6379 - Pentesting Redis
Únete al servidor de HackenProof Discord para comunicarte con hackers experimentados y cazadores de recompensas por errores!
Perspectivas de Hacking Involúcrate con contenido que profundiza en la emoción y los desafíos del hacking
Noticias de Hacking en Tiempo Real Mantente actualizado con el mundo del hacking a través de noticias e información en tiempo real
Últimos Anuncios Mantente informado sobre los nuevos programas de recompensas por errores que se lanzan y las actualizaciones cruciales de la plataforma
Únete a nosotros en Discord y comienza a colaborar con los mejores hackers hoy!
Información Básica
Desde la documentación: Redis es un almacén de estructuras de datos en memoria, de código abierto (licencia BSD), utilizado como base de datos, caché y broker de mensajes.
Por defecto, Redis utiliza un protocolo basado en texto plano, pero debes tener en cuenta que también puede implementar ssl/tls. Aprende cómo ejecutar Redis con ssl/tls aquí.
Puerto predeterminado: 6379
Enumeración Automática
Algunas herramientas automatizadas que pueden ayudar a obtener información de una instancia de redis:
Enumeración Manual
Banner
Redis es un protocolo basado en texto, puedes simplemente enviar el comando en un socket y los valores devueltos serán legibles. También recuerda que Redis puede ejecutarse utilizando ssl/tls (pero esto es muy raro).
En una instancia regular de Redis puedes simplemente conectarte usando nc
o también podrías usar redis-cli
:
El primer comando que podrías probar es info
. Puede devolver una salida con información de la instancia de Redis o algo similar a lo siguiente es devuelto:
En este último caso, esto significa que necesitas credenciales válidas para acceder a la instancia de Redis.
Autenticación de Redis
Por defecto Redis se puede acceder sin credenciales. Sin embargo, se puede configurar para admitir solo contraseña o usuario + contraseña.
Es posible establecer una contraseña en el archivo redis.conf con el parámetro requirepass
o temporalmente hasta que el servicio se reinicie conectándose a él y ejecutando: config set requirepass p@ss$12E45
.
Además, se puede configurar un nombre de usuario en el parámetro masteruser
dentro del archivo redis.conf.
Si solo se configura la contraseña, el nombre de usuario utilizado es "default". Además, ten en cuenta que no hay forma de saber externamente si Redis se configuró solo con contraseña o usuario + contraseña.
En casos como este, necesitarás encontrar credenciales válidas para interactuar con Redis, por lo que podrías intentar brute-force. En caso de encontrar credenciales válidas, necesitarás autenticar la sesión después de establecer la conexión con el comando:
Credenciales válidas serán respondidas con: +OK
Enumeración autenticada
Si el servidor Redis permite conexiones anónimas o si has obtenido credenciales válidas, puedes iniciar el proceso de enumeración del servicio utilizando los siguientes comandos:
Otros comandos de Redis se pueden encontrar aquí y aquí.
Tenga en cuenta que los comandos de Redis de una instancia pueden ser renombrados o eliminados en el archivo redis.conf. Por ejemplo, esta línea eliminará el comando FLUSHDB:
Más información sobre cómo configurar de forma segura un servicio de Redis aquí: https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04
También puedes monitorizar en tiempo real los comandos de Redis ejecutados con el comando monitor
o obtener las 25 consultas más lentas con slowlog get 25
Encuentra más información interesante sobre otros comandos de Redis aquí: https://lzone.de/cheat-sheet/Redis
Volcado de base de datos
Dentro de Redis, las bases de datos son números que empiezan desde 0. Puedes ver si alguna está en uso en la salida del comando info
dentro del bloque "Keyspace":
O simplemente puedes obtener todos los keyspaces (bases de datos) con:
En ese ejemplo se están utilizando la base de datos 0 y 1. La base de datos 0 contiene 4 claves y la base de datos 1 contiene 1. Por defecto, Redis utilizará la base de datos 0. Para volcar, por ejemplo, la base de datos 1, debes hacer lo siguiente:
En caso de que obtengas el siguiente error -WRONGTYPE Operación contra una clave que contiene un tipo de valor incorrecto
mientras ejecutas GET <KEY>
es porque la clave puede ser algo distinto a una cadena o un entero y requiere un operador especial para mostrarlo.
Para conocer el tipo de la clave, utiliza el comando TYPE
, ejemplo a continuación para claves de lista y hash.
Volcar la base de datos con npm redis-dump o python redis-utils
Únete al servidor HackenProof Discord para comunicarte con hackers experimentados y cazadores de recompensas por errores!
Perspectivas de Hacking Participa en contenido que explora la emoción y los desafíos del hacking
Noticias de Hacking en Tiempo Real Mantente al día con el mundo del hacking a través de noticias e información en tiempo real
Últimos Anuncios Mantente informado sobre los nuevos programas de recompensas por errores que se lanzan y las actualizaciones cruciales de la plataforma
Únete a nosotros en Discord ¡y comienza a colaborar con los mejores hackers hoy!
RCE de Redis
Shell Interactivo
redis-rogue-server puede obtener automáticamente un shell interactivo o un shell inverso en Redis (<=5.0.5).
PHP Webshell
Información de aquí. Debes conocer la ruta de la carpeta del sitio web:
Si la excepción de acceso a la webshell, puedes vaciar la base de datos después de hacer una copia de seguridad e intentarlo de nuevo, recuerda restaurar la base de datos.
Plantilla Webshell
Al igual que en la sección anterior, también podrías sobrescribir algún archivo de plantilla html que vaya a ser interpretado por un motor de plantillas y obtener una shell.
Por ejemplo, siguiendo este informe, puedes ver que el atacante inyectó una shell inversa en un html interpretado por el motor de plantillas nunjucks:
Ten en cuenta que varios motores de plantillas almacenan en caché las plantillas en memoria, por lo que incluso si las sobrescribes, la nueva no se ejecutará. En estos casos, o el desarrollador dejó activa la recarga automática o necesitas realizar un ataque de denegación de servicio (DoS) sobre el servicio (y esperar a que se reinicie automáticamente).
SSH
Ejemplo desde aquí
Por favor ten en cuenta que el resultado de config get dir
puede cambiar después de ejecutar otros comandos de explotación manual. Se sugiere ejecutarlo primero justo después de iniciar sesión en Redis. En la salida de config get dir
podrías encontrar el directorio raíz del usuario redis (generalmente /var/lib/redis o /home/redis/.ssh), y al saber esto sabrás dónde puedes escribir el archivo authenticated_users
para acceder vía ssh con el usuario redis. Si conoces el directorio raíz de otro usuario válido donde tengas permisos de escritura, también puedes abusar de ello:
Genera un par de claves pública-privada ssh en tu computadora:
ssh-keygen -t rsa
Escribe la clave pública en un archivo:
(echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt
Importa el archivo a redis:
cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key
Guarda la clave pública en el archivo authorized_keys en el servidor de redis:
Finalmente, puedes hacer ssh al servidor de redis con la clave privada: ssh -i id_rsa redis@10.85.0.52
Esta técnica está automatizada aquí: https://github.com/Avinash-acid/Redis-Server-Exploit
Crontab
El último ejemplo es para Ubuntu, para Centos, el comando anterior debería ser: redis-cli -h 10.85.0.52 config set dir /var/spool/cron/
Este método también se puede utilizar para ganar bitcoin: yam
Cargar Módulo Redis
Siguiendo las instrucciones de https://github.com/n0b0dyCN/RedisModules-ExecuteCommand puedes compilar un módulo redis para ejecutar comandos arbitrarios.
Luego necesitas alguna forma de subir el módulo compilado.
Cargar el módulo subido en tiempo de ejecución con
MODULE LOAD /ruta/a/mymodule.so
.Listar los módulos cargados para verificar que se cargó correctamente:
MODULE LIST
.Ejecutar comandos:
Descargar el módulo cuando lo desees:
MODULE UNLOAD mymodule
Bypass del sandbox LUA
Aquí puedes ver que Redis utiliza el comando EVAL para ejecutar código Lua en un entorno seguro. En el post vinculado puedes ver cómo abusarlo usando la función dofile, pero aparentemente esto ya no es posible. De todos modos, si puedes burlar el sandbox de Lua, podrías ejecutar comandos arbitrarios en el sistema. Además, en el mismo post puedes ver algunas opciones para causar una denegación de servicio (DoS).
Algunos CVEs para escapar de LUA:
Módulo Maestro-Esclavo
El redis maestro sincroniza automáticamente todas las operaciones con el redis esclavo, lo que significa que podemos considerar la vulnerabilidad redis como un redis esclavo, conectado al redis maestro que controlamos, luego podemos ingresar comandos en nuestro propio redis.
SSRF hablando con Redis
Si puedes enviar una solicitud en texto claro a Redis, puedes comunicarte con él ya que Redis leerá línea por línea la solicitud y simplemente responderá con errores a las líneas que no entienda:
Por lo tanto, si encuentras una vulnerabilidad de SSRF en un sitio web y puedes controlar algunos encabezados (quizás con una vulnerabilidad de CRLF) o parámetros POST, podrás enviar comandos arbitrarios a Redis.
Ejemplo: Gitlab SSRF + CRLF a Shell
En Gitlab11.4.7 se descubrió una vulnerabilidad de SSRF y una de CRLF. La vulnerabilidad de SSRF estaba en la funcionalidad de importación de proyectos desde URL al crear un nuevo proyecto y permitía acceder a IPs arbitrarias en la forma [0:0:0:0:0:ffff:127.0.0.1] (esto accederá a 127.0.0.1), y la vulnerabilidad de CRLF se explotó simplemente agregando los caracteres %0D%0A a la URL.
Por lo tanto, era posible abusar de estas vulnerabilidades para comunicarse con la instancia de Redis que gestiona colas desde gitlab y abusar de esas colas para obtener ejecución de código. El payload de abuso de la cola de Redis es:
Y la solicitud de codificación de URL abusando de SSRF y CRLF para ejecutar un whoami
y enviar la salida a través de nc
es:
Por alguna razón (como para el autor de https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/ de donde se tomó esta información) la explotación funcionó con el esquema git
y no con el esquema http
.
Únete al servidor de HackenProof Discord para comunicarte con hackers experimentados y cazadores de bugs!
Perspectivas de Hacking Involúcrate con contenido que profundiza en la emoción y desafíos del hacking
Noticias de Hacking en Tiempo Real Mantente actualizado con el mundo del hacking a través de noticias e información en tiempo real
Últimos Anuncios Mantente informado sobre los nuevos programas de recompensas por bugs que se lanzan y actualizaciones cruciales de plataformas
Únete a nosotros en Discord ¡y comienza a colaborar con los mejores hackers hoy!
Última actualización