15 KiB
9200 - Pentesting Elasticsearch
htARTE (HackTricks AWS Red Team Expert)에서 AWS 해킹을 처음부터 전문가까지 배워보세요!!
HackTricks를 지원하는 다른 방법:
- 회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드하려면 SUBSCRIPTION PLANS를 확인하세요!
- 공식 PEASS & HackTricks 스웨그를 얻으세요.
- The PEASS Family를 발견하세요. 독점적인 NFTs 컬렉션입니다.
- 💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @carlospolopm를 팔로우하세요.
- Hacking 트릭을 공유하려면 HackTricks 및 HackTricks Cloud github 저장소에 PR을 제출하세요.
기본 정보
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=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
인덱스에서만 검색하려면 경로에 지정할 수 있습니다: 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를 지원하는 다른 방법:
- 회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드하려면 SUBSCRIPTION PLANS를 확인하세요!
- 공식 PEASS & HackTricks 스웨그를 얻으세요.
- The PEASS Family를 발견하세요. 독점적인 NFTs 컬렉션입니다.
- 💬 Discord 그룹 또는 텔레그램 그룹에 참여하거나 Twitter 🐦 @carlospolopm을 팔로우하세요.
- HackTricks와 HackTricks Cloud github 저장소에 PR을 제출하여 해킹 트릭을 공유하세요.