13 KiB
9200 - Pentesting Elasticsearch
{% 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
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 do 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, lokalizacje geograficzne 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 uwierzytelnianie 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ć obsługiwane przez instancję punkty końcowe /_cat/*
.
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
{% embed url="https://github.com/theMiddleBlue/nmap-elasticsearch-nse" %}
Shodan
port:9200 elasticsearch
{% hint style="success" %}
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)
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.