9200 - Pentesting 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 typó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 stanowi rdzeń 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 zawiera listę każdego unikalnego słowa w dokumentach i identyfikuje dokumenty, w których występuje każde słowo.

Podczas procesu indeksowania Elasticsearch przechowuje dokumenty i tworzy indeks odwrócony, umożliwiając wyszukiwanie w czasie zbliżonym do rzeczywistego. API indeksu służy 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 podczas dostępu 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 za pomocą żądania 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 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 prawidłowych poświadczeń, aby uzyskać jakiekolwiek informacje z Elasticsearch. Następnie możesz spróbować przeprowadzić atak brutalnej siły (wykorzystuje on uwierzytelnianie podstawowe 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 Elasticsearch

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 pobrane z dokumentacji, gdzie możesz znaleźć więcej informacji. 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 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 wyciec 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ę 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 wyciec je wszystkie, określając liczbę wpisów, które chcesz wyciec 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ą wycięte, 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 wszystkiego

Aby wyciec wszystko, po prostu udaj się 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.

Szukaj

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 po prostu wyszukać w indeksie, możesz po prostu określić to w ścieżce: http://host:9200/<index>/_search?pretty=true&q=<search_term>

Zauważ, że parametr q używany do wyszukiwania zawartości obsługuje wyrażenia regularne

Możesz także użyć czegoś 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 poniższego:

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 przedstawionych danych wcześniej:

msf > use auxiliary/scanner/elasticsearch/indices_enum

Shodan

  • port:9200 elasticsearch

Zacznij od zera i stań się ekspertem od hakowania AWS dzięki htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated