* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
La función `preg_replace` es una función de PHP que se utiliza para buscar y reemplazar texto utilizando expresiones regulares. Esta función es muy útil para realizar operaciones de búsqueda y reemplazo en cadenas de texto complejas.
La sintaxis básica de la función `preg_replace` es la siguiente:
Donde `$pattern` es la expresión regular que se utilizará para buscar el texto, `$replacement` es el texto que se utilizará para reemplazar el texto encontrado y `$subject` es la cadena de texto en la que se realizará la búsqueda y el reemplazo.
Es importante tener en cuenta que la función `preg_replace` puede ser utilizada para realizar ataques de inyección de código si no se utiliza de manera segura. Por lo tanto, es recomendable deshabilitar esta función en entornos de producción utilizando la directiva `disable_functions` o la directiva `open_basedir`.
**mail / mb\_send\_mail** - Esta función se utiliza para enviar correos electrónicos, pero también se puede abusar de ella para inyectar comandos arbitrarios dentro del parámetro `$options`. Esto se debe a que la **función `mail` de php** suele llamar al binario `sendmail` dentro del sistema y permite **poner opciones adicionales**. Sin embargo, no podrás ver la salida del comando ejecutado, por lo que se recomienda crear un script de shell que escriba la salida en un archivo, ejecutarlo usando mail y mostrar la salida:
**dl** - Esta función se puede utilizar para cargar dinámicamente una extensión de PHP. Esta función no siempre estará presente, por lo que debe verificar si está disponible antes de intentar explotarla. Lee [esta página para aprender cómo explotar esta función](disable\_functions-bypass-dl-function.md).
Aparte de eval, hay otras formas de ejecutar código PHP: include/require se pueden utilizar para la ejecución remota de código en forma de vulnerabilidades de inclusión de archivos locales y remotos.\
**${\<php code>}** - Si su entrada se refleja en cualquier cadena PHP, se ejecutará.\
**Las funciones deshabilitadas** son la configuración que se puede configurar en los archivos `.ini` en PHP que **prohibirán** el uso de las **funciones** indicadas. **Open basedir** es la configuración que indica a PHP la carpeta a la que puede acceder.\
La configuración de PHP solía configurarse en la ruta _/etc/php7/conf.d_ o similar.
`open_basedir` configurará las carpetas a las que PHP puede acceder, no podrá escribir/leer/ejecutar ningún archivo fuera de esas carpetas, pero tampoco podrá listar otros directorios.\
Sin embargo, si de alguna manera puede ejecutar código PHP arbitrario, puede **intentar** el siguiente fragmento de **código** para intentar **burlar** la restricción.
Tenga en cuenta que lo primero que debe hacer es encontrar dónde está el **socket unix de php-fpm**. Por lo general, se encuentra en `/var/run`, por lo que puede **usar el código anterior para listar el directorio y encontrarlo**.\
Código de [aquí](https://balsn.tw/ctf\_writeup/20190323-0ctf\_tctf2019quals/#wallbreaker-easy).
Este script se comunicará con el **socket Unix de php-fpm** (generalmente ubicado en /var/run si se utiliza fpm) para ejecutar código arbitrario. La configuración de `open_basedir` será sobrescrita por el atributo **PHP\_VALUE** que se envía.\
Observe cómo se utiliza `eval` para ejecutar el código PHP que se envía dentro del parámetro **cmd**.\
También observe la **línea 324 comentada**, puede descomentarla y el **payload se conectará automáticamente a la URL dada y ejecutará el código PHP** contenido allí.\
Simplemente acceda a `http://vulnerable.com:1337/l.php?cmd=echo file_get_contents('/etc/passwd');` para obtener el contenido del archivo `/etc/passwd`.
Puede estar pensando que de la misma manera en que hemos sobrescrito la configuración de `open_basedir`, podemos **sobrescribir `disable_functions`**. Bueno, inténtelo, pero no funcionará, aparentemente **`disable_functions` solo se puede configurar en un archivo de configuración `.ini` de php** y los cambios que realice usando PHP\_VALUE no serán efectivos en esta configuración específica.
Si logra tener código PHP ejecutándose dentro de una máquina, probablemente querrá pasar al siguiente nivel y **ejecutar comandos del sistema arbitrarios**. En esta situación, es habitual descubrir que la mayoría o todas las **funciones** de PHP que permiten **ejecutar comandos del sistema han sido deshabilitadas** en **`disable_functions`.**\
Entonces, veamos cómo puede evitar esta restricción (si puede).
Puede utilizar la herramienta [https://github.com/teambi0s/dfunc-bypasser](https://github.com/teambi0s/dfunc-bypasser) y le indicará qué función (si hay alguna) puede usar para **bypass****`disable_functions`**.
Simplemente vuelva al principio de esta página y **verifique si alguna de las funciones que ejecutan comandos no está deshabilitada y está disponible en el entorno**. Si encuentra al menos una, podrá usarla para ejecutar comandos del sistema arbitrarios.
Es bien sabido que algunas funciones en PHP como `mail()` van a **ejecutar binarios dentro del sistema**. Por lo tanto, puede abusar de ellas utilizando la variable de entorno `LD_PRELOAD` para hacer que carguen una biblioteca arbitraria que pueda ejecutar cualquier cosa.
2.`mb_send_mail`: Si su sistema tiene instalado el módulo `php-mbstring`, entonces esta función se puede usar para evitar las `disable_functions` de PHP.
3.`imap_mail`: Si su sistema tiene instalado el módulo `php-imap`, entonces esta función también se puede usar para evitar las `disable_functions` de PHP.
4.`libvirt_connect`: Si su sistema tiene instalado el módulo `php-libvirt-php`, entonces esta función también se puede usar para evitar las `disable_functions`.
5.`gnupg_init`: Si su sistema tiene instalado el módulo `php-gnupg`, entonces esta función también se puede usar para evitar las `disable_functions`.
6.`new imagick()`: Puede [**encontrar aquí un writeup**](https://blog.bi0s.in/2019/10/23/Web/BSidesDelhi19-evalme/) para aprender cómo abusar de esta clase.
Puede encontrar [**aquí**](https://github.com/tarunkant/fuzzphunc/blob/master/lazyFuzzer.py) el script de fuzzing que se utilizó para encontrar esas funciones.
Para aprovechar esta mala configuración, puedes usar [**Chankro**](https://github.com/TarlogicSecurity/Chankro). Esta es una herramienta que generará un **exploit de PHP** que debes cargar en el servidor vulnerable y ejecutarlo (acceder a él a través de la web).\
**Chankro** escribirá en el disco del servidor víctima la **biblioteca y la shell inversa** que deseas ejecutar y utilizará el truco de **`LD_PRELOAD` + la función `mail()` de PHP** para ejecutar la shell inversa.
Ten en cuenta que para usar **Chankro**, `mail` y `putenv`**no pueden aparecer en la lista de `disable_functions`**.\
En el siguiente ejemplo puedes ver cómo **crear un exploit de chankro** para **arch 64**, que ejecutará `whoami` y guardará la salida en _/tmp/chankro\_shell.out_, chankro escribirá la **biblioteca y el payload** en _/tmp_ y el **exploit final** se llamará **bicho.php** (ese es el archivo que debes cargar en el servidor víctima):
# Funciones útiles de PHP para bypass de `disable_functions` y `open_basedir`
## Introducción
En algunas situaciones, cuando se está realizando una prueba de penetración, se puede encontrar que la función `disable_functions` de PHP está habilitada en el servidor. Esta función se utiliza para deshabilitar ciertas funciones de PHP que pueden ser peligrosas o inseguras. Por ejemplo, la función `exec()` se utiliza para ejecutar comandos en el sistema operativo subyacente, lo que puede ser peligroso si se utiliza de manera incorrecta. Si `exec()` está en la lista de funciones deshabilitadas, no se podrá utilizar en el código PHP.
Otra restricción común que se encuentra en los servidores web es la configuración `open_basedir`. Esta configuración limita el acceso del código PHP a un conjunto específico de directorios en el sistema de archivos. Si se intenta acceder a un archivo fuera de estos directorios, se producirá un error.
En este artículo, se presentan algunas funciones útiles de PHP que se pueden utilizar para eludir estas restricciones.
## Funciones útiles
### `dl()`
La función `dl()` se utiliza para cargar una extensión de PHP en tiempo de ejecución. Si la función `dl()` no está deshabilitada, se puede utilizar para cargar una extensión que permita la ejecución de comandos en el sistema operativo subyacente.
```php
dl("nombre_de_la_extension.so");
```
### `proc_open()`
La función `proc_open()` se utiliza para ejecutar un comando en el sistema operativo subyacente y obtener un controlador de proceso para interactuar con él. Si la función `exec()` está deshabilitada, se puede utilizar `proc_open()` para ejecutar comandos en el sistema operativo subyacente.
```php
$descriptorspec = array(
0 => array("pipe", "r"), // stdin es una tubería donde el proceso va a leer
1 => array("pipe", "w"), // stdout es una tubería donde el proceso va a escribir
2 => array("pipe", "w") // stderr es una tubería donde el proceso va a escribir
La función `popen()` se utiliza para ejecutar un comando en el sistema operativo subyacente y obtener un controlador de archivo para interactuar con él. Si la función `exec()` está deshabilitada, se puede utilizar `popen()` para ejecutar comandos en el sistema operativo subyacente.
```php
$handle = popen("comando_a_ejecutar", "r");
echo fread($handle, 8192);
pclose($handle);
```
### `system()`
La función `system()` se utiliza para ejecutar un comando en el sistema operativo subyacente y mostrar la salida. Si la función `exec()` está deshabilitada, se puede utilizar `system()` para ejecutar comandos en el sistema operativo subyacente.
```php
system("comando_a_ejecutar");
```
### `passthru()`
La función `passthru()` se utiliza para ejecutar un comando en el sistema operativo subyacente y mostrar la salida directamente en el navegador. Si la función `exec()` está deshabilitada, se puede utilizar `passthru()` para ejecutar comandos en el sistema operativo subyacente.
```php
passthru("comando_a_ejecutar");
```
### `shell_exec()`
La función `shell_exec()` se utiliza para ejecutar un comando en el sistema operativo subyacente y devolver la salida como una cadena. Si la función `exec()` está deshabilitada, se puede utilizar `shell_exec()` para ejecutar comandos en el sistema operativo subyacente.
```php
echo shell_exec("comando_a_ejecutar");
```
### `escapeshellcmd()`
La función `escapeshellcmd()` se utiliza para escapar los caracteres especiales en un comando que se va a ejecutar en el sistema operativo subyacente. Esto es importante para evitar la inyección de comandos. Si la función `exec()` está deshabilitada, se puede utilizar `escapeshellcmd()` para escapar los caracteres especiales en un comando que se va a ejecutar.
```php
$command = escapeshellcmd($_GET["command"]);
system($command);
```
### `escapeshellarg()`
La función `escapeshellarg()` se utiliza para escapar los caracteres especiales en un argumento que se va a pasar a un comando que se va a ejecutar en el sistema operativo subyacente. Esto es importante para evitar la inyección de comandos. Si la función `exec()` está deshabilitada, se puede utilizar `escapeshellarg()` para escapar los caracteres especiales en un argumento que se va a pasar a un comando que se va a ejecutar.
```php
$arg = escapeshellarg($_GET["arg"]);
system("comando_a_ejecutar " . $arg);
```
## Conclusión
En este artículo, se han presentado algunas funciones útiles de PHP que se pueden utilizar para eludir las restricciones de `disable_functions` y `open_basedir`. Es importante tener en cuenta que estas funciones pueden ser peligrosas si se utilizan de manera incorrecta y que se deben utilizar con precaución.
Si encuentra que la función **mail** está bloqueada por funciones deshabilitadas, aún puede usar la función **mb\_send\_mail**.\
Más información sobre esta técnica y Chankro aquí: [https://www.tarlogic.com/en/blog/how-to-bypass-disable\_functions-and-open\_basedir/](https://www.tarlogic.com/en/blog/how-to-bypass-disable\_functions-and-open\_basedir/)
Tenga en cuenta que usando **PHP** puede **leer y escribir archivos, crear directorios y cambiar permisos**.\
Incluso puede **volcar bases de datos**.\
Tal vez usando **PHP** para **enumerar** la caja, puede encontrar una manera de escalar privilegios/ejecutar comandos (por ejemplo, leyendo alguna clave ssh privada).
He creado una webshell que hace que sea muy fácil realizar estas acciones (tenga en cuenta que la mayoría de las webshells también le ofrecerán estas opciones): [https://github.com/carlospolop/phpwebshelllimited](https://github.com/carlospolop/phpwebshelllimited)