hacktricks/network-services-pentesting/11211-memcache
2024-02-08 22:27:35 +00:00
..
memcache-commands.md Translated ['network-services-pentesting/11211-memcache/memcache-command 2024-02-08 22:27:35 +00:00
README.md Translated ['a.i.-exploiting/bra.i.nsmasher-presentation/BIM_Bruteforcer 2024-02-08 22:25:00 +00:00

11211 - Pentesting Memcache

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Información del Protocolo

Desde wikipedia:

Memcached (pronunciación: mem-cached, mem-cash-dee) es un sistema de caché de memoria 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.

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

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 vulnerabilidades de seguridad si no se configura adecuadamente.

Escaneo de Memcached

Puedes escanear en busca de servidores Memcached abiertos utilizando herramientas como nmap o masscan. Una vez identificados los servidores Memcached, puedes intentar acceder a ellos y realizar pruebas de penetración para identificar posibles vulnerabilidades y configuraciones incorrectas.

Ataques a Memcached

Algunos ataques comunes a servidores Memcached abiertos incluyen la amplificación de ataques DDoS, donde un atacante puede enviar solicitudes falsificadas a un servidor Memcached y hacer que responda con una cantidad mucho mayor de datos, lo que puede abrumar al objetivo del ataque. Es importante asegurarse de que los servidores Memcached estén correctamente configurados y protegidos para evitar este tipo de ataques.

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

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.

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 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. Iniciar memcache con la opción "-vv" revela las clases de fragmentos que genera, como se muestra a continuación:

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

Para mostrar todas las losas actualmente existentes, se utiliza el siguiente comando:

stats slabs

Añadir una clave única a memcached 1.4.13 ilustra cómo se poblaron y gestionaron las clases de fragmentos. Por ejemplo:

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:

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:

stats items
[...]

Volcado de Claves

Para versiones anteriores a 1.4.31, las claves se vuelcan por clase de fragmento 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 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. Este enfoque genera una salida extensa, por lo tanto, se recomienda emplear el comando 'nc' para mayor eficiencia. 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 VOLCADO

Tabla desde aquí.

Lenguajes de Programación Herramientas Funcionalidad
PHP script simple Imprime nombres de claves.
Perl script simple Imprime claves y valores.
Ruby script simple Imprime nombres de claves.
Perl memdump Herramienta en módulo CPAN. Memcached-libmemcached ached/)
PHP memcache.php GUI de Monitoreo de Memcache que también permite el volcado de claves.
libmemcached peep ¡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: Replicación asíncrona multi-maestro (conjunto de parches de memcached 1.2)
  • Interfaz de memcached de Couchbase: Usa CouchBase como reemplazo de memcached
  • yrmcds: Almacenamiento de clave-valor maestro-esclavo compatible con memcached
  • 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 {% endcontent-ref %}

Shodan

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

Referencias

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: