6379 - Pentesting Redis
Last updated
Last updated
Μάθετε & εξασκηθείτε στο Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Εγγραφείτε στον HackenProof Discord server για να επικοινωνήσετε με έμπειρους hackers και κυνηγούς bug bounty!
Ενημερώσεις Hacking Ασχοληθείτε με περιεχόμενο που εμβαθύνει στην αδρεναλίνη και τις προκλήσεις του hacking
Ειδήσεις Hack σε Πραγματικό Χρόνο Μείνετε ενημερωμένοι με τον ταχύτατο κόσμο του hacking μέσω ειδήσεων και πληροφοριών σε πραγματικό χρόνο
Τελευταίες Ανακοινώσεις Μείνετε ενημερωμένοι με τις πιο πρόσφατες bug bounties που ξεκινούν και κρίσιμες ενημερώσεις πλατφόρμας
Εγγραφείτε μαζί μας στο Discord και ξεκινήστε να συνεργάζεστε με κορυφαίους hackers σήμερα!
Από τα docs: Το Redis είναι ένα ανοιχτού κώδικα (με άδεια BSD), in-memory data structure store, που χρησιμοποιείται ως βάση δεδομένων, cache και message broker).
Από προεπιλογή, το Redis χρησιμοποιεί ένα πρωτόκολλο βασισμένο σε απλό κείμενο, αλλά πρέπει να έχετε υπόψη ότι μπορεί επίσης να υλοποιήσει ssl/tls. Μάθετε πώς να τρέξετε το Redis με ssl/tls εδώ.
Προεπιλεγμένη θύρα: 6379
Ορισμένα αυτοματοποιημένα εργαλεία που μπορούν να βοηθήσουν στην απόκτηση πληροφοριών από μια αναπαράσταση redis:
Το Redis είναι ένα πρωτόκολλο βασισμένο σε κείμενο, μπορείτε απλά να στείλετε την εντολή σε ένα socket και οι επιστρεφόμενες τιμές θα είναι αναγνώσιμες. Επίσης, θυμηθείτε ότι το Redis μπορεί να τρέχει χρησιμοποιώντας ssl/tls (αλλά αυτό είναι πολύ παράξενο).
Σε μια κανονική εγκατάσταση Redis μπορείτε απλά να συνδεθείτε χρησιμοποιώντας nc
ή μπορείτε επίσης να χρησιμοποιήσετε redis-cli
:
Η πρώτη εντολή που θα μπορούσατε να δοκιμάσετε είναι info
. Αυτή μπορεί να επιστρέψει έξοδο με πληροφορίες της Redis instance ή κάτι όπως το παρακάτω επιστρέφεται:
In this last case, this means that χρειάζεστε έγκυρα διαπιστευτήρια για να αποκτήσετε πρόσβαση στην Redis instance.
Από προεπιλογή η Redis μπορεί να προσπελαστεί χωρίς διαπιστευτήρια. Ωστόσο, μπορεί να ρυθμιστεί ώστε να υποστηρίζει μόνο κωδικό πρόσβασης ή όνομα χρήστη + κωδικό πρόσβασης.
Είναι δυνατόν να ορίσετε έναν κωδικό πρόσβασης στο redis.conf αρχείο με την παράμετρο requirepass
ή προσωρινά μέχρι να επανεκκινήσει η υπηρεσία συνδεόμενοι σε αυτήν και εκτελώντας: config set requirepass p@ss$12E45
.
Επίσης, ένα όνομα χρήστη μπορεί να ρυθμιστεί στην παράμετρο masteruser
μέσα στο redis.conf αρχείο.
Εάν έχει ρυθμιστεί μόνο κωδικός πρόσβασης, το όνομα χρήστη που χρησιμοποιείται είναι "default". Επίσης, σημειώστε ότι δεν υπάρχει τρόπος να βρείτε εξωτερικά αν η Redis έχει ρυθμιστεί με μόνο κωδικό πρόσβασης ή όνομα χρήστη + κωδικό πρόσβασης.
Σε περιπτώσεις όπως αυτή θα χρειαστεί να βρείτε έγκυρα διαπιστευτήρια για να αλληλεπιδράσετε με την Redis, οπότε θα μπορούσατε να προσπαθήσετε να brute-force την. Σε περίπτωση που βρείτε έγκυρα διαπιστευτήρια, πρέπει να αυθεντικοποιήσετε τη συνεδρία μετά την εγκαθίδρυση της σύνδεσης με την εντολή:
Έγκυρα διαπιστευτήρια θα απαντηθούν με: +OK
Εάν ο διακομιστής Redis επιτρέπει ανώνυμες συνδέσεις ή εάν έχετε αποκτήσει έγκυρα διαπιστευτήρια, μπορείτε να ξεκινήσετε τη διαδικασία καταμέτρησης για την υπηρεσία χρησιμοποιώντας τις παρακάτω εντολές:
Άλλες εντολές Redis μπορείτε να βρείτε εδώ και εδώ.
Σημειώστε ότι οι εντολές Redis μιας παρουσίας μπορούν να μετονομαστούν ή να αφαιρεθούν στο αρχείο redis.conf. Για παράδειγμα, αυτή η γραμμή θα αφαιρέσει την εντολή 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 (βάσεις δεδομένων) με:
Σε αυτό το παράδειγμα χρησιμοποιούνται οι βάσεις δεδομένων 0 και 1. Η βάση δεδομένων 0 περιέχει 4 κλειδιά και η βάση δεδομένων 1 περιέχει 1. Από προεπιλογή, το Redis θα χρησιμοποιήσει τη βάση δεδομένων 0. Για να κάνετε dump για παράδειγμα τη βάση δεδομένων 1, πρέπει να κάνετε:
Σε περίπτωση που λάβετε το εξής σφάλμα -WRONGTYPE Operation against a key holding the wrong kind of value
κατά την εκτέλεση του GET <KEY>
, είναι επειδή το κλειδί μπορεί να είναι κάτι άλλο από μια συμβολοσειρά ή έναν ακέραιο και απαιτεί έναν ειδικό τελεστή για να το εμφανίσει.
Για να γνωρίζετε τον τύπο του κλειδιού, χρησιμοποιήστε την εντολή TYPE
, παράδειγμα παρακάτω για κλειδιά λίστας και κατακερματισμού.
Εξαγωγή της βάσης δεδομένων με npm redis-dump ή python redis-utils
Συμμετάσχετε στον HackenProof Discord server για να επικοινωνήσετε με έμπειρους χάκερ και κυνηγούς bug bounty!
Επιγνώσεις Χάκινγκ Ασχοληθείτε με περιεχόμενο που εμβαθύνει στην αδρεναλίνη και τις προκλήσεις του hacking
Ειδήσεις Χάκινγκ σε Πραγματικό Χρόνο Μείνετε ενημερωμένοι με τον ταχύτατο κόσμο του hacking μέσω ειδήσεων και επιγνώσεων σε πραγματικό χρόνο
Τελευταίες Ανακοινώσεις Μείνετε ενημερωμένοι με τις πιο πρόσφατες εκκινήσεις bug bounties και κρίσιμες ενημερώσεις πλατφόρμας
Συμμετάσχετε μαζί μας στο Discord και ξεκινήστε να συνεργάζεστε με κορυφαίους χάκερ σήμερα!
redis-rogue-server μπορεί αυτόματα να αποκτήσει ένα διαδραστικό shell ή ένα reverse shell στο Redis(<=5.0.5).
Πληροφορίες από εδώ. Πρέπει να γνωρίζετε το μονοπάτι του φακέλου της ιστοσελίδας:
Αν η εξαίρεση πρόσβασης webshell, μπορείτε να αδειάσετε τη βάση δεδομένων μετά από αντίγραφο ασφαλείας και να δοκιμάσετε ξανά, θυμηθείτε να αποκαταστήσετε τη βάση δεδομένων.
Όπως στην προηγούμενη ενότητα, μπορείτε επίσης να αντικαταστήσετε κάποιο αρχείο html template που θα ερμηνευτεί από μια μηχανή template και να αποκτήσετε ένα shell.
Για παράδειγμα, ακολουθώντας αυτή την αναφορά, μπορείτε να δείτε ότι ο επιτιθέμενος εισήγαγε ένα rev shell σε ένα html που ερμηνεύεται από τη μηχανή template nunjucks:
Σημειώστε ότι πολλές μηχανές προτύπων αποθηκεύουν τα πρότυπα στη μνήμη, οπότε ακόμη και αν τα αντικαταστήσετε, το νέο δεν θα εκτελείται. Σε αυτές τις περιπτώσεις, είτε ο προγραμματιστής άφησε ενεργό το αυτόματο επαναφόρτωμα είτε πρέπει να κάνετε DoS στην υπηρεσία (και να περιμένετε ότι θα επανεκκινηθεί αυτόματα).
Παράδειγμα από εδώ
Παρακαλώ να είστε προσεκτικοί ότι το config get dir
αποτέλεσμα μπορεί να αλλάξει μετά από άλλες χειροκίνητες εντολές εκμετάλλευσης. Συνιστάται να το εκτελέσετε πρώτα αμέσως μετά την είσοδο στο Redis. Στην έξοδο του config get dir
μπορείτε να βρείτε το home του redis user (συνήθως /var/lib/redis ή /home/redis/.ssh), και γνωρίζοντας αυτό ξέρετε πού μπορείτε να γράψετε το αρχείο authenticated_users
για πρόσβαση μέσω ssh με τον χρήστη redis. Αν γνωρίζετε το home άλλου έγκυρου χρήστη όπου έχετε δικαιώματα εγγραφής μπορείτε επίσης να το εκμεταλλευτείτε:
Δημιουργήστε ένα ζεύγος δημόσιου-ιδιωτικού κλειδιού ssh στον υπολογιστή σας: ssh-keygen -t rsa
Γράψτε το δημόσιο κλειδί σε ένα αρχείο : (echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt
Εισάγετε το αρχείο στο redis : cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key
Αποθηκεύστε το δημόσιο κλειδί στο αρχείο authorized_keys στον διακομιστή redis:
Τέλος, μπορείτε να ssh στον διακομιστή redis με το ιδιωτικό κλειδί : ssh -i id_rsa redis@10.85.0.52
Αυτή η τεχνική είναι αυτοματοποιημένη εδώ: https://github.com/Avinash-acid/Redis-Server-Exploit
Το τελευταίο παράδειγμα είναι για Ubuntu, για Centos, η παραπάνω εντολή θα πρέπει να είναι: redis-cli -h 10.85.0.52 config set dir /var/spool/cron/
Αυτή η μέθοδος μπορεί επίσης να χρησιμοποιηθεί για να κερδίσετε bitcoin :yam
Ακολουθώντας τις οδηγίες από https://github.com/n0b0dyCN/RedisModules-ExecuteCommand μπορείτε να συγκεντρώσετε μια μονάδα redis για να εκτελέσετε αυθαίρετες εντολές.
Στη συνέχεια, χρειάζεστε κάποιον τρόπο για να ανεβάσετε τη συγκεντρωμένη μονάδα.
Φορτώστε τη μονάδα που ανέβηκε κατά την εκτέλεση με MODULE LOAD /path/to/mymodule.so
Λίστα φορτωμένων μονάδων για να ελέγξετε αν φορτώθηκε σωστά: MODULE LIST
Εκτελέστε εντολές:
Ξεφορτώστε τη μονάδα όποτε θέλετε: MODULE UNLOAD mymodule
Εδώ μπορείτε να δείτε ότι το Redis χρησιμοποιεί την εντολή EVAL για να εκτελέσει κώδικα Lua σε sandbox. Στην συνδεδεμένη ανάρτηση μπορείτε να δείτε πώς να το εκμεταλλευτείτε χρησιμοποιώντας τη λειτουργία dofile, αλλά φαίνεται ότι αυτό δεν είναι πλέον δυνατό. Ούτως ή άλλως, αν μπορείτε να παράκαμψετε το sandbox Lua θα μπορούσατε να εκτελέσετε αυθαίρετες εντολές στο σύστημα. Επίσης, από την ίδια ανάρτηση μπορείτε να δείτε κάποιες επιλογές για να προκαλέσετε DoS.
Ορισμένα CVE για να ξεφύγετε από το LUA:
Η κύρια redis συγχρονίζει αυτόματα όλες τις λειτουργίες στη slave redis, που σημαίνει ότι μπορούμε να θεωρήσουμε την ευπάθεια redis ως μια slave redis, συνδεδεμένη με την κύρια redis που ελέγχουμε, και στη συνέχεια μπορούμε να εισάγουμε την εντολή στη δική μας redis.
Αν μπορείτε να στείλετε καθαρό κείμενο αίτημα στο Redis, μπορείτε να επικοινωνήσετε μαζί του καθώς το Redis θα διαβάσει γραμμή προς γραμμή το αίτημα και θα απαντήσει μόνο με σφάλματα για τις γραμμές που δεν καταλαβαίνει:
Λοιπόν, αν βρείτε μια SSRF vuln σε μια ιστοσελίδα και μπορείτε να ελέγξετε κάποιες κεφαλίδες (ίσως με μια CRLF vuln) ή παραμέτρους POST, θα είστε σε θέση να στείλετε αυθαίρετες εντολές στο Redis.
Στο 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.
Έτσι, ήταν δυνατό να καταχραστούν αυτές οι ευπάθειες για να μιλήσουν με την παρουσία Redis που διαχειρίζεται τις ουρές από gitlab και να καταχραστούν αυτές τις ουρές για να αποκτήσουν εκτέλεση κώδικα. Το payload κατάχρησης της ουράς Redis είναι:
Και το URL encode αίτημα κατάχρησης SSRF και CRLF για την εκτέλεση ενός whoami
και την αποστολή της εξόδου μέσω nc
είναι:
Για κάποιο λόγο (όπως για τον συγγραφέα του https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/ από όπου προήλθε αυτή η πληροφορία) η εκμετάλλευση λειτούργησε με το git
scheme και όχι με το http
scheme.
Join HackenProof Discord server to communicate with experienced hackers and bug bounty hunters!
Hacking Insights Engage with content that delves into the thrill and challenges of hacking
Real-Time Hack News Keep up-to-date with fast-paced hacking world through real-time news and insights
Latest Announcements Stay informed with the newest bug bounties launching and crucial platform updates
Join us on Discord and start collaborating with top hackers today!
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)