
EternalBlue suíte refeita em C/C++ que inclui: Exploit MS17-010, detector de vulnerabilidade EternalBlue, detector DoublePulsar e carregador de Shellcode & DLL do DoublePulsar
Suite EternalBlue refeita em C/C++ que inclui:



Esses valores de Recvbuff[18] -> Recvbuff[22] são então processados pela função calculadora de chave XOR do DoublePulsar, que gera uma chave XOR inteira unsigned que pode ser usada para criptografar o shellcode ou payload DLL que será carregado no DoublePulsar. Testado no Windows 7 x64 bit.
Captura de tela de exemplo:

Mesma chave do binário original da NSA no FUZZBUNCH

DoublePulsar_structure_ping.cpp - Este programa envia 4 pacotes SMB. 1 negociação, 1 configuração de sessão, 1 conexão de árvore e 1 pacote Trans2 SESSION_SETUP. A diferença entre este e o doublepulsar_check.cpp é que este gera o pacote PING DoublePulsar Trans2 usando uma estrutura, em vez de uma string hexadecimal SMB fixa que obtive de uma amostra do Wannacry. Outra diferença é que este programa gera dinamicamente o pacote TreeConnect, em vez de usar o fixo presente na amostra do Wannacry. O pacote ping gerado neste programa informará se o DoublePulsar está instalado na máquina remota.
DoublePulsar_structure_exec.cpp - Este programa envia 5 pacotes SMB. 1 negociação SMB, 1 configuração de sessão, 1 conexão de árvore, 1 pacote Ping DoublePulsar Trans2 SESSION_SETUP e 1 pacote de Execução DoublePulsar Trans2 SESSION_SETUP. A diferença entre este e o Doublepulsar_UploadShellcode.cpp é que este gera o pacote de Execução DoublePulsar Trans2 usando uma estrutura, em vez de uma string hexadecimal SMB fixa que obtive de uma amostra do Wannacry.
Doublepulsar_UploadDLL.cpp - Este programa é destinado a DLLs. Ele envia 4 pacotes SMB junto com os dados da DLL em pacotes Trans2 SMB. 1 negociação, 1 configuração de sessão, 1 conexão de árvore, 1 requisição Ping Trans2 SESSION_SETUP e um pacote de Execução Trans2 SESSION_SETUP. O pacote de requisição Ping Trans2 SESSION_SETUP é enviado para obter a assinatura SMB no pacote de resposta Trans2 SESSION_SETUP. Esta assinatura é processada pela calculadora de chave XOR do DoublePulsar. O programa então lê um arquivo DLL e o combina com shellcode de kernel e userland de 64 bits para executar a DLL e aplica XOR no buffer com a chave XOR do DoublePulsar que calculamos a partir da assinatura SMB. Um pacote é gerado alocando memória, copiando o pacote Trans2, editando os valores necessários para a transação SMB funcionar (UserID, TreeID, TotalDataCount, DataCount, ByteCount), depois copia os dados com XOR (shellcode de kernel + DLL) para o final e o percorre enviando-o em um comprimento total de pacote de 4096 bytes por vez para o DoublePulsar. Comprimento total do pacote = 4178. 4096 é para os dados criptografados com XOR. Também implementarei o uso de estruturas SMB & TRANSACTION2 em versões futuras.
Doublepulsar_UploadShellcode.cpp - Este programa envia 5 pacotes SMB. 1 negociação, 1 configuração de sessão, 1 conexão de árvore, 1 pacote Ping Trans2 SESSION_SETUP e 1 pacote de execução Trans2 SESSION_SETUP. O pacote de requisição Trans2 SESSION_SETUP é enviado para obter a assinatura SMB no pacote de resposta TRANS2 SESSION_SETUP. Esta assinatura é processada pela calculadora de chave XOR do DoublePulsar. O programa então copia o shellcode de kernel e o shellcode de exemplo de um buffer, aplica XOR no buffer com a chave XOR do DoublePulsar que calculamos a partir da assinatura SMB. Um pacote é gerado alocando memória, copiando o pacote de execução Trans2, editando os valores necessários para a transação SMB funcionar (UserID, TreeID, TotalDataCount, DataCount, ByteCount), depois copia os Parâmetros SESSION_SETUP e 4096 bytes de dados de shellcode com XOR para o final e o envia com comprimento total de pacote de 4178 bytes para o DoublePulsar. Comprimento total do pacote = 4178. O comprimento NetBIOS será 4174, pois o cabeçalho NetBIOS não conta a si mesmo para o tamanho. 12 bytes deste pacote são para os parâmetros SESSION_SETUP do Doublepulsar. 4096 são para os dados criptografados com XOR. Em uma versão futura, serão usadas estruturas SMB & TRANSACTION2.

Shellcode gerado a partir de - zerosum0x0 escreveu shellcode personalizado para ETERNALBLUE que poderia ser reutilizado para DOUBLEPULSAR, embora com uma pequena modificação. Como a sobrescrita de chamada de sistema no shellcode copiado era desnecessária para este caso de uso, nós a removemos:
;%define SYSCALL_OVERWRITE ; to run at process IRQL in syscall
recompile com: nasm -w-other -o >(xxd -p -c 16 | sed 's/../\x&/g') external/source/shellcode/windows/multi_arch_kernel_queue_apc.asm
https://github.com/rapid7/metasploit-framework/blob/master/external/source/shellcode/windows/multi_arch_kernel_queue_apc.asm
https://raw.githubusercontent.com/ninp0/eternalblue/master/eternalblue_kshellcode_x64.asm
https://raw.githubusercontent.com/ninp0/eternalblue/master/eternalblue_kshellcode_x86.asm
https://www.rapid7.com/blog/post/2019/10/02/open-source-command-and-control-of-the-doublepulsar-implant/
DoublePulsar_UploadExe.cpp -
Este programa é destinado a executáveis. O executável será lido na memória e colocado em uma DLL inicializadora do Wannacry e enviado via DoublePulsar. 1 negociação, 1 configuração de sessão, 1 conexão de árvore, 1 pacote Trans2 Ping e múltiplos pacotes de execução Trans2 SESSION_SETUP. O pacote de requisição Trans2 Ping é enviado para obter a assinatura SMB no pacote de resposta Trans2. Esta assinatura é processada pela calculadora de chave XOR do DoublePulsar. Em seguida, o programa lê um arquivo EXE e o combina com shellcode de kernel e userland de 64 bits e um arquivo DLL esqueleto e aplica XOR no buffer com a chave XOR do DoublePulsar que calculamos a partir da assinatura SMB. Um pacote é gerado alocando memória, copiando o pacote de execução Trans2, editando os valores necessários para a transação SMB funcionar (UserID, TreeID, TotalDataCount, DataCount, ByteCount), depois copia os dados com XOR (shellcode de kernel + DLL + Executável) para o final e o percorre enviando-o em um comprimento total de pacote de 4096 bytes por vez para o DoublePulsar. Comprimento total do pacote = 4178. O comprimento NetBIOS será 4174, pois o cabeçalho NetBIOS não conta a si mesmo para o tamanho. 12 bytes deste pacote são para os parâmetros SESSION_SETUP do Doublepulsar. 4096 são para os dados criptografados com XOR.
Criei um módulo Metasploit personalizado que tornei funcional usando o módulo RCE DoublePulsar de código aberto do Metasploit.
Mudei a lógica para permitir que uma DLL seja gerada, mesclando-a com o shellcode do kernel x64 (prefixado) que peguei do Wannacry, para permitir que o DoublePulsar execute a DLL.

O repositório também contém o seguinte para fins educacionais e NÃO é suportado por mim:
DoublePulsar x86/x64 Upload DLL python script
EternalBlue All in one binary
Multi arch kernel queue apc assembly code & Windows x86/x64 Multi-Arch Kernel Ring 0 to Ring 3 via Queued APC kernel code
EternalBlue x64/x86 kernel payload shellcode from worawit
Eternalblue replay file
EternalBlue.cpp - Este programa envia múltiplos pacotes SMB. Negociação, SessionSetup, TreeConnect e múltiplos pacotes NT trans e Trans2. Esses pacotes NT trans são malformados, o que prepara o exploit na memória do computador vítima. Mais pacotes SMB em branco ou vazios são enviados para a vítima através de múltiplos sockets para a mesma porta na vítima. A maior parte do payload base64 do EternalBlue está sendo enviada pelo socket 1, onde os pacotes de Negociação, SessionSetup e TreeConnect foram enviados. Em seguida, outros 20 sockets são criados e dados são enviados para esses sockets (Socket 3 ao Socket 21). Depois, o DoublePulsar é enviado no Socket 3 ao Socket 21. Os sockets são então fechados pelo programa, o que detona o EternalBlue e o DoublePulsar no computador vítima. Uma requisição de desconexão SMB e logout SMB é então enviada e a conexão é encerrada. Este exploit funciona e foi testado no Windows 7 x64 bit. Levou cerca de 5 segundos para o backdoor ficar totalmente operacional, conforme já relatado em análises do EternalBlue na internet. Mais tentativas de exploração podem ser necessárias. No entanto, atualmente há um bug com o TreeID e UserID não sendo definidos corretamente nos pacotes, que será corrigido em uma versão posterior. Isso funcionará contra máquinas que foram ligadas recentemente, pois os TreeID e UserIDs estão definidos com os valores padrão. Esses pacotes precisarão ter seus valores de TreeID e UserID atualizados, pois atualmente estão definidos com os valores padrão "08 00".
