11211 - Pentesting Memcache

Support HackTricks

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

Από wikipedia:

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

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

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

PORT      STATE SERVICE
11211/tcp open  unknown

Enumeration

Manual

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

  1. Βρείτε slabs με ενεργά αντικείμενα

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

  3. Εξάγετε τα αποθηκευμένα δεδομένα αποκτώντας τα ονόματα κλειδιών

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

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

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)

Αυτόματη

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

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

  1. Οι κωδικοί μπορούν να αποθηκευτούν μόνο κατά slab class, ομαδοποιώντας κωδικούς παρόμοιου μεγέθους περιεχομένου.

  2. Υπάρχει περιορισμός μίας σελίδας ανά slab class, που ισοδυναμεί με 1MB δεδομένων.

  3. Αυτή η δυνατότητα είναι ανεπίσημη και μπορεί να καταργηθεί οποιαδήποτε στιγμή, όπως συζητείται σε community forums.

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

How it Works

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

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

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

stats slabs

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

set mykey 0 60 1
1
STORED

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

stats slabs
[...]

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

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

stats items
[...]

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

Dumping Keys

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

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

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

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

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

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

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

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

DUMPING TOOLS

Table from here.

Programming LanguagesToolsFunctionality

PHP

Εκτυπώνει τα ονόματα κλειδιών.

Perl

Εκτυπώνει κλειδιά και τιμές

Ruby

Εκτυπώνει τα ονόματα κλειδιών.

Perl

Εργαλείο στο CPAN module

ached/)

PHP

GUI παρακολούθησης Memcache που επιτρέπει επίσης την εκτύπωση κλειδιών

libmemcached

Κάνει παγώσει τη διαδικασία memcached!!! Να είστε προσεκτικοί όταν το χρησιμοποιείτε σε παραγωγή. Ακόμα και αν το χρησιμοποιήσετε μπορείτε να παρακάμψετε τον περιορισμό των 1MB και να εκτυπώσετε όλα τα κλειδιά.

Troubleshooting

1MB Data Limit

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

Never Set a Timeout > 30 Days!

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

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

set my_key 0 2592000 1
1

Disappearing Keys on Overflow

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

Replication

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

  • repcached: Πολυμάστερ ασύγχρονη αναπαραγωγή (patch set memcached 1.2)

  • Couchbase memcached interface: Χρησιμοποιήστε το CouchBase ως drop-in memcached

  • yrmcds: Συμβατό με memcached Master-Slave αποθήκη κλειδιών-τιμών

  • twemproxy (aka nutcracker): proxy με υποστήριξη memcached

Commands Cheat-Sheet

Memcache Commands

Shodan

  • port:11211 "STAT pid"

  • "STAT pid"

References

Support HackTricks

Last updated