11211 - Pentesting Memcache

Reading time: 8 minutes

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Πληροφορίες Πρωτοκόλλου

Από wikipedia:

Memcached (προφορά: mem-cashed, mem-cash-dee) είναι ένα γενικού σκοπού κατανεμημένο σύστημα προσωρινής αποθήκευσης μνήμης. Χρησιμοποιείται συχνά για να επιταχύνει δυναμικές ιστοσελίδες που βασίζονται σε βάσεις δεδομένων, αποθηκεύοντας δεδομένα και αντικείμενα στη RAM για να μειώσει τον αριθμό των φορών που πρέπει να διαβαστεί μια εξωτερική πηγή δεδομένων (όπως μια βάση δεδομένων ή API).

Αν και το Memcached υποστηρίζει SASL, οι περισσότερες περιπτώσεις είναι εκτεθειμένες χωρίς αυθεντικοποίηση.

Προεπιλεγμένη θύρα: 11211

PORT      STATE SERVICE
11211/tcp open  unknown

Αριθμητική

Χειροκίνητη

Για να εξάγετε όλες τις πληροφορίες που είναι αποθηκευμένες μέσα σε μια μνήμη memcache, πρέπει να:

  1. Βρείτε slabs με ενεργά στοιχεία
  2. Πάρτε τα ονόματα κλειδιών των slabs που ανιχνεύθηκαν προηγουμένως
  3. Εξάγετε τα αποθηκευμένα δεδομένα αποκτώντας τα ονόματα κλειδιών

Θυμηθείτε ότι αυτή η υπηρεσία είναι απλώς μια cache, οπότε τα δεδομένα μπορεί να εμφανίζονται και να εξαφανίζονται.

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

Manual2

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)

Αυτόματη

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

Εξαγωγή Κλειδιών Memcache

Στον τομέα του memcache, ένα πρωτόκολλο που βοηθά στην οργάνωση των δεδομένων κατά slabs, υπάρχουν συγκεκριμένες εντολές για την επιθεώρηση των αποθηκευμένων δεδομένων, αν και με σημαντικούς περιορισμούς:

  1. Τα κλειδιά μπορούν να εξάγονται μόνο κατά slab class, ομαδοποιώντας κλειδιά παρόμοιου μεγέθους περιεχομένου.
  2. Υπάρχει περιορισμός μίας σελίδας ανά slab class, που ισοδυναμεί με 1MB δεδομένων.
  3. Αυτή η δυνατότητα είναι ανεπίσημη και μπορεί να καταργηθεί οποιαδήποτε στιγμή, όπως συζητείται σε community forums.

Ο περιορισμός της εξαγωγής μόνο 1MB από δυνητικά γιγαμπάτ δεδομένων είναι ιδιαίτερα σημαντικός. Ωστόσο, αυτή η λειτουργικότητα μπορεί να προσφέρει πληροφορίες σχετικά με τα πρότυπα χρήσης κλειδιών, ανάλογα με τις συγκεκριμένες ανάγκες. Για εκείνους που δεν ενδιαφέρονται τόσο για τη μηχανική, μια επίσκεψη στην tools section αποκαλύπτει εργαλεία για εκτενή εξαγωγή. Εναλλακτικά, η διαδικασία χρήσης telnet για άμεση αλληλεπίδραση με τις ρυθμίσεις memcached περιγράφεται παρακάτω.

Πώς Λειτουργεί

Η οργάνωση μνήμης του memcache είναι καθοριστική. Η εκκίνηση του memcache με την επιλογή "-vv" αποκαλύπτει τις slab classes που δημιουργεί, όπως φαίνεται παρακάτω:

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

Για να εμφανίσετε όλα τα υπάρχοντα slabs, χρησιμοποιείται η ακόλουθη εντολή:

bash
stats slabs

Η προσθήκη ενός μόνο κλειδιού στο memcached 1.4.13 απεικονίζει πώς οι κλάσεις slab γεμίζουν και διαχειρίζονται. Για παράδειγμα:

bash
set mykey 0 60 1
1
STORED

Η εκτέλεση της εντολής "stats slabs" μετά την προσθήκη κλειδιού αποδίδει λεπτομερείς στατιστικές σχετικά με τη χρησιμοποίηση των slabs:

bash
stats slabs
[...]

Αυτή η έξοδος αποκαλύπτει τους ενεργούς τύπους slab, τα χρησιμοποιούμενα chunks και τις λειτουργικές στατιστικές, προσφέροντας πληροφορίες σχετικά με την αποδοτικότητα των λειτουργιών ανάγνωσης και εγγραφής.

Μια άλλη χρήσιμη εντολή, "stats items", παρέχει δεδομένα σχετικά με τις εκδιώξεις, τους περιορισμούς μνήμης και τους κύκλους ζωής των αντικειμένων:

bash
stats items
[...]

Αυτές οι στατιστικές επιτρέπουν εκπαιδευμένες υποθέσεις σχετικά με τη συμπεριφορά της προσωρινής αποθήκευσης εφαρμογών, συμπεριλαμβανομένης της αποδοτικότητας της προσωρινής αποθήκευσης για διαφορετικά μεγέθη περιεχομένου, της κατανομής μνήμης και της ικανότητας προσωρινής αποθήκευσης μεγάλων αντικειμένων.

Dumping Keys

Για εκδόσεις πριν από την 1.4.31, τα κλειδιά αποθηκεύονται κατά κατηγορία slab χρησιμοποιώντας:

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

Για παράδειγμα, για να εξάγετε ένα κλειδί στην κατηγορία #1:

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

Αυτή η μέθοδος επαναλαμβάνει τις κλάσεις slab, εξάγοντας και προαιρετικά εκ dumping τις τιμές κλειδιών.

ΕΚΤΥΠΩΣΗ ΚΛΕΙΔΙΩΝ MEMCACHE (VER 1.4.31+)

Με την έκδοση memcache 1.4.31 και άνω, εισάγεται μια νέα, ασφαλέστερη μέθοδος για την εκτύπωση κλειδιών σε ένα παραγωγικό περιβάλλον, χρησιμοποιώντας μη αποκλειστική λειτουργία όπως αναφέρεται στις σημειώσεις έκδοσης. Αυτή η προσέγγιση παράγει εκτενή έξοδο, γι' αυτό συνιστάται η χρήση της εντολής 'nc' για αποδοτικότητα. Παραδείγματα περιλαμβάνουν:

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

ΕΡΓΑΛΕΙΑ ΕΞΑΓΩΓΗΣ

Table from here.

Programming LanguagesToolsFunctionality
PHPsimple scriptΕκτυπώνει τα ονόματα κλειδιών.
Perlsimple scriptΕκτυπώνει κλειδιά και τιμές
Rubysimple scriptΕκτυπώνει τα ονόματα κλειδιών.
PerlmemdumpΕργαλείο στο CPAN moduleMemcached-libmemcachedached/)
PHPmemcache.phpGUI παρακολούθησης Memcache που επιτρέπει επίσης την εξαγωγή κλειδιών
libmemcachedpeepΚάνει παγώμα της διαδικασίας memcached!!! Να είστε προσεκτικοί όταν το χρησιμοποιείτε σε παραγωγή. Παρ' όλα αυτά, μπορείτε να παρακάμψετε τον περιορισμό των 1MB και να εξάγετε όλα τα κλειδιά.

Troubleshooting

1MB Data Limit

Σημειώστε ότι πριν από το memcached 1.4 δεν μπορείτε να αποθηκεύσετε αντικείμενα μεγαλύτερα από 1MB λόγω του προεπιλεγμένου μέγιστου μεγέθους slab.

Ποτέ μην ορίζετε χρόνο λήξης > 30 ημέρες!

Εάν προσπαθήσετε να “ορίσετε” ή “προσθέσετε” ένα κλειδί με χρόνο λήξης μεγαλύτερο από το επιτρεπόμενο μέγιστο, μπορεί να μην λάβετε αυτό που περιμένετε, επειδή το memcached τότε θεωρεί την τιμή ως χρονική σφραγίδα Unix. Επίσης, εάν η χρονική σφραγίδα είναι στο παρελθόν, δεν θα κάνει τίποτα απολύτως. Η εντολή σας θα αποτύχει σιωπηλά.

Έτσι, αν θέλετε να χρησιμοποιήσετε τη μέγιστη διάρκεια ζωής, καθορίστε 2592000. Παράδειγμα:

set my_key 0 2592000 1
1

Κλειδιά που Εξαφανίζονται σε Υπερχείλιση

Παρά το γεγονός ότι η τεκμηρίωση αναφέρει κάτι σχετικά με την περιτύλιξη γύρω από την υπερχείλιση 64bit, η χρήση του “incr” προκαλεί την εξαφάνιση της τιμής. Πρέπει να δημιουργηθεί ξανά χρησιμοποιώντας “add”/”set”.

Αναπαραγωγή

Το memcached από μόνο του δεν υποστηρίζει αναπαραγωγή. Αν το χρειάζεστε πραγματικά, πρέπει να χρησιμοποιήσετε λύσεις τρίτων:

  • repcached: Πολυμάστερ ασύγχρονη αναπαραγωγή (patch set memcached 1.2)
  • Couchbase memcached interface: Χρησιμοποιήστε το CouchBase ως drop-in memcached
  • yrmcds: Συμβατό με memcached Master-Slave κατάστημα κλειδιών-τιμών
  • twemproxy (aka nutcracker): proxy με υποστήριξη memcached

Cheat-Sheet Εντολών

Memcache Commands

Shodan

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

Αναφορές

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks