漏洞描述
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)-腾讯云开发者社区-腾讯云
专注分享安全知识,大家可以关注一下我的微信公众号,谢谢大家!
不积跬步,无以至千里;不积小流,无以成江河。文章来源:https://www.toymoban.com/news/detail-837024.html
文章来源地址https://www.toymoban.com/news/detail-837024.html
到了这里,关于Jenkins CLI 任意文件读取漏洞复现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!