11211 - Pentesting Memcache

Reading time: 8 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks का समर्थन करें

Protocol Information

From wikipedia:

Memcached (उच्चारण: मेम-कैश्ड, मेम-कैश-डी) एक सामान्य-उद्देश्य वितरित मेमोरी कैशिंग प्रणाली है। इसका उपयोग अक्सर गतिशील डेटाबेस-चालित वेबसाइटों को तेज़ करने के लिए डेटा और वस्तुओं को RAM में कैश करके किया जाता है ताकि बाहरी डेटा स्रोत (जैसे डेटाबेस या API) को पढ़ने की संख्या को कम किया जा सके।

हालांकि Memcached SASL का समर्थन करता है, अधिकांश उदाहरण प्रमाणीकरण के बिना उजागर होते हैं।

डिफ़ॉल्ट पोर्ट: 11211

PORT      STATE SERVICE
11211/tcp open  unknown

Enumeration

Manual

एक memcache उदाहरण के अंदर सहेजी गई सभी जानकारी को निकालने के लिए आपको निम्नलिखित करने की आवश्यकता है:

  1. सक्रिय आइटम के साथ स्लैब खोजें
  2. पहले पहचाने गए स्लैब के की नाम प्राप्त करें
  3. की नाम प्राप्त करके सहेजी गई डेटा को निकालें

याद रखें कि यह सेवा केवल एक कैश है, इसलिए डेटा प्रकट और गायब हो सकता है

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

मैनुअल2

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 के क्षेत्र में, एक प्रोटोकॉल जो डेटा को स्लैब द्वारा व्यवस्थित करने में मदद करता है, संग्रहीत डेटा की जांच के लिए विशिष्ट कमांड मौजूद हैं, हालांकि notable सीमाओं के साथ:

  1. कुंजी केवल स्लैब वर्ग द्वारा डंप की जा सकती हैं, समान सामग्री आकार की कुंजियों को समूहित करना।
  2. प्रत्येक स्लैब वर्ग के लिए एक पृष्ठ की सीमा है, जो 1MB डेटा के बराबर है।
  3. यह सुविधा अनौपचारिक है और इसे किसी भी समय बंद किया जा सकता है, जैसा कि समुदाय फोरम में चर्चा की गई है।

संभावित गीगाबाइट डेटा में से केवल 1MB को डंप करने की सीमा विशेष रूप से महत्वपूर्ण है। हालाँकि, यह कार्यक्षमता कुंजी उपयोग पैटर्न के बारे में अंतर्दृष्टि प्रदान कर सकती है, विशिष्ट आवश्यकताओं के आधार पर। जो लोग यांत्रिकी में कम रुचि रखते हैं, उनके लिए उपकरण अनुभाग पर जाने से व्यापक डंपिंग के लिए उपयोगिताएँ मिलती हैं। वैकल्पिक रूप से, memcached सेटअप के साथ सीधे इंटरैक्शन के लिए टेलनेट का उपयोग करने की प्रक्रिया नीचे दी गई है।

यह कैसे काम करता है

Memcache की मेमोरी संगठन महत्वपूर्ण है। "-vv" विकल्प के साथ memcache शुरू करने से यह स्लैब वर्ग प्रकट होते हैं जो यह उत्पन्न करता है, जैसा कि नीचे दिखाया गया है:

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

सभी वर्तमान में मौजूद स्लैब्स को प्रदर्शित करने के लिए, निम्नलिखित कमांड का उपयोग किया जाता है:

bash
stats slabs

memcached 1.4.13 में एकल कुंजी जोड़ना यह दर्शाता है कि स्लैब वर्ग कैसे भरे और प्रबंधित किए जाते हैं। उदाहरण के लिए:

bash
set mykey 0 60 1
1
STORED

"stats slabs" कमांड को कुंजी जोड़ने के बाद निष्पादित करने से स्लैब उपयोग के बारे में विस्तृत आंकड़े मिलते हैं:

bash
stats slabs
[...]

यह आउटपुट सक्रिय स्लैब प्रकार, उपयोग किए गए चंक्स और संचालनात्मक सांख्यिकी को प्रकट करता है, जो पढ़ने और लिखने के संचालन की दक्षता के बारे में जानकारी प्रदान करता है।

एक और उपयोगी कमांड, "stats items", निष्कासन, मेमोरी प्रतिबंधों और आइटम जीवनचक्रों पर डेटा प्रदान करता है:

bash
stats items
[...]

ये आँकड़े एप्लिकेशन कैशिंग व्यवहार के बारे में शिक्षित अनुमान लगाने की अनुमति देते हैं, जिसमें विभिन्न सामग्री आकारों के लिए कैश दक्षता, मेमोरी आवंटन, और बड़े ऑब्जेक्ट्स को कैश करने की क्षमता शामिल है।

कीज़ डंप करना

संस्करण 1.4.31 से पहले, कीज़ को स्लैब क्लास द्वारा डंप किया जाता है:

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

उदाहरण के लिए, क्लास #1 में एक कुंजी को डंप करने के लिए:

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

यह विधि स्लैब वर्गों के माध्यम से पुनरावृत्ति करती है, कुंजी मानों को निकालती है और वैकल्पिक रूप से उन्हें डंप करती है।

MEMCACHE कुंजी डंप करना (संस्करण 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

DUMPING TOOLS

Table from here.

Programming LanguagesToolsFunctionality
PHPsimple scriptकुंजी नाम प्रिंट करता है।
Perlsimple scriptकुंजी और मान प्रिंट करता है
Rubysimple scriptकुंजी नाम प्रिंट करता है।
PerlmemdumpCPAN मॉड्यूल में उपकरणMemcached-libmemcachedached/)
PHPmemcache.phpMemcache मॉनिटरिंग GUI जो कुंजी को डंप करने की अनुमति भी देता है
libmemcachedpeepआपके memcached प्रक्रिया को फ्रीज कर देता है!!! उत्पादन में इसका उपयोग करते समय सावधान रहें। फिर भी इसका उपयोग करते हुए आप 1MB सीमा को पार कर सकते हैं और वास्तव में सभी कुंजी को डंप कर सकते हैं।

Troubleshooting

1MB Data Limit

ध्यान दें कि memcached 1.4 से पहले आप 1MB से बड़े ऑब्जेक्ट्स को स्टोर नहीं कर सकते हैं क्योंकि डिफ़ॉल्ट अधिकतम स्लैब आकार है।

Never Set a Timeout > 30 Days!

यदि आप एक कुंजी को एक टाइमआउट के साथ “सेट” या “ऐड” करने की कोशिश करते हैं जो अधिकतम अनुमत से बड़ा है, तो आपको वह नहीं मिल सकता है जिसकी आप अपेक्षा करते हैं क्योंकि memcached तब मान को एक Unix टाइमस्टैम्प के रूप में मानता है। यदि टाइमस्टैम्प अतीत में है तो यह बिल्कुल कुछ नहीं करेगा। आपका आदेश चुपचाप विफल हो जाएगा।

तो यदि आप अधिकतम जीवनकाल का उपयोग करना चाहते हैं तो 2592000 निर्दिष्ट करें। उदाहरण:

set my_key 0 2592000 1
1

Disappearing Keys on Overflow

दस्तावेज़ में कहा गया है कि 64bit के ओवरफ्लो होने पर “incr” का उपयोग करने से मान गायब हो जाता है। इसे फिर से “add”/”set” का उपयोग करके बनाना होगा।

Replication

memcached स्वयं प्रतिकृति का समर्थन नहीं करता। यदि आपको इसकी वास्तव में आवश्यकता है, तो आपको 3rd पार्टी समाधानों का उपयोग करना होगा:

  • repcached: मल्टी-मास्टर असिंक्रोनस प्रतिकृति (memcached 1.2 पैच सेट)
  • Couchbase memcached interface: CouchBase का उपयोग memcached ड्रॉप-इन के रूप में करें
  • yrmcds: memcached संगत मास्टर-स्लेव की वैल्यू स्टोर
  • twemproxy (उर्फ नटक्रैकर): memcached समर्थन के साथ प्रॉक्सी

Commands Cheat-Sheet

Memcache Commands

Shodan

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

References

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks का समर्थन करें