11211 - Pentesting Memcache

Support HackTricks

Protocol Information

From 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 las claves de los slabs detectados anteriormente

  3. Exfiltrar los datos guardados obteniendo los nombres de las claves

Recuerda que este servicio es solo un cache, por lo que los datos pueden aparecer y desaparecer.

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

Dumping Memcache Keys

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 foros comunitarios.

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 sección de herramientas 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.

How it Works

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:

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

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

stats slabs

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

set mykey 0 60 1
1
STORED

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

stats slabs
[...]

Este resultado 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 elementos:

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:

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

Por ejemplo, para volcar una clave en la clase #1:

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 de memcache 1.4.31 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, de ahí la recomendación de emplear el comando 'nc' para mayor eficiencia. Los ejemplos incluyen:

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

PHP

Imprime nombres de claves.

Perl

Imprime claves y valores

Ruby

Imprime nombres de claves.

Perl

Herramienta en el módulo CPAN

ached/)

PHP

Interfaz gráfica de monitoreo de Memcache que también permite volcar claves

libmemcached

¡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 Desaparecidas 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 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

Apoya a HackTricks

Last updated