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 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=1000
asd
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
{% embed url="https://github.com/theMiddleBlue/nmap-elasticsearch-nse" %}
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:
- 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.