11211 - Pentesting Memcache

Reading time: 8 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Informations sur le protocole

De wikipedia:

Memcached (prononciation : mem-cashed, mem-cash-dee) est un systĂšme de mise en cache en mĂ©moire distribuĂ© Ă  usage gĂ©nĂ©ral. Il est souvent utilisĂ© pour accĂ©lĂ©rer les sites Web dynamiques basĂ©s sur des bases de donnĂ©es en mettant en cache des donnĂ©es et des objets dans la RAM pour rĂ©duire le nombre de fois qu'une source de donnĂ©es externe (comme une base de donnĂ©es ou une API) doit ĂȘtre lue.

Bien que Memcached prenne en charge SASL, la plupart des instances sont exposées sans authentification.

Port par défaut : 11211

PORT      STATE SERVICE
11211/tcp open  unknown

ÉnumĂ©ration

Manuel

Pour exfiltrer toutes les informations enregistrées dans une instance de memcache, vous devez :

  1. Trouver des slabs avec des éléments actifs
  2. Obtenir les noms de clé des slabs détectés précédemment
  3. Exfiltrer les données enregistrées en obtenant les noms de clé

N'oubliez pas que ce service n'est qu'un cache, donc les données peuvent apparaßtre et disparaßtre.

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() );'

Manuel2

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)

Automatique

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

Dumping Memcache Keys

Dans le domaine de memcache, un protocole qui aide à organiser les données par slabs, des commandes spécifiques existent pour inspecter les données stockées, bien qu'avec des contraintes notables :

  1. Les clĂ©s ne peuvent ĂȘtre extraites que par classe de slab, regroupant les clĂ©s de taille de contenu similaire.
  2. Une limite existe d'une page par classe de slab, équivalant à 1 Mo de données.
  3. Cette fonctionnalitĂ© est non officielle et peut ĂȘtre interrompue Ă  tout moment, comme discutĂ© dans community forums.

La limitation de ne pouvoir extraire que 1 Mo de données potentiellement de plusieurs gigaoctets est particuliÚrement significative. Cependant, cette fonctionnalité peut encore offrir des aperçus sur les modÚles d'utilisation des clés, selon les besoins spécifiques. Pour ceux qui s'intéressent moins à la mécanique, une visite à la tools section révÚle des utilitaires pour un dumping complet. Alternativement, le processus d'utilisation de telnet pour une interaction directe avec les configurations memcached est décrit ci-dessous.

How it Works

L'organisation de la mémoire de Memcache est essentielle. Initier memcache avec l'option "-vv" révÚle les classes de slab qu'il génÚre, comme montré ci-dessous :

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

Pour afficher tous les slabs actuellement existants, la commande suivante est utilisée :

bash
stats slabs

Ajouter une seule clé à memcached 1.4.13 illustre comment les classes de slab sont peuplées et gérées. Par exemple :

bash
set mykey 0 60 1
1
STORED

L'exécution de la commande "stats slabs" aprÚs l'ajout de la clé fournit des statistiques détaillées sur l'utilisation des slabs :

bash
stats slabs
[...]

Cette sortie révÚle les types de slab actifs, les chunks utilisés et les statistiques opérationnelles, offrant des informations sur l'efficacité des opérations de lecture et d'écriture.

Une autre commande utile, "stats items", fournit des données sur les évictions, les contraintes de mémoire et les cycles de vie des éléments :

bash
stats items
[...]

Ces statistiques permettent de faire des hypothÚses éclairées sur le comportement de mise en cache des applications, y compris l'efficacité du cache pour différentes tailles de contenu, l'allocation de mémoire et la capacité de mise en cache des grands objets.

Dumping Keys

Pour les versions antérieures à 1.4.31, les clés sont extraites par classe de slab en utilisant :

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

Par exemple, pour extraire une clé dans la classe #1 :

bash
stats cachedump 1 1000
ITEM mykey [1 b; 1350677968 s]
END

Cette méthode itÚre sur les classes de slab, extrayant et optionnellement vidant les valeurs clés.

VIDAGE DES CLÉS MEMCACHE (VER 1.4.31+)

Avec la version memcache 1.4.31 et supĂ©rieure, une nouvelle mĂ©thode plus sĂ»re pour vider les clĂ©s dans un environnement de production est introduite, utilisant le mode non-bloquant comme dĂ©taillĂ© dans les notes de version. Cette approche gĂ©nĂšre une sortie extensive, d'oĂč la recommandation d'utiliser la commande 'nc' pour plus d'efficacitĂ©. Des exemples incluent :

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

OUTILS DE DUMPING

Table from here.

Langages de programmationOutilsFonctionnalité
PHPsimple scriptImprime les noms de clés.
Perlsimple scriptImprime les clés et les valeurs
Rubysimple scriptImprime les noms de clés.
PerlmemdumpOutil dans le module CPANMemcached-libmemcachedached/)
PHPmemcache.phpInterface de surveillance Memcache qui permet également de dumper les clés
libmemcachedpeepFait geler votre processus memcached !!! Faites attention en l'utilisant en production. En l'utilisant, vous pouvez contourner la limitation de 1 Mo et vraiment dumper toutes les clés.

DĂ©pannage

Limite de données de 1 Mo

Notez qu'avant memcached 1.4, vous ne pouvez pas stocker des objets de plus de 1 Mo en raison de la taille maximale de slab par défaut.

Ne jamais définir un délai d'expiration > 30 jours !

Si vous essayez de “dĂ©finir” ou “ajouter” une clĂ© avec un dĂ©lai d'expiration supĂ©rieur au maximum autorisĂ©, vous pourriez ne pas obtenir ce que vous attendez car memcached traite alors la valeur comme un horodatage Unix. De plus, si l'horodatage est dans le passĂ©, il ne fera rien du tout. Votre commande Ă©chouera silencieusement.

Donc, si vous voulez utiliser la durée de vie maximale, spécifiez 2592000. Exemple :

set my_key 0 2592000 1
1

Disappearing Keys on Overflow

MalgrĂ© la documentation disant quelque chose sur le fait que le dĂ©bordement d'une valeur 64 bits en utilisant “incr” fait disparaĂźtre la valeur. Elle doit ĂȘtre crĂ©Ă©e Ă  nouveau en utilisant “add”/”set”.

Replication

memcached lui-mĂȘme ne prend pas en charge la rĂ©plication. Si vous en avez vraiment besoin, vous devez utiliser des solutions tierces :

  • repcached: RĂ©plication multi-maĂźtre asynchrone (ensemble de correctifs memcached 1.2)
  • Couchbase memcached interface: Utilisez CouchBase comme remplacement de memcached
  • yrmcds: magasin de valeurs clĂ©s Master-Slave compatible memcached
  • twemproxy (alias nutcracker): proxy avec support memcached

Commands Cheat-Sheet

Memcache Commands

Shodan

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

References

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks