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)

Support HackTricks

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 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 <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

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 <item1> <item2> <item3> #Get info inside the item(s)

Automático

bash
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:

  1. As chaves só podem ser despejadas 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 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:

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 da chave fornece estatísticas detalhadas sobre a utilização de slabs:

bash
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:

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 objetos grandes.

Dumping Keys

Para versões anteriores a 1.4.31, as chaves são despejadas por classe de slab usando:

bash
stats cachedump <slab class> <number of items to dump>

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. 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

FERRAMENTAS DE DUMPING

Tabela daqui.

Linguagens de ProgramaçãoFerramentasFuncionalidade
PHPscript simplesImprime nomes de chaves.
Perlscript simplesImprime chaves e valores
Rubyscript simplesImprime nomes de chaves.
PerlmemdumpFerramenta no módulo CPANMemcached-libmemcachedached/)
PHPmemcache.phpGUI de Monitoramento do Memcache que também permite o dumping de chaves
libmemcachedpeepCongela 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.

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 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

Chaves Desaparecendo em Overflow

Apesar da documentação dizer algo sobre o wrap em 64bit, o que causa o overflow de um valor usando “incr” faz com que o valor desapareça. Ele precisa ser criado novamente usando “add”/”set”.

Replicação

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

Comandos Cheat-Sheet

Memcache Commands

Shodan

  • port:11211 "STAT pid"
  • "STAT pid"

Referências

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)

Support HackTricks