
EternalBlueC
La suite EternalBlue rifatta in C/C++ che include:
- Exploit MS17-010 (include DoublePulsar)
- Rilevatore di vulnerabilità EternalBlue/MS17-010
- Rilevatore di DoublePulsar
- Caricamento DLL con DoublePulsar
- Caricamento shellcode con DoublePulsar
- Caricamento DLL con struttura SMB con DoublePulsar
- Caricamento shellcode con struttura SMB con DoublePulsar
- Caricamento di un eseguibile all'interno di una DLL con DoublePulsar
Risultati del progetto
- Caricamento shellcode - completato e funzionante, inietta il tuo shellcode in qualsiasi processo desideri
- Caricamento DLL - completato e funzionante, inietta la tua DLL in qualsiasi processo desideri
- Caricamento DLL con un eseguibile embedded - completato, inietta la tua DLL in qualsiasi processo desideri e rilascia l'eseguibile come "mssecsvc.exe"
Obiettivi del progetto
- Consentire la generazione dinamica dei pacchetti DoublePulsar di negoziazione, impostazione sessione, connessione albero, TransNamedPipe e Transaction2 con strutture SMB e catture esadecimali
- Consentire la modifica del payload dell'exploit EternalBlue per rimuovere l'impianto DoublePulsar e inviare invece shellcode personalizzati
- Consentire la generazione dinamica dei pacchetti EternalBlue
- Richiedere input utente per tutti gli indirizzi IP, payload come shellcode o percorsi file e autorizzazione a proseguire
- Essere più verboso
- Aggiungere la versione di Windows dalla risposta SMB a schermo
- Aggiungere supporto per parametri da riga di comando (DoublepulsarExecute.exe -h 192.168.0.8 -f PopCalculatorShellcode.bin)
- Aggiungere più controlli degli errori come il timeout del socket
Suite EternalBlue e DoublePulsar
- ms17_vuln_status.cpp - Questo programma invia 4 pacchetti SMB: 1 negoziazione, 1 impostazione sessione, 1 connessione albero e 1 richiesta TransNamedPipe. Il programma legge quindi la risposta NT_STATUS dalla TransNamedPipeRequest (richiesta PeekNamedPipe) e determina se NT_STATUS nel pacchetto SMB è uguale a 0xC0000205 (STATUS_INSUFF_SERVER_RESOURCES). Se è corretto, il target è vulnerabile a MS17-010. Testato su Windows 7 x64 non aggiornato.

- doublepulsar_check.cpp - Questo programma invia 4 pacchetti SMB: 1 negoziazione, 1 impostazione sessione, 1 connessione albero e 1 pacchetto Trans2 SESSION_SETUP. Inviando il pacchetto Trans2 SESSION_SETUP, l'ID multiplex inviato può essere confrontato nel pacchetto di risposta Trans2 con l'ID multiplex: 0x51 o 81. DoublePulsar legge l'ID multiplex inviato e, dopo che il comando ping è riuscito, restituisce +10 in esadecimale per l'ID multiplex nella risposta Trans2 SESSION_SETUP. Successivamente, vengono inviati comandi per disattivare il backdoor DoublePulsar. Il comando di disattivazione di DoublePulsar si trova nei parametri di timeout del pacchetto SMB. Dopodiché, DoublePulsar diventa dormiente e non viene rimosso dal sistema. Testato su Windows 7 x64.

- DoublePulsarXORKeyCalculator.cpp - Questo programma invia 4 pacchetti SMB: 1 pacchetto di negoziazione e 3 richieste. L'ultima richiesta è una richiesta Trans2 SESSION_SETUP. Viene ricevuta una risposta Trans2 SESSION_SETUP e la firma SMB viene estratta da (Recvbuff[18] -> Recvbuff[22]). Recvbuff[22] indica il tipo di architettura: se 1, il target è a 64 bit; se 0, il target è a 32 bit. La firma SMB viene convertita dai caratteri unsigned char in un intero senza segno.

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.