LFI2RCE via Eternal waiting

Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstütze HackTricks

Grundinformationen

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

; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20

Auch die Anzahl der potenziellen Dateinamen beträgt 62*62*62*62*62*62 = 56800235584

Andere Techniken

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.

Ewige Warte-Technik

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:

php -a # open php cli
include("/sys/kernel/security/apparmor/revision");

Apache2

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.

PHP-FMP

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.

Nginx

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)

Support HackTricks

Last updated