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

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
{% endhint %}

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=1000asd
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
{% endhint %}