6379 - Pentesting Redis
Last updated
Last updated
Rejoignez le serveur HackenProof Discord pour communiquer avec des pirates expérimentés et des chasseurs de primes en bugs !
Perspectives de piratage Engagez-vous avec du contenu qui explore le frisson et les défis du piratage
Actualités de piratage en temps réel Restez à jour avec le monde du piratage en évolution rapide grâce aux actualités et aux informations en temps réel
Dernières annonces Restez informé des dernières primes de bugs lancées et des mises à jour cruciales de la plateforme
Rejoignez-nous sur Discord et commencez à collaborer avec les meilleurs pirates dès aujourd'hui !
D'après la documentation : Redis est un magasin de structures de données en mémoire, open source (sous licence BSD), utilisé comme base de données, cache et courtier de messages.
Par défaut, Redis utilise un protocole basé sur du texte en clair, mais vous devez garder à l'esprit qu'il peut également implémenter ssl/tls. Apprenez comment exécuter Redis avec ssl/tls ici.
Port par défaut : 6379
Certains outils automatisés qui peuvent aider à obtenir des informations à partir d'une instance redis :
Redis est un protocole basé sur le texte, vous pouvez simplement envoyer la commande dans un socket et les valeurs retournées seront lisibles. N'oubliez pas que Redis peut fonctionner en utilisant ssl/tls (mais c'est très étrange).
Dans une instance Redis régulière, vous pouvez simplement vous connecter en utilisant nc
ou vous pourriez également utiliser redis-cli
:
Le premier commande que vous pourriez essayer est info
. Il peut renvoyer une sortie avec des informations sur l'instance Redis ou quelque chose comme ce qui suit est retourné:
Dans ce dernier cas, cela signifie que vous avez besoin d'identifiants valides pour accéder à l'instance Redis.
Par défaut, Redis peut être accédé sans identifiants. Cependant, il peut être configuré pour supporter uniquement un mot de passe, ou un nom d'utilisateur + mot de passe.
Il est possible de définir un mot de passe dans le fichier redis.conf avec le paramètre requirepass
ou temporairement jusqu'au redémarrage du service en se connectant et en exécutant : config set requirepass p@ss$12E45
.
De plus, un nom d'utilisateur peut être configuré dans le paramètre masteruser
à l'intérieur du fichier redis.conf.
Si seul un mot de passe est configuré, le nom d'utilisateur utilisé est "default". Notez également qu'il n'y a aucun moyen de savoir de l'extérieur si Redis a été configuré avec un mot de passe unique ou un nom d'utilisateur + mot de passe.
Dans des cas comme celui-ci, vous devrez trouver des identifiants valides pour interagir avec Redis, vous pourriez essayer de forcer l'accès. Si vous trouvez des identifiants valides, vous devrez authentifier la session après avoir établi la connexion avec la commande :
Des identifiants valides recevront comme réponse : +OK
Si le serveur Redis autorise les connexions anonymes ou si vous avez obtenu des identifiants valides, vous pouvez initier le processus d'énumération du service en utilisant les commandes suivantes :
Autres commandes Redis peuvent être trouvées ici et ici.
Notez que les commandes Redis d'une instance peuvent être renommées ou supprimées dans le fichier redis.conf. Par exemple, cette ligne supprimera la commande FLUSHDB :
Plus d'informations sur la configuration sécurisée d'un service Redis ici : https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04
Vous pouvez également surveiller en temps réel les commandes Redis exécutées avec la commande monitor
ou obtenir les 25 requêtes les plus lentes avec slowlog get 25
Trouvez plus d'informations intéressantes sur d'autres commandes Redis ici : https://lzone.de/cheat-sheet/Redis
À l'intérieur de Redis, les bases de données sont des numéros commençant par 0. Vous pouvez vérifier si l'une d'entre elles est utilisée dans la sortie de la commande info
dans la section "Keyspace" :
Ou vous pouvez simplement obtenir tous les keyspaces (bases de données) avec :
Dans cet exemple, les bases de données 0 et 1 sont utilisées. La base de données 0 contient 4 clés et la base de données 1 en contient 1. Par défaut, Redis utilisera la base de données 0. Pour sauvegarder par exemple la base de données 1, vous devez faire :
En cas d'erreur suivante -WRONGTYPE Operation against a key holding the wrong kind of value
lors de l'exécution de GET <KEY>
, c'est parce que la clé peut être autre chose qu'une chaîne ou un entier et nécessite un opérateur spécial pour l'afficher.
Pour connaître le type de la clé, utilisez la commande TYPE
, exemple ci-dessous pour les clés de type liste et hachage.
Extraire la base de données avec npm redis-dump ou python redis-utils
Rejoignez le serveur HackenProof Discord pour communiquer avec des hackers expérimentés et des chasseurs de bugs !
Perspectives de Hacking Engagez-vous avec du contenu qui explore le frisson et les défis du hacking
Actualités de Hacking en Temps Réel Restez à jour avec le monde du hacking en constante évolution grâce aux actualités et aux informations en temps réel
Dernières Annonces Restez informé des dernières primes de bugs lancées et des mises à jour cruciales de la plateforme
Rejoignez-nous sur Discord et commencez à collaborer avec les meilleurs hackers dès aujourd'hui !
redis-rogue-server peut automatiquement obtenir un shell interactif ou un shell inversé dans Redis (<=5.0.5).
Info from ici. Vous devez connaître le chemin du dossier du site Web:
Si l'exception d'accès à la webshell, vous pouvez vider la base de données après la sauvegarde et réessayer, n'oubliez pas de restaurer la base de données.
Comme dans la section précédente, vous pourriez également écraser un fichier de modèle html qui va être interprété par un moteur de modèle et obtenir une shell.
Par exemple, en suivant cette explication, vous pouvez voir que l'attaquant a injecté une shell inversée dans un html interprété par le moteur de modèle nunjucks:
Notez que plusieurs moteurs de modèles mettent en cache les modèles en mémoire, donc même si vous les écrasez, le nouveau ne sera pas exécuté. Dans ces cas, soit le développeur a laissé le rechargement automatique activé, soit vous devez effectuer un DoS sur le service (et vous attendre à ce qu'il soit relancé automatiquement).
Exemple d'ici
Veuillez noter que le résultat de config get dir
peut être modifié après d'autres commandes d'exploitation manuelles. Il est recommandé de l'exécuter en premier juste après la connexion à Redis. Dans la sortie de config get dir
, vous pourriez trouver le dossier personnel de l'utilisateur redis (généralement /var/lib/redis ou /home/redis/.ssh), et en sachant cela, vous savez où vous pouvez écrire le fichier authenticated_users
pour accéder via ssh avec l'utilisateur redis. Si vous connaissez le dossier personnel d'un autre utilisateur valide où vous avez des autorisations d'écriture, vous pouvez également en abuser :
Générer une paire de clés publique-privée ssh sur votre ordinateur : ssh-keygen -t rsa
Écrire la clé publique dans un fichier : (echo -e "\n\n"; cat ~/id_rsa.pub; echo -e "\n\n") > spaced_key.txt
Importer le fichier dans redis : cat spaced_key.txt | redis-cli -h 10.85.0.52 -x set ssh_key
Enregistrer la clé publique dans le fichier authorized_keys sur le serveur redis :
Enfin, vous pouvez vous connecter en ssh au serveur redis avec la clé privée : ssh -i id_rsa redis@10.85.0.52
Cette technique est automatisée ici : https://github.com/Avinash-acid/Redis-Server-Exploit
Le dernier exemple est pour Ubuntu, pour Centos, la commande ci-dessus devrait être : redis-cli -h 10.85.0.52 config set dir /var/spool/cron/
Cette méthode peut également être utilisée pour gagner des bitcoins : yam
Suivant les instructions de https://github.com/n0b0dyCN/RedisModules-ExecuteCommand vous pouvez compiler un module Redis pour exécuter des commandes arbitraires.
Ensuite, vous avez besoin d'une manière de télécharger le module compilé
Charger le module téléchargé à l'exécution avec MODULE LOAD /chemin/vers/mymodule.so
Lister les modules chargés pour vérifier s'il a été correctement chargé : MODULE LIST
Exécuter des commandes :
Décharger le module quand vous le souhaitez : MODULE UNLOAD mymodule
Ici vous pouvez voir que Redis utilise la commande EVAL pour exécuter du code Lua dans un bac à sable. Dans l'article lié, vous pouvez voir comment l'exploiter en utilisant la fonction dofile, mais apparemment cela n'est plus possible. Quoi qu'il en soit, si vous pouvez contourner le bac à sable Lua, vous pourriez exécuter des commandes arbitraires sur le système. De plus, dans le même article, vous pouvez voir quelques options pour causer des dénis de service.
Quelques CVE pour échapper à LUA :
Toutes les opérations du serveur Redis maître sont automatiquement synchronisées vers le serveur Redis esclave, ce qui signifie que nous pouvons considérer la vulnérabilité Redis comme un serveur Redis esclave, connecté au serveur Redis maître que nous contrôlons, puis nous pouvons saisir des commandes dans notre propre Redis.
Si vous pouvez envoyer une requête en texte clair à Redis, vous pouvez communiquer avec lui car Redis lira ligne par ligne la requête et répondra simplement avec des erreurs aux lignes qu'il ne comprend pas:
Par conséquent, si vous trouvez une vulnérabilité SSRF sur un site Web et que vous pouvez contrôler certains en-têtes (peut-être avec une vulnérabilité CRLF) ou des paramètres POST, vous pourrez envoyer des commandes arbitraires à Redis.
Dans Gitlab11.4.7, une vulnérabilité SSRF et une CRLF ont été découvertes. La vulnérabilité SSRF se trouvait dans la fonctionnalité d'importation de projet à partir de l'URL lors de la création d'un nouveau projet et permettait d'accéder à des adresses IP arbitraires sous la forme [0:0:0:0:0:ffff:127.0.0.1] (ceci accédera à 127.0.0.1), et la vulnérabilité CRLF était exploitée en ajoutant simplement les caractères %0D%0A à l'URL.
Par conséquent, il était possible d'exploiter ces vulnérabilités pour communiquer avec l'instance Redis qui gère les files d'attente de gitlab et d'abuser de ces files d'attente pour obtenir l'exécution de code. Le payload d'abus de file d'attente Redis est :
Et la demande URL encode abusant de SSRF et CRLF pour exécuter un whoami
et renvoyer la sortie via nc
est :
Pour une raison quelconque (comme pour l'auteur de https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/ d'où cette information a été tirée), l'exploitation a fonctionné avec le schéma git
et non avec le schéma http
.
Rejoignez le serveur HackenProof Discord pour communiquer avec des hackers expérimentés et des chasseurs de primes en bugs !
Perspectives de Hacking Engagez-vous avec du contenu qui explore le frisson et les défis du hacking
Actualités de Hacking en Temps Réel Restez à jour avec le monde du hacking en évolution rapide grâce aux actualités et aux informations en temps réel
Dernières Annonces Restez informé des dernières primes de bugs lancées et des mises à jour cruciales de la plateforme
Rejoignez-nous sur Discord et commencez à collaborer avec les meilleurs hackers dès aujourd'hui!