# 9200 - Pentesting Elasticsearch
{% hint style="success" %}
Learn & practice AWS Hacking:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
Learn & practice GCP Hacking: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
Support HackTricks
* 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.
{% endhint %}
## Basic information
Elasticsearch๋ **๋ถ์ฐํ**, **์คํ ์์ค** ๊ฒ์ ๋ฐ ๋ถ์ ์์ง์ผ๋ก **๋ชจ๋ ์ ํ์ ๋ฐ์ดํฐ**๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. **์๋**, **ํ์ฅ์ฑ**, **๊ฐ๋จํ REST API**๋ก ์ ์๋ ค์ ธ ์์ต๋๋ค. Apache Lucene์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, 2010๋
์ Elasticsearch N.V. (ํ์ฌ Elastic๋ก ์๋ ค์ง)์์ ์ฒ์ ์ถ์๋์์ต๋๋ค. Elasticsearch๋ ๋ฐ์ดํฐ ์์ง, ๋ณด๊ฐ, ์ ์ฅ, ๋ถ์ ๋ฐ ์๊ฐํ๋ฅผ ์ํ ์คํ ์์ค ๋๊ตฌ ๋ชจ์์ธ Elastic Stack์ ํต์ฌ ๊ตฌ์ฑ ์์์
๋๋ค. ์ด ์คํ์ ์ผ๋ฐ์ ์ผ๋ก ELK Stack์ด๋ผ๊ณ ํ๋ฉฐ, Logstash์ Kibana๋ฅผ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ํ์ฌ Beats๋ผ๋ ๊ฒฝ๋ ๋ฐ์ดํฐ ์ ์ก ์์ด์ ํธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
### What is an Elasticsearch index?
Elasticsearch **์ธ๋ฑ์ค**๋ **๊ด๋ จ ๋ฌธ์**์ ๋ชจ์์ผ๋ก **JSON** ํ์์ผ๋ก ์ ์ฅ๋ฉ๋๋ค. ๊ฐ ๋ฌธ์๋ **ํค**์ ํด๋น **๊ฐ**(๋ฌธ์์ด, ์ซ์, ๋ถ๋ฆฌ์ธ, ๋ ์ง, ๋ฐฐ์ด, ์ง๋ฆฌ์ ์์น ๋ฑ)์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
Elasticsearch๋ ๋น ๋ฅธ ์ ์ฒด ํ
์คํธ ๊ฒ์์ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํด **์ญ ์ธ๋ฑ์ค**๋ผ๋ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ์ธ๋ฑ์ค๋ ๋ฌธ์ ๋ด์ ๋ชจ๋ ๊ณ ์ ๋จ์ด๋ฅผ ๋์ดํ๊ณ ๊ฐ ๋จ์ด๊ฐ ๋ํ๋๋ ๋ฌธ์๋ฅผ ์๋ณํฉ๋๋ค.
์ธ๋ฑ์ฑ ๊ณผ์ ์์ Elasticsearch๋ ๋ฌธ์๋ฅผ ์ ์ฅํ๊ณ ์ญ ์ธ๋ฑ์ค๋ฅผ ๊ตฌ์ฑํ์ฌ ๊ฑฐ์ ์ค์๊ฐ ๊ฒ์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. **์ธ๋ฑ์ค API**๋ ํน์ ์ธ๋ฑ์ค ๋ด์์ JSON ๋ฌธ์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์
๋ฐ์ดํธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
**๊ธฐ๋ณธ ํฌํธ**: 9200/tcp
## Manual Enumeration
### Banner
Elasticsearch์ ์ ๊ทผํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํ๋กํ ์ฝ์ **HTTP**์
๋๋ค. HTTP๋ฅผ ํตํด ์ ๊ทผํ๋ฉด ํฅ๋ฏธ๋ก์ด ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค: `http://10.10.10.115:9200/`
![](<../.gitbook/assets/image (294).png>)
`/`์ ์ ๊ทผํ ๋ ํด๋น ์๋ต์ด ๋ณด์ด์ง ์์ผ๋ฉด ๋ค์ ์น์
์ ์ฐธ์กฐํ์ธ์.
### Authentication
**๊ธฐ๋ณธ์ ์ผ๋ก Elasticsearch๋ ์ธ์ฆ์ด ํ์ฑํ๋์ด ์์ง ์์ต๋๋ค**, ๋ฐ๋ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๊ฒฉ ์ฆ๋ช
์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์ ๋ชจ๋ ๊ฒ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
์ธ์ฆ์ด ๋นํ์ฑํ๋์ด ์๋์ง ํ์ธํ๋ ค๋ฉด ๋ค์ ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค:
```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}
```
**๊ทธ๋ฌ๋**, `/`์ ์์ฒญ์ ๋ณด๋ด๊ณ ๋ค์๊ณผ ๊ฐ์ ์๋ต์ ๋ฐ์ผ๋ฉด:
```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}
```
๊ทธ๊ฒ์ ์ธ์ฆ์ด ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ **์ ํจํ ์๊ฒฉ ์ฆ๋ช
์ด ํ์**ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์, [**๋ธ๋ฃจํธํฌ์ค๋ฅผ ์๋ํ ์ ์์ต๋๋ค**](../generic-methodologies-and-resources/brute-force.md#elasticsearch) (HTTP ๊ธฐ๋ณธ ์ธ์ฆ์ ์ฌ์ฉํ๋ฏ๋ก BF HTTP ๊ธฐ๋ณธ ์ธ์ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค).\
์ฌ๊ธฐ **๊ธฐ๋ณธ ์ฌ์ฉ์ ์ด๋ฆ ๋ชฉ๋ก**์ด ์์ต๋๋ค: _**elastic** (์ํผ์ ์ ), remote\_monitoring\_user, beats\_system, logstash\_system, kibana, kibana\_system, apm\_system,_ \_anonymous\_.\_ ์ด์ ๋ฒ์ ์ Elasticsearch๋ ์ด ์ฌ์ฉ์์ ๋ํด ๊ธฐ๋ณธ ๋น๋ฐ๋ฒํธ **changeme**๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
```
curl -X GET http://user:password@IP:9200/
```
### ๊ธฐ๋ณธ ์ฌ์ฉ์ ์ด๊ฑฐ
```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/"
```
### Elastic Info
๋ค์์ elasticsearch์ ๋ํ **์ ๋ณด**๋ฅผ **์ป๊ธฐ ์ํด** **GET**์ ํตํด **์ ๊ทผํ ์ ์๋** ๋ช ๊ฐ์ง ์๋ํฌ์ธํธ์
๋๋ค:
| \_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 | | |
์ด ์๋ํฌ์ธํธ๋ [**๋ฌธ์์์ ๊ฐ์ ธ์จ ๊ฒ์
๋๋ค**](https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html) ์ฌ๊ธฐ์์ **๋ ๋ง์** ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.\
๋ํ, `/_cat`์ ์ ๊ทผํ๋ฉด ์๋ต์๋ ์ธ์คํด์ค์์ ์ง์ํ๋ `/_cat/*` ์๋ํฌ์ธํธ๊ฐ ํฌํจ๋ฉ๋๋ค.
`/_security/user`์์ (์ธ์ฆ์ด ํ์ฑํ๋ ๊ฒฝ์ฐ) ์ด๋ค ์ฌ์ฉ์๊ฐ `superuser` ์ญํ ์ ๊ฐ์ง๊ณ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค.
### Indices
`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
```
To obtain **์ ๋ณด๋ฅผ ์ป์ผ๋ ค๋ฉด ์ด๋ค ์ข
๋ฅ์ ๋ฐ์ดํฐ๊ฐ ์ธ๋ฑ์ค์ ์ ์ฅ๋์ด ์๋์ง** `http://host:9200/`์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ `http://10.10.10.115:9200/bank`
![](<../.gitbook/assets/image (342).png>)
### ๋คํ ์ธ๋ฑ์ค
๋ชจ๋ **๋ด์ฉ์ ๋คํํ๋ ค๋ฉด** ์ธ๋ฑ์ค์ ๋ชจ๋ ๋ด์ฉ์ ๋คํํ๋ ค๋ฉด `http://host:9200//_search?pretty=true`์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด `http://10.10.10.115:9200/bank/_search?pretty=true`
![](<../.gitbook/assets/image (914).png>)
_์ํ ์ธ๋ฑ์ค ๋ด ๊ฐ ๋ฌธ์(ํญ๋ชฉ)์ ๋ด์ฉ์ ๋น๊ตํ๊ณ ์ด์ ์น์
์์ ๋ณธ ์ด ์ธ๋ฑ์ค์ ํ๋๋ฅผ ํ์ธํด ๋ณด์ธ์._
๋ฐ๋ผ์ ์ด ์์ ์์ **"hits" ๋ด์ "total"์ด๋ผ๋ ํ๋๊ฐ ์์ด** ์ด ์ธ๋ฑ์ค ๋ด์์ **1000๊ฐ์ ๋ฌธ์๊ฐ ๋ฐ๊ฒฌ๋์์ง๋ง** 10๊ฐ๋ง ๊ฒ์๋์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด๋ **๊ธฐ๋ณธ์ ์ผ๋ก 10๊ฐ์ ๋ฌธ์์ ์ ํ์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค.**\
ํ์ง๋ง ์ด์ **์ด ์ธ๋ฑ์ค์ 1000๊ฐ์ ๋ฌธ์๊ฐ ํฌํจ๋์ด ์๋ค๋ ๊ฒ์ ์์์ผ๋ฏ๋ก**, **๋ชจ๋ ๋คํํ ์ ์์ต๋๋ค.** ์ํ๋ ํญ๋ชฉ ์๋ฅผ **`size`** ๋งค๊ฐ๋ณ์์ ์ง์ ํ์ฌ ๋คํํ ์ ์์ต๋๋ค: `http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000`asd\
_์ฐธ๊ณ : ๋ ํฐ ์ซ์๋ฅผ ์ง์ ํ๋ฉด ๋ชจ๋ ํญ๋ชฉ์ด ์ด์จ๋ ๋คํ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด `size=9999`๋ฅผ ์ง์ ํ ์ ์์ผ๋ฉฐ, ๋ ๋ง์ ํญ๋ชฉ์ด ์์ ๊ฒฝ์ฐ ์ด์ํ ๊ฒ์
๋๋ค(ํ์ง๋ง ํ์ธํด์ผ ํฉ๋๋ค)._
### ๋ชจ๋ ๋คํ
๋ชจ๋ ๋คํํ๋ ค๋ฉด **์ด์ ๊ณผ ๋์ผํ ๊ฒฝ๋ก๋ก ๊ฐ๋ ์ธ๋ฑ์ค๋ฅผ ์ง์ ํ์ง ์๊ณ ** `http://host:9200/_search?pretty=true`์ ์ ๊ทผํ๋ฉด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด `http://10.10.10.115:9200/_search?pretty=true`\
์ด ๊ฒฝ์ฐ **๊ธฐ๋ณธ 10๊ฐ์ ๊ฒฐ๊ณผ ์ ํ**์ด ์ ์ฉ๋ฉ๋๋ค. `size` ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ **๋ ๋ง์ ๊ฒฐ๊ณผ๋ฅผ ๋คํํ ์ ์์ต๋๋ค.** ๋ ๋ง์ ์ ๋ณด๋ ์ด์ ์น์
์ ์ฐธ์กฐํ์ธ์.
### ๊ฒ์
์ ๋ณด๋ฅผ ์ฐพ๊ณ ์๋ค๋ฉด **๋ชจ๋ ์ธ๋ฑ์ค์์ ์์ ๊ฒ์์ ์ํํ ์ ์์ต๋๋ค.** `http://host:9200/_search?pretty=true&q=`์ ์ ๊ทผํ๋ฉด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด `http://10.10.10.115:9200/_search?pretty=true&q=Rockwell`
![](<../.gitbook/assets/image (335).png>)
์ธ๋ฑ์ค์์๋ง **๊ฒ์ํ๋ ค๋ฉด** **๊ฒฝ๋ก**์ ์ธ๋ฑ์ค๋ฅผ **์ง์ **ํ๋ฉด ๋ฉ๋๋ค: `http://host:9200//_search?pretty=true&q=`
_๊ฒ์ ์ฝํ
์ธ ์ ์ฌ์ฉ๋๋ q ๋งค๊ฐ๋ณ์๋ **์ ๊ท ํํ์**์ ์ง์ํฉ๋๋ค._
Elasticsearch ์๋น์ค๋ฅผ ํผ์งํ๊ธฐ ์ํด [https://github.com/misalabs/horuz](https://github.com/misalabs/horuz)์ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
### ์ฐ๊ธฐ ๊ถํ
์ ์ธ๋ฑ์ค ๋ด์ ์ ๋ฌธ์๋ฅผ ์์ฑํ๋ ค๊ณ ์๋ํ์ฌ ์ฐ๊ธฐ ๊ถํ์ ํ์ธํ ์ ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ช
๋ น์ ์คํํด ๋ณด์ธ์:
```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"
}'
```
ํด๋น cmd๋ "_bookId_", "_author_", "_publisher_" ๋ฐ "_name_" ์์ฑ์ ๊ฐ์ง `books` ์ ํ์ ๋ฌธ์๋ก `bookindex`๋ผ๋ **์ ์ธ๋ฑ์ค**๋ฅผ ์์ฑํฉ๋๋ค.
**์ ์ธ๋ฑ์ค๊ฐ ์ด์ ๋ชฉ๋ก์ ๋ํ๋๋์ง ํ์ธํ์ธ์**:
![](<../.gitbook/assets/image (130).png>)
๊ทธ๋ฆฌ๊ณ **์๋์ผ๋ก ์์ฑ๋ ์์ฑ**์ ์ฃผ๋ชฉํ์ธ์:
![](<../.gitbook/assets/image (434).png>)
## ์๋ ์ด๊ฑฐ
์ผ๋ถ ๋๊ตฌ๋ ์ด์ ์ ์ ์๋ ๋ฐ์ดํฐ ์ค ์ผ๋ถ๋ฅผ ์ป์ต๋๋ค:
```bash
msf > use auxiliary/scanner/elasticsearch/indices_enum
```
{% embed url="https://github.com/theMiddleBlue/nmap-elasticsearch-nse" %}
## Shodan
* `port:9200 elasticsearch`
{% hint style="success" %}
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)\
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ: [**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)
HackTricks ์ง์ํ๊ธฐ
* [**๊ตฌ๋
๊ณํ**](https://github.com/sponsors/carlospolop) ํ์ธํ๊ธฐ!
* **๐ฌ [**Discord ๊ทธ๋ฃน**](https://discord.gg/hRep4RUj7f) ๋๋ [**ํ
๋ ๊ทธ๋จ ๊ทธ๋ฃน**](https://t.me/peass)์ ์ฐธ์ฌํ๊ฑฐ๋ **Twitter** ๐ฆ [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**๋ฅผ ํ๋ก์ฐํ์ธ์.**
* **[**HackTricks**](https://github.com/carlospolop/hacktricks) ๋ฐ [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) ๊นํ๋ธ ๋ฆฌํฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํ์ ๊ณต์ ํ์ธ์.**
{% endhint %}