6379 - Pentesting Redis
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:
HackTricks Training GCP Red Team Expert (GRTE)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-7ebaebfa37dac753bd916c91429befb49dfd6309%252Fimage%2520%28380%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=b04e6b5&sv=1)
Junte-se ao HackenProof Discord para se comunicar com hackers experientes e caçadores de bugs!
Insights de Hacking Engaje-se com conteúdo que mergulha na emoção e nos desafios do hacking
Notícias de Hacking em Tempo Real Mantenha-se atualizado com o mundo acelerado do hacking através de notícias e insights em tempo real
Últimos Anúncios Fique informado sobre os novos programas de recompensas por bugs lançados e atualizações cruciais da plataforma
Junte-se a nós no Discord e comece a colaborar com os melhores hackers hoje!
Informações Básicas
De a documentação: Redis é um armazenamento de estrutura de dados em memória de código aberto (licenciado 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.
Porta padrão: 6379
Enumeração Automática
Algumas ferramentas automatizadas que podem ajudar a obter informações de uma instância redis:
Enumeração Manual
Banner
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
:
O primeiro comando que você pode tentar é info
. Ele pode retornar uma saída com informações da instância Redis ou algo como o seguinte é retornado:
Neste último caso, isso significa que você precisa de credenciais válidas para acessar a instância do Redis.
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.
É 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.
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.
Em casos como este, você precisará encontrar credenciais válidas para interagir com o Redis, então você pode tentar brute-force nele. Caso você encontre credenciais válidas, precisará autenticar a sessão após estabelecer a conexão com o comando:
Credenciais válidas serão respondidas com: +OK
Enumeração autenticada
Se o servidor Redis permitir conexões anônimas ou se você tiver obtido credenciais válidas, você pode iniciar o processo de enumeração para o serviço usando os seguintes comandos:
Outros comandos Redis podem ser encontrados aqui e aqui.
Observe que os comandos Redis de uma instância podem ser renomeados ou removidos no arquivo redis.conf. Por exemplo, esta linha removerá o comando FLUSHDB:
Mais sobre como configurar um serviço Redis de forma segura aqui: 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 as 25 consultas mais lentas com slowlog get 25
Encontre mais informações interessantes sobre mais comandos Redis aqui: https://lzone.de/cheat-sheet/Redis
Dumping Database
Dentro do Redis, as 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":
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-ff43412dcf28b4192e1866bd85022d33f2c53f49%252Fimage%2520%28766%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=2c84b589&sv=1)
Ou você pode simplesmente obter todos os keyspaces (bancos de dados) com:
No 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 despejar, por exemplo, o banco de dados 1, você precisa fazer:
Em 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.
Para saber o tipo da chave, use o comando TYPE
, exemplo abaixo para chaves de lista e hash.
Despeje o banco de dados com npm redis-dump ou python redis-utils
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-7ebaebfa37dac753bd916c91429befb49dfd6309%252Fimage%2520%28380%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=b04e6b5&sv=1)
Junte-se ao servidor HackenProof Discord para se comunicar com hackers experientes e caçadores de bugs!
Insights de Hacking Engaje-se com conteúdo que explora a emoção e os desafios do hacking
Notícias de Hack em Tempo Real Mantenha-se atualizado com o mundo do hacking em ritmo acelerado através de notícias e insights em tempo real
Últimos Anúncios Fique informado sobre os novos programas de recompensas por bugs lançados e atualizações cruciais da plataforma
Junte-se a nós no Discord e comece a colaborar com os melhores hackers hoje!
Redis RCE
Shell Interativa
redis-rogue-server pode obter automaticamente uma shell interativa ou uma shell reversa no Redis(<=5.0.5).
PHP Webshell
Info de aqui. Você deve conhecer o caminho da pasta do site:
Se a exceção de acesso ao webshell ocorrer, você pode esvaziar o banco de dados após o backup e tentar novamente, lembre-se de restaurar o banco de dados.
Template Webshell
Como na seção anterior, você também pode sobrescrever algum arquivo de template html que será interpretado por um mecanismo de template e obter um shell.
Por exemplo, seguindo este writeup, você pode ver que o atacante injetou um rev shell em um html interpretado pelo mecanismo de template nunjucks:
Note que vários mecanismos de template armazenam em cache os templates na memória, então mesmo que você os sobrescreva, o novo não será executado. Nesses casos, ou o desenvolvedor deixou o recarregamento automático ativo ou você precisa fazer um DoS sobre o serviço (e esperar que ele seja reiniciado automaticamente).
SSH
Exemplo daqui
Por favor, esteja ciente de que o resultado de config get dir
pode ser alterado após outros comandos de exploração manuais. Sugere-se executá-lo primeiro logo após o login no Redis. Na saída de config get dir
você pode encontrar o 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 home de outro usuário válido onde você tem permissões de gravação, você também pode abusar disso:
Gere um par de chaves pública-privada ssh no seu pc:
ssh-keygen -t rsa
Escreva a chave pública em um arquivo:
(echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt
Importe o arquivo para o redis:
cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key
Salve a chave pública no arquivo authorized_keys no servidor redis:
Finalmente, você pode ssh para o servidor redis com a chave privada: ssh -i id_rsa redis@10.85.0.52
Esta técnica está automatizada aqui: https://github.com/Avinash-acid/Redis-Server-Exploit
Crontab
O último exemplo é para Ubuntu, para Centos, o comando acima deve ser: redis-cli -h 10.85.0.52 config set dir /var/spool/cron/
Este método também pode ser usado para ganhar bitcoin :yam
Carregar Módulo Redis
Seguindo as instruções de https://github.com/n0b0dyCN/RedisModules-ExecuteCommand você pode compilar um módulo redis para executar comandos arbitrários.
Então você precisa de alguma forma de fazer upload do módulo compilado.
Carregue o módulo enviado em tempo de execução com
MODULE LOAD /path/to/mymodule.so
Liste os módulos carregados para verificar se foi carregado corretamente:
MODULE LIST
Execute comandos:
Descarregue o módulo sempre que quiser:
MODULE UNLOAD mymodule
Bypass do sandbox LUA
Aqui 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 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:
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 redis como um redis slave, conectado ao redis master que controlamos, então podemos inserir o comando no nosso próprio redis.
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:
Portanto, se você encontrar uma SSRF vuln em um site e puder controlar alguns headers (talvez com uma vulnerabilidade CRLF) ou parâmetros POST, você poderá enviar comandos arbitrários para o Redis.
Exemplo: Gitlab SSRF + CRLF para Shell
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 é:
E a solicitação URL encode abusando SSRF e CRLF para executar um whoami
e enviar a saída de volta via nc
é:
Por algum motivo (como para o autor de 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
.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-7ebaebfa37dac753bd916c91429befb49dfd6309%252Fimage%2520%28380%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=b04e6b5&sv=1)
Junte-se ao servidor HackenProof Discord para se comunicar com hackers experientes e caçadores de bugs!
Insights de Hacking Engaje-se com conteúdo que mergulha na emoção e nos desafios do hacking
Notícias de Hack em Tempo Real Mantenha-se atualizado com o mundo do hacking em ritmo acelerado através de notícias e insights em tempo real
Últimos Anúncios Fique informado sobre os novos programas de recompensas por bugs que estão sendo lançados e atualizações cruciais da plataforma
Junte-se a nós no Discord e comece a colaborar com os melhores hackers hoje!
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:
HackTricks Training GCP Red Team Expert (GRTE)
Last updated