漏洞描述

Jenkins CLI 是 Jenkins 内置的命令行页面。

Jenkins 受影响版本中使用 args4j 库解析CLI命令参数,该库默认将参数中 @ 字符后的文件路径替换为文件内容,未授权的攻击者可利用该特性使用 Jenkins 控制器进程的默认字符编码读取 Jenkins 控制器文件系统上的任意文件(如加密密钥的二进制文件),并结合 Resource Root URL、Remember me cookie、存储型 XSS 或 CSRF 等在 Jenkins 控制器中执行任意代码。

Jenkins 2.442, LTS 2.426.3 版本通过禁用命令解析器读取 @ 字符后文件路径的特性修复此漏洞。

影响版本

jenkins@(-∞, 2.442)

jenkins lts@(-∞, 2.426.3)

jenkins@影响所有版本

org.jenkins-ci.main:jenkins-core@(-∞, 2.442)

漏洞原理

args4j在解析命令行的时候会把@后面的字符作为文件名,并读取文件内容作为参数的值。

使用限制

1)关闭了匿名用户可读权限,只能读取几行文件

如果jenkins关闭了匿名用户可读的权限,则Jenkins CLI上大部分的命令都不能执行,可以执行的只有help和who-am-i,这两个命令是无需任何权限的。

如下:如果关闭了匿名用户可读,执行其它命令会报错,ERROR: anonymous is missing the Overall/Read permission

为什么只能读取几行?

该漏洞的原理是由于args4j在解析命令行的时候会把@后面的字符作为文件名,并读取文件内容作为参数的值。那么当我们在调用该命令时如果出错,args4j就会将错误返回给客户端,而错误信息中就包含文件的内容。但是有个问题就是如果我们使用@将文件内容加载成命令行参数,则会遇到问题,那就是文件中存在空白字符的情况下,会被分割参数。如一个文件有四行,那么命令解析就会将这四行分别作为一个参数跟到help命令的后面。

java -jar jenkins-cli.jar -s http://localhost:8080/ help 1 2 3 4

而这个命令只接受前面的几个参数,报错的时候也只会把前面的几个参数报出来,因此我们不能读取到文件的全部内容。

漏洞复现

1)复现的时候需要用到jenkins-cli.jar,可以找一个jenkins服务,登录以后访问/cli/链接,下载该jar包

2)关闭匿名访问的情况下

ava -jar jenkins-cli.jar -s http://localhost:8080/ help "@/etc/passwd"

这时可以通过报错信息读取到前面两行的信息

如果一个文件只有一行(如/var/jenkins_home/secret.key 和 /var/jenkins_home/secrets/master.key),使用help读取就会出现“ERROR: You must authenticate to access this Jenkins.”的错误:

前面不是说调用help命令可以不需要权限吗?实际上,help命令会先检查命令的参数个数是否正确,后再检查权限,如果我们能让检查命令参数个数的步骤就出错,就能正常返回错误信息了。

所以,可以人为地给help命令后增加一个新参数,比如:

java -jar jenkins-cli.jar -s http://localhost:8080/ -http help 1 "@/var/jenkins_home/secret.key"

此时help后有两个参数,参数个数太多导致出错,第二个参数被爆出,就是我们要读的文件内容:

3)开启匿名访问的情况下

开启匿名访问

可以通过connect-node命令和reload-job命令读取文件的全部内容

可以读取那些文件

知道了如何读取文件,那么我们在实战中应该读取哪些文件呢?

如果部署Jenkins使用的是官方镜像,那么Jenkins的数据根目录是在/var/jenkins_home。但并不是所有人都会使用这个目录作为根目录,如果像读取Jenkins相关的文件,必须先知道Jenkins的根目录在哪里。

这时可以读取/proc/self/environ和/proc/self/cmdline,这两个文件中包含的是当前进程的环境变量和cmd启动命令行,其中就会包含Jenkins的根目录。

拿到了Jenkins的根目录,我们就可以来尝试读取下面这些敏感文件。

/var/jenkins_home/users/*/config.xml

/var/jenkins_home/secret.key

/var/jenkins_home/secrets/master.key

/var/jenkins_home/secrets/org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices.mac

后面具体的利用可以查看该链接:Jenkins文件读取漏洞拾遗(CVE-2024-23897)-腾讯云开发者社区-腾讯云

 专注分享安全知识,大家可以关注一下我的微信公众号,谢谢大家!

不积跬步,无以至千里;不积小流,无以成江河。

相关链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: