11211 - Pentesting Memcache
Reading time: 8 minutes
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Informações do Protocolo
De wikipedia:
Memcached (pronúncia: mem-cashed, mem-cash-dee) é um sistema de cache de memória distribuído de propósito geral. É frequentemente usado para acelerar sites dinâmicos baseados em banco de dados, armazenando dados e objetos em RAM para reduzir o número de vezes que uma fonte de dados externa (como um banco de dados ou API) deve ser lida.
Embora o Memcached suporte SASL, a maioria das instâncias está exposta sem autenticação.
Porta padrão: 11211
PORT STATE SERVICE
11211/tcp open unknown
Enumeração
Manual
Para exfiltrar todas as informações salvas dentro de uma instância de memcache, você precisa:
- Encontrar slabs com itens ativos
- Obter os nomes das chaves dos slabs detectados anteriormente
- Exfiltrar os dados salvos obtendo os nomes das chaves
Lembre-se de que este serviço é apenas um cache, então os dados podem aparecer e desaparecer.
echo "version" | nc -vn -w 1 <IP> 11211 #Get version
echo "stats" | nc -vn -w 1 <IP> 11211 #Get status
echo "stats slabs" | nc -vn -w 1 <IP> 11211 #Get slabs
echo "stats items" | nc -vn -w 1 <IP> 11211 #Get items of slabs with info
echo "stats cachedump <number> 0" | nc -vn -w 1 <IP> 11211 #Get key names (the 0 is for unlimited output size)
echo "get <item_name>" | nc -vn -w 1 <IP> 11211 #Get saved info
#This php will just dump the keys, you need to use "get <item_name> later"
sudo apt-get install php-memcached
php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'
Manual2
sudo apt install libmemcached-tools
memcstat --servers=127.0.0.1 #Get stats
memcdump --servers=127.0.0.1 #Get all items
memccat --servers=127.0.0.1 <item1> <item2> <item3> #Get info inside the item(s)
Automático
nmap -n -sV --script memcached-info -p 11211 <IP> #Just gather info
msf > use auxiliary/gather/memcached_extractor #Extracts saved data
msf > use auxiliary/scanner/memcached/memcached_amp #Check is UDP DDoS amplification attack is possible
Dumping Memcache Keys
No âmbito do memcache, um protocolo que ajuda a organizar dados por slabs, existem comandos específicos para inspecionar os dados armazenados, embora com restrições notáveis:
- As chaves só podem ser despejadas por classe de slab, agrupando chaves de tamanho de conteúdo semelhante.
- Existe um limite de uma página por classe de slab, equivalente a 1MB de dados.
- Este recurso é não oficial e pode ser descontinuado a qualquer momento, conforme discutido em community forums.
A limitação de poder despejar apenas 1MB de dados que podem ser gigabytes é particularmente significativa. No entanto, essa funcionalidade ainda pode oferecer insights sobre padrões de uso de chaves, dependendo das necessidades específicas. Para aqueles menos interessados na mecânica, uma visita à tools section revela utilitários para despejos abrangentes. Alternativamente, o processo de usar telnet para interação direta com configurações de memcached é descrito abaixo.
How it Works
A organização da memória do Memcache é fundamental. Iniciar o memcache com a opção "-vv" revela as classes de slab que ele gera, como mostrado abaixo:
$ memcached -vv
slab class 1: chunk size 96 perslab 10922
[...]
Para exibir todos os slabs existentes atualmente, o seguinte comando é usado:
stats slabs
Adicionar uma única chave ao memcached 1.4.13 ilustra como as classes de slab são populadas e gerenciadas. Por exemplo:
set mykey 0 60 1
1
STORED
Executar o comando "stats slabs" após a adição da chave gera estatísticas detalhadas sobre a utilização de slabs:
stats slabs
[...]
Esta saída revela os tipos de slab ativos, os chunks utilizados e as estatísticas operacionais, oferecendo insights sobre a eficiência das operações de leitura e gravação.
Outro comando útil, "stats items", fornece dados sobre evacuações, restrições de memória e ciclos de vida dos itens:
stats items
[...]
Essas estatísticas permitem suposições fundamentadas sobre o comportamento de cache da aplicação, incluindo a eficiência do cache para diferentes tamanhos de conteúdo, alocação de memória e capacidade para armazenar grandes objetos.
Dumping Keys
Para versões anteriores a 1.4.31, as chaves são despejadas por classe de slab usando:
stats cachedump <slab class> <number of items to dump>
Por exemplo, para despejar uma chave na classe #1:
stats cachedump 1 1000
ITEM mykey [1 b; 1350677968 s]
END
Este método itera sobre classes de slab, extraindo e, opcionalmente, despejando valores de chave.
DESPEJANDO CHAVES DO MEMCACHE (VER 1.4.31+)
Com a versão 1.4.31 do memcache e acima, um novo método mais seguro para despejar chaves em um ambiente de produção é introduzido, utilizando o modo não bloqueante, conforme detalhado nas notas de lançamento. Esta abordagem gera uma saída extensa, portanto, a recomendação é empregar o comando 'nc' para eficiência. Exemplos incluem:
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | head -1
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | grep ee6ba58566e234ccbbce13f9a24f9a28
DUMPING TOOLS
Table from here.
Linguagens de Programação | Ferramentas | Funcionalidade | ||
---|---|---|---|---|
PHP | simple script | Imprime nomes de chaves. | ||
Perl | simple script | Imprime chaves e valores | ||
Ruby | simple script | Imprime nomes de chaves. | ||
Perl | memdump | Ferramenta no módulo CPAN | Memcached-libmemcached | ached/) |
PHP | memcache.php | GUI de Monitoramento do Memcache que também permite despejar chaves | ||
libmemcached | peep | Congela seu processo memcached!!! Tenha cuidado ao usar isso em produção. Ainda assim, você pode contornar a limitação de 1MB e realmente despejar todas as chaves. |
Troubleshooting
1MB Data Limit
Note que antes do memcached 1.4 você não pode armazenar objetos maiores que 1MB devido ao tamanho máximo de slab padrão.
Nunca Defina um Timeout > 30 Dias!
Se você tentar “definir” ou “adicionar” uma chave com um timeout maior que o máximo permitido, pode não obter o que espera, pois o memcached trata o valor como um timestamp Unix. Além disso, se o timestamp estiver no passado, não fará nada. Seu comando falhará silenciosamente.
Portanto, se você quiser usar a vida útil máxima, especifique 2592000. Exemplo:
set my_key 0 2592000 1
1
Disappearing Keys on Overflow
Apesar da documentação mencionar algo sobre o transbordamento de 64 bits, fazer um "incr" faz com que o valor desapareça. Ele precisa ser criado novamente usando "add"/"set".
Replication
memcached em si não suporta replicação. Se você realmente precisar, precisará usar soluções de terceiros:
- repcached: Replicação assíncrona multi-mestre (conjunto de patches do memcached 1.2)
- Couchbase memcached interface: Use CouchBase como substituto do memcached
- yrmcds: Armazenamento de chave-valor compatível com memcached Master-Slave
- twemproxy (também conhecido como nutcracker): proxy com suporte a memcached
Commands Cheat-Sheet
Shodan
port:11211 "STAT pid"
"STAT pid"
References
tip
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.