LFI2RCE via Eternal waiting
Last updated
Last updated
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Standardmäßig, wenn eine Datei in PHP hochgeladen wird (auch wenn sie nicht erwartet wird), wird eine temporäre Datei in /tmp
mit einem Namen wie php[a-zA-Z0-9]{6}
erstellt, obwohl ich einige Docker-Images gesehen habe, bei denen die generierten Dateien keine Ziffern enthalten.
Bei einer lokalen Dateieinfügung, wenn du es schaffst, diese hochgeladene Datei einzufügen, erhältst du RCE.
Beachte, dass PHP standardmäßig nur 20 Dateien in einer einzigen Anfrage hochzuladen erlaubt (festgelegt in /etc/php/<version>/apache2/php.ini
):
Auch die Anzahl der potenziellen Dateinamen beträgt 62*62*62*62*62*62 = 56800235584
Andere Techniken basieren auf dem Angreifen von PHP-Protokollen (Sie werden nicht in der Lage sein, wenn Sie nur den letzten Teil des Pfades kontrollieren), dem Offenlegen des Pfades der Datei, dem Missbrauch erwarteter Dateien oder dem Verursachen eines Segmentierungsfehlers in PHP, sodass hochgeladene temporäre Dateien nicht gelöscht werden. Diese Technik ist sehr ähnlich der letzten, erfordert jedoch kein Finden eines Zero-Day.
In dieser Technik müssen wir nur einen relativen Pfad kontrollieren. Wenn es uns gelingt, Dateien hochzuladen und das LFI niemals enden zu lassen, haben wir "genug Zeit", um hochgeladene Dateien zu brute-forcen und eine der hochgeladenen zu finden.
Vorteile dieser Technik:
Sie müssen nur einen relativen Pfad innerhalb eines Includes kontrollieren
Erfordert kein nginx oder unerwarteten Zugriff auf Protokolldateien
Erfordert keinen 0-Day, um einen Segmentierungsfehler zu verursachen
Erfordert keine Pfadoffenlegung
Die Hauptprobleme dieser Technik sind:
Es müssen spezifische Datei(en) vorhanden sein (es könnten mehr sein)
Die wahnsinnige Anzahl potenzieller Dateinamen: 56800235584
Wenn der Server keine Ziffern verwendet, beträgt die gesamte potenzielle Anzahl: 19770609664
Standardmäßig können nur 20 Dateien in einer einzelnen Anfrage hochgeladen werden.
Die maximale Anzahl paralleler Worker des verwendeten Servers.
Diese Grenze zusammen mit den vorherigen kann diesen Angriff zu lange dauern lassen
Timeout für eine PHP-Anfrage. Idealerweise sollte dies ewig dauern oder den PHP-Prozess beenden, ohne die temporär hochgeladenen Dateien zu löschen, andernfalls wird dies auch ein Problem sein
Wie kann man also eine PHP-Include niemals enden lassen? Indem man einfach die Datei /sys/kernel/security/apparmor/revision
einfügt (leider nicht in Docker-Containern verfügbar...).
Versuchen Sie es einfach, indem Sie aufrufen:
Standardmäßig unterstützt Apache 150 gleichzeitige Verbindungen. Laut https://ubiq.co/tech-blog/increase-max-connections-apache/ ist es möglich, diese Zahl auf bis zu 8000 zu erhöhen. Folgen Sie diesem Link, um PHP mit diesem Modul zu verwenden: https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04.
Standardmäßig (wie ich in meinen Tests sehen kann) kann ein PHP-Prozess ewig dauern.
Lassen Sie uns einige Berechnungen anstellen:
Wir können 149 Verbindungen verwenden, um 149 * 20 = 2980 temporäre Dateien mit unserem Webshell zu generieren.
Dann verwenden wir die letzte Verbindung, um Brute-Force potenzielle Dateien.
Bei einer Geschwindigkeit von 10 Anfragen/s sind die Zeiten:
56800235584 / 2980 / 10 / 3600 ~= 530 Stunden (50% Chance in 265h)
(ohne Ziffern) 19770609664 / 2980 / 10 / 3600 ~= 185h (50% Chance in 93h)
Beachten Sie, dass wir im vorherigen Beispiel andere Clients vollständig DoSen!
Wenn der Apache-Server verbessert wird und wir 4000 Verbindungen missbrauchen könnten (auf halbem Weg zur maximalen Anzahl). Wir könnten 3999*20 = 79980
Dateien erstellen und die Zahl würde auf etwa 19,7h oder 6,9h (10h, 3,5h 50% Chance) reduziert werden.
Wenn anstelle des regulären PHP-Moduls für Apache, um PHP-Skripte auszuführen, die Webseite PHP-FMP verwendet (dies verbessert die Effizienz der Webseite, daher ist es üblich, es zu finden), gibt es noch etwas anderes, das getan werden kann, um die Technik zu verbessern.
PHP-FMP ermöglicht es, den Parameter request_terminate_timeout
in /etc/php/<php-version>/fpm/pool.d/www.conf
zu konfigurieren.
Dieser Parameter gibt die maximale Anzahl von Sekunden an, wann die Anfrage an PHP beendet werden muss (standardmäßig unendlich, aber 30s, wenn der Parameter nicht auskommentiert ist). Wenn eine Anfrage von PHP verarbeitet wird, wird die angegebene Anzahl von Sekunden abgebrochen. Das bedeutet, dass, wenn die Anfrage temporäre Dateien hochgeladen hat, weil die PHP-Verarbeitung gestoppt wurde, diese Dateien nicht gelöscht werden. Daher, wenn Sie eine Anfrage so lange aufrechterhalten können, können Sie tausende von temporären Dateien generieren, die nicht gelöscht werden, was den Prozess der Auffindung beschleunigt und die Wahrscheinlichkeit eines DoS auf der Plattform verringert, indem alle Verbindungen verbraucht werden.
Um also DoS zu vermeiden, nehmen wir an, dass ein Angreifer nur 100 Verbindungen gleichzeitig verwenden wird und die maximale Verarbeitungszeit von PHP durch php-fmp (request_terminate_timeout
) 30s beträgt. Daher beträgt die Anzahl der temporären Dateien, die pro Sekunde generiert werden können, 100*20/30 = 66.67
.
Um 10000 Dateien zu generieren, würde ein Angreifer benötigen: 10000/66.67 = 150s
(um 100000 Dateien zu generieren, würde die Zeit 25min betragen).
Dann könnte der Angreifer diese 100 Verbindungen verwenden, um eine Brute-Force-Suche durchzuführen. **** Bei einer Geschwindigkeit von 300 req/s beträgt die benötigte Zeit für die Ausnutzung Folgendes:
56800235584 / 10000 / 300 / 3600 ~= 5.25 Stunden (50% Chance in 2.63h)
(mit 100000 Dateien) 56800235584 / 100000 / 300 / 3600 ~= 0.525 Stunden (50% Chance in 0.263h)
Ja, es ist möglich, 100000 temporäre Dateien in einer EC2-Medium-Instanz zu generieren:
Beachten Sie, dass es ausreicht, die verwundbare LFI-Seite einzuschließen, um den Timeout auszulösen, sodass sie in eine ewige Einschluss-Schleife eintritt.
Es scheint, dass Nginx standardmäßig 512 parallele Verbindungen gleichzeitig unterstützt (und diese Zahl kann verbessert werden).
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)