环境搭建:
使用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 | try { |
重新编译打包继续调试

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

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

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

漏洞复现:

