mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-01 00:49:40 +00:00
195 lines
13 KiB
Markdown
195 lines
13 KiB
Markdown
# 11211 - Pentesting Memcache
|
|
|
|
<details>
|
|
|
|
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
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**](https://github.com/sponsors/carlospolop)!
|
|
* Obtenha o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* 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)
|
|
* **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
* **Compartilhe seus truques de hacking enviando PRs para os** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
|
|
|
|
</details>
|
|
|
|
## Informações do Protocolo
|
|
|
|
Do [wikipedia](https://en.wikipedia.org/wiki/Memcached):
|
|
|
|
> **Memcached** (pronúncia: mem-cached, mem-cash-dee) é um sistema de [cache de memória](https://en.wikipedia.org/wiki/Memory\_caching) 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:
|
|
|
|
1. Encontrar **slabs** com **itens ativos**
|
|
2. Obter os **nomes das chaves** dos slabs detectados anteriormente
|
|
3. 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**.
|
|
```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
|
|
```
|
|
## **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:
|
|
|
|
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, como discutido em [fóruns da comunidade](https://groups.google.com/forum/?fromgroups=#!topic/memcached/1-T8I-RVGKM).
|
|
|
|
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](https://lzone.de/cheat-sheet/memcached#tools) 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:
|
|
```bash
|
|
$ memcached -vv
|
|
slab class 1: chunk size 96 perslab 10922
|
|
[...]
|
|
```
|
|
Para exibir todas as lajes atualmente existentes, 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 de chaves fornece estatísticas detalhadas sobre a utilização de slabs:
|
|
```bash
|
|
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:
|
|
```bash
|
|
stats items
|
|
[...]
|
|
```
|
|
### **Despejando Chaves**
|
|
|
|
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 fazer dump de 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 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](https://github.com/memcached/memcached/wiki/ReleaseNotes1431). Esta abordagem gera uma saída extensa, portanto, é recomendado utilizar 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 DESPEJO**
|
|
|
|
Tabela [daqui](https://lzone.de/blog).
|
|
|
|
| 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 despejar chaves | | |
|
|
| libmemcached | [peep](http://blog.evanweaver.com/2009/04/20/peeping-into-memcached/) | **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 <a href="#troubleshooting" id="troubleshooting"></a>
|
|
|
|
### Limite de Dados de 1MB <a href="#1mb-data-limit" id="1mb-data-limit"></a>
|
|
|
|
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! <a href="#never-set-a-timeout--30-days" id="never-set-a-timeout--30-days"></a>
|
|
|
|
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 <a href="#disappearing-keys-on-overflow" id="disappearing-keys-on-overflow"></a>
|
|
|
|
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 <a href="#replication" id="replication"></a>
|
|
|
|
O memcached em si não suporta replicação. Se realmente precisar, é necessário 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 de chave Mestre-Escravo compatível com memcached
|
|
- [twemproxy](https://github.com/twitter/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](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)
|
|
|
|
<details>
|
|
|
|
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
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**](https://github.com/sponsors/carlospolop)!
|
|
- Adquira o [**swag oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
- 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)
|
|
- **Junte-se ao** 💬 [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
- **Compartilhe seus truques de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|