hacktricks/network-services-pentesting/9200-pentesting-elasticsearch.md

14 KiB

9200 - Testowanie penetracyjne Elasticsearch

Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

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=1000asd
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: