# 11211 - Pentesting Memcache
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
## Informações do Protocolo
**Memcached** (pronúncia: mem-cached, mem-cash-dee) é um sistema de [cache de memória distribuída](https://en.wikipedia.org/wiki/Memory\_caching) 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. (De [wikipedia](https://en.wikipedia.org/wiki/Memcached))\
Embora o Memcached suporte o SASL, a maioria das instâncias é **exposta sem autenticação**.
**Porta padrão:** 11211
```
PORT STATE SERVICE
11211/tcp open unknown
```
## Enumeração
### Manual
Para extrair todas as informações salvas em uma instância do memcache, você precisa:
1. Encontrar **slabs** com **itens ativos**
2. Obter os **nomes das chaves** dos slabs detectados anteriormente
3. Extrair os **dados salvos** obtendo os nomes das chaves
Lembre-se de que este serviço é apenas um **cache**, portanto, **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
Este é um manual para explorar vulnerabilidades no serviço de cache Memcached. O Memcached é um sistema de cache distribuído de alto desempenho que armazena dados em memória RAM. Ele é frequentemente usado para acelerar aplicativos da web, como sites de comércio eletrônico e redes sociais.
#### Verificando se o serviço Memcached está em execução
Antes de começar a explorar o Memcached, é importante verificar se o serviço está em execução na máquina de destino. Isso pode ser feito usando o comando `nmap` para verificar as portas abertas na máquina:
```
nmap -p 11211
```
Se a porta 11211 estiver aberta, o serviço Memcached está em execução na máquina.
#### Explorando o serviço Memcached
Uma vez que o serviço Memcached esteja em execução, você pode começar a explorar possíveis vulnerabilidades. Algumas das técnicas de exploração mais comuns incluem:
- **Ataques de negação de serviço (DoS)**: o Memcached pode ser usado para realizar ataques de DoS em outras máquinas. Isso é feito enviando solicitações falsas para o serviço Memcached, fazendo com que ele envie grandes quantidades de dados para a máquina de destino.
- **Exfiltração de dados**: o Memcached pode ser usado para exfiltrar dados de outras máquinas. Isso é feito enviando dados para o serviço Memcached e, em seguida, recuperando-os de outra máquina.
- **Execução remota de código**: o Memcached pode ser usado para executar código arbitrário em outras máquinas. Isso é feito enviando comandos especiais para o serviço Memcached, que são então executados na máquina de destino.
#### Prevenção de vulnerabilidades do Memcached
Para prevenir vulnerabilidades do Memcached, é importante seguir as melhores práticas de segurança, como:
- **Restringir o acesso ao serviço Memcached**: o serviço Memcached deve ser restrito apenas a máquinas confiáveis e não deve ser acessível a partir da Internet pública.
- **Usar autenticação**: o Memcached suporta autenticação, o que pode ajudar a prevenir ataques de DoS e exfiltração de dados.
- **Manter o software atualizado**: é importante manter o software Memcached atualizado com as últimas correções de segurança para prevenir vulnerabilidades conhecidas.
```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
```
## Despejando Chaves do Memcache
**Se a sua versão do memcached for superior a 1.4.31, leia a próxima seção para um método avançado de despejo de chaves.**
O protocolo memcache fornece [comandos](https://lzone.de/articles/memcached.htm) para visualizar os dados organizados por slabs (categorias de dados de um determinado intervalo de tamanho). No entanto, existem algumas limitações significativas:
1. Você só pode despejar chaves por classe de slab (chaves com tamanho de conteúdo aproximado)
2. Você só pode despejar uma página por classe de slab (1MB de dados)
3. Esta é uma funcionalidade não oficial que [pode ser removida a qualquer momento.](https://groups.google.com/forum/?fromgroups=#!topic/memcached/1-T8I-RVGKM)
A segunda limitação é provavelmente a mais difícil, porque 1MB de vários gigabytes é quase nada. Ainda assim, pode ser útil observar como você usa um subconjunto de suas chaves. Mas isso pode depender do seu caso de uso. Se você não se importa com os detalhes técnicos, pule para a seção de [ferramentas](https://lzone.de/cheat-sheet/memcached#tools) para aprender sobre as ferramentas que permitem despejar tudo facilmente. Alternativamente, siga o guia a seguir e tente os comandos [usando telnet](https://lzone.de/articles/memcached.htm) contra sua configuração do memcached. **Como Funciona** Primeiro, você precisa saber como o memcache organiza sua memória. Se você iniciar o memcache com a opção "-vv", verá as classes de slab que ele cria. Por exemplo:
```
$ memcached -vv
slab class 1: chunk size 96 perslab 10922
slab class 2: chunk size 120 perslab 8738
slab class 3: chunk size 152 perslab 6898
slab class 4: chunk size 192 perslab 5461
[...]
```
Na configuração impressa acima, o memcache manterá 6898 peças de dados entre 121 e 152 bytes em um único slab de tamanho 1MB (6898\*152). Todos os slabs têm tamanho de 1MB por padrão. Use o seguinte comando para imprimir todos os slabs existentes no momento:
```
stats slabs
```
Se você adicionou uma única chave a um memcached vazio 1.4.13 com...
```
set mykey 0 60 1
1
STORED
```
Agora você verá o seguinte resultado para o comando "stats slabs":
```
stats slabs
STAT 1:chunk_size 96
STAT 1:chunks_per_page 10922
STAT 1:total_pages 1
STAT 1:total_chunks 10922
STAT 1:used_chunks 1
STAT 1:free_chunks 0
STAT 1:free_chunks_end 10921
STAT 1:mem_requested 71
STAT 1:get_hits 0
STAT 1:cmd_set 2
STAT 1:delete_hits 0
STAT 1:incr_hits 0
STAT 1:decr_hits 0
STAT 1:cas_hits 0
STAT 1:cas_badval 0
STAT 1:touch_hits 0
STAT active_slabs 1
STAT total_malloced 1048512
END
```
O exemplo mostra que temos apenas um tipo de slab ativo, o #1. Como nossa chave tem apenas um byte de tamanho, ela se encaixa no menor tamanho possível de chunk. As estatísticas do slab mostram que atualmente existe apenas uma página da classe de slab e que apenas um chunk é usado. **O mais importante é que ele mostra um contador para cada operação de escrita (set, incr, decr, cas, touch) e um para gets. Usando esses contadores, você pode determinar a taxa de acertos!** Você também pode obter outro conjunto de informações usando "stats items" com contadores interessantes sobre evasões e contadores de falta de memória.
```
stats items
STAT items:1:number 1
STAT items:1:age 4
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 0
STAT items:1:expired_unfetched 0
STAT items:1:evicted_unfetched 0
END
```
**O que podemos deduzir até agora...** Dadas as informações estatísticas por classe de blocos, já podemos deduzir muitas coisas sobre o comportamento do aplicativo:
1. Qual é a taxa de cache para diferentes tamanhos de conteúdo?
* Quão bom é o cache de grandes blocos de HTML?
2. Quanta memória gastamos em diferentes tamanhos de conteúdo?
* Quanto gastamos em contadores numéricos simples?
* Quanto gastamos em nossos dados de sessão?
* Quanto gastamos em grandes blocos de HTML?
3. Quantos objetos grandes podemos armazenar em cache?
Claro, para responder às perguntas, você precisa conhecer os objetos de cache do seu aplicativo. **Agora: Como Despejar Chaves?** As chaves podem ser despejadas por classe de blocos usando o comando "stats cachedump".
```
stats cachedump
```
Para despejar nossa única chave na classe #1, execute
```
stats cachedump 1 1000
ITEM mykey [1 b; 1350677968 s]
END
```
O comando "cachedump" retorna um item por linha. O primeiro número entre chaves indica o tamanho em bytes e o segundo o timestamp da criação. Dado o nome da chave, agora você também pode despejar o valor usando.
```
get mykey
VALUE mykey 0 1
1
END
```
Aqui está: itere sobre todas as classes de fragmentos que você deseja, extraia os nomes das chaves e, se necessário, despeje o conteúdo delas.
### **DESPREZANDO AS CHAVES DO MEMCACHE (VER 1.4.31+)**
Na versão do memcache 1.4.31 e superior, há um novo comando para despejar as chaves da memória em modo não-bloqueante (leia https://github.com/memcached/memcached/wiki/ReleaseNotes1431). Este método é seguro para ser executado em produção. A saída não é consistente, mas é boa o suficiente para encontrar chaves, seu tempo exato de expiração (EXP) e o último tempo de acesso (LA). Devido à enorme saída gerada, é recomendável usar o comando ‘nc’. Exemplos:
```
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | head -1
key=0dLLX%253Amemcache_test_key exp=1590718787 la=1590718487 cas=2238881166 fetch=yes
echo 'lru_crawler metadump all' | nc 127.0.0.1 11211 | grep ee6ba58566e234ccbbce13f9a24f9a28
key=VQRFX%253Aee6ba58566e234ccbbce13f9a24f9a28 exp=-1 la=1590386157 cas=1776204003 fetch=yes
key=0dLLX%253Aee6ba58566e234ccbbce13f9a24f9a28 exp=-1 la=1590712292 cas=2225524871 fetch=yes
```
EXP=-1 significa que o item nunca expira. EXP=1590718787 (Sex Maio 29 02:19:47 GMT 2020) mantém o timestamp Unix quando o item deve expirar. LA=1590712292 (Seg Maio 25 05:55:57 GMT 2020) mantém o timestamp Unix quando o item foi acessado pela última vez.
### **FERRAMENTAS DE DUMPING**
Existem diferentes ferramentas de dumping, às vezes apenas scripts, que ajudam a imprimir as chaves do memcache:
| Linguagens de programação | Ferramentas | Funcionalidade | | |
| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ------- |
| PHP | [script simples](http://snipt.org/xtP) | Imprime nomes de chaves. | | |
| Perl | [script simples](https://wiki.jasig.org/download/attachments/13572172/memcached-clean.pl?version=1\&modificationDate=1229693957401) | Imprime chaves e valores. | | |
| Ruby | [script simples](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 o dumping de chaves. | | |
| libmemcached | [peep](http://blog.evanweaver.com/2009/04/20/peeping-into-memcached/) | **Congela seu processo memcached!!!** Tenha cuidado ao usá-lo em produção. Ainda assim, você pode contornar a limitação de 1MB e realmente despejar **todas** as chaves. | | |
## Solução de problemas
### 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 tempo limite > 30 dias!
Se você tentar "set" ou "add" uma chave com um tempo limite maior do que o máximo permitido, pode não obter o que espera, porque 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ê deseja usar o tempo de vida máximo, especifique 2592000. Exemplo:
```
set my_key 0 2592000 1
1
```
### Chaves Desaparecendo em Overflow
Apesar da documentação dizer algo sobre o valor de transbordamento de 64 bits usando "incr" faz com que o valor desapareça. É necessário criá-lo novamente usando "add" / "set".
### Replicação
O memcached em si não suporta replicação. Se você realmente precisa disso, precisa usar soluções de terceiros:
* [repcached](http://repcached.lab.klab.org/): replicação assíncrona multi-mestre (conjunto de patches memcached 1.2)
* [Interface memcached do Couchbase](http://www.couchbase.com/memcached): Use o CouchBase como substituto do memcached
* [yrmcds](https://cybozu.github.io/yrmcds/): armazenamento de valor-chave mestre-escravo compatível com memcached
* [twemproxy](https://github.com/twitter/twemproxy) (também conhecido como nutcracker): proxy com suporte memcached
### Comandos Cheat-Sheet
{% content-ref url="memcache-commands.md" %}
[memcache-commands.md](memcache-commands.md)
{% endcontent-ref %}
### **Shodan**
* `port:11211 "STAT pid"`
* `"STAT pid"`
## Referências
* [https://lzone.de/cheat-sheet/memcached](https://lzone.de/cheat-sheet/memcached)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).