EternalBlue
đ Guide Complet sur lâExploit EternalBlue
Ce document dĂ©taille le fonctionnement de lâexploit EternalBlue, depuis les concepts fondamentaux jusquâĂ lâexĂ©cution de code Ă distance, en sâappuyant sur lâimplĂ©mentation de Metasploit.
Lâanalogie du chef cuisinier est utilisĂ©e pour vulgariser, mais la derniĂšre section adopte une approche professionnelle avec les termes techniques du domaine, en sâappuyant sur les fonctions du noyau Windows.
Partie 1 : Les Concepts Fondamentaux (avec analogie du chef)
1. Le Buffer Overflow (Dépassement de Tampon)
đ§âđł Analogie du chef
Imaginez que la mĂ©moire de lâordinateur est une grande cuisine.
Le chef (le processeur) prépare des plats dans des casseroles (les buffers).
Si le chef verse trop de soupe dans la casserole, la soupe déborde et coule sur la table à cÎté (la mémoire voisine).
đ„ïž Dans la rĂ©alitĂ©
Un programme alloue un espace mémoire pour stocker des données (le buffer).
Si un attaquant envoie plus de données que la capacité du buffer, ces données débordent et écrasent des zones mémoire voisines qui contiennent des informations importantes du systÚme.
2. La Corruption de MĂ©moire et le DĂ©tournement dâExĂ©cution
đ§âđł Analogie du chef
Ă cĂŽtĂ© de chaque casserole, le chef a une ânoteâ qui lui dit quelle recette faire ensuite.
Si la soupe dĂ©borde et recouvre la note, le chef pourrait lire une mauvaise instruction, comme âFais un gĂąteauâ alors quâil devrait faire une soupe.
đ„ïž Dans la rĂ©alitĂ©
La mémoire voisine peut contenir des pointeurs de fonction (adresses qui indiquent au processeur quelle instruction exécuter ensuite).
Si lâattaquant remplace cette adresse par celle de son propre code, le processeur va exĂ©cuter le code malveillant de lâattaquant au lieu du code lĂ©gitime.
3. Le Pool Grooming (Préparation de la Mémoire)
đ§âđł Analogie du chef
Le chef doit sâassurer que la casserole qui va dĂ©border est placĂ©e juste Ă cĂŽtĂ© de la note Ă modifier.
Il organise la cuisine pour que tout soit bien alignĂ© : la casserole (buffer vulnĂ©rable), la note (pointeur), et lâespace oĂč il va verser la soupe (payload).
đ„ïž Dans la rĂ©alitĂ©
Lâattaquant envoie des requĂȘtes pour manipuler la façon dont le systĂšme alloue les blocs mĂ©moire.
Il sâassure que le buffer vulnĂ©rable sera allouĂ© juste Ă cĂŽtĂ© de la structure quâil veut corrompre (SRVNET_BUFFER
).
Partie 2 : La Cible - Quâest-ce que la structure SRVNET_BUFFER
?
đ§âđł Analogie
Chaque recette que le chef reçoit est accompagnĂ©e dâun dossier de gestion : il contient la liste des ingrĂ©dients, la taille de la casserole, et surtout une note qui lui dit quelle recette faire aprĂšs.
đ„ïž Dans la rĂ©alitĂ©
Quand Windows gÚre une connexion réseau SMB, il crée une structure complexe appelée SRVNET_BUFFER
au début du bloc mémoire.
La structure SRVNET_BUFFER
contient toutes les informations vitales pour que Windows puisse traiter les donnĂ©es reçues. Son importance pour lâattaquant vient dâun de ses champs spĂ©cifiques.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
+-------------------------------------------------------------+ <-- Début d'un bloc mémoire alloué par SMB
| SRVNET_BUFFER (le "dossier") |
| +---------------------------------------------------------+ |
| | Pointeur vers les données brutes du paquet | |
| +---------------------------------------------------------+ |
| | Taille des données | |
| +---------------------------------------------------------+ |
| | Flags (Indicateurs de statut, etc.) | |
| +---------------------------------------------------------+ |
| | ... autres informations de gestion ... | |
| +---------------------------------------------------------+ |
| | POINTEUR VERS LA FONCTION DE TRAITEMENT (Handler) | | <-- LA CIBLE ! La fameuse "note" à écraser.
| +---------------------------------------------------------+ |
| |
+=============================================================+
| |
| DONNĂES BRUTES DU PAQUET |
| (C'est ici que l'attaquant place |
| son shellcode/payload) |
| |
+-------------------------------------------------------------+
Le champ âPointeur vers la fonction de traitementâ est la clĂ©.
- RÎle légitime : Quand des données arrivent sur cette connexion, le systÚme regarde ce pointeur pour savoir quelle fonction appeler pour les traiter. Normalement, il pointe vers une fonction interne et sécurisée de
srvnet.sys
(commeSrvNetWskReceiveComplete
). - LâidĂ©e de lâattaque : Si lâattaquant peut réécrire ce pointeur, il peut forcer le systĂšme Ă exĂ©cuter nâimporte quel code de son choix.
Partie 3 : Visualisation de lâAttaque ComplĂšte (MĂ©moire et Code)
Ătape 1 : Le âPool Groomingâ
đ§âđł Analogie
Le chef prĂ©pare la cuisine : il place des casseroles (blocs mĂ©moire avec payload) alignĂ©es sur la table, et crĂ©e un espace vide (trou) Ă cĂŽtĂ© de la note quâil veut modifier.
đ„ïž Dans la rĂ©alitĂ©
Lâattaquant prĂ©pare la mĂ©moire du noyau pour que tout sâaligne parfaitement.
A. Placer les futures âvictimesâ (contenant le payload) Lâattaquant envoie de nombreux paquets SMBv2 simples. Leur but est de forcer Windows Ă allouer de nombreux blocs mĂ©moire. Chacun de ces blocs commence par une structure SRVNET_BUFFER
et contient le payload de lâattaquant. ce nâest que de la donnĂ©e (comme une liste dâingrĂ©dients). Le serveur, en faisant son travail, stocke cette âliste dâingrĂ©dientsâ sur une page blanche Ă la fin du livre. Cette âlisteâ est en rĂ©alitĂ© le payload de lâattaquant : une recette malveillante qui dit âDonne-moi un shellâ. Ă ce stade, ce nâest que du texte inerte sur une page. Le chef ne la regarde mĂȘme pas. Disons que câest Ă la page 5000.
1
2
3
4
5
6
7
8
9
10
# modules/exploits/windows/smb/ms17_010_eternalblue.rb
# La fonction smb2_grooms envoie de nombreux paquets pour remplir la mémoire.
def smb2_grooms(grooms, payload_hdr_pkt)
grooms.times do |_groom_id|
gsock = connect(false)
@groom_socks << gsock
# Chaque paquet contient le payload (créé par make_smb2_payload_body_packet)
gsock.put(payload_hdr_pkt)
end
end
La mémoire ressemble maintenant à : | SRVNET_BUFFER #1 | SRVNET_BUFFER #2 | SRVNET_BUFFER #3 | ... |
B. CrĂ©er un âTrouâ Via une manipulation de connexions SMBv1, lâattaquant force Windows Ă libĂ©rer lâun de ces blocs, crĂ©ant un âtrouâ au milieu de ses blocs prĂ©parĂ©s.
1
2
3
# modules/exploits/windows/smb/ms17_010_eternalblue.rb
fhs_sock = smb1_free_hole(true) # Cette fonction libÚre un bloc mémoire.
fhs_sock.shutdown # La fermeture de la connexion finalise la libération.
La mémoire ressemble maintenant à ceci : | SRVNET_BUFFER #1 | <-- TROU LIBRE --> | SRVNET_BUFFER #3 | ... |
Ătape 2 : LâOverflow et la Corruption de la Structure Voisine
đ§âđł Analogie
Le chef verse dĂ©libĂ©rĂ©ment trop de soupe dans la casserole vulnĂ©rable, la soupe dĂ©borde sur la note voisine et la recouvre avec une nouvelle instruction Ă©crite par lâattaquant : âVa Ă la page 5000 et suis la recette lĂ -bas !â
đ„ïž Dans la rĂ©alitĂ©
Lâattaquant envoie le paquet TRANSACTION2
final, construit par make_smb1_trans2_exploit_packet
. Ă cause de la faille de calcul, Windows alloue un petit buffer dans le âtrouâ pour y copier les donnĂ©es.
1
2
3
ĂTAT DE LA MĂMOIRE AU MOMENT DE L'OVERFLOW
...| SRVNET_BUFFER #2 | [Buffer Vulnérable] | SRVNET_BUFFER #3 (La Cible) | ...
La copie des donnĂ©es commence. Le paquet est bien plus grand que le âBuffer VulnĂ©rableâ et dĂ©borde, Ă©crasant la structure SRVNET_BUFFER
du bloc voisin (#3
).
1
2
3
4
5
6
7
8
9
# modules/exploits/windows/smb/ms17_010_eternalblue.rb
# Le paquet est construit pour que les données qui débordent contiennent les adresses malveillantes.
when :eb_trans2_exploit
# ...
pkt << "\x41" * 2957 # Remplissage pour atteindre la cible
# ...
# ADRESSE MALVEILLANTE (pour x64) qui va écraser le pointeur de fonction légitime.
# Cette adresse pointe vers le shellcode que l'on a déjà placé dans le bloc #3.
pkt << "\x00\xf1\xdf\xff\xff\xff\xff\xff"
Le schéma de la corruption est le suivant :
1
2
3
4
5
6
7
8
9
10
[Buffer VulnĂ©rable]<---- DONNĂES QUI DĂBORDENT ---->| SRVNET_BUFFER #3 CORROMPUE |
+-----------------------------------+
| Pointeur de Fonction (Handler) |
| AVANT: (Adresse légitime Windows) |
| APRĂS: (Adresse de notre payload) |
+-----------------------------------+
| ... Reste du Bloc #3 ... |
| (Contient déjà notre shellcode !) |
Ătape 3 : LâExĂ©cution du Payload
đ§âđł Analogie
Le chef lit la note corrompue, va à la page indiquée et suit la fausse recette.
đ„ïž Dans la rĂ©alitĂ©
Windows lit le pointeur de fonction modifiĂ©, saute Ă lâadresse du shellcode, et exĂ©cute le code malveillant. Le shellcode, quand il est juste stockĂ© en mĂ©moire, nâest quâune suite dâoctets. Pour le systĂšme, câest de la donnĂ©e, du âtexte. Il est inoffensif. Il pourrait sâagir des pixels dâune image de chat ou dâun poĂšme.
Le âmiracleâ se produit Ă cause du Pointeur dâInstruction du CPU (le registre RIP
).
- Le systÚme, voulant traiter des données, suit le pointeur de fonction corrompu.
- Il dit au CPU : âOK, ta prochaine instruction Ă exĂ©cuter se trouve Ă lâadresse
0xFEEDBEEF
(lâadresse de notre shellcode)â. - Le CPU, qui est une machine bĂȘte et obĂ©issante, dĂ©place son Pointeur dâInstruction (
RIP
) Ă lâadresse0xFEEDBEEF
. - Ă partir de cet instant, le CPU ne considĂšre plus les octets Ă cette adresse comme du âtexteâ ou de la âdonnĂ©eâ. Il les interprĂšte comme sa prochaine commande Ă exĂ©cuter.
Le premier octet du shellcode pourrait ĂȘtre \x55
, ce qui pour le CPU signifie âSauvegarde le registre de base sur la pileâ (PUSH RBP
). Le CPU lâexĂ©cute. Puis il lit lâoctet suivant, et ainsi de suite.
La donnĂ©e est devenue du code exĂ©cutable au moment prĂ©cis oĂč le CPU a reçu lâordre de la considĂ©rer comme sa prochaine instruction
Ătape 4 : Le Payload - La PoupĂ©e Russe
đ§âđł Analogie
La fausse recette indique au chef dâaller voir lâassistant, lui donner une casserole, et placer la vraie recette (reverse shell) dedans.
đ„ïž Dans la rĂ©alitĂ©
Contenu de la âPage 5000â (Le Payload)
Il sâagit du contenu du payload, qui est créé par la fonction make_kernel_user_payload
et placĂ© dans les blocs de âgroomingâ par make_smb2_payload_body_packet
.
Ce payload est une vĂ©ritable âpoupĂ©e russeâ en deux parties :
Partie 1 : Le Shellcode Noyau (Kernel Mode)
Câest le code qui sâexĂ©cute en premier, avec les privilĂšges maximum (Niveau 0 / Ring 0). Il ne peut pas directement lancer cmd.exe
ou un reverse shell. Son travail est de faire le pont vers le monde utilisateur (Niveau 3 / Ring 3).
Son contenu, en langage humain, est le suivant :
- âMets en pause tout ce que tu fais.â
- âParcours la liste de tous les processus qui tournent sur le systĂšme.â
- âPour chaque processus, calcule un
hash
de son nom (ex:ror13_hash('spoolsv.exe')
).â - âCompare ce hash avec le hash que lâattaquant mâa donnĂ© (
proc_hash
).â - âAh ! Jâai trouvĂ© le bon processus (
spoolsv.exe
) !â - âMaintenant, utilise les fonctions du noyau pour allouer une nouvelle page de mĂ©moire Ă lâintĂ©rieur de ce processus.â
- âCopie la deuxiĂšme partie de mon code (le payload final, le reverse shell) dans cette page mĂ©moire.â
- âCrĂ©e un nouveau fil dâexĂ©cution (un âthreadâ) dans le processus
spoolsv.exe
et dis-lui de commencer Ă exĂ©cuter le code que je viens de copier.â - âMon travail est terminĂ©, je nettoie mes traces et je rends la main.â
Partie 2 : Le Payload Final (User Mode - Le Reverse Shell)
Câest le code que tout le monde connaĂźt de Metasploit (ex: windows/x64/meterpreter/reverse_tcp
). Il est ajouté à la fin du shellcode noyau par la ligne sc << ring3
. Une fois que le shellcode noyau lâa injectĂ© et lancĂ© dans spoolsv.exe
, il sâexĂ©cute comme un programme normal et fait ce pour quoi il est conçu :
- âOuvre une connexion rĂ©seau vers lâadresse IP et le port de lâattaquant.â
- âLance un interprĂ©teur de commandes (
cmd.exe
).â - âRedirige toutes les entrĂ©es et sorties de
cmd.exe
vers la connexion rĂ©seau.â - âAttends les commandes de lâattaquant.â
Câest Ă ce moment que la session sâouvre dans Metasploit et que le hacker peut taper des commandes.
En rĂ©sumĂ©, lâexploit est une chaĂźne dâĂ©vĂ©nements brillamment orchestrĂ©e :
- Préparation : Placer le payload (poupée russe) dans des blocs mémoire.
- Corruption : DĂ©clencher un overflow pour remplacer une ânoteâ (un pointeur de fonction) par lâadresse de la premiĂšre partie du payload.
- Exécution Noyau : Le CPU exécute la premiÚre partie, qui agit comme un injecteur.
- ExĂ©cution Utilisateur : Lâinjecteur lance la seconde partie (le reverse shell) dans un processus lĂ©gitime, donnant le contrĂŽle Ă lâattaquant.
Partie 4 : Analyse Technique
Ă prĂ©sent, nous quittons lâanalogie pour dĂ©tailler prĂ©cisĂ©ment le fonctionnement technique.
1. Les fonctions du noyau Windows
- La faille se situe dans le driver
srv.sys
, plus prĂ©cisĂ©ment dans la gestion des requĂȘtes SMBv1 TRANS2 (commande 0x32). - La fonction vulnĂ©rable :
SrvOs2FeaToNt
réalise une copie de la liste FEA dans un buffer alloué selon une taille calculée parSrvOs2FeaListSizeToNt
. Ă cause dâune erreur arithmĂ©tique (overflow entre DWORD et WORD), la taille est sous-estimĂ©e et la mĂ©moire allouĂ©e est trop petite.
2. La structure mémoire cible
- Le buffer vulnérable est alloué dans le Non-Paged Pool du noyau.
- La structure voisine est une instance de
SRVNET_BUFFER
, qui gÚre une connexion SMBv2. - Le champ critique est un pointeur de fonction utilisé par le driver
srvnet.sys
pour dispatcher les opérations réseau, commeSrvNetWskReceiveComplete
.
3. Le dĂ©roulement de lâattaque
- Pool Grooming:
Lâattaquant ouvre et ferme des connexions SMB pour organiser lâordre dâallocation des blocs mĂ©moire. - Trigger de lâoverflow:
En envoyant un paquet TRANS2 malveillant, il force la copie de données dans un buffer trop petit, qui déborde sur la structureSRVNET_BUFFER
voisine. - Corruption du pointeur:
Les octets dĂ©bordants Ă©crasent le pointeur de fonction, le remplaçant par lâadresse du shellcode placĂ© dans le bloc de grooming. - ExĂ©cution du shellcode:
Lors dâune opĂ©ration rĂ©seau ultĂ©rieure, Windows utilise la structure corrompue et appelle la fonction Ă lâadresse de lâattaquant, exĂ©cutant le shellcode en mode noyau. - Injection du payload utilisateur:
Le shellcode noyau injecte le payload final (reverse shell) dans un processus utilisateur (spoolsv.exe
), permettant Ă lâattaquant de prendre le contrĂŽle total du systĂšme.
4. Extraits de code illustratifs (Metasploit)
1
2
3
# Calcul de la taille vulnérable (SrvOs2FeaListSizeToNt)
# Le bug : DWORD - WORD => overflow
# Buffer sous-dimensionné
1
2
# Construction du paquet SMB pour l'overflow :
pkt << "\x00\xf1\xdf\xff\xff\xff\xff\xff" # Nouvelle adresse à la place du pointeur légitime
1
2
3
4
5
6
7
8
# Shellcode injecté :
def make_kernel_user_payload(ring3, proc_name)
proc_hash = generate_process_hash(proc_name)
# Shellcode noyau (injecteur)
sc = ( ... )
# Reverse shell ajouté à la fin
sc << ring3
end
En résumé
EternalBlue est une exploitation de corruption mémoire dans le driver SMB de Windows (srv.sys), utilisant une erreur arithmétique pour provoquer un buffer overflow qui cible la structure voisine SRVNET_BUFFER
.
Lâattaque permet lâexĂ©cution de code arbitraire en mode noyau, qui injecte un payload dans un processus utilisateur, donnant un accĂšs SYSTEM Ă lâattaquant.
DerniĂšre mise Ă jour par Sbihi_Mohammed le 2025-07-29 19:18 UTC