<summary><strong>Aprende hacking en AWS desde cero hasta experto con</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
Únete al servidor de [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para comunicarte con hackers experimentados y cazadores de recompensas por errores!
Desde [la documentación](https://redis.io/topics/introduction): 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í](https://fossies.org/linux/redis/TLS.md).
Redis es un **protocolo basado en texto**, simplemente puedes **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).
El **primer comando** que podrías probar es **`info`**. **Puede devolver una salida con información** de la instancia de Redis **o algo** como lo siguiente es devuelto:
**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`.\
En casos como este, **necesitarás encontrar credenciales válidas** para interactuar con Redis, por lo que podrías intentar [**brute-force**](../generic-methodologies-and-resources/brute-force.md#redis).\
**En caso de encontrar credenciales válidas, necesitarás autenticar la sesión** después de establecer la conexión con el comando:
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í**](https://redis.io/topics/data-types-intro) **y** [**aquí**](https://lzone.de/cheat-sheet/Redis)**.**
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](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`**
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":
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 recibas el siguiente error `-WRONGTYPE Operation against a key holding the wrong kind of value` al ejecutar `GET <KEY>`, se debe a que la clave puede ser algo distinto a una cadena o un entero y requiere un operador especial para mostrarla.
**Volcar la base de datos con npm** [**redis-dump**](https://www.npmjs.com/package/redis-dump) **o python** [**redis-utils**](https://pypi.org/project/redis-utils/)
Únete al servidor [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para comunicarte con hackers experimentados y cazadores de recompensas por errores!
[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server) puede obtener automáticamente un shell interactivo o un shell inverso en Redis (<=5.0.5).
Información de [**aquí**](https://web.archive.org/web/20191201022931/http://reverse-tcp.xyz/pentest/database/2017/02/09/Redis-Hacking-Tips.html). 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.
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**](https://www.neteye-blog.com/2022/05/cyber-apocalypse-ctf-2022-red-island-writeup/), 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 hacer un DoS sobre el servicio (y esperar que se reinicie automáticamente).
Por favor, ten en cuenta que el resultado de **`config get dir`** puede cambiar después de ejecutar otros comandos de explotación manualmente. 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 de 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:
1. Siguiendo las instrucciones de [https://github.com/n0b0dyCN/RedisModules-ExecuteCommand](https://github.com/n0b0dyCN/RedisModules-ExecuteCommand) puedes **compilar un módulo de redis para ejecutar comandos arbitrarios**.
[**Aquí**](https://www.agarri.fr/blog/archives/2014/09/11/trying\_to\_hack\_redis\_via\_http\_requests/index.html) puedes ver que Redis utiliza el comando **EVAL** para ejecutar código **Lua sandboxed**. En el post vinculado puedes ver **cómo abusarlo** usando la función **dofile**, pero [aparentemente](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval) esto ya no es posible. De todos modos, si puedes **burlar el sandbox Lua** podrías **ejecutar comandos arbitrarios** en el sistema. Además, en el mismo post puedes ver algunas **opciones para causar DoS**.
Todas las operaciones en el redis maestro se sincronizan automáticamente 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.
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.
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 una 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 explotaba 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 las colas** de **gitlab** y abusar de esas colas para **obtener ejecución de código**. El payload de abuso de la cola de Redis es:
_Por alguna razón (como menciona el autor de_ [_https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/_](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/) _de donde se extrajo esta información) la explotación funcionó con el esquema `git` y no con el esquema `http`._
<summary><strong>Aprende a hackear AWS de cero a héroe con</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Si deseas ver a tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).