hacktricks/network-services-pentesting/11211-memcache/README.md

14 KiB

11211 - Pentesting Memcache

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Protocol Information

From 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 afin de 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

Enumeration

Manual

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

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

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

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

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

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 les forums communautaires.

La limitation de ne pouvoir extraire que 1 Mo de données parmi potentiellement des gigaoctets de données 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 dans la section outils 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. Lancer memcache avec l'option "-vv" révèle les classes de slab qu'il génère, comme montré ci-dessous :

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

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

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 :

set mykey 0 60 1
1
STORED

Exécuter la commande "stats slabs" après l'ajout de la clé fournit des statistiques détaillées sur l'utilisation des slabs :

stats slabs
[...]

Cette sortie révèle les types de slab actifs, les chunks utilisés et les statistiques opérationnelles, offrant des aperçus 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 :

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 d'objets volumineux.

Dumping Keys

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

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

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

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

Cette méthode itère sur les classes de slab, extrayant et optionnellement déversant les valeurs clés.

DUMPING MEMCACHE KEYS (VER 1.4.31+)

Avec la version memcache 1.4.31 et supérieure, une nouvelle méthode plus sûre pour déverser 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'employer la commande 'nc' pour plus d'efficacité. Les exemples incluent :

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 Programmation Outils Fonctionnalité
PHP simple script Imprime les noms de clés.
Perl simple script Imprime les clés et les valeurs
Ruby simple script Imprime les noms de clés.
Perl memdump Outil dans le module CPAN Memcached-libmemcached ached/)
PHP memcache.php Interface de surveillance Memcache qui permet également de dumper les clés
libmemcached peep Fait 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 plus grands que 1 Mo en raison de la taille maximale de slab par défaut.

Ne Jamais Définir un Délai > 30 Jours !

Si vous essayez de “définir” ou “ajouter” une clé avec un délai 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

{% content-ref url="memcache-commands.md" %} memcache-commands.md {% endcontent-ref %}

Shodan

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

References

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}