<summary><strong>Aprenda hacking AWS do zero ao herói com</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
Junte-se ao servidor [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) para se comunicar com hackers experientes e caçadores de recompensas por bugs!
De [a documentação](https://redis.io/topics/introduction): Redis é um armazenamento de **estrutura de dados em memória**, de código aberto (licença BSD), usado como um **banco de dados**, cache e corretor de mensagens.
Por padrão, o Redis usa um protocolo baseado em texto simples, mas você deve ter em mente que também pode implementar **ssl/tls**. Aprenda como [executar o Redis com ssl/tls aqui](https://fossies.org/linux/redis/TLS.md).
O Redis é um **protocolo baseado em texto**, você pode simplesmente **enviar o comando em um socket** e os valores retornados serão legíveis. Lembre-se também de que o Redis pode ser executado usando **ssl/tls** (mas isso é muito estranho).
O **primeiro comando** que você poderia tentar é **`info`**. Ele **pode retornar a saída com informações** da instância do Redis **ou algo** como o seguinte é retornado:
**Por padrão**, o Redis pode ser acessado **sem credenciais**. No entanto, ele pode ser **configurado** para suportar **apenas senha ou nome de usuário + senha**.\
É possível **definir uma senha** no arquivo _**redis.conf**_ com o parâmetro `requirepass`**ou temporariamente** até que o serviço reinicie conectando-se a ele e executando: `config set requirepass p@ss$12E45`.\
Em casos como este, você precisará **encontrar credenciais válidas** para interagir com o Redis, então você poderia tentar [**força bruta**](../generic-methodologies-and-resources/brute-force.md#redis) nisso.\
Se o servidor Redis permitir **conexões anônimas** ou se você obteve credenciais válidas, você pode iniciar o processo de enumeração do serviço usando os seguintes **comandos**:
**Outros comandos do Redis** [**podem ser encontrados aqui**](https://redis.io/topics/data-types-intro) **e** [**aqui**](https://lzone.de/cheat-sheet/Redis)**.**
Note que os **comandos do Redis de uma instância podem ser renomeados** ou removidos no arquivo _redis.conf_. Por exemplo, esta linha removerá o comando FLUSHDB:
Mais sobre configurar de forma segura um serviço Redis aqui: [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)
Você também pode **monitorar em tempo real os comandos Redis** executados com o comando **`monitor`** ou obter os **25 queries mais lentos** com **`slowlog get 25`**
Dentro do Redis, os **bancos de dados são números que começam a partir de 0**. Você pode verificar se algum está sendo usado na saída do comando `info` dentro do bloco "Keyspace":
Nesse exemplo, o **banco de dados 0 e 1** estão sendo usados. **O banco de dados 0 contém 4 chaves e o banco de dados 1 contém 1**. Por padrão, o Redis usará o banco de dados 0. Para fazer o dump, por exemplo, do banco de dados 1, você precisa fazer:
No caso de você receber o seguinte erro `-WRONGTYPE Operation against a key holding the wrong kind of value` ao executar `GET <KEY>`, é porque a chave pode ser algo diferente de uma string ou um inteiro e requer um operador especial para exibi-la.
**Despeje o banco de dados com npm** [**redis-dump**](https://www.npmjs.com/package/redis-dump) **ou python** [**redis-utils**](https://pypi.org/project/redis-utils/)
[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server) pode automaticamente obter um shell interativo ou um shell reverso no Redis (<=5.0.5).
Informações de [**aqui**](https://web.archive.org/web/20191201022931/http://reverse-tcp.xyz/pentest/database/2017/02/09/Redis-Hacking-Tips.html). Você deve saber o **caminho** da **pasta do site**:
Assim como na seção anterior, você também pode sobrescrever algum arquivo de modelo html que será interpretado por um mecanismo de modelo e obter um shell.
Por exemplo, seguindo [**este artigo**](https://www.neteye-blog.com/2022/05/cyber-apocalypse-ctf-2022-red-island-writeup/), você pode ver que o atacante injetou um **shell reverso em um html** interpretado pelo **mecanismo de modelo nunjucks:**
Note que **vários motores de modelo armazenam em cache** os modelos na **memória**, então mesmo que você os sobrescreva, o novo **não será executado**. Nestes casos, ou o desenvolvedor deixou a recarga automática ativa ou você precisa fazer um DoS sobre o serviço (e esperar que ele seja reiniciado automaticamente).
Por favor, esteja ciente de que o resultado de **`config get dir`** pode ser alterado após outros comandos de exploração manual. Sugiro executá-lo primeiro logo após fazer login no Redis. No resultado de **`config get dir`** você pode encontrar o **diretório home** do **usuário redis** (geralmente _/var/lib/redis_ ou _/home/redis/.ssh_), e sabendo disso você sabe onde pode escrever o arquivo `authenticated_users` para acessar via ssh **com o usuário redis**. Se você souber o diretório home de outro usuário válido onde você tem permissões de escrita, você também pode abusar disso:
1. Seguindo as instruções de [https://github.com/n0b0dyCN/RedisModules-ExecuteCommand](https://github.com/n0b0dyCN/RedisModules-ExecuteCommand) você pode **compilar um módulo redis para executar comandos arbitrários**.
2. Em seguida, você precisa de alguma forma de **fazer upload do módulo compilado**
[**Aqui**](https://www.agarri.fr/blog/archives/2014/09/11/trying\_to\_hack\_redis\_via\_http\_requests/index.html) você pode ver que o Redis usa o comando **EVAL** para executar **código Lua em sandbox**. No post vinculado, você pode ver **como abusar disso** usando a função **dofile**, mas [aparentemente](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval) isso não é mais possível. De qualquer forma, se você puder **burlar o sandbox** Lua, poderá **executar comandos arbitrários** no sistema. Além disso, no mesmo post, você pode ver algumas **opções para causar DoS**.
O redis mestre sincroniza automaticamente todas as operações com o redis escravo, o que significa que podemos considerar a vulnerabilidade do redis como um redis escravo, conectado ao redis mestre que controlamos, então podemos inserir o comando no nosso próprio redis.
Se você pode enviar uma solicitação em **texto claro****para o Redis**, você pode **comunicar-se com ele** pois o Redis lerá linha por linha a solicitação e apenas responderá com erros às linhas que não entender:
Portanto, se você encontrar uma **vulnerabilidade SSRF** em um site e puder **controlar** alguns **cabeçalhos** (talvez com uma vulnerabilidade CRLF) ou **parâmetros POST**, você poderá enviar comandos arbitrários para o Redis.
No **Gitlab11.4.7** foram descobertas uma **vulnerabilidade SSRF** e uma **CRLF**. A **vulnerabilidade SSRF** estava na **funcionalidade de importação de projeto a partir de URL** ao criar um novo projeto e permitia acessar IPs arbitrários no formato \[0:0:0:0:0:ffff:127.0.0.1] (isso acessará 127.0.0.1), e a **vulnerabilidade CRLF** foi explorada apenas **adicionando os caracteres %0D%0A** à **URL**.
Portanto, foi possível **abusar dessas vulnerabilidades para se comunicar com a instância do Redis** que **gerencia filas** do **gitlab** e abusar dessas filas para **obter execução de código**. O payload de abuso da fila do Redis é:
_Por alguma razão (como para o 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 onde essa informação foi retirada), a exploração funcionou com o esquema `git` e não com o esquema `http`._
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Se você deseja ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.