hacktricks/network-services-pentesting/9200-pentesting-elasticsearch.md
2024-02-10 21:30:13 +00:00

220 lines
15 KiB
Markdown

# 9200 - Pentesting Elasticsearch
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 <strong>AWS 해킹을 처음부터 전문가까지 배워보세요</strong>!<strong>!</strong></summary>
HackTricks를 지원하는 다른 방법:
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**를** **팔로우**하세요.
* **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) **및** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **github 저장소에 PR을 제출**하세요.
</details>
## 기본 정보
Elasticsearch는 **분산**, **오픈 소스** 검색 및 분석 엔진으로 **모든 유형의 데이터**에 대해 알려져 있습니다. 이는 **속도**, **확장성** 및 **간단한 REST API**로 유명합니다. Apache Lucene 위에 구축되었으며, Elasticsearch N.V. (현재 Elastic로 알려진)에서 2010년에 처음 출시되었습니다. Elasticsearch는 데이터 수집, 향상, 저장, 분석 및 시각화를 위한 오픈 소스 도구 모음인 Elastic Stack의 핵심 구성 요소입니다. 이 스택은 Logstash와 Kibana도 포함하며, Beats라는 경량 데이터 배송 에이전트도 포함하고 있습니다.
### Elasticsearch 인덱스란?
Elasticsearch **인덱스**는 **JSON**으로 저장된 **관련 문서**의 컬렉션입니다. 각 문서는 **키**와 해당하는 **값**(문자열, 숫자, 부울, 날짜, 배열, 지리 위치 등)으로 구성됩니다.
Elasticsearch는 빠른 전체 텍스트 검색을 용이하게 하기 위해 **역 인덱스**라는 효율적인 데이터 구조를 사용합니다. 이 인덱스는 문서에 있는 모든 고유한 단어를 나열하고 각 단어가 나타나는 문서를 식별합니다.
인덱싱 프로세스 중에 Elasticsearch는 문서를 저장하고 역 인덱스를 구성하여 거의 실시간 검색이 가능하게 합니다. **인덱스 API**는 특정 인덱스 내에서 JSON 문서를 추가하거나 업데이트하는 데 사용됩니다.
**기본 포트**: 9200/tcp
## 수동 열거
### 배너
Elasticsearch에 액세스하는 데 사용되는 프로토콜은 **HTTP**입니다. HTTP를 통해 액세스하면 몇 가지 흥미로운 정보를 찾을 수 있습니다: `http://10.10.10.115:9200/`
![](<../.gitbook/assets/image (264).png>)
`/`에 접근하여 해당 응답을 보지 못하는 경우 다음 섹션을 참조하세요.
### 인증
**기본적으로 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}
```
이는 인증이 구성되어 있으며 **유효한 자격 증명**이 필요하므로 elasticserach에서 정보를 얻으려면 유효한 자격 증명이 필요합니다. 그런 다음 [**브루트포스를 시도**](../generic-methodologies-and-resources/brute-force.md#elasticsearch)할 수 있습니다 (HTTP 기본 인증을 사용하므로 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/
```
### 기본 사용자 열거
Elasticsearch는 기본적으로 사용자 인증을 설정하지 않으므로, 기본적으로는 익명 사용자로 액세스할 수 있습니다. 그러나, 실제 운영 환경에서는 사용자 인증을 설정하는 것이 좋습니다.
#### 1. 기본 사용자 계정
Elasticsearch에는 기본적으로 `elastic`이라는 사용자 계정이 있습니다. 이 계정은 모든 클러스터 권한을 가지고 있으므로, 악용될 경우 치명적일 수 있습니다. 따라서, 이 계정의 암호를 변경하거나 비활성화하는 것이 좋습니다.
#### 2. 사용자 계정 열거
Elasticsearch에는 `_cat` API를 통해 사용자 계정을 열거할 수 있는 기능이 있습니다. 다음 명령어를 사용하여 사용자 계정을 확인할 수 있습니다.
```bash
GET /_cat/users?v
```
#### 3. 사용자 계정 암호화
Elasticsearch는 사용자 계정의 암호를 해시화하여 저장합니다. 따라서, 암호를 평문으로 저장하지 않고 해시화된 값을 사용합니다. 이를 통해 보안을 강화할 수 있습니다.
#### 4. 사용자 계정 누출
사용자 계정이 누출되면 치명적인 보안 위협이 될 수 있습니다. 따라서, 사용자 계정 정보를 안전하게 보호하고, 누출 여부를 주기적으로 확인하는 것이 중요합니다.
#### 5. 기타 열거 기법
다른 열거 기법으로는, Elasticsearch 클러스터에 대한 정보를 수집하는 것이 있습니다. 예를 들어, `_cat` API를 사용하여 인덱스, 노드, 세그먼트 등의 정보를 확인할 수 있습니다. 이를 통해 클러스터의 구성과 상태를 파악할 수 있습니다.
```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 정보
다음은 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` 역할을 가진 사용자를 확인할 수 있습니다.
### 인덱스
`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
```
**인덱스에 저장된 데이터의 종류에 대한 정보를 얻으려면** 다음을 액세스할 수 있습니다: `http://host:9200/<index>` 예를 들어 이 경우 `http://10.10.10.115:9200/bank`
![](<../.gitbook/assets/image (265).png>)
### 인덱스 덤프
인덱스의 **모든 내용을 덤프**하려면 다음을 액세스할 수 있습니다: `http://host:9200/<index>/_search?pretty=true` 예를 들어 `http://10.10.10.115:9200/bank/_search?pretty=true`
![](<../.gitbook/assets/image (266).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=<search_term>`와 같이 **모든 인덱스에서 원시 검색**을 수행할 수 있습니다. 예를 들어 `http://10.10.10.115:9200/_search?pretty=true&q=Rockwell`
![](<../.gitbook/assets/image (267).png>)
**인덱스에서만 검색**하려면 **경로**에 **지정**할 수 있습니다: `http://host:9200/<index>/_search?pretty=true&q=<search_term>`
_검색 내용을 검색하는 데 사용되는 q 매개변수는 **정규 표현식을 지원**합니다._
또한 [https://github.com/misalabs/horuz](https://github.com/misalabs/horuz)와 같은 도구를 사용하여 elasticsearch 서비스를 퍼징할 수도 있습니다.
### 쓰기 권한
다음과 같이 실행하여 새 인덱스 내에 새 문서를 생성하여 쓰기 권한을 확인할 수 있습니다:
```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"
}'
```
그 명령은 "_bookId_", "_author_", "_publisher_" 및 "_name_" 속성을 가진 `books` 유형의 문서를 가진 `bookindex`라는 **새 인덱스**를 생성합니다.
**새 인덱스가 목록에 나타나는 것**을 주목하세요:
![](<../.gitbook/assets/image (268).png>)
그리고 **자동으로 생성된 속성**을 확인하세요:
![](<../.gitbook/assets/image (269).png>)
## 자동 열거
일부 도구는 이전에 제시된 데이터 중 일부를 얻을 수 있습니다:
```bash
msf > use auxiliary/scanner/elasticsearch/indices_enum
```
{% embed url="https://github.com/theMiddleBlue/nmap-elasticsearch-nse" %}
## Shodan
* `port:9200 elasticsearch`
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>에서 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
HackTricks를 지원하는 다른 방법:
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요.
* **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 **해킹 트릭을 공유**하세요.
</details>