
Exploit for CVE-2019-11043
Dies ist ein Exploit für einen Fehler in php-fpm (CVE-2019-11043). In bestimmten nginx + php-fpm-Konfigurationen kann der Fehler von außen ausgelöst werden. Das bedeutet, dass ein Web-Benutzer Code-Ausführung erlangen kann, wenn Sie eine verwundbare Konfiguration haben (siehe unten).
Da wir zu faul waren, ein Writeup zu schreiben, hat Orange Tsai eine perfekte Analyse in seinem Blog veröffentlicht. Ein Lob 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;
...
}
welcher zudem jegliche Skript-Existenzprüfungen (wie try_files) vermissen lässt, dann können Sie dies wahrscheinlich mit diesem Sploit hacken.
location ~ [^/]\.php(/|$) muss an php-fpm weitergeleitet werden (vielleicht kann der Regexp strenger sein, siehe #1).PATH_INFO-Variablenzuweisung über die Anweisung fastcgi_param PATH_INFO $fastcgi_path_info; geben. Außerdem muss SCRIPT_FILENAME mit fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; gesetzt sein (es könnte auch ein konstanter Pfad anstelle von $document_root sein). Zunächst dachten wir, dass diese immer in der fastcgi_params-Datei vorhanden sind, aber das stimmt nicht.PATH_INFO auf einen leeren Wert zu setzen. Dieser Exploit geht davon aus, dass die fastcgi_split_path_info-Direktive vorhanden ist und einen Regexp enthält, der mit ^ beginnt und mit $ endet, sodass versucht wird, den Regexp mit einem Zeilenumbruchzeichen zu brechen.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 herum behoben.
Das aktuelle erfordert keinen Datei-Upload, funktioniert in den neuesten Versionen (bis der Fix veröffentlicht wurde), und vor allem ist der Exploit 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 benötigen möglicherweise mehrere Wiederholungen).
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-Verzeichnis.docker build -t reproduce-cve-2019-11043 .. Dies dauert lange, da es intern das PHP-Repository klont und aus dem Quellcode baut. Auf diese Weise wird es jedoch einfacher, wenn Sie den Exploit debuggen möchten. Die erstellte Revision ist die unmittelbar 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-Container nginx und php-fpm. Konfigurieren Sie den Server-Block wie in dieser Konfiguration. Erstellen Sie eine leere Datei /var/www/html/index.php.attacker-Container 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 es mehrmals, 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 Buffer-Underflow in php-fpm ist in PHP-Version 5 vorhanden. Dieser Exploit nutzt jedoch 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 Exploitationstechnik 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 die Möglichkeit, php.ini-Optionen zu setzen. Endgültige php.ini-Optionen gefunden von beched.
Dieser Exploit wird unter den Bedingungen der MIT-Lizenz verteilt.
Verzichten Sie darauf, mit diesem Exploit Schaden anzurichten. Aber wenn Sie wirklich etwas mit diesem Ding hacken, werde ich mich freuen.
PATH_INFO nach REQUEST_URI in der Konfiguration gesetzt wird.try_files $uri =404 oder if (-f $uri). Wenn Nginx Anfragen an nicht existierende Skripte vor dem FastCGI-Forwarding ablehnt, erreichen unsere Anfragen nie php-fpm. Dies hinzuzufügen ist auch der einfachste Weg, um zu patchen.