Jenkins是Jenkins开源的一个应用软件。一个开源自动化服务器Jenkins提供了数百个插件来支持构建,部署和自动化任何项目。
Jenkins 2.217版本至2.441版本、LTS 2.222.1版本至2.426.2版本存在安全漏洞,该漏洞源于不会对通过CLI WebSocket端点发出的请求执行源验证,导致跨站劫持漏洞,从而允许攻击者在Jenkins控制器上执行CLI命令。
漏洞等级
|
严重 |
漏洞评分 |
9.8 |
漏洞类型 |
任意文件读取、RCE |
公开漏洞情报 |
2024年01月25日 |
利用条件 |
有权限要求 |
威胁类型 |
远程 |
组件名称 |
Jenkins |
#FFE9F1FB受影响版本 |
version <= TLS 2.426.2
version <= 2.441
|
二、漏洞分析
通过官网关于漏洞的通告,问题出现在内置的CLI接口,Jenkins使用args4j库解析控制器上的命令存在一个功能,允许在命令参数中用@字符后跟文件路径来替换为文件内容。导致攻击者能够读取Jenkins控制器文件系统上的任意文件。现Jenkins 2.441及更早版本、LTS 2.426.2及更早版本不会禁用该功能。
官网通报链接
https://www.jenkins.io/security/advisory/2024-01-24/
CVE-2024-23897是于1月25日漏洞情报公开,漏洞利于工具可以是Jenkins提供的Jenkins CLI命令行工具,用于与Jenkins服务器进行交互和执行各种操作(jenkins-cli.jar包),官网已给出下载方式:
通过自身搭建的jenkins拼接/jnlpJars/jenkins-cli.jar即可下载(JENKINS_URL为搭建的jenkins系统地址)
三、任意文件读取
通报中说到args4j库解析参数时会把@字符后跟文件路径来替换为文件内容,所以漏洞验证命令POC可以是官网给出的下面这种形式进行测试。
最终就是执行成功,验证漏洞存在,拥有Overall/Read权限可以读取完整的文件。经过验证可以读取所有已知路径的文件内容。
漏洞POC:
java -jar jenkins-cli.jar -s http://127.0.0.1:8080/ connect-node @/etc/passwd
具体分析:-auth参数后的@符号的作用是指定一个文件,通过使用@符号,Jenkins CLI将读取指定文件中的身份验证信息,在未做安全验证的情况下可以读取任意文件。并且读取的每一行内容当中命令执行,所以才有每行都提示命令错误。
权限绕过:拥有Overall/Read权限可以读取完整的文件。没有该权限可以读取文件的前几行
Jenkins默认安装的匿名用户并没有Overall/Read权限,只能读取文件的前几行,可读取的行数取决于可用的CLI命令。
如开启以下配置,则代表拥有Overall/Read权限,可以读取文件完整的内容。
还可以执行以下命令进行测试,在无-auth的身份验证下,依旧可以进入命令行解析流程触发漏洞。无权限也可任意文件读取。
1.存在身份验证,使用http
java -jar jenkins-cli.jar -s http:
2.存在身份验证,使用webSocket
java -jar jenkins-cli.jar -s http:
3.删除身份验证测试
java -jar jenkins-cli.jar -s http:
根据Jenkins官方通报,任意文件读取漏洞可能对机密性、完整性和可用性产生高风险影响。虽然可以读取包含二进制数据的文件,但受影响的功能会将其作为字符串以控制器进程的默认字符编码进行读取。这可能导致部分字节无法成功读取并被替换为占位符值,具体取决于字符编码。尽管使用UTF-8编码的随机二进制数据大约有一半字节会被替换为非法值的占位符,但使用Windows-1252编码的情况下,只有5个字节会被替换。根据Jenkins的遥测数据显示,超过90%的实例使用UTF-8作为默认字符编码。虽然限制较高,但依旧有可能性,管理员需及时更新Jenkins以减少潜在风险。
通过检查“Manage Jenkins»System Information”中的file.encoding系统属性值来确定编码,我安装的Linux下使用的是UTF-8,而Windows下是GBK(系统是中文)
四、关于RCE远程代码执行
通报指出,Jenkins存在任意文件读取漏洞,并且攻击者可以读取包含加密密钥的二进制文件,尽管有一些限制。同时,通报列举了一些可能的攻击方式,这些攻击方式利用了攻击者从二进制文件中获取加密密钥的能力,并且仅适用于具备可行性的实例,符合利用条件即可实现RCE。
通报提到通过“Resource Root URL”功能启用远程代码执行RCE的攻击方式。攻击者需要满足多个条件,包括启用该功能、能够获取二进制密钥、可访问CLI WebSocket端点,并且了解或猜测具有Overall/Read权限的用户的用户名,或者需要用户账号的API令牌;攻击者还可以通过记住我的cookie、构建日志进行存储的跨站点脚本 (XSS) 攻击和通过 CSRF 保护绕过等方法实现远程执行代码RCE攻击,条件要求较多也较高!
文章主要围绕CVE-2024-23897漏洞进行分析,主要参考官网Jenkins通报文章和Jenkins CLI介绍文章,结合自己的实际测试和验证,以官网通报文章为基础,成功实现漏洞验证和攻击过程,并对漏洞的影响和潜在风险进行了简单分析。文章末尾将提供漏洞验证工具和测试环境搭建程序。
五、测试环境搭建
下载链接如下,Windows下载jenkins.msi程序,需下载安装存在漏洞的低版本;需指定版本的java环境。
https://github.com/jenkinsci/jenkins/releases
https://www.jenkins.io/doc/book/installing/windows/
说明:环境搭建测试漏洞情况下,安装过程中可以选择“Run service as LocalSystem”,部署较为简单。
环境搭建测试漏洞情况下,建议一律从简,下载链接同上。需下载安装存在漏洞的低版本;需指定版本的java环境。
https://github.com/jenkinsci/jenkins/releases
选择jenkins.war文件,只需运行下面一个命令:
docker pull bitnami/jenkins:2.426.2-debian-11-r3
docker run -e "JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:5005" -d --name jenkins -p 8081:8080 -p 8777:5005 bitnami/jenkins:2.426.2-debian-11-r3
更新至最新版本以解决该漏洞,现Jenkins2.442、LTS 2.426.3已禁用相关命令解析器功能。
网络访问控制:配置适当的网络防火墙规则,限制对Jenkins服务器和应用的访问。只允许来自受信任的IP地址或网络范围的请求通过,并阻止外部非授权访问。
1.jenkins官网通报和补丁
1.jenkins官网通报和补丁
https://www.jenkins.io/security/advisory/2024-01-24/
2.Jenkins CLI介绍
https://www.jenkins.io/doc/book/managing/cli/
3.长亭安全复现
https://mp.weixin.qq.com/s/GSDwEg5fVHwEKatGpuxPog
4.目前jenkins系统最新版本下载链接
https://github.com/jenkinsci/jenkins/releases
曾经有一位安全大佬在迷茫中寻找解决方案,直到他发现了这些神奇的工具。下一个安全大佬是你吧?快来关注我们的公众号,揭开这个故事的结局吧!
上面所涉及到的工具和Windows/Linux系统环境搭建安装包,如有方便等需要,关注我们的公众号,回复"jenkins"领取。
漏洞利于工具和环境搭建程序,并已添加相关命令,清单如下:
本文所提及的工具仅供参考和学习之用,作者不对读者使用这些工具所产生的任何损失或损害负责。读者在使用这些工具时请注意风险,并遵守相关条款和使用要求。如有侵权,请联系作者删除。
原文始发于微信公众号(笑谈安全阁):【漏洞复现】Jenkins 任意文件读取漏洞CVE-2024-23897(附POC)
评论