# 11211 - Pentesting Memcache
{% hint style="success" %}
Aprenda e pratique Hacking AWS:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Aprenda e pratique Hacking GCP: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
{% endhint %}
## Informações do Protocolo
De [wikipedia](https://en.wikipedia.org/wiki/Memcached):
> **Memcached** (pronúncia: mem-cashed, mem-cash-dee) é um sistema de [cache de memória](https://en.wikipedia.org/wiki/Memory\_caching) distribuído de propósito geral. É frequentemente usado para acelerar sites dinâmicos baseados em banco de dados, armazenando em cache dados e objetos na 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:
1. Encontrar **slabs** com **itens ativos**
2. Obter os **nomes das chaves** dos slabs detectados anteriormente
3. 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**.
```bash
echo "version" | nc -vn -w 1 11211 #Get version
echo "stats" | nc -vn -w 1 11211 #Get status
echo "stats slabs" | nc -vn -w 1 11211 #Get slabs
echo "stats items" | nc -vn -w 1 11211 #Get items of slabs with info
echo "stats cachedump 0" | nc -vn -w 1 11211 #Get key names (the 0 is for unlimited output size)
echo "get " | nc -vn -w 1 11211 #Get saved info
#This php will just dump the keys, you need to use "get later"
sudo apt-get install php-memcached
php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'
```
### Manual2
```bash
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 #Get info inside the item(s)
```
### Automático
```bash
nmap -n -sV --script memcached-info -p 11211 #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
```
## **Dumpando Chaves do Memcache**
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:
1. As chaves só podem ser dumpadas por classe de slab, agrupando chaves de tamanho de conteúdo semelhante.
2. Existe um limite de uma página por classe de slab, equivalente a 1MB de dados.
3. Este recurso é não oficial e pode ser descontinuado a qualquer momento, conforme discutido em [fóruns da comunidade](https://groups.google.com/forum/?fromgroups=#!topic/memcached/1-T8I-RVGKM).
A limitação de poder dump 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 à [seção de ferramentas](https://lzone.de/cheat-sheet/memcached#tools) revela utilitários para dump abrangente. Alternativamente, o processo de usar telnet para interação direta com configurações do memcached é descrito abaixo.
### **Como Funciona**
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:
```bash
$ memcached -vv
slab class 1: chunk size 96 perslab 10922
[...]
```
Para exibir todos os slabs existentes atualmente, o seguinte comando é usado:
```bash
stats slabs
```
Adicionar uma única chave ao memcached 1.4.13 ilustra como as classes de slab são populadas e gerenciadas. Por exemplo:
```bash
set mykey 0 60 1
1
STORED
```
Executar o comando "stats slabs" após a adição de uma chave gera estatísticas detalhadas sobre a utilização de slabs:
```bash
stats slabs
[...]
```
Este output 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 escrita.
Outro comando útil, "stats items", fornece dados sobre evacuações, restrições de memória e ciclos de vida dos itens:
```bash
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:
```bash
stats cachedump
```
Por exemplo, para despejar uma chave na classe #1:
```bash
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](https://github.com/memcached/memcached/wiki/ReleaseNotes1431). Esta abordagem gera uma saída extensa, portanto, a recomendação é empregar o comando 'nc' para eficiência. Exemplos incluem:
```bash
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](https://lzone.de/blog).
| Linguagens de Programação | Ferramentas | Funcionalidade | | |
| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ------- |
| PHP | [simple script](http://snipt.org/xtP) | Imprime nomes de chaves. | | |
| Perl | [simple script](https://wiki.jasig.org/download/attachments/13572172/memcached-clean.pl?version=1\&modificationDate=1229693957401) | Imprime chaves e valores | | |
| Ruby | [simple script](https://gist.github.com/1365005) | Imprime nomes de chaves. | | |
| Perl | [memdump](https://search.cpan.org/\~dmaki/Memcached-libmemcached-0.4202/src/libmemcached/docs/memdump.pod) | Ferramenta no módulo CPAN | [Memcached-libmemcached](https://search.cpan.org/\~dmaki/Memcached-libmemc) | ached/) |
| PHP | [memcache.php](http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/) | GUI de Monitoramento do Memcache que também permite despejar chaves | | |
| libmemcached | [peep](http://blog.evanweaver.com/2009/04/20/peeping-into-memcached/) | **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
### Limite de Dados de 1MB
Observe 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 estouro de um valor de 64 bits usando “incr” fazer o valor desaparecer. 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](http://repcached.lab.klab.org/): Replicação assíncrona multi-mestre (conjunto de patches do memcached 1.2)
* [Couchbase memcached interface](http://www.couchbase.com/memcached): Use CouchBase como substituto do memcached
* [yrmcds](https://cybozu.github.io/yrmcds/): Armazenamento de chave-valor compatível com memcached Master-Slave
* [twemproxy](https://github.com/twitter/twemproxy) (também conhecido como nutcracker): proxy com suporte a memcached
### Commands Cheat-Sheet
{% content-ref url="memcache-commands.md" %}
[memcache-commands.md](memcache-commands.md)
{% endcontent-ref %}
### **Shodan**
* `port:11211 "STAT pid"`
* `"STAT pid"`
## References
* [https://lzone.de/cheat-sheet/memcached](https://lzone.de/cheat-sheet/memcached)
{% hint style="success" %}
Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}