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

14 KiB

9200 - Pentesting Elasticsearch

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Grundlegende Informationen

Elasticsearch ist eine verteilte, Open-Source-Such- und Analyse-Engine für alle Arten von Daten. Es ist bekannt für seine Geschwindigkeit, Skalierbarkeit und einfachen REST-APIs. Auf Apache Lucene aufbauend, wurde es 2010 erstmals von Elasticsearch N.V. (jetzt bekannt als Elastic) veröffentlicht. Elasticsearch ist die Kernkomponente des Elastic Stack, einer Sammlung von Open-Source-Tools für Datenübernahme, -anreicherung, -speicherung, -analyse und -visualisierung. Dieser Stack, allgemein als ELK Stack bezeichnet, umfasst auch Logstash und Kibana und verfügt nun über leichte Datenversand-Agenten namens Beats.

Was ist ein Elasticsearch-Index?

Ein Elasticsearch-Index ist eine Sammlung von verwandten Dokumenten, die als JSON gespeichert sind. Jedes Dokument besteht aus Schlüsseln und ihren entsprechenden Werten (Zeichenfolgen, Zahlen, Boolesche Werte, Datum, Arrays, Geolokationen usw.).

Elasticsearch verwendet eine effiziente Datenstruktur namens umgekehrter Index, um schnelle Volltextsuchen zu ermöglichen. Dieser Index listet jedes eindeutige Wort in den Dokumenten auf und identifiziert die Dokumente, in denen jedes Wort erscheint.

Während des Indexierungsprozesses speichert Elasticsearch die Dokumente und erstellt den umgekehrten Index, was eine nahezu Echtzeitsuche ermöglicht. Die Index-API wird verwendet, um JSON-Dokumente zu einem bestimmten Index hinzuzufügen oder zu aktualisieren.

Standardport: 9200/tcp

Manuelle Enumeration

Banner

Das Protokoll, um auf Elasticsearch zuzugreifen, ist HTTP. Wenn Sie über HTTP darauf zugreifen, finden Sie einige interessante Informationen: http://10.10.10.115:9200/

Wenn Sie diese Antwort beim Zugriff auf / nicht sehen, lesen Sie den folgenden Abschnitt.

Authentifizierung

Standardmäßig ist die Authentifizierung in Elasticsearch deaktiviert, sodass Sie standardmäßig auf alles in der Datenbank zugreifen können, ohne Anmeldeinformationen zu verwenden.

Sie können überprüfen, ob die Authentifizierung deaktiviert ist, indem Sie eine Anfrage an:

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}

Allerdings, wenn Sie eine Anfrage an / senden und eine Antwort wie die folgende erhalten:

{"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}

Das bedeutet, dass die Authentifizierung konfiguriert ist und gültige Anmeldeinformationen erforderlich sind, um Informationen von Elasticsearch zu erhalten. Anschließend können Sie versuchen, Brute-Force anzuwenden (es verwendet HTTP-Basisauthentifizierung, daher kann alles, was BF HTTP-Basisauthentifizierung kann, verwendet werden).
Hier haben Sie eine Liste der Standardbenutzernamen: elastic (Superbenutzer), remote_monitoring_user, beats_system, logstash_system, kibana, kibana_system, apm_system, _anonymous_._ Ältere Versionen von Elasticsearch haben das Standardpasswort changeme für diesen Benutzer.

curl -X GET http://user:password@IP:9200/

Grundlegende Benutzerenumeration

#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>"

Elastische Informationen

Hier sind einige Endpunkte, die Sie über GET aufrufen können, um Informationen über Elasticsearch zu erhalten:

_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

Diese Endpunkte wurden aus der Dokumentation entnommen, wo Sie mehr finden können.
Außerdem enthält die Antwort auf den Zugriff auf /_cat die von der Instanz unterstützten /_cat/*-Endpunkte.

In /_security/user (falls Authentifizierung aktiviert ist) können Sie sehen, welcher Benutzer die Rolle superuser hat.

Indizes

Sie können alle Indizes abrufen, indem Sie http://10.10.10.115:9200/_cat/indices?v aufrufen.

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

Um Informationen darüber zu erhalten, welche Art von Daten in einem Index gespeichert sind, können Sie auf Folgendes zugreifen: http://host:9200/<index> zum Beispiel in diesem Fall http://10.10.10.115:9200/bank

Index dump

Wenn Sie alle Inhalte eines Index dumpen möchten, können Sie auf Folgendes zugreifen: http://host:9200/<index>/_search?pretty=true wie http://10.10.10.115:9200/bank/_search?pretty=true

Nehmen Sie sich einen Moment Zeit, um die Inhalte jedes Dokuments (Eintrags) im Bank-Index und die Felder dieses Index zu vergleichen, die wir im vorherigen Abschnitt gesehen haben.

An diesem Punkt können Sie feststellen, dass es ein Feld namens "total" innerhalb von "hits" gibt, das angibt, dass 1000 Dokumente in diesem Index gefunden wurden, aber nur 10 abgerufen wurden. Dies liegt daran, dass standardmäßig eine Begrenzung von 10 Dokumenten besteht.
Aber jetzt, da Sie wissen, dass dieser Index 1000 Dokumente enthält, können Sie alle von ihnen dumpen, indem Sie die Anzahl der Einträge angeben, die Sie im size-Parameter dumpen möchten: http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000asd
Hinweis: Wenn Sie eine größere Zahl angeben, werden alle Einträge sowieso gedumpt, zum Beispiel könnten Sie size=9999 angeben und es wäre seltsam, wenn es mehr Einträge gäbe (aber Sie sollten überprüfen).

Alles dumpen

Um alles zu dumpen, können Sie einfach zum gleichen Pfad wie zuvor gehen, aber ohne einen Index anzugeben http://host:9200/_search?pretty=true wie http://10.10.10.115:9200/_search?pretty=true
Denken Sie daran, dass in diesem Fall die Standardbegrenzung von 10 Ergebnissen angewendet wird. Sie können den size-Parameter verwenden, um eine größere Menge an Ergebnissen zu dumpen. Lesen Sie den vorherigen Abschnitt für weitere Informationen.

Suche

Wenn Sie nach Informationen suchen, können Sie eine Rohsuche in allen Indizes durchführen, indem Sie zu http://host:9200/_search?pretty=true&q=<search_term> gehen, wie in http://10.10.10.115:9200/_search?pretty=true&q=Rockwell

Wenn Sie nur in einem Index suchen möchten, können Sie es einfach im Pfad angeben: http://host:9200/<index>/_search?pretty=true&q=<search_term>

Beachten Sie, dass der q-Parameter, der zum Suchen von Inhalten verwendet wird, reguläre Ausdrücke unterstützt

Sie können auch etwas wie https://github.com/misalabs/horuz verwenden, um einen Elasticsearch-Dienst zu fuzzieren.

Schreibberechtigungen

Sie können Ihre Schreibberechtigungen überprüfen, indem Sie versuchen, ein neues Dokument in einem neuen Index zu erstellen, indem Sie etwas Ähnliches ausführen:

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"
}'

Die folgende cmd erstellt einen neuen Index namens bookindex mit einem Dokument vom Typ books, das die Attribute "bookId", "author", "publisher" und "name" hat.

Beachten Sie, wie der neue Index jetzt in der Liste erscheint:

Und beachten Sie die automatisch erstellten Eigenschaften:

Automatische Enumeration

Einige Tools werden einige der zuvor präsentierten Daten erhalten:

msf > use auxiliary/scanner/elasticsearch/indices_enum

{% embed url="https://github.com/theMiddleBlue/nmap-elasticsearch-nse" %}

Shodan

  • port:9200 elasticsearch
Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen: