mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-29 16:10:54 +00:00
196 lines
14 KiB
Markdown
196 lines
14 KiB
Markdown
# 9200 - Pentesting Elasticsearch
|
|
|
|
{% hint style="success" %}
|
|
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Support HackTricks</summary>
|
|
|
|
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
|
|
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
{% 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/`
|
|
|
|
![](<../.gitbook/assets/image (294).png>)
|
|
|
|
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 à :
|
|
```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 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 **vous avez besoin de credentials valides** pour obtenir des informations d'Elasticsearch. Ensuite, vous pouvez [**essayer de le bruteforcer**](../generic-methodologies-and-resources/brute-force.md#elasticsearch) (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
|
|
```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>"
|
|
```
|
|
### 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**](https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html) 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`
|
|
|
|
![](<../.gitbook/assets/image (342).png>)
|
|
|
|
### 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`
|
|
|
|
![](<../.gitbook/assets/image (914).png>)
|
|
|
|
_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`
|
|
|
|
![](<../.gitbook/assets/image (335).png>)
|
|
|
|
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](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 :
|
|
```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 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** :
|
|
|
|
![](<../.gitbook/assets/image (130).png>)
|
|
|
|
Et notez les **propriétés créées automatiquement** :
|
|
|
|
![](<../.gitbook/assets/image (434).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
|
|
```
|
|
{% embed url="https://github.com/theMiddleBlue/nmap-elasticsearch-nse" %}
|
|
|
|
## Shodan
|
|
|
|
* `port:9200 elasticsearch`
|
|
|
|
{% hint style="success" %}
|
|
Apprenez et pratiquez le hacking AWS :<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Formation Expert Red Team AWS (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
|
Apprenez et pratiquez le hacking GCP : <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Formation Expert Red Team GCP (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
|
|
|
<details>
|
|
|
|
<summary>Soutenir HackTricks</summary>
|
|
|
|
* Consultez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop)!
|
|
* **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** nous sur **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Partagez des astuces de hacking en soumettant des PRs aux** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts github.
|
|
|
|
</details>
|
|
{% endhint %}
|