# 11211 - Pentesting Memcache
Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Obtén [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
## Información del Protocolo
Desde [wikipedia](https://en.wikipedia.org/wiki/Memcached):
> **Memcached** (pronunciación: mem-cashed, mem-cash-dee) es un sistema de [caché de memoria](https://en.wikipedia.org/wiki/Memory\_caching) distribuida de propósito general. A menudo se utiliza para acelerar sitios web dinámicos basados en bases de datos mediante el almacenamiento en caché de datos y objetos en RAM para reducir la cantidad de veces que se debe leer una fuente de datos externa (como una base de datos o una API).
Aunque Memcached admite SASL, la mayoría de las instancias están **expuestas sin autenticación**.
**Puerto predeterminado:** 11211
```
PORT STATE SERVICE
11211/tcp open unknown
```
## Enumeración
### Manual
Para extraer toda la información guardada dentro de una instancia de memcache necesitas:
1. Encontrar **slabs** con **elementos activos**
2. Obtener los **nombres de clave** de los slabs detectados anteriormente
3. Exfiltrar los **datos guardados** obteniendo los nombres de clave
Recuerda que este servicio es solo una **caché**, por lo que **los datos pueden aparecer y desaparecer**.
```bash
echo "version" | nc -vn -w 1 11211 #Get version
echo "stats" | nc -vn -w 1 11211 #Get status
echo "stats slabs" | nc -vn -w 1 11211 #Get slabs
echo "stats items" | nc -vn -w 1 11211 #Get items of slabs with info
echo "stats cachedump 0" | nc -vn -w 1 11211 #Get key names (the 0 is for unlimited output size)
echo "get " | nc -vn -w 1 11211 #Get saved info
#This php will just dump the keys, you need to use "get later"
sudo apt-get install php-memcached
php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'
```
### Manual2
#### Memcached
Memcached es un sistema de almacenamiento en caché de objetos de alto rendimiento. Es comúnmente utilizado para acelerar aplicaciones web al almacenar en caché datos y objetos en la memoria RAM. Memcached escucha en el puerto 11211 por defecto y no tiene autenticación habilitada de forma predeterminada. Esto puede llevar a posibles riesgos de seguridad si no se configura adecuadamente.
#### Escaneo de Memcached
Puedes escanear Memcached utilizando herramientas como `nmap` para identificar servidores Memcached expuestos en una red. Una vez identificado, puedes intentar acceder a ellos y realizar pruebas de penetración para evaluar posibles vulnerabilidades y riesgos de seguridad.
#### Ataques a Memcached
Algunos ataques comunes a Memcached incluyen la amplificación de ataques DDoS, donde un atacante puede enviar solicitudes falsificadas a servidores Memcached expuestos, provocando respuestas amplificadas que abruman al objetivo. Es importante asegurarse de que los servidores Memcached estén correctamente configurados y protegidos para evitar este tipo de ataques.
```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 #Get info inside the item(s)
```
### Automático
```bash
nmap -n -sV --script memcached-info -p 11211 #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
```
## **Volcado de Claves de Memcache**
En el ámbito de memcache, un protocolo que ayuda a organizar datos por fragmentos, existen comandos específicos para inspeccionar los datos almacenados, aunque con limitaciones notables:
1. Las claves solo se pueden volcar por clase de fragmento, agrupando claves de tamaño de contenido similar.
2. Existe un límite de una página por clase de fragmento, lo que equivale a 1 MB de datos.
3. Esta función es no oficial y puede ser descontinuada en cualquier momento, como se discute en los [foros comunitarios](https://groups.google.com/forum/?fromgroups=#!topic/memcached/1-T8I-RVGKM).
La limitación de solo poder volcar 1 MB de potencialmente gigabytes de datos es particularmente significativa. Sin embargo, esta funcionalidad aún puede ofrecer información sobre patrones de uso de claves, dependiendo de necesidades específicas. Para aquellos menos interesados en la mecánica, una visita a la [sección de herramientas](https://lzone.de/cheat-sheet/memcached#tools) revela utilidades para volcados completos. Alternativamente, se describe a continuación el proceso de usar telnet para interactuar directamente con configuraciones de memcached.
### **Cómo Funciona**
La organización de la memoria de Memcache es fundamental. Al iniciar memcache con la opción "-vv", se revelan las clases de fragmentos que genera, como se muestra a continuación:
```bash
$ memcached -vv
slab class 1: chunk size 96 perslab 10922
[...]
```
Para mostrar todas las losas actualmente existentes, se utiliza el siguiente comando:
```bash
stats slabs
```
Añadir una clave única a memcached 1.4.13 ilustra cómo se poblán y gestionan las clases de fragmentos. Por ejemplo:
```bash
set mykey 0 60 1
1
STORED
```
Ejecutar el comando "stats slabs" después de agregar una clave proporciona estadísticas detalladas sobre la utilización de las placas:
```bash
stats slabs
[...]
```
Este resultado revela los tipos de fragmentos activos, los fragmentos utilizados y las estadísticas operativas, ofreciendo información sobre la eficiencia de las operaciones de lectura y escritura.
Otro comando útil, "stats items", proporciona datos sobre las evicciones, las limitaciones de memoria y los ciclos de vida de los elementos:
```bash
stats items
[...]
```
### **Volcado de claves**
Para versiones anteriores a 1.4.31, las claves se vuelcan por clase de fragmento usando:
```bash
stats cachedump
```
Por ejemplo, para volcar una clave en la clase #1:
```bash
stats cachedump 1 1000
ITEM mykey [1 b; 1350677968 s]
END
```
Este método itera sobre las clases de fragmentos, extrayendo y opcionalmente volcando los valores de las claves.
### **VOLCADO DE CLAVES DE MEMCACHE (VER 1.4.31+)**
Con la versión de memcache 1.4.31 y superior, se introduce un nuevo método más seguro para volcar claves en un entorno de producción, utilizando el modo no bloqueante como se detalla en las [notas de la versión](https://github.com/memcached/memcached/wiki/ReleaseNotes1431). Este enfoque genera una salida extensa, por lo tanto, se recomienda emplear el comando 'nc' para mayor eficiencia. Algunos ejemplos incluyen:
```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
```
### **HERRAMIENTAS DE VOLCADO**
Tabla [desde aquí](https://lzone.de/blog).
| Lenguajes de Programación | Herramientas | Funcionalidad | | |
| ------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- | ------- |
| PHP | [script simple](http://snipt.org/xtP) | Imprime nombres de claves. | | |
| Perl | [script simple](https://wiki.jasig.org/download/attachments/13572172/memcached-clean.pl?version=1\&modificationDate=1229693957401) | Imprime claves y valores. | | |
| Ruby | [script simple](https://gist.github.com/1365005) | Imprime nombres de claves. | | |
| Perl | [memdump](https://search.cpan.org/\~dmaki/Memcached-libmemcached-0.4202/src/libmemcached/docs/memdump.pod) | Herramienta en 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 Monitoreo de Memcache que también permite el volcado de claves. | | |
| libmemcached | [peep](http://blog.evanweaver.com/2009/04/20/peeping-into-memcached/) | **¡Congela tu proceso de memcached!** Ten cuidado al usar esto en producción. Aún así, puedes evitar la limitación de 1MB y realmente volcar **todas** las claves. | | |
## Solución de Problemas
### Límite de Datos de 1MB
Ten en cuenta que antes de memcached 1.4 no puedes almacenar objetos mayores a 1MB debido al tamaño máximo de fragmento predeterminado.
### ¡Nunca Establezcas un Tiempo de Espera > 30 Días!
Si intentas "establecer" o "agregar" una clave con un tiempo de espera mayor al máximo permitido, es posible que no obtengas lo que esperas, ya que memcached trata el valor como una marca de tiempo Unix. Además, si la marca de tiempo está en el pasado, no hará nada en absoluto. Tu comando fallará silenciosamente.
Por lo tanto, si deseas utilizar el tiempo de vida máximo, especifica 2592000. Ejemplo:
```
set my_key 0 2592000 1
1
```
### Claves que desaparecen al desbordarse
A pesar de que la documentación menciona algo sobre envolver alrededor de 64 bits al desbordar un valor usando "incr", hace que el valor desaparezca. Es necesario crearlo nuevamente usando "add"/"set".
### Replicación
memcached en sí no admite replicación. Si realmente la necesitas, debes usar soluciones de terceros:
* [repcached](http://repcached.lab.klab.org/): Replicación asíncrona multi-maestro (conjunto de parches de memcached 1.2)
* [Interfaz de memcached de Couchbase](http://www.couchbase.com/memcached): Usa CouchBase como reemplazo de memcached
* [yrmcds](https://cybozu.github.io/yrmcds/): Almacenamiento de clave-valor maestro-esclavo compatible con memcached
* [twemproxy](https://github.com/twitter/twemproxy) (también conocido como nutcracker): proxy con soporte para memcached
### Hoja de trucos de comandos
{% content-ref url="memcache-commands.md" %}
[memcache-commands.md](memcache-commands.md)
{% endcontent-ref %}
### **Shodan**
* `port:11211 "STAT pid"`
* `"STAT pid"`
## Referencias
* [https://lzone.de/cheat-sheet/memcached](https://lzone.de/cheat-sheet/memcached)
Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
* Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Obtén la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).