6379 - Pentesting Redis
Last updated
Last updated
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
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!
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
Algumas ferramentas automatizadas que podem ajudar a obter informações de uma instância redis:
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.
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
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
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":
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
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-rogue-server pode obter automaticamente uma shell interativa ou uma shell reversa no Redis(<=5.0.5).
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.
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).
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
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
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
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:
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.
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.
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
.
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)