174 lines
17 KiB
Markdown

# 11211 - Pentesting Memcache
{{#include ../../banners/hacktricks-training.md}}
## Protocol Information
From [wikipedia](https://en.wikipedia.org/wiki/Memcached):
> **Memcached** (उच्चारण: मेम-कैश्ड, मेम-कैश-डी) एक सामान्य-उद्देश्य वितरित [मेमोरी कैशिंग](https://en.wikipedia.org/wiki/Memory_caching) प्रणाली है। इसका उपयोग अक्सर गतिशील डेटाबेस-चालित वेबसाइटों को तेज़ करने के लिए डेटा और वस्तुओं को 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. यह सुविधा अनौपचारिक है और इसे किसी भी समय बंद किया जा सकता है, जैसा कि [समुदाय फोरम](https://groups.google.com/forum/?fromgroups=#!topic/memcached/1-T8I-RVGKM) में चर्चा की गई है।
संभावित गीगाबाइट डेटा में से केवल 1MB को डंप करने की सीमा विशेष रूप से महत्वपूर्ण है। हालाँकि, यह कार्यक्षमता कुंजी उपयोग पैटर्न के बारे में अंतर्दृष्टि प्रदान कर सकती है, विशिष्ट आवश्यकताओं के आधार पर। जो लोग यांत्रिकी में कम रुचि रखते हैं, उनके लिए [उपकरण अनुभाग](https://lzone.de/cheat-sheet/memcached#tools) पर जाने से व्यापक डंपिंग के लिए उपयोगिताएँ मिलती हैं। वैकल्पिक रूप से, 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 और उससे ऊपर, उत्पादन वातावरण में कुंजी डंप करने के लिए एक नया, सुरक्षित तरीका पेश किया गया है, जो नॉन-ब्लॉकिंग मोड का उपयोग करता है जैसा कि [रिलीज नोट्स](https://github.com/memcached/memcached/wiki/ReleaseNotes1431) में विस्तृत किया गया है। यह दृष्टिकोण व्यापक आउटपुट उत्पन्न करता है, इसलिए दक्षता के लिए '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](https://lzone.de/blog).
| Programming Languages | Tools | Functionality | | |
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------- | ------- |
| PHP | [simple script](http://snipt.org/xtP) | कुंजी नाम प्रिंट करता है। | | |
| Perl | [simple script](https://wiki.jasig.org/download/attachments/13572172/memcached-clean.pl?version=1&modificationDate=1229693957401) | कुंजी और मान प्रिंट करता है | | |
| Ruby | [simple script](https://gist.github.com/1365005) | कुंजी नाम प्रिंट करता है। | | |
| Perl | [memdump](https://search.cpan.org/~dmaki/Memcached-libmemcached-0.4202/src/libmemcached/docs/memdump.pod) | CPAN मॉड्यूल में उपकरण | [Memcached-libmemcached](https://search.cpan.org/~dmaki/Memcached-libmemc) | ached/) |
| PHP | [memcache.php](http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/) | Memcache मॉनिटरिंग GUI जो कुंजी को डंप करने की अनुमति भी देता है | | |
| libmemcached | [peep](http://blog.evanweaver.com/2009/04/20/peeping-into-memcached/) | **आपके memcached प्रक्रिया को फ्रीज कर देता है!!!** उत्पादन में इसका उपयोग करते समय सावधान रहें। फिर भी इसका उपयोग करते हुए आप 1MB सीमा को पार कर सकते हैं और वास्तव में **सभी** कुंजी को डंप कर सकते हैं। | | |
## Troubleshooting <a href="#troubleshooting" id="troubleshooting"></a>
### 1MB Data Limit <a href="#1mb-data-limit" id="1mb-data-limit"></a>
ध्यान दें कि memcached 1.4 से पहले आप 1MB से बड़े ऑब्जेक्ट्स को स्टोर नहीं कर सकते हैं क्योंकि डिफ़ॉल्ट अधिकतम स्लैब आकार है।
### Never Set a Timeout > 30 Days! <a href="#never-set-a-timeout--30-days" id="never-set-a-timeout--30-days"></a>
यदि आप एक कुंजी को एक टाइमआउट के साथ “सेट” या “ऐड” करने की कोशिश करते हैं जो अधिकतम अनुमत से बड़ा है, तो आपको वह नहीं मिल सकता है जिसकी आप अपेक्षा करते हैं क्योंकि memcached तब मान को एक Unix टाइमस्टैम्प के रूप में मानता है। यदि टाइमस्टैम्प अतीत में है तो यह बिल्कुल कुछ नहीं करेगा। आपका आदेश चुपचाप विफल हो जाएगा।
तो यदि आप अधिकतम जीवनकाल का उपयोग करना चाहते हैं तो 2592000 निर्दिष्ट करें। उदाहरण:
```
set my_key 0 2592000 1
1
```
### Disappearing Keys on Overflow <a href="#disappearing-keys-on-overflow" id="disappearing-keys-on-overflow"></a>
दस्तावेज़ में कहा गया है कि 64bit के ओवरफ्लो होने पर “incr” का उपयोग करने से मान गायब हो जाता है। इसे फिर से “add”/”set” का उपयोग करके बनाना होगा।
### Replication <a href="#replication" id="replication"></a>
memcached स्वयं प्रतिकृति का समर्थन नहीं करता। यदि आपको इसकी वास्तव में आवश्यकता है, तो आपको 3rd पार्टी समाधानों का उपयोग करना होगा:
- [repcached](http://repcached.lab.klab.org/): मल्टी-मास्टर असिंक्रोनस प्रतिकृति (memcached 1.2 पैच सेट)
- [Couchbase memcached interface](http://www.couchbase.com/memcached): CouchBase का उपयोग memcached ड्रॉप-इन के रूप में करें
- [yrmcds](https://cybozu.github.io/yrmcds/): memcached संगत मास्टर-स्लेव की वैल्यू स्टोर
- [twemproxy](https://github.com/twitter/twemproxy) (उर्फ नटक्रैकर): memcached समर्थन के साथ प्रॉक्सी
### Commands Cheat-Sheet
{{#ref}}
memcache-commands.md
{{#endref}}
### **Shodan**
- `port:11211 "STAT pid"`
- `"STAT pid"`
## References
- [https://lzone.de/cheat-sheet/memcached](https://lzone.de/cheat-sheet/memcached)
{{#include ../../banners/hacktricks-training.md}}