hacktricks/network-services-pentesting/9200-pentesting-elasticsearch.md
2024-02-11 01:46:25 +00:00

16 KiB

9200 - Testowanie penetracyjne Elasticsearch

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Podstawowe informacje

Elasticsearch to rozproszony, open source'owy silnik wyszukiwania i analizy dla wszystkich typów danych. Jest znany ze swojej 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 podstawowym komponentem Elastic Stack, kolekcji narzędzi 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 ma lekkie agenty wysyłające dane o nazwie Beats.

Co to jest indeks Elasticsearch?

Indeks Elasticsearch to kolekcja 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 wydajnej struktury danych o nazwie odwrócony indeks, aby umożliwić 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 odwrócony indeks, umożliwiając wyszukiwanie w czasie rzeczywistym. Interfejs 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 takiej odpowiedzi podczas dostępu do /, zobacz następną sekcję.

Autoryzacja

Domyślnie Elasticsearch nie ma włączonej autoryzacji, więc domyślnie można uzyskać dostęp do wszystkiego w bazie danych bez użycia żadnych poświadczeń.

Możesz sprawdzić, czy 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ź podobną do tej:

{"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 prawidłowych danych uwierzytelniających, aby uzyskać jakiekolwiek informacje z Elasticsearch. Następnie możesz spróbować przeprowadzić atak brutalnej siły (używa on uwierzytelniania HTTP basic, więc można użyć czegokolwiek, co potrafi atakować uwierzytelnianie HTTP basic).
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

Elasticsearch provides an API endpoint that allows users to retrieve information about the cluster, including the list of indices and their settings. This can be useful for an attacker to gather information about the target system.

Elasticsearch udostępnia punkt końcowy API, który umożliwia użytkownikom pobieranie informacji o klastrze, w tym listy indeksów i ich ustawień. Może to być przydatne dla atakującego do zebrania informacji o docelowym systemie.

To enumerate the list of indices, you can send a GET request to the /_cat/indices endpoint. This will return a list of all indices along with their metadata.

Aby wyliczyć listę indeksów, możesz wysłać żądanie GET do punktu końcowego /_cat/indices. Spowoduje to zwrócenie listy wszystkich indeksów wraz z ich metadanymi.

To enumerate the list of settings for a specific index, you can send a GET request to the /_settings/<index> endpoint. Replace <index> with the name of the index you want to enumerate.

Aby wyliczyć listę ustawień dla określonego indeksu, możesz wysłać żądanie GET do punktu końcowego /_settings/<index>. Zastąp <index> nazwą indeksu, który chcesz wyliczyć.

By default, Elasticsearch does not require authentication for these API endpoints, so an attacker can easily retrieve this information without any credentials.

Domyślnie Elasticsearch nie wymaga uwierzytelniania dla tych punktów końcowych API, więc atakujący może łatwo pobrać te informacje bez żadnych poświadczeń.

Default Credentials

Elasticsearch does not have default credentials set by default. However, if the administrator has set up authentication, it is important to try common default credentials such as admin:admin, elastic:elastic, or admin:password.

Domyślnie Elasticsearch nie ma ustawionych domyślnych poświadczeń. Jednak jeśli administrator skonfigurował uwierzytelnianie, ważne jest, aby spróbować popularnych domyślnych poświadczeń, takich jak admin:admin, elastic:elastic lub admin:password.

Anonymous Access

In some cases, Elasticsearch may be configured to allow anonymous access. This means that anyone can access the cluster and perform actions without providing any credentials. It is important to check if anonymous access is enabled and take appropriate measures to secure the cluster.

W niektórych przypadkach Elasticsearch może być skonfigurowany tak, aby umożliwić anonimowy dostęp. Oznacza to, że każdy może uzyskać dostęp do klastra i wykonywać działania bez podawania żadnych poświadczeń. Ważne jest sprawdzenie, czy anonimowy dostęp jest włączony i podjęcie odpowiednich działań w celu zabezpieczenia klastra.

#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żna 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żna znaleźć więcej informacji.
Dodatkowo, jeśli uzyskasz dostęp do /_cat, odpowiedź będzie zawierać punkty końcowe /_cat/* obsługiwane przez instancję.

W /_security/user (jeśli uwierzytelnianie jest włączone), można zobaczyć, który użytkownik ma rolę superuser.

Indeksy

Aby uzyskać wszystkie indeksy, można uzyskać 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 przechowywanych w indeksie, można uzyskać dostęp do: http://host:9200/<index>, na przykład w tym przypadku http://10.10.10.115:9200/bank

Wydrukuj indeks

Jeśli chcesz wydrukować wszystkie zawartości indeksu, możesz uzyskać dostęp do: http://host:9200/<index>/_search?pretty=true, na przykład http://10.10.10.115:9200/bank/_search?pretty=true

Zastanów się przez chwilę nad porównaniem zawartości każdego dokumentu (wpisu) wewnątrz indeksu banku i pól tego indeksu, które widzieliśmy wcześniej.

W tym momencie możesz zauważyć, że istnieje pole o nazwie "total" wewnątrz "hits", które wskazuje, że znaleziono 1000 dokumentów wewnątrz tego indeksu, ale pobrano tylko 10. Dzieje się tak, ponieważ domyślnie istnieje limit 10 dokumentów.
Ale teraz, gdy wiesz, że ten indeks zawiera 1000 dokumentów, możesz wydrukować je wszystkie, określając liczbę wpisów, które chcesz wydrukować w parametrze size: http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000asd
Uwaga: Jeśli podasz większą liczbę, wszystkie wpisy zostaną wydrukowane, na przykład możesz podać size=9999, ale warto sprawdzić, czy istnieją więcej wpisów.

Wydrukuj wszystko

Aby wydrukować wszystko, możesz po prostu przejść do tej samej ścieżki jak wcześniej, ale bez wskazywania żadnego indeksu http://host:9200/_search?pretty=true, na przykład 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 wydrukować 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>, na przykład http://10.10.10.115:9200/_search?pretty=true&q=Rockwell

Jeśli chcesz wyszukać tylko w jednym indeksie, możesz po prostu określić go na ś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 również użyć czegoś takiego jak https://github.com/misalabs/horuz, aby przetestować 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"
}'

To polecenie utworzy nowy indeks o nazwie bookindex z dokumentem o typie books, który ma atrybuty "bookId", "author", "publisher" i "name".

Zauważ, jak nowy indeks pojawił się teraz na liście:

Zwróć uwagę na automatycznie utworzone właściwości:

Automatyczne wyliczanie

Niektóre narzędzia uzyskają część przedstawionych wcześniej danych:

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: