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

15 KiB

9200 - Pentesting Elasticsearch

htARTE (HackTricks AWS Red Team Expert)에서 AWS 해킹을 처음부터 전문가까지 배워보세요!!

HackTricks를 지원하는 다른 방법:

기본 정보

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/

/에 접근하여 해당 응답을 보지 못하는 경우 다음 섹션을 참조하세요.

인증

기본적으로 Elasticsearch에는 인증이 활성화되어 있지 않습니다. 따라서 기본적으로 자격 증명을 사용하지 않고 데이터베이스 내의 모든 것에 액세스할 수 있습니다.

인증이 비활성화되어 있는지 확인하려면 다음 요청을 사용하세요:

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}

그러나, /로 요청을 보내고 다음과 같은 응답을 받는 경우:

{"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에서 정보를 얻으려면 유효한 자격 증명이 필요합니다. 그런 다음 브루트포스를 시도할 수 있습니다 (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를 통해 사용자 계정을 열거할 수 있는 기능이 있습니다. 다음 명령어를 사용하여 사용자 계정을 확인할 수 있습니다.

GET /_cat/users?v

3. 사용자 계정 암호화

Elasticsearch는 사용자 계정의 암호를 해시화하여 저장합니다. 따라서, 암호를 평문으로 저장하지 않고 해시화된 값을 사용합니다. 이를 통해 보안을 강화할 수 있습니다.

4. 사용자 계정 누출

사용자 계정이 누출되면 치명적인 보안 위협이 될 수 있습니다. 따라서, 사용자 계정 정보를 안전하게 보호하고, 누출 여부를 주기적으로 확인하는 것이 중요합니다.

5. 기타 열거 기법

다른 열거 기법으로는, Elasticsearch 클러스터에 대한 정보를 수집하는 것이 있습니다. 예를 들어, _cat API를 사용하여 인덱스, 노드, 세그먼트 등의 정보를 확인할 수 있습니다. 이를 통해 클러스터의 구성과 상태를 파악할 수 있습니다.

#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

이 엔드포인트들은 문서에서 가져온 것이며, 여기에서 더 많은 정보를 찾을 수 있습니다.
또한, /_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

인덱스 덤프

인덱스의 모든 내용을 덤프하려면 다음을 액세스할 수 있습니다: http://host:9200/<index>/_search?pretty=true 예를 들어 http://10.10.10.115:9200/bank/_search?pretty=true

은행 인덱스 내의 각 문서(항목)의 내용과 이전 섹션에서 본 이 인덱스의 필드를 비교해 보세요.

따라서, 이 시점에서 "hits" 내부에 "total"이라는 필드가 있음을 알 수 있습니다. 이 필드는 이 인덱스 내에서 1000개의 문서가 발견되었지만 10개만 검색되었음을 나타냅니다. 이는 기본적으로 10개의 문서 제한이 있기 때문입니다.
하지만, 이제 이 인덱스에 1000개의 문서가 포함되어 있음을 알았으므로, size 매개변수에 덤프할 항목 수를 지정하여 모두 덤프할 수 있습니다: http://10.10.10.115:9200/quotes/_search?pretty=true&size=1000asd
참고: 더 큰 숫자를 지정하면 모든 항목이 덤프됩니다. 예를 들어 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

인덱스에서만 검색하려면 경로지정할 수 있습니다: http://host:9200/<index>/_search?pretty=true&q=<search_term>

검색 내용을 검색하는 데 사용되는 q 매개변수는 정규 표현식을 지원합니다.

또한 https://github.com/misalabs/horuz와 같은 도구를 사용하여 elasticsearch 서비스를 퍼징할 수도 있습니다.

쓰기 권한

다음과 같이 실행하여 새 인덱스 내에 새 문서를 생성하여 쓰기 권한을 확인할 수 있습니다:

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라는 새 인덱스를 생성합니다.

새 인덱스가 목록에 나타나는 것을 주목하세요:

그리고 자동으로 생성된 속성을 확인하세요:

자동 열거

일부 도구는 이전에 제시된 데이터 중 일부를 얻을 수 있습니다:

msf > use auxiliary/scanner/elasticsearch/indices_enum

{% embed url="https://github.com/theMiddleBlue/nmap-elasticsearch-nse" %}

Shodan

  • port:9200 elasticsearch
htARTE (HackTricks AWS Red Team Expert)에서 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법: