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
पैरामीटर में एक उपयोगकर्ता नाम को कॉन्फ़िगर किया जा सकता है।
यदि केवल पासवर्ड कॉन्फ़िगर किया गया है तो उपयोगकर्ता नाम जोड़ा गया है "default"। इसके अलावा, ध्यान दें कि बाहरी रूप से यह पता लगाने का कोई तरीका नहीं है कि क्या Redis को केवल पासवर्ड या उपयोगकर्ता नाम + पासवर्ड के साथ कॉन्फ़िगर किया गया था।
इस तरह के मामलों में आपको Redis के साथ इंटरैक्ट करने के लिए मान्य क्रेडेंशियल्स खोजने की आवश्यकता होगी ताकि आप इसे brute-force करने की कोशिश कर सकें। यदि आपने मान्य क्रेडेंशियल्स पाए हैं तो आपको कनेक्शन स्थापित करने के बाद सत्र को प्रमाणित करने की आवश्यकता है कमांड के साथ:
मान्य क्रेडेंशियल्स का उत्तर होगा: +OK
यदि Redis सर्वर गुमनाम कनेक्शन की अनुमति देता है या यदि आपने मान्य क्रेडेंशियल्स प्राप्त कर लिए हैं, तो आप निम्नलिखित कमांड्स का उपयोग करके सेवा के लिए गणना प्रक्रिया शुरू कर सकते हैं:
अन्य Redis कमांड यहां पाया जा सकता है और यहां.
ध्यान दें कि एक उदाहरण के Redis कमांड को नामित किया जा सकता है या redis.conf फ़ाइल में हटा दिया जा सकता है। उदाहरण के लिए, यह पंक्ति कमांड FLUSHDB को हटा देगी:
More about configuring securely a Redis service here: https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04
You can also real time में Redis कमांड्स executed with the command monitor
or get the top 25 सबसे धीमे क्वेरीज़ with slowlog get 25
Find more interesting information about more Redis commands here: https://lzone.de/cheat-sheet/Redis
Inside Redis the डेटाबेस 0 से शुरू होने वाले नंबर हैं. You can find if anyone is used in the output of the command info
inside the "Keyspace" chunk:
Or you can just get all the कीस्पेस (databases) with:
इस उदाहरण में डेटाबेस 0 और 1 का उपयोग किया जा रहा है। डेटाबेस 0 में 4 कीज़ हैं और डेटाबेस 1 में 1 है। डिफ़ॉल्ट रूप से Redis डेटाबेस 0 का उपयोग करेगा। उदाहरण के लिए डेटाबेस 1 के लिए डंप करने के लिए आपको करना होगा:
यदि आप GET <KEY>
चलाते समय निम्नलिखित त्रुटि -WRONGTYPE Operation against a key holding the wrong kind of value
प्राप्त करते हैं, तो इसका कारण यह हो सकता है कि कुंजी एक स्ट्रिंग या पूर्णांक के अलावा कुछ और हो और इसे प्रदर्शित करने के लिए एक विशेष ऑपरेटर की आवश्यकता होती है।
कुंजी के प्रकार को जानने के लिए, TYPE
कमांड का उपयोग करें, नीचे सूची और हैश कुंजी के लिए उदाहरण।
npm के साथ डेटाबेस डंप करें redis-dump या python redis-utils
अनुभवी हैकर्स और बग बाउंटी शिकारियों के साथ संवाद करने के लिए HackenProof Discord सर्वर में शामिल हों!
हैकिंग अंतर्दृष्टि हैकिंग के रोमांच और चुनौतियों में गहराई से जाने वाले सामग्री के साथ संलग्न हों
वास्तविक समय हैक समाचार वास्तविक समय समाचार और अंतर्दृष्टियों के माध्यम से तेज़-तर्रार हैकिंग दुनिया के साथ अद्यतित रहें
नवीनतम घोषणाएँ नवीनतम बग बाउंटी लॉन्च और महत्वपूर्ण प्लेटफ़ॉर्म अपडेट के साथ सूचित रहें
आज ही Discord पर हमारे साथ जुड़ें और शीर्ष हैकर्स के साथ सहयोग करना शुरू करें!
redis-rogue-server स्वचालित रूप से Redis(<=5.0.5) में एक इंटरएक्टिव शेल या एक रिवर्स शेल प्राप्त कर सकता है।
यहाँ से जानकारी। आपको वेब साइट फ़ोल्डर का पथ पता होना चाहिए:
यदि वेबशेल एक्सेस अपवाद है, तो आप बैकअप के बाद डेटाबेस को खाली कर सकते हैं और फिर से प्रयास कर सकते हैं, याद रखें कि डेटाबेस को पुनर्स्थापित करना है।
जैसे पिछले अनुभाग में, आप कुछ html टेम्पलेट फ़ाइल को भी ओवरराइट कर सकते हैं जिसे एक टेम्पलेट इंजन द्वारा व्याख्यायित किया जाएगा और एक शेल प्राप्त कर सकते हैं।
उदाहरण के लिए, इस लेख का पालन करते हुए, आप देख सकते हैं कि हमलावर ने nunjucks टेम्पलेट इंजन द्वारा व्याख्यायित एक rev shell in an html इंजेक्ट किया:
ध्यान दें कि कई टेम्पलेट इंजन टेम्पलेट्स को मेमोरी में कैश करते हैं, इसलिए यदि आप उन्हें ओवरराइट करते हैं, तो नया निष्पादित नहीं होगा। इन मामलों में, या तो डेवलपर ने स्वचालित पुनः लोड सक्रिय रखा है या आपको सेवा पर DoS करना होगा (और उम्मीद करें कि इसे स्वचालित रूप से फिर से लॉन्च किया जाएगा)।
Example from here
कृपया ध्यान दें कि 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/
यह विधि बिटकॉइन कमाने के लिए भी उपयोग की जा सकती है :yam
https://github.com/n0b0dyCN/RedisModules-ExecuteCommand से निर्देशों का पालन करते हुए आप मनमाने आदेशों को निष्पादित करने के लिए एक redis मॉड्यूल संकलित कर सकते हैं।
फिर आपको संकलित मॉड्यूल को अपलोड करने का कोई तरीका चाहिए।
अपलोड किए गए मॉड्यूल को रनटाइम पर MODULE LOAD /path/to/mymodule.so
के साथ लोड करें।
लोड किए गए मॉड्यूल की सूची जांचें कि यह सही ढंग से लोड हुआ है: MODULE LIST
आदेश निष्पादित करें:
जब चाहें मॉड्यूल को अनलोड करें: 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 का प्रबंधन करने वाले Redis उदाहरण से बात करने के लिए इन कमजोरियों का दुरुपयोग करना संभव था और उन queues का दुरुपयोग करके कोड निष्पादन प्राप्त करना। Redis queue abuse 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 हैकिंग की रोमांच और चुनौतियों में गहराई से जाने वाली सामग्री के साथ जुड़ें
Real-Time Hack News तेज-तर्रार हैकिंग दुनिया के साथ वास्तविक समय की खबरों और अंतर्दृष्टियों के माध्यम से अद्यतित रहें
Latest Announcements नवीनतम बग बाउंटी लॉन्च और महत्वपूर्ण प्लेटफ़ॉर्म अपडेट के साथ सूचित रहें
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)