Post

EternalBlue

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 (comme SrvNetWskReceiveComplete).
  • 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).

  1. Le systÚme, voulant traiter des données, suit le pointeur de fonction corrompu.
  2. Il dit au CPU : “OK, ta prochaine instruction Ă  exĂ©cuter se trouve Ă  l’adresse 0xFEEDBEEF (l’adresse de notre shellcode)”.
  3. Le CPU, qui est une machine bĂȘte et obĂ©issante, dĂ©place son Pointeur d’Instruction (RIP) Ă  l’adresse 0xFEEDBEEF.
  4. À 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 :

  1. “Mets en pause tout ce que tu fais.”
  2. “Parcours la liste de tous les processus qui tournent sur le systùme.”
  3. “Pour chaque processus, calcule un hash de son nom (ex: ror13_hash('spoolsv.exe')).”
  4. “Compare ce hash avec le hash que l’attaquant m’a donnĂ© (proc_hash).”
  5. “Ah ! J’ai trouvĂ© le bon processus (spoolsv.exe) !”
  6. “Maintenant, utilise les fonctions du noyau pour allouer une nouvelle page de mĂ©moire Ă  l’intĂ©rieur de ce processus.”
  7. “Copie la deuxiĂšme partie de mon code (le payload final, le reverse shell) dans cette page mĂ©moire.”
  8. “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.”
  9. “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 :

  1. “Ouvre une connexion rĂ©seau vers l’adresse IP et le port de l’attaquant.”
  2. “Lance un interprĂ©teur de commandes (cmd.exe).”
  3. “Redirige toutes les entrĂ©es et sorties de cmd.exe vers la connexion rĂ©seau.”
  4. “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 :

  1. Préparation : Placer le payload (poupée russe) dans des blocs mémoire.
  2. Corruption : DĂ©clencher un overflow pour remplacer une “note” (un pointeur de fonction) par l’adresse de la premiĂšre partie du payload.
  3. Exécution Noyau : Le CPU exécute la premiÚre partie, qui agit comme un injecteur.
  4. 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 par SrvOs2FeaListSizeToNt. À 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, comme SrvNetWskReceiveComplete.

3. Le dĂ©roulement de l’attaque

  1. Pool Grooming:
    L’attaquant ouvre et ferme des connexions SMB pour organiser l’ordre d’allocation des blocs mĂ©moire.
  2. 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 structure SRVNET_BUFFER voisine.
  3. 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.
  4. 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.
  5. 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

This post is licensed under CC BY 4.0 by the author.