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
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
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=1000
asd
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.
Search
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
- Consultez les plans d'abonnement!
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PRs aux HackTricks et HackTricks Cloud dépôts github.