mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-22 19:13:39 +00:00
204 lines
16 KiB
Markdown
204 lines
16 KiB
Markdown
# 9200 - Pentesting Elasticsearch
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
|
|
|
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
|
|
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
|
|
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
|
|
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
|
|
|
</details>
|
|
|
|
## Informations de base
|
|
|
|
À partir de la [page principale](https://www.elastic.co/what-is/elasticsearch), vous pouvez trouver des descriptions utiles :
|
|
|
|
> Elasticsearch est un moteur de recherche et d'analyse distribué et open source pour tous les types de données, y compris textuelles, numériques, géospatiales, structurées et non structurées. Elasticsearch est construit sur Apache Lucene et a été publié pour la première fois en 2010 par Elasticsearch N.V. (maintenant connu sous le nom d'Elastic). Connu pour ses API REST simples, sa nature distribuée, sa rapidité et sa scalabilité, Elasticsearch est le composant central de l'Elastic Stack, un ensemble d'outils open source pour l'ingestion, l'enrichissement, le stockage, l'analyse et la visualisation de données. Communément appelé ELK Stack (après Elasticsearch, Logstash et Kibana), Elastic Stack comprend maintenant une riche collection d'agents d'expédition légers appelés Beats pour l'envoi de données à Elasticsearch.
|
|
|
|
### Qu'est-ce qu'un index Elasticsearch ?
|
|
|
|
Un _index_ Elasticsearch **est une collection de documents** qui sont liés les uns aux autres. Elasticsearch stocke les données sous forme de documents JSON. Chaque document corrèle un ensemble de _clés_ (noms de champs ou de propriétés) avec leurs valeurs correspondantes (chaînes, nombres, booléens, dates, tableaux de _valeurs_, géolocalisations ou autres types de données).
|
|
|
|
Elasticsearch utilise une structure de données appelée _index inversé_, conçue pour permettre des recherches de texte intégral très rapides. Un index inversé répertorie chaque mot unique qui apparaît dans n'importe quel document et identifie tous les documents dans lesquels chaque mot apparaît.
|
|
|
|
Pendant le processus d'indexation, Elasticsearch stocke les documents et construit un index inversé pour rendre les données du document interrogeables en temps quasi réel. L'indexation est initiée avec l'API d'index, par laquelle vous pouvez ajouter ou mettre à jour un document 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/`
|
|
|
|
![](<../.gitbook/assets/image (264).png>)
|
|
|
|
Si vous ne voyez pas cette réponse en accédant à `/`, voir la section suivante.
|
|
|
|
### Authentification
|
|
|
|
**Par défaut, Elasticsearch n'a pas d'authentification activée**, donc par défaut, vous pouvez accéder à tout ce qui se trouve dans la base de données sans utiliser de crédentials.
|
|
|
|
Vous pouvez vérifier que l'authentification est désactivée avec une requête à :
|
|
```bash
|
|
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 que vous recevez une réponse comme celle-ci :
|
|
```bash
|
|
{"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 que **vous avez besoin de valides identifiants** pour obtenir des informations à partir d'Elasticsearch. Ensuite, vous pouvez [**essayer de le bruteforcer**](../generic-methodologies-and-resources/brute-force.md#elasticsearch) (il utilise l'authentification de base HTTP, donc tout ce qui peut bruteforcer 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 base des utilisateurs
|
|
|
|
Pour commencer, nous pouvons utiliser la méthode GET pour récupérer la liste des index disponibles sur Elasticsearch. Pour cela, nous pouvons envoyer une requête GET à l'URL `http://<IP>:9200/_cat/indices?v`. Cela nous donnera une liste des index disponibles sur le serveur Elasticsearch.
|
|
|
|
Ensuite, nous pouvons utiliser la méthode GET pour récupérer la liste des documents dans un index spécifique. Pour cela, nous pouvons envoyer une requête GET à l'URL `http://<IP>:9200/<nom_de_l'index>/_search?size=1000`. Cela nous donnera une liste des 1000 premiers documents dans l'index spécifié.
|
|
|
|
Enfin, nous pouvons utiliser la méthode GET pour récupérer les détails d'un document spécifique. Pour cela, nous pouvons envoyer une requête GET à l'URL `http://<IP>:9200/<nom_de_l'index>/_doc/<ID_du_document>`. Cela nous donnera les détails du document spécifié.
|
|
```bash
|
|
#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 que vous pouvez **obtenir 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é [**pris à partir de la documentation**](https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html) où vous pouvez **en 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 de `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 stockées dans un index, vous pouvez accéder à : `http://host:9200/<index>` par exemple dans ce cas `http://10.10.10.115:9200/bank`
|
|
|
|
![](<../.gitbook/assets/image (265).png>)
|
|
|
|
### Dump de l'index
|
|
|
|
Si vous voulez **dump 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`
|
|
|
|
![](<../.gitbook/assets/image (266).png>)
|
|
|
|
_Prenez un moment pour comparer le contenu de chaque document (entrée) à l'intérieur de l'index bancaire et les champs de cet index que nous avons vus dans la section précédente._
|
|
|
|
Ainsi, à 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 seulement 10 ont été récupérés. C'est parce que **par défaut, il y a une limite de 10 documents**.\
|
|
Mais maintenant que vous savez que **cet index contient 1000 documents**, vous pouvez **dump tous les documents** en indiquant le nombre d'entrées que vous voulez dans le paramètre **`size`** : `http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000`\
|
|
_Remarque : Si vous indiquez un nombre plus grand, toutes les entrées seront quand même dumpées, par exemple vous pourriez indiquer `size=9999` et ce serait étrange s'il y avait plus d'entrées (mais vous devriez vérifier)._
|
|
|
|
### Dump de tout
|
|
|
|
Pour tout dump, vous pouvez simplement aller sur le **même chemin qu'avant mais sans indiquer aucun 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 dump une **plus grande quantité de résultats**. Lisez la section précédente pour plus d'informations.
|
|
|
|
### Recherche
|
|
|
|
Si vous cherchez des informations, vous pouvez faire 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`
|
|
|
|
![](<../.gitbook/assets/image (267).png>)
|
|
|
|
Si vous voulez simplement **chercher dans un index**, vous pouvez simplement le **spécifier** sur le **chemin** : `http://host:9200/<index>/_search?pretty=true&q=<search_term>`
|
|
|
|
_Remarquez 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](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 dans un nouvel index en exécutant quelque chose comme ce qui suit :
|
|
```bash
|
|
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 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**:
|
|
|
|
![](<../.gitbook/assets/image (268).png>)
|
|
|
|
Et notez les **propriétés créées automatiquement**:
|
|
|
|
![](<../.gitbook/assets/image (269).png>)
|
|
|
|
## Énumération automatique
|
|
|
|
Certains outils obtiendront certaines des données présentées précédemment:
|
|
```bash
|
|
msf > use auxiliary/scanner/elasticsearch/indices_enum
|
|
```
|
|
## Shodan
|
|
|
|
* `port:9200 elasticsearch`
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
- Travaillez-vous dans une entreprise de cybersécurité ? Voulez-vous voir votre entreprise annoncée dans HackTricks ? ou voulez-vous avoir accès à la dernière version de PEASS ou télécharger HackTricks en PDF ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
|
|
|
- Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
|
|
- Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
|
|
- **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
|
|
|
- **Partagez vos astuces de piratage en soumettant des PR au [repo hacktricks](https://github.com/carlospolop/hacktricks) et au [repo hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
|
|
|
</details>
|