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

14 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 %}

Informations de base

Elasticsearch est un moteur de recherche et d'analyse distribué, open source pour tous types de données. Il est connu pour sa rapidité, sa scalabilité et ses API REST simples. Basé sur Apache Lucene, il a été publié pour la première fois en 2010 par Elasticsearch N.V. (aujourd'hui connu sous le nom d'Elastic). Elasticsearch est le composant central de l'Elastic Stack, une collection d'outils open source pour l'ingestion, l'enrichissement, le stockage, l'analyse et la visualisation des données. Ce stack, communément appelé ELK Stack, comprend également Logstash et Kibana, et dispose maintenant d'agents d'expédition de données légers appelés Beats.

Qu'est-ce qu'un index Elasticsearch ?

Un index Elasticsearch est une collection de documents liés stockés sous forme de JSON. Chaque document se compose de clés et de leurs valeurs correspondantes (chaînes, nombres, booléens, dates, tableaux, géolocalisations, etc.).

Elasticsearch utilise une structure de données efficace appelée index inversé pour faciliter des recherches en texte intégral rapides. Cet index répertorie chaque mot unique dans les documents et identifie les documents dans lesquels chaque mot apparaît.

Au cours du processus d'indexation, Elasticsearch stocke les documents et construit l'index inversé, permettant des recherches quasi en temps réel. L'API d'index est utilisée pour ajouter ou mettre à jour des documents JSON dans un index spécifique.

Port par défaut : 9200/tcp

Énumération manuelle

Bannière

Le protocole utilisé pour accéder à Elasticsearch est HTTP. Lorsque vous y accédez via HTTP, vous trouverez des informations intéressantes : http://10.10.10.115:9200/

Si vous ne voyez pas cette réponse en accédant à /, consultez la section suivante.

Authentification

Par défaut, Elasticsearch n'a pas d'authentification activée, donc par défaut, vous pouvez accéder à tout à l'intérieur de la base de données sans utiliser de credentials.

Vous pouvez vérifier que l'authentification est désactivée avec une requête à :

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}

Cependant, si vous envoyez une requête à / et recevez une réponse comme celle-ci :

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

Cela signifie que l'authentification est configurée et vous avez besoin de credentials valides pour obtenir des informations d'Elasticsearch. Ensuite, vous pouvez essayer de le bruteforcer (il utilise l'authentification HTTP basique, donc tout ce qui peut BF HTTP basic auth peut être utilisé).
Voici une liste des noms d'utilisateur par défaut : elastic (superutilisateur), remote_monitoring_user, beats_system, logstash_system, kibana, kibana_system, apm_system, _anonymous_._ Les anciennes versions d'Elasticsearch ont le mot de passe par défaut changeme pour cet utilisateur.

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

Énumération de base des utilisateurs

#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

Voici quelques points de terminaison que vous pouvez accéder via GET pour obtenir des informations sur 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

Ces points de terminaison ont été pris de la documentation où vous pouvez trouver plus.
De plus, si vous accédez à /_cat, la réponse contiendra les points de terminaison /_cat/* pris en charge par l'instance.

Dans /_security/user (si l'authentification est activée), vous pouvez voir quel utilisateur a le rôle superuser.

Indices

Vous pouvez rassembler tous les indices en accédant à 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

Pour obtenir des informations sur le type de données enregistrées dans un index, vous pouvez accéder à : http://host:9200/<index> par exemple dans ce cas http://10.10.10.115:9200/bank

Dump index

Si vous souhaitez exporter tout le contenu d'un index, vous pouvez accéder à : http://host:9200/<index>/_search?pretty=true comme http://10.10.10.115:9200/bank/_search?pretty=true

Prenez un moment pour comparer le contenu de chaque document (entrée) dans l'index bank et les champs de cet index que nous avons vus dans la section précédente.

Donc, à ce stade, vous pouvez remarquer qu'il y a un champ appelé "total" à l'intérieur de "hits" qui indique que 1000 documents ont été trouvés dans cet index mais seulement 10 ont été récupérés. Cela est dû au fait qu'il y a par défaut une limite de 10 documents.
Mais maintenant que vous savez que cet index contient 1000 documents, vous pouvez les exporter tous en indiquant le nombre d'entrées que vous souhaitez exporter dans le paramètre size : http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000asd
Remarque : Si vous indiquez un nombre plus grand, toutes les entrées seront de toute façon exportées, par exemple vous pourriez indiquer size=9999 et il serait étrange qu'il y ait plus d'entrées (mais vous devriez vérifier).

Dump all

Pour exporter tout, vous pouvez simplement aller au même chemin qu'auparavant mais sans indiquer d'index http://host:9200/_search?pretty=true comme http://10.10.10.115:9200/_search?pretty=true
N'oubliez pas que dans ce cas, la limite par défaut de 10 résultats sera appliquée. Vous pouvez utiliser le paramètre size pour exporter une plus grande quantité de résultats. Lisez la section précédente pour plus d'informations.

Si vous recherchez des informations, vous pouvez faire une recherche brute sur tous les indices en allant à http://host:9200/_search?pretty=true&q=<search_term> comme dans http://10.10.10.115:9200/_search?pretty=true&q=Rockwell

Si vous souhaitez juste rechercher dans un index, vous pouvez simplement le spécifier dans le chemin : http://host:9200/<index>/_search?pretty=true&q=<search_term>

Remarque : le paramètre q utilisé pour rechercher du contenu prend en charge les expressions régulières

Vous pouvez également utiliser quelque chose comme https://github.com/misalabs/horuz pour fuzz un service elasticsearch.

Write permissions

Vous pouvez vérifier vos permissions d'écriture en essayant de créer un nouveau document dans un nouvel index en exécutant quelque chose comme ce qui suit :

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

Cette commande créera un nouvel index appelé bookindex avec un document de type books qui a les attributs "bookId", "author", "publisher" et "name"

Remarquez comment le nouvel index apparaît maintenant dans la liste :

Et notez les propriétés créées automatiquement :

Énumération Automatique

Certains outils obtiendront certaines des données présentées précédemment :

msf > use auxiliary/scanner/elasticsearch/indices_enum

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

Shodan

  • port:9200 elasticsearch

{% hint style="success" %} Apprenez et pratiquez le hacking AWS :HackTricks Formation Expert Red Team AWS (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Formation Expert Red Team GCP (GRTE)

Soutenir HackTricks
{% endhint %}