11211 - Pentesting Memcache

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Información del Protocolo

De wikipedia:

Memcached (pronunciación: mem-cashed, mem-cash-dee) es un sistema de caché de memoria distribuido de propósito general. A menudo se utiliza para acelerar sitios web dinámicos impulsados por bases de datos al almacenar en caché 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 API).

Aunque Memcached admite SASL, la mayoría de las instancias están expuestas sin autenticación.

Puerto por defecto: 11211

PORT      STATE SERVICE
11211/tcp open  unknown

Enumeración

Manual

Para exfiltrar 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 un cache, por lo que los datos pueden aparecer y desaparecer.

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

Volcando Claves de Memcache

En el ámbito de memcache, un protocolo que ayuda a organizar datos por slabs, existen comandos específicos para inspeccionar los datos almacenados, aunque con notables limitaciones:

  1. Las claves solo se pueden volcar por clase de slab, agrupando claves de tamaño de contenido similar.
  2. Existe un límite de una página por clase de slab, equivalente a 1MB de datos.
  3. Esta función es no oficial y puede ser descontinuada en cualquier momento, como se discute en community forums.

La limitación de poder volcar solo 1MB de potencialmente gigabytes de datos es particularmente significativa. Sin embargo, esta funcionalidad aún puede ofrecer información sobre los patrones de uso de claves, dependiendo de las necesidades específicas. Para aquellos menos interesados en la mecánica, una visita a la tools section revela utilidades para un volcado completo. Alternativamente, el proceso de usar telnet para la interacción directa con configuraciones de memcached se describe a continuación.

Cómo Funciona

La organización de la memoria de Memcache es fundamental. Iniciar memcache con la opción "-vv" revela las clases de slab que genera, como se muestra a continuación:

bash
$ memcached -vv
slab class   1: chunk size        96 perslab   10922
[...]

Para mostrar todos los slabs existentes actualmente, se utiliza el siguiente comando:

bash
stats slabs

Agregar una sola clave a memcached 1.4.13 ilustra cómo se poblan y gestionan las clases de slab. Por ejemplo:

bash
set mykey 0 60 1
1
STORED

Ejecutar el comando "stats slabs" después de la adición de una clave produce estadísticas detalladas sobre la utilización de los slabs:

bash
stats slabs
[...]

Esta salida revela los tipos de slab activos, los chunks 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 desalojos, restricciones de memoria y ciclos de vida de los ítems:

bash
stats items
[...]

Estas estadísticas permiten hacer suposiciones fundamentadas sobre el comportamiento de caché de la aplicación, incluida la eficiencia de la caché para diferentes tamaños de contenido, la asignación de memoria y la capacidad para almacenar en caché objetos grandes.

Volcando Claves

Para versiones anteriores a 1.4.31, las claves se vierten por clase de slab usando:

bash
stats cachedump <slab class> <number of items to dump>

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 slab, extrayendo y opcionalmente volcando valores clave.

VOLCANDO CLAVES DE MEMCACHE (VER 1.4.31+)

Con la versión 1.4.31 de memcache y superiores, 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. Este enfoque genera una salida extensa, por lo que se recomienda emplear el comando 'nc' para mayor eficiencia. Los 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 DUMPING

Tabla desde aquí.

Lenguajes de ProgramaciónHerramientasFuncionalidad
PHPscript simpleImprime nombres de claves.
Perlscript simpleImprime claves y valores
Rubyscript simpleImprime nombres de claves.
PerlmemdumpHerramienta en el módulo CPANMemcached-libmemcachedached/)
PHPmemcache.phpInterfaz gráfica de monitoreo de Memcache que también permite volcar claves
libmemcachedpeep¡Congela tu proceso de memcached! Ten cuidado al usar esto en producción. Aún así, puedes sortear 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 más grandes de 1MB debido al tamaño máximo de slab predeterminado.

¡Nunca Establezcas un Tiempo de Espera > 30 Días!

Si intentas “establecer” o “agregar” una clave con un tiempo de espera mayor que el máximo permitido, es posible que no obtengas lo que esperas porque memcached trata el valor como una marca de tiempo de Unix. Además, si la marca de tiempo está en el pasado, no hará nada en absoluto. Tu comando fallará silenciosamente.

Así que si deseas usar la vida útil máxima, especifica 2592000. Ejemplo:

set my_key 0 2592000 1
1

Claves que desaparecen en desbordamiento

A pesar de que la documentación dice algo sobre que el desbordamiento de un valor de 64 bits usando “incr” hace que el valor desaparezca. Necesita ser creado nuevamente usando “add”/”set”.

Replicación

memcached en sí no soporta replicación. Si realmente lo necesitas, debes usar soluciones de terceros:

  • repcached: Replicación asíncrona multi-maestro (conjunto de parches de memcached 1.2)
  • Interfaz memcached de Couchbase: Usa CouchBase como reemplazo de memcached
  • yrmcds: Almacenamiento de clave-valor compatible con memcached Master-Slave
  • twemproxy (también conocido como nutcracker): proxy con soporte para memcached

Hoja de trucos de comandos

Memcache Commands

Shodan

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

Referencias

tip

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks