11211 - Pentesting Memcache
Last updated
Last updated
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
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 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
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 obtendo os nomes das chaves
Lembre-se de que este serviço é apenas um cache, então os dados podem estar aparecendo e desaparecendo.
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:
As chaves só podem ser dumpadas 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, conforme discutido em fóruns da comunidade.
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 revela utilitários para dump abrangente. Alternativamente, o processo de usar telnet para interação direta com configurações do memcached é descrito abaixo.
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:
Para exibir todos os slabs existentes atualmente, o seguinte comando é usado:
Adicionar uma única chave ao memcached 1.4.13 ilustra como as classes de slab são populadas e gerenciadas. Por exemplo:
Executar o comando "stats slabs" após a adição da chave gera estatísticas detalhadas sobre a utilização do slab:
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 despejos, restrições de memória e ciclos de vida dos itens:
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.
Para versões anteriores a 1.4.31, as chaves são despejadas por classe de slab usando:
Por exemplo, para despejar uma chave na classe #1:
Este método itera sobre classes de slab, extraindo e, opcionalmente, despejando valores de chave.
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:
Table from here.
Linguagens de Programação | Ferramentas | Funcionalidade | ||
---|---|---|---|---|
PHP | Imprime nomes de chaves. | |||
Perl | Imprime chaves e valores | |||
Ruby | Imprime nomes de chaves. | |||
Perl | Ferramenta no módulo CPAN | ached/) | ||
PHP | GUI de Monitoramento do Memcache que também permite despejar chaves | |||
libmemcached | 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. |
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.
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:
Apesar da documentação dizer algo sobre o estouro de um valor de 64 bits usando “incr” fazer o valor desaparecer. Ele precisa ser criado novamente usando “add”/”set”.
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
port:11211 "STAT pid"
"STAT pid"
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)