11211 - Pentesting Memcache

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks:

Informations sur le protocole

D'après Wikipédia:

Memcached (prononciation : mem-cached, mem-cash-dee) est un système de mise en cache de mémoire distribuée à usage général. Il est souvent utilisé pour accélérer les sites Web dynamiques pilotés par une base de données en mettant en cache des données et des objets en RAM pour réduire le nombre de fois où 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

Manuelle

Pour exfiltrer toutes les informations enregistrées à l'intérieur d'une instance memcache, vous devez :

  1. Trouver les 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é

Rappelez-vous que ce service est juste 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

Extraction des clés Memcache

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

  1. Les clés ne peuvent être extraites que par classe de tranche, regroupant les clés de taille de contenu similaire.

  2. Il existe une limite d'une page par classe de tranche, é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 parmi potentiellement des gigaoctets de données est particulièrement significative. Cependant, cette fonctionnalité peut toujours offrir des informations sur les schémas d'utilisation des clés, en fonction des besoins spécifiques. Pour ceux qui sont moins intéressés par les mécanismes, une visite de la section des outils révèle des utilitaires pour une extraction complète. Alternativement, le processus d'utilisation de telnet pour une interaction directe avec les configurations memcached est décrit ci-dessous.

Comment ça Marche

L'organisation de la mémoire de Memcache est cruciale. L'initialisation de memcache avec l'option "-vv" révèle les classes de tranches qu'il génère, comme illustré ci-dessous :

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

Pour afficher toutes les dalles actuellement existantes, la commande suivante est utilisée :

stats slabs

Ajouter une clé unique à 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 clés fournit des statistiques détaillées sur l'utilisation des slab :

stats slabs
[...]

Cet output 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 :

stats items
[...]

Extraction des clés

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 vider 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 éventuellement déversant les valeurs des clés.

EXTRACTION DES CLÉS MEMCACHE (VER 1.4.31+)

Avec la version de memcache 1.4.31 et supérieure, une nouvelle méthode plus sûre pour extraire les clés dans un environnement de production est introduite, en 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 :

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

Tableau à partir d'ici.

Langages de programmation
Outils
Fonctionnalité

PHP

Affiche les noms des clés.

Perl

Affiche les clés et les valeurs

Ruby

Affiche les noms des clés.

Perl

Outil dans le module CPAN

ached/)

PHP

Interface graphique de surveillance de Memcache qui permet également de vider les clés

libmemcached

Gèle votre processus memcached !!! Soyez prudent lors de son utilisation en production. En l'utilisant, vous pouvez contourner la limitation de 1 Mo et vraiment vider 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 Définissez Jamais 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 le résultat attendu car memcached traitera alors la valeur comme un horodatage Unix. De plus, si l'horodatage est dans le passé, rien ne se produira 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

Clés Disparaissant en Cas de Dépassement

Malgré la documentation indiquant quelque chose à propos du dépassement de 64 bits, une valeur dépassement en utilisant "incr" fait disparaître la valeur. Il faut la recréer en utilisant "add"/"set" à nouveau.

Réplication

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 asynchrone multi-maître (ensemble de correctifs memcached 1.2)

  • Interface memcached de Couchbase : Utilisez CouchBase comme remplacement de memcached

  • yrmcds : Magasin de valeurs clés maître-esclave compatible avec memcached

  • twemproxy (alias nutcracker) : proxy avec support memcached

Feuille de Triche des Commandes

Memcache Commands

Shodan

  • port:11211 "STAT pid"

  • "STAT pid"

Références

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks :

Last updated