
Suite EternalBlue refaite en C/C++ qui inclut : MS17-010 Exploit, EternalBlue vulnerability detector, DoublePulsar detector et DoublePulsar Shellcode & DLL uploader
Suite EternalBlue refaite en C/C++ qui comprend :



Ces valeurs de Recvbuff[18] à Recvbuff[22] sont ensuite passées par la fonction de calcul de la clé XOR DoublePulsar, qui génère une clé XOR entière non signée pouvant être utilisée pour chiffrer le shellcode ou la charge utile DLL qui sera téléchargée sur DoublePulsar. Testé sur Windows 7 x64.
Exemple de capture d’écran :

Même clé que celle du binaire NSA original dans FUZZBUNCH

DoublePulsar_structure_ping.cpp – Ce programme envoie 4 paquets SMB : 1 de négociation, 1 d’ouverture de session, 1 de connexion d’arborescence et 1 paquet Trans2 SESSION_SETUP. La différence avec doublepulsar_check.cpp est qu’il génère le paquet PING DoublePulsar Trans2 à l’aide d’une structure plutôt que d’une chaîne hexadécimale SMB codée en dur que j’ai extraite d’un échantillon Wannacry. Une autre différence est que ce programme génère dynamiquement le paquet TreeConnect plutôt que d’utiliser celui codé en dur présent dans l’échantillon Wannacry. Le paquet ping généré par ce programme vous indiquera si DoublePulsar est installé sur la machine distante.
DoublePulsar_structure_exec.cpp – Ce programme envoie 5 paquets SMB : 1 de négociation SMB, 1 d’ouverture de session, 1 de connexion d’arborescence, 1 paquet PING Trans2 SESSION_SETUP DoublePulsar et 1 paquet d’exécution Trans2 SESSION_SETUP DoublePulsar. La différence avec Doublepulsar_UploadShellcode.cpp est qu’il génère le paquet d’exécution Trans2 DoublePulsar à l’aide d’une structure plutôt que d’une chaîne hexadécimale SMB codée en dur extraite d’un échantillon Wannacry.
Doublepulsar_UploadDLL.cpp – Ce programme est destiné aux DLL. Il envoie 4 paquets SMB avec les données DLL dans les paquets Trans2 SMB : 1 de négociation, 1 d’ouverture de session, 1 de connexion d’arborescence, 1 requête PING Trans2 SESSION_SETUP et un paquet d’exécution Trans2 SESSION_SETUP. Le paquet de requête PING Trans2 SESSION_SETUP est envoyé pour obtenir la signature SMB dans le paquet de réponse Trans2 SESSION_SETUP. Cette signature est traitée par le calculateur de clé XOR DoublePulsar. Le programme lit ensuite un fichier DLL et le combine avec un shellcode noyau 64 bits et un shellcode espace utilisateur pour exécuter la DLL, puis applique un XOR sur le tampon avec la clé XOR DoublePulsar calculée à partir de la signature SMB. Un paquet est généré en allouant de la mémoire, en copiant le paquet Trans2, en modifiant les valeurs nécessaires au fonctionnement de la transaction SMB (UserID, TreeID, TotalDataCount, DataCount, ByteCount), puis en copiant les données XORées (shellcode noyau + DLL) à la fin et en les envoyant par boucle par paquets de 4096 octets à DoublePulsar. Longueur totale du paquet = 4178. 4096 correspondent aux données chiffrées par XOR. L’implémentation avec les structures SMB & TRANSACTION2 sera également faite dans les versions futures.
Doublepulsar_UploadShellcode.cpp – Ce programme envoie 5 paquets SMB : 1 de négociation, 1 d’ouverture de session, 1 de connexion d’arborescence, 1 paquet PING Trans2 SESSION_SETUP et 1 paquet d’exécution Trans2 SESSION_SETUP. Le paquet de requête Trans2 SESSION_SETUP est envoyé pour obtenir la signature SMB dans le paquet de réponse TRANS2 SESSION_SETUP. Cette signature est traitée par le calculateur de clé XOR DoublePulsar. Le programme copie ensuite le shellcode noyau et un shellcode exemple depuis un tampon, applique un XOR sur le tampon avec la clé XOR DoublePulsar calculée à partir de la signature SMB. Un paquet est généré en allouant de la mémoire, en copiant le paquet d’exécution Trans2, en modifiant les valeurs nécessaires au fonctionnement de la transaction SMB (UserID, TreeID, TotalDataCount, DataCount, ByteCount), puis en copiant les paramètres SESSION_SETUP et 4096 octets de données shellcode XORées à la fin, et en l’envoyant à une longueur totale de 4178 octets à DoublePulsar. Longueur totale du paquet = 4178. La longueur NetBIOS sera de 4174 car l’en-tête NetBIOS ne compte pas lui-même dans la taille. 12 octets de ce paquet sont destinés aux paramètres SESSION_SETUP de DoublePulsar. 4096 correspondent aux données chiffrées par XOR. Dans une version future, les structures SMB & TRANSACTION2 seront utilisées.

Shellcode généré à partir de – zerosum0x0 a écrit un shellcode personnalisé pour ETERNALBLUE qui pourrait être réutilisé pour DOUBLEPULSAR, avec une petite modification. Comme la réécriture d’appel système dans le shellcode copié était inutile pour ce cas d’utilisation, nous l’avons annulée :
;%define SYSCALL_OVERWRITE ; pour s’exécuter à IRQL de processus dans syscall
recompiler avec : 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 – Ce programme est destiné aux exécutables. L’exécutable est lu en mémoire et placé dans une DLL de lanceur Wannacry, puis envoyé via DoublePulsar. 1 paquet de négociation, 1 d’ouverture de session, 1 de connexion d’arborescence, 1 paquet Trans2 « Ping » et plusieurs paquets Trans2 « exec » SESSION_SETUP. Le paquet de requête Trans2 Ping est envoyé pour obtenir la signature SMB dans le paquet de réponse Trans2. Cette signature est traitée par le calculateur de clé XOR DoublePulsar. Ensuite, le programme lit un fichier EXE et le combine avec un shellcode noyau 64 bits, un shellcode espace utilisateur et un fichier DLL squelette, puis applique un XOR sur le tampon avec la clé XOR DoublePulsar calculée à partir de la signature SMB. Un paquet est généré en allouant de la mémoire, en copiant le paquet d’exécution Trans2, en modifiant les valeurs nécessaires au fonctionnement de la transaction SMB (UserID, TreeID, TotalDataCount, DataCount, ByteCount), puis en copiant les données XORées (shellcode noyau + DLL + exécutable) à la fin et en les envoyant par boucle par paquets de 4096 octets à DoublePulsar. Longueur totale du paquet = 4178. La longueur NetBIOS sera de 4174 car l’en-tête NetBIOS ne compte pas lui-même dans la taille. 12 octets de ce paquet sont destinés aux paramètres SESSION_SETUP de DoublePulsar. 4096 correspondent aux données chiffrées par XOR.
Création d’un module Metasploit personnalisé que j’ai rendu fonctionnel en utilisant le module DoublePulsar RCE open source de Metasploit.
J’ai modifié la logique pour permettre la génération d’une DLL, la fusionner avec le shellcode noyau x64 (préfixé) que j’ai emprunté à Wannacry, afin de permettre à DoublePulsar d’exécuter la DLL.

Le dépôt contient également les éléments suivants à des fins éducatives et NE sont PAS pris en charge par moi :
Script Python de téléchargement de DLL DoublePulsar x86/x64
Binaire EternalBlue tout-en-un
Code assembleur multi-architecture de file d’attente APC du noyau et code noyau Windows x86/x64 multi-architecture Ring 0 vers Ring 3 via APC en file d’attente
Shellcode de charge utile du noyau EternalBlue x64/x86 de worawit
Fichier de rejeu Eternalblue
EternalBlue.cpp – Ce programme envoie plusieurs paquets SMB : Négociation, SessionSetup, TreeConnect et plusieurs paquets NT trans et Trans2. Ces paquets NT trans sont malformés et préparent l’exploit en mémoire sur la machine victime. D’autres paquets SMB vides ou contenant des espaces sont envoyés à la victime via plusieurs sockets sur le même port de la victime. La majeure partie de la charge utile base64 d’EternalBlue est envoyée via le socket 1, sur lequel les paquets de négociation, SessionSetup et TreeConnect ont été envoyés. Ensuite, 20 autres sockets sont créés et des données sont envoyées sur ces sockets (socket 3 à socket 21). Puis DoublePulsar est envoyé sur les sockets 3 à 21. Les sockets sont ensuite fermés par le programme, ce qui déclenche EternalBlue et DoublePulsar sur la machine victime. Une demande de déconnexion SMB et de déconnexion de session est ensuite envoyée, et la connexion se ferme. Cet exploit fonctionne et a été testé sur Windows 7 x64. La porte dérobée a mis environ 5 secondes pour devenir pleinement opérationnelle, comme cela a déjà été rapporté dans les analyses d’EternalBlue sur Internet. Plusieurs tentatives d’exploitation peuvent être nécessaires. Cependant, il y a actuellement un bogue concernant les TreeID et UserID qui ne sont pas correctement définis dans les paquets ; ce sera corrigé dans une version ultérieure. Cela fonctionnera sur des machines récemment allumées car les TreeID et UserID sont définis sur les valeurs par défaut. Ces paquets devront voir leurs valeurs TreeID et UserID mises à jour car elles sont actuellement définies sur les valeurs par défaut « 08 00 ».
