9200 - Pentesting Elasticsearch
Reading time: 7 minutes
tip
Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wsparcie HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.
Podstawowe informacje
Elasticsearch to rozproszony, otwarty silnik wyszukiwania i analizy dla wszystkich typów danych. Znany jest z szybkości, skalowalności i prosty REST API. Zbudowany na Apache Lucene, został po raz pierwszy wydany w 2010 roku przez Elasticsearch N.V. (obecnie znany jako Elastic). Elasticsearch jest podstawowym komponentem Elastic Stack, zbioru narzędzi open source do pobierania, wzbogacania, przechowywania, analizy i wizualizacji danych. Ten stos, powszechnie nazywany ELK Stack, obejmuje również Logstash i Kibana, a teraz ma lekkie agenty przesyłania danych zwane Beats.
Czym jest indeks Elasticsearch?
Indeks Elasticsearch to zbiór powiązanych dokumentów przechowywanych jako JSON. Każdy dokument składa się z kluczy i odpowiadających im wartości (ciągi, liczby, wartości logiczne, daty, tablice, geolokalizacje itp.).
Elasticsearch używa efektywnej struktury danych zwanej indeksem odwróconym, aby ułatwić szybkie wyszukiwanie pełnotekstowe. Ten indeks wymienia każde unikalne słowo w dokumentach i identyfikuje dokumenty, w których każde słowo się pojawia.
Podczas procesu indeksowania Elasticsearch przechowuje dokumenty i konstruuje indeks odwrócony, co pozwala na wyszukiwanie w niemal rzeczywistym czasie. API indeksu jest używane do dodawania lub aktualizowania dokumentów JSON w określonym indeksie.
Domyślny port: 9200/tcp
Ręczna enumeracja
Baner
Protokół używany do uzyskania dostępu do Elasticsearch to HTTP. Gdy uzyskasz do niego dostęp przez HTTP, znajdziesz interesujące informacje: http://10.10.10.115:9200/
Jeśli nie widzisz tej odpowiedzi, uzyskując dostęp do /
, zobacz następną sekcję.
Uwierzytelnianie
Domyślnie Elasticsearch nie ma włączonego uwierzytelniania, więc domyślnie możesz uzyskać dostęp do wszystkiego w bazie danych bez użycia jakichkolwiek poświadczeń.
Możesz zweryfikować, że uwierzytelnianie jest wyłączone, wysyłając żądanie do:
curl -X GET "ELASTICSEARCH-SERVER:9200/_xpack/security/user"
{"error":{"root_cause":[{"type":"exception","reason":"Security must be explicitly enabled when using a [basic] license. Enable security by setting [xpack.security.enabled] to [true] in the elasticsearch.yml file and restart the node."}],"type":"exception","reason":"Security must be explicitly enabled when using a [basic] license. Enable security by setting [xpack.security.enabled] to [true] in the elasticsearch.yml file and restart the node."},"status":500}
Jednakże, jeśli wyślesz żądanie do /
i otrzymasz odpowiedź podobną do poniższej:
{"error":{"root_cause":[{"type":"security_exception","reason":"missing authentication credentials for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}}],"type":"security_exception","reason":"missing authentication credentials for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}},"status":401}
To oznacza, że uwierzytelnienie jest skonfigurowane i potrzebujesz ważnych poświadczeń, aby uzyskać jakiekolwiek informacje z elasticserach. Następnie możesz spróbować przeprowadzić atak brute force (używa HTTP basic auth, więc wszystko, co może przeprowadzić BF HTTP basic auth, może być użyte).
Oto lista domyślnych nazw użytkowników: elastic (superużytkownik), remote_monitoring_user, beats_system, logstash_system, kibana, kibana_system, apm_system, _anonymous_._ Starsze wersje Elasticsearch mają domyślne hasło changeme dla tego użytkownika.
curl -X GET http://user:password@IP:9200/
Podstawowa enumeracja użytkowników
#List all roles on the system:
curl -X GET "ELASTICSEARCH-SERVER:9200/_security/role"
#List all users on the system:
curl -X GET "ELASTICSEARCH-SERVER:9200/_security/user"
#Get more information about the rights of an user:
curl -X GET "ELASTICSEARCH-SERVER:9200/_security/user/<USERNAME>"
Elastic Info
Oto kilka punktów końcowych, które możesz uzyskać za pomocą GET, aby uzyskać pewne informacje o elasticsearch:
_cat | /_cluster | /_security |
---|---|---|
/_cat/segments | /_cluster/allocation/explain | /_security/user |
/_cat/shards | /_cluster/settings | /_security/privilege |
/_cat/repositories | /_cluster/health | /_security/role_mapping |
/_cat/recovery | /_cluster/state | /_security/role |
/_cat/plugins | /_cluster/stats | /_security/api_key |
/_cat/pending_tasks | /_cluster/pending_tasks | |
/_cat/nodes | /_nodes | |
/_cat/tasks | /_nodes/usage | |
/_cat/templates | /_nodes/hot_threads | |
/_cat/thread_pool | /_nodes/stats | |
/_cat/ml/trained_models | /_tasks | |
/_cat/transforms/_all | /_remote/info | |
/_cat/aliases | ||
/_cat/allocation | ||
/_cat/ml/anomaly_detectors | ||
/_cat/count | ||
/_cat/ml/data_frame/analytics | ||
/_cat/ml/datafeeds | ||
/_cat/fielddata | ||
/_cat/health | ||
/_cat/indices | ||
/_cat/master | ||
/_cat/nodeattrs | ||
/_cat/nodes |
Te punkty końcowe zostały wzięte z dokumentacji, gdzie możesz znaleźć więcej.
Ponadto, jeśli uzyskasz dostęp do /_cat
, odpowiedź będzie zawierać punkty końcowe /_cat/*
obsługiwane przez instancję.
W /_security/user
(jeśli uwierzytelnianie jest włączone) możesz zobaczyć, który użytkownik ma rolę superuser
.
Indices
Możesz zgromadzić wszystkie indeksy, uzyskując dostęp do http://10.10.10.115:9200/_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .kibana 6tjAYZrgQ5CwwR0g6VOoRg 1 0 1 0 4kb 4kb
yellow open quotes ZG2D1IqkQNiNZmi2HRImnQ 5 1 253 0 262.7kb 262.7kb
yellow open bank eSVpNfCfREyYoVigNWcrMw 5 1 1000 0 483.2kb 483.2kb
Aby uzyskać informacje o tym, jakie dane są zapisane w indeksie, możesz uzyskać dostęp do: http://host:9200/<index>
w tym przypadku http://10.10.10.115:9200/bank
Zrzut indeksu
Jeśli chcesz zrzucić wszystkie zawartości indeksu, możesz uzyskać dostęp do: http://host:9200/<index>/_search?pretty=true
jak http://10.10.10.115:9200/bank/_search?pretty=true
Poświęć chwilę, aby porównać zawartość każdego dokumentu (wpisu) w indeksie bankowym oraz pola tego indeksu, które widzieliśmy w poprzedniej sekcji.
Na tym etapie możesz zauważyć, że istnieje pole o nazwie "total" wewnątrz "hits", które wskazuje, że znaleziono 1000 dokumentów w tym indeksie, ale tylko 10 zostało zwróconych. Dzieje się tak, ponieważ domyślnie istnieje limit 10 dokumentów.
Jednak teraz, gdy wiesz, że ten indeks zawiera 1000 dokumentów, możesz zrzucić wszystkie z nich, wskazując liczbę wpisów, które chcesz zrzucić w parametrze size
: http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000
asd
_Uwaga: Jeśli wskażesz większą liczbę, wszystkie wpisy i tak zostaną zrzucane, na przykład możesz wskazać size=9999
, a to będzie dziwne, jeśli byłoby więcej wpisów (ale powinieneś to sprawdzić)._
Zrzut wszystkich
Aby zrzucić wszystko, możesz po prostu przejść do tej samej ścieżki co wcześniej, ale bez wskazywania jakiegoś indeksu http://host:9200/_search?pretty=true
jak http://10.10.10.115:9200/_search?pretty=true
Pamiętaj, że w tym przypadku zostanie zastosowany domyślny limit 10 wyników. Możesz użyć parametru size
, aby zrzucić większą ilość wyników. Przeczytaj poprzednią sekcję, aby uzyskać więcej informacji.
Wyszukiwanie
Jeśli szukasz jakichś informacji, możesz przeprowadzić surowe wyszukiwanie we wszystkich indeksach, przechodząc do http://host:9200/_search?pretty=true&q=<search_term>
jak w http://10.10.10.115:9200/_search?pretty=true&q=Rockwell
Jeśli chcesz tylko wyszukiwać w indeksie, możesz po prostu określić go w ścieżce: http://host:9200/<index>/_search?pretty=true&q=<search_term>
Uwaga, że parametr q używany do wyszukiwania treści obsługuje wyrażenia regularne
Możesz również użyć czegoś takiego jak https://github.com/misalabs/horuz, aby fuzzować usługę elasticsearch.
Uprawnienia do zapisu
Możesz sprawdzić swoje uprawnienia do zapisu, próbując utworzyć nowy dokument w nowym indeksie, uruchamiając coś takiego jak poniżej:
curl -X POST '10.10.10.115:9200/bookindex/books' -H 'Content-Type: application/json' -d'
{
"bookId" : "A00-3",
"author" : "Sankaran",
"publisher" : "Mcgrahill",
"name" : "how to get a job"
}'
Ten cmd utworzy nowy indeks o nazwie bookindex
z dokumentem typu books
, który ma atrybuty "bookId", "author", "publisher" i "name".
Zauważ, jak nowy indeks pojawia się teraz na liście:
I zwróć uwagę na automatycznie utworzone właściwości:
Automatyczna enumeracja
Niektóre narzędzia uzyskają część danych przedstawionych wcześniej:
msf > use auxiliary/scanner/elasticsearch/indices_enum
{{#ref}} https://github.com/theMiddleBlue/nmap-elasticsearch-nse {{#endref}}
Shodan
port:9200 elasticsearch
tip
Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wsparcie HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegram lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów github.