hacktricks/network-services-pentesting/11211-memcache
2023-06-06 18:56:34 +00:00
..
memcache-commands.md Translated to Portuguese 2023-06-06 18:56:34 +00:00
README.md Translated to Portuguese 2023-06-06 18:56:34 +00:00

11211 - Pentesting Memcache

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Informações do Protocolo

Memcached (pronúncia: mem-cached, mem-cash-dee) é um sistema de cache de memória distribuída 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)
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.

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

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

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.

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 

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

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 para aprender sobre as ferramentas que permitem despejar tudo facilmente. Alternativamente, siga o guia a seguir e tente os comandos usando telnet 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 <slab class> <number of items to dump>

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 Imprime nomes de chaves.
Perl script simples Imprime chaves e valores.
Ruby script simples 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 o dumping de chaves.
libmemcached peep 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: replicação assíncrona multi-mestre (conjunto de patches memcached 1.2)
  • Interface memcached do Couchbase: Use o CouchBase como substituto do memcached
  • yrmcds: armazenamento de valor-chave mestre-escravo compatível com memcached
  • twemproxy (também conhecido como nutcracker): proxy com suporte memcached

Comandos Cheat-Sheet

{% content-ref url="memcache-commands.md" %} memcache-commands.md {% endcontent-ref %}

Shodan

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

Referências

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥