14 KiB
9200 - Test d'intrusion Elasticsearch
Apprenez le piratage AWS de zéro à héros avec htARTE (Expert de l'équipe rouge AWS de HackTricks)!
Autres façons de soutenir HackTricks :
- Si vous souhaitez voir votre entreprise annoncée dans HackTricks ou télécharger HackTricks en PDF, consultez les PLANS D'ABONNEMENT !
- Obtenez le swag officiel PEASS & HackTricks
- Découvrez La famille PEASS, notre collection exclusive de NFTs
- Rejoignez le 💬 groupe Discord ou le groupe Telegram ou suivez nous sur Twitter 🐦 @carlospolopm.
- Partagez vos astuces de piratage en soumettant des PR aux HackTricks et HackTricks Cloud dépôts GitHub.
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é initialement publié en 2010 par Elasticsearch N.V. (maintenant 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. Cette pile, communément appelée ELK Stack, comprend également Logstash et Kibana, et dispose désormais d'agents légers d'expédition de données appelés Beats.
Qu'est-ce qu'un index Elasticsearch ?
Un index Elasticsearch est une collection de documents associés stockés sous forme de JSON. Chaque document se compose de clés et de leurs valeurs correspondantes (chaînes de caractères, nombres, booléens, dates, tableaux, géolocalisations, etc.).
Elasticsearch utilise une structure de données efficace appelée index inversé pour faciliter les recherches de texte intégral rapides. Cet index répertorie chaque mot unique dans les documents et identifie les documents dans lesquels chaque mot apparaît.
Pendant le processus d'indexation, Elasticsearch stocke les documents et construit l'index inversé, permettant une recherche quasi 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 d'identifiants.
Vous pouvez vérifier que l'authentification est désactivée avec une requête vers :
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 justificatifs valides pour obtenir des informations à partir d'Elasticsearch. Ensuite, vous pouvez essayer de le forcer (il utilise l'authentification de base HTTP, donc tout ce qui peut forcer l'authentification de base HTTP 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 l'utilisateur de base
#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>"
Informations sur Elastic
Voici quelques points d'accès auxquels 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 d'accès ont été extraits de la documentation où vous pouvez trouver plus.
De plus, si vous accédez à /_cat
, la réponse contiendra les points d'accès /_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 à l'intérieur d'un index, vous pouvez accéder à : http://host:9200/<index>
par exemple dans ce cas http://10.10.10.115:9200/bank
Dump de l'index
Si vous souhaitez extraire tous les contenus 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) à l'intérieur de l'index bank et les champs de cet index que nous avons vus dans la section précédente.
A 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 à l'intérieur de cet index mais seuls 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 extraire tous les documents en indiquant le nombre d'entrées que vous souhaitez extraire 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 extraites de toute façon, par exemple vous pourriez indiquer size=9999
et ce serait étrange s'il y avait plus d'entrées (mais vous devriez vérifier).
Extraction de tous les documents
Pour extraire tous les documents, 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
Rappelez-vous que dans ce cas, la limite par défaut de 10 résultats sera appliquée. Vous pouvez utiliser le paramètre size
pour extraire une plus grande quantité de résultats. Lisez la section précédente pour plus d'informations.
Recherche
Si vous recherchez des informations, vous pouvez effectuer une recherche brute sur tous les index 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 simplement effectuer une recherche sur un index, vous pouvez simplement le spécifier dans le chemin : http://host:9200/<index>/_search?pretty=true&q=<search_term>
Notez que le paramètre q utilisé pour rechercher le 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.
Permissions d'écriture
Vous pouvez vérifier vos permissions d'écriture en essayant de créer un nouveau document à l'intérieur d'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"
}'
Ce cmd va créer 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
Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!
Autres façons de soutenir HackTricks:
- Si vous souhaitez voir votre entreprise annoncée dans HackTricks ou télécharger HackTricks en PDF, consultez les PLANS D'ABONNEMENT!
- Obtenez le swag officiel PEASS & HackTricks
- Découvrez La famille PEASS, notre collection exclusive de NFTs
- Rejoignez le 💬 groupe Discord ou le groupe Telegram ou suivez-nous sur Twitter 🐦 @carlospolopm.
- Partagez vos astuces de piratage en soumettant des PR aux HackTricks et HackTricks Cloud dépôts github.