14 KiB
9200 - Testowanie penetracyjne Elasticsearch
Nauka hakowania 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ź PLANY SUBSKRYPCYJNE!
- 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 hakowania, przesyłając PR-y do HackTricks i HackTricks Cloud github repos.
Podstawowe informacje
Elasticsearch to rozdzielony, otwarty silnik wyszukiwania i analizy danych dla wszystkich rodzajów danych. Znany jest z szybkości, skalowalności i prostych interfejsów REST. Zbudowany na Apache Lucene, został po raz pierwszy wydany w 2010 roku przez Elasticsearch N.V. (obecnie znany jako Elastic). Elasticsearch jest głównym komponentem stosu Elastic, kolekcji narzędzi typu open source do pobierania, wzbogacania, przechowywania, analizy i wizualizacji danych. Ten stos, często nazywany stos ELK, obejmuje również Logstash i Kibanę, a teraz posiada lekkie agenty wysyłające dane zwane Beats.
Co to 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 znaków, liczby, wartości logiczne, daty, tablice, geolokacje, 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 występuje każde słowo.
Podczas procesu indeksowania Elasticsearch przechowuje dokumenty i konstruuje indeks odwrócony, umożliwiając niemal czasowe wyszukiwanie. API indeksu jest używane do dodawania lub aktualizowania dokumentów JSON w określonym indeksie.
Domyślny port: 9200/tcp
Ręczne wyliczanie
Baner
Protokół używany do dostępu do Elasticsearch to HTTP. Gdy uzyskasz do niego dostęp za pomocą HTTP, znajdziesz kilka interesujących informacji: http://10.10.10.115:9200/
Jeśli nie widzisz tej odpowiedzi, przechodząc do /
, zobacz następną sekcję.
Autoryzacja
Domyślnie Elasticsearch nie ma włączonej autoryzacji, więc domyślnie możesz uzyskać dostęp do wszystkiego w bazie danych bez użycia jakichkolwiek poświadczeń.
Możesz zweryfikować, że autoryzacja jest wyłączona, 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, jeśli wysyłasz żądanie do /
i otrzymujesz odpowiedź w stylu:
{"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 Elasticsearch. Następnie możesz spróbować przeprowadzić atak brutalnej siły (używa on uwierzytelniania podstawowego HTTP, więc można użyć wszystkiego, co może atakować uwierzytelnianie podstawowe HTTP).
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/
Podstawowe wyliczanie 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>"
Informacje o Elastic
Oto kilka punktów końcowych, do których możesz uzyskać dostęp za pomocą metody GET, aby uzyskać 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 informacji.
Ponadto, jeśli uzyskasz dostęp do /_cat
, odpowiedź będzie zawierać obsługiwane punkty końcowe /_cat/*
przez instancję.
W /_security/user
(jeśli uwierzytelnienie jest włączone), możesz zobaczyć, który użytkownik ma rolę superuser
.
Indeksy
Możesz zbierać 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 na temat rodzaju danych zapisanych wewnątrz indeksu, możesz uzyskać dostęp do: http://host:9200/<index>
na przykład w tym przypadku http://10.10.10.115:9200/bank
Wyciek indeksu
Jeśli chcesz wyciek wszystkich 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ę na porównanie zawartości każdego dokumentu (wpisu) wewnątrz indeksu banku i pól tego indeksu, które widzieliśmy w poprzednim rozdziale.
Zauważysz więc, że istnieje pole o nazwie "total" wewnątrz "hits", które wskazuje, że znaleziono 1000 dokumentów wewnątrz tego indeksu, ale tylko 10 zostało pobranych. Dzieje się tak, ponieważ domyślnie istnieje limit 10 dokumentów.
Teraz, gdy wiesz, że ten indeks zawiera 1000 dokumentów, możesz wyciek wszystkich z nich, określając liczbę wpisów, które chcesz wyciekać w parametrze size
: http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000
asd
Uwaga: Jeśli określisz większą liczbę, wszystkie wpisy zostaną wyciekane, na przykład możesz określić size=9999
i byłoby to dziwne, gdyby istniało więcej wpisów (ale powinieneś sprawdzić).
Wyciek wszystkich
Aby wyciec wszystko, możesz po prostu przejść do tej samej ścieżki co wcześniej, ale bez określania żadnego indeksu http://host:9200/_search?pretty=true
jak http://10.10.10.115:9200/_search?pretty=true
Pamiętaj, że w tym przypadku będzie stosowany domyślny limit 10 wyników. Możesz użyć parametru size
, aby wyciec większą ilość wyników. Przeczytaj poprzedni rozdział, aby uzyskać więcej informacji.
Wyszukiwanie
Jeśli szukasz 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 wyszukać tylko w indeksie, możesz po prostu to określić w ścieżce: http://host:9200/<index>/_search?pretty=true&q=<search_term>
Zauważ, że parametr q używany do wyszukiwania treści obsługuje wyrażenia regularne
Możesz także użyć narzędzia takiego jak https://github.com/misalabs/horuz, aby przetestować usługę Elasticsearch pod kątem fuzzowania.
Uprawnienia do zapisu
Możesz sprawdzić swoje uprawnienia do zapisu, próbując utworzyć nowy dokument w nowym indeksie, uruchamiając coś w rodzaju:
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"
}'
To polecenie utworzy nowy indeks o nazwie bookindex
z dokumentem typu books
, który ma atrybuty "bookId", "author", "publisher" i "name"
Zauważ, jak nowy indeks teraz pojawia się na liście:
Zauważ automatycznie utworzone właściwości:
Automatyczne wyliczanie
Niektóre narzędzia uzyskają niektóre z danych przedstawionych wcześniej:
msf > use auxiliary/scanner/elasticsearch/indices_enum
{% embed url="https://github.com/theMiddleBlue/nmap-elasticsearch-nse" %}
Shodan
port:9200 elasticsearch
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ź PLANY SUBSKRYPCYJNE!
- 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.