
Suite EternalBlue rifatta in C/C++ che include: MS17-010 Exploit, rilevatore di vulnerabilità EternalBlue, rilevatore DoublePulsar e caricatore di Shellcode e DLL DoublePulsar
La suite EternalBlue rifatta in C/C++ che include:



Questi valori da Recvbuff[18] -> Recvbuff[22] vengono poi elaborati tramite la funzione calcolatrice della chiave XOR di DoublePulsar, che genera una chiave XOR intera senza segno utilizzabile per crittografare il shellcode o il payload DLL da caricare su DoublePulsar. Testato su Windows 7 x64.
Screenshot di esempio:

Stessa chiave dal binario NSA originale in FUZZBUNCH

DoublePulsar_structure_ping.cpp - Questo programma invia 4 pacchetti SMB: 1 negoziazione, 1 impostazione sessione, 1 connessione albero e 1 pacchetto Trans2 SESSION_SETUP. La differenza rispetto a doublepulsar_check.cpp è che questo genera il pacchetto PING di DoublePulsar Trans2 utilizzando una struttura anziché una stringa esadecimale SMB hardcoded presa da un campione di WannaCry. Un'altra differenza è che questo programma genera dinamicamente il pacchetto TreeConnect invece di usare quello hardcoded presente nel campione di WannaCry. Il pacchetto ping generato in questo programma ti dirà se DoublePulsar è installato sulla macchina remota.
DoublePulsar_structure_exec.cpp - Questo programma invia 5 pacchetti SMB: 1 negoziazione SMB, 1 impostazione sessione, 1 connessione albero, 1 pacchetto Ping Trans2 SESSION_SETUP di DoublePulsar e 1 pacchetto di esecuzione Trans2 SESSION_SETUP di DoublePulsar. La differenza rispetto a Doublepulsar_UploadShellcode.cpp è che questo genera il pacchetto di esecuzione Trans2 DoublePulsar utilizzando una struttura anziché una stringa esadecimale SMB hardcoded presa da un campione di WannaCry.
Doublepulsar_UploadDLL.cpp - Questo programma è pensato per DLL. Invia 4 pacchetti SMB insieme ai dati DLL in pacchetti Trans2 SMB: 1 negoziazione, 1 impostazione sessione, 1 connessione albero, 1 richiesta Ping Trans2 SESSION_SETUP e un pacchetto di esecuzione Trans2 SESSION_SETUP. Il pacchetto di richiesta Ping Trans2 SESSION_SETUP viene inviato per ottenere la firma SMB nel pacchetto di risposta Trans2 SESSION_SETUP. Questa firma viene elaborata tramite la calcolatrice della chiave XOR di DoublePulsar. Il programma legge quindi un file DLL e lo combina con shellcode del kernel a 64 bit e userland per eseguire la DLL e XORa il buffer con la chiave XOR di DoublePulsar calcolata dalla firma SMB. Viene generato un pacchetto allocando memoria, copiando il pacchetto Trans2, modificando i valori necessari per il funzionamento della transazione SMB (UserID, TreeID, TotalDataCount, DataCount, ByteCount), quindi copiando i dati XORati (shellcode del kernel + DLL) alla fine e iterando inviandoli a blocchi di 4096 byte per volta a DoublePulsar. La lunghezza totale del pacchetto è 4178. 4096 sono per i dati crittografati XOR. In futuro verrà implementato anche l'uso delle strutture SMB e TRANSACTION2.
Doublepulsar_UploadShellcode.cpp - Questo programma invia 5 pacchetti SMB: 1 negoziazione, 1 impostazione sessione, 1 connessione albero, 1 pacchetto Ping Trans2 SESSION_SETUP e 1 pacchetto di esecuzione Trans2 SESSION_SETUP. Il pacchetto di richiesta Trans2 SESSION_SETUP viene inviato per ottenere la firma SMB nel pacchetto di risposta TRANS2 SESSION_SETUP. Questa firma viene elaborata tramite la calcolatrice della chiave XOR di DoublePulsar. Il programma copia quindi lo shellcode del kernel e uno shellcode di esempio da un buffer, XORa il buffer con la chiave XOR di DoublePulsar calcolata dalla firma SMB. Viene generato un pacchetto allocando memoria, copiando il pacchetto di esecuzione Trans2, modificando i valori necessari per il funzionamento della transazione SMB (UserID, TreeID, TotalDataCount, DataCount, ByteCount), quindi copiando i parametri SESSION_SETUP e 4096 byte di dati shellcode XORati alla fine e inviandoli a una lunghezza totale del pacchetto di 4178 byte a DoublePulsar. La lunghezza totale del pacchetto è 4178. La lunghezza NetBIOS sarà 4174 poiché l'intestazione NetBIOS non conta se stessa per la dimensione. 12 byte di questo pacchetto sono per i parametri SESSION_SETUP di DoublePulsar. 4096 sono per i dati crittografati XOR. In una versione futura verranno utilizzate le strutture SMB e TRANSACTION2.

Shellcode generato da - zerosum0x0 ha scritto shellcode personalizzato per ETERNALBLUE che potrebbe essere riadattato per DOUBLEPULSAR, sebbene con una piccola modifica. Poiché la sovrascrittura della syscall nello shellcode copiato non era necessaria per questo caso d'uso, l'abbiamo rimossa:
;%define SYSCALL_OVERWRITE ; per eseguire al livello IRQL del processo in syscall
ricompila con: 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 -
Questo programma è pensato per eseguibili. L'eseguibile viene letto in memoria e inserito in una DLL di lancio di WannaCry e inviato tramite DoublePulsar: 1 negoziazione, 1 impostazione sessione, 1 connessione albero, 1 pacchetto Trans2 Ping e più pacchetti Trans2 exec SESSION_SETUP. Il pacchetto di richiesta Trans2 Ping viene inviato per ottenere la firma SMB nel pacchetto di risposta Trans2. Questa firma viene elaborata tramite la calcolatrice della chiave XOR di DoublePulsar. Quindi il programma legge un file EXE e lo combina con shellcode del kernel a 64 bit e userland e un file DLL scheletro e XORa il buffer con la chiave XOR di DoublePulsar calcolata dalla firma SMB. Viene generato un pacchetto allocando memoria, copiando il pacchetto di esecuzione Trans2, modificando i valori necessari per il funzionamento della transazione SMB (UserID, TreeID, TotalDataCount, DataCount, ByteCount), quindi copiando i dati XORati (shellcode del kernel + DLL + eseguibile) alla fine e iterando inviandoli a blocchi di 4096 byte per volta a DoublePulsar. La lunghezza totale del pacchetto è 4178. La lunghezza NetBIOS sarà 4174 poiché l'intestazione NetBIOS non conta se stessa per la dimensione. 12 byte di questo pacchetto sono per i parametri SESSION_SETUP di DoublePulsar. 4096 sono per i dati crittografati XOR.
EternalBlue.cpp - Questo programma invia multipli pacchetti SMB: negoziazione, impostazione sessione, connessione albero e multipli pacchetti NT trans e Trans2. Questi pacchetti NT trans sono malformati e preparano l'exploit in memoria sulla macchina vittima. Vengono inviati più pacchetti SMB vuoti o di spaziatura alla vittima su più socket sulla stessa porta. La maggior parte del payload base64 di EternalBlue viene inviata tramite il socket 1, dove sono stati inviati i pacchetti di negoziazione, impostazione sessione e connessione albero. Quindi vengono creati altri 20 socket e i dati vengono inviati a tali socket (Socket 3 a Socket 21). Successivamente, DoublePulsar viene inviato sui socket 3 a 21. I socket vengono poi chiusi dal programma, che fa esplodere EternalBlue e DoublePulsar sulla macchina vittima. Vengono quindi inviate una richiesta di disconnessione SMB e una richiesta di logout SMB e la connessione si chiude. Questo exploit funziona ed è stato testato su Windows 7 x64. Ci sono voluti circa 5 secondi perché il backdoor fosse completamente operativo, come già riportato nelle descrizioni di EternalBlue su internet. Potrebbero essere necessari più tentativi di sfruttamento. Tuttavia, attualmente c'è un bug con TreeID e UserID non impostati correttamente nei pacchetti, che verrà corretto in una versione successiva. Funzionerà contro macchine appena accese poiché TreeID e UserID sono impostati ai valori predefiniti. Questi pacchetti dovranno avere i loro valori TreeID e UserID aggiornati poiché attualmente sono impostati ai valori predefiniti "08 00".

Ho creato un modulo Metasploit personalizzato che ho reso funzionante utilizzando il modulo DoublePulsar RCE open source di Metasploit.
Ho modificato la logica per consentire la generazione di una DLL, unirla con lo shellcode del kernel x64 (premesso) che ho preso da WannaCry, per permettere a DoublePulsar di eseguire la DLL.

Il repository contiene anche quanto segue per scopi educativi e NON sono supportati da me:
Script Python per caricamento DLL x86/x64 di DoublePulsar
Binario EternalBlue tutto in uno
Codice assembly multi-architettura kernel queue apc e codice kernel Windows x86/x64 Multi-Arch Kernel Ring 0 a Ring 3 tramite Queued APC
Shellcode del payload del kernel EternalBlue x64/x86 da worawit
File di replay di Eternalblue