Jenkins CI / CD 解决方案为开发人员提供了一种创建自动化、可扩展和高度可配置的管道的方法,以确保代码库保持最新,并且可以毫不费力地推出。当开发人员向任何代码推送新的提交时, Jenkins 都可以接受这些更改,并运行一系列测试和构建,然后通过一条无缝管道将其交付生产。
詹金斯在全球拥有超过 30 万台装置,并在稳步增长。任何一家拥有软件开发团队的公司都可能有一个或多个 Jenkins 的实例与之交互。
由于这种普遍性, Jenkins 经常成为威胁行为者的目标,特别是暗示这些管道包含秘密和公司最密切的软件来源。
GroovyWaiter 是一个简单的 Python 脚本,它将获取一个 URL 文件,对于每个 URL ,它将尝试枚举对 Jenkins 脚本控制台的未经验证的访问(下面将进一步解释)。如果它能够访问 Console ,如果 Jenkins 服务器运行的是 Linux ,它将执行id
命令;如果服务器运行的 Windows ,则执行whoami.exe
命令。
脚本将在扫描时显示找到的主机(图 1 )。扫描完成后,它将显示表中运行的命令的输出(图 2 )。
您可以修改此脚本,使其运行比上面提到的命令更多的命令。您甚至可以将存储在服务器上的所有秘密转储,以获得一个包含密码、密钥和其他物品的表。
詹金斯的历史和威胁景观
Jenkins 允许将“秘密”注入到自动化 CI / CD 构建中。这意味着开发人员可以将密码、 SSH 密钥等安全地插入到构建中,而不是对它们进行硬编码。然而,这些秘密存储在 Jenkins 服务器本身上。
多年来,出于多种原因,威胁行为者一直以 Jenkins 服务器为目标。这些是勒索软件以及供应链注入(针对更高级的参与者)的主要候选。更常见的情况是,这些服务器之所以成为目标,是因为它们可能保存数据。
Jenkins 服务器的开发
与任何产品一样,每年都会有很多 Jenkins common vulnerabilities and exposures (CVEs) 报告。这些漏洞包含从反映的跨站点脚本漏洞到完整的远程代码执行漏洞。这篇文章关注的是红色团队如何通过使用 Jenkins 自身的功能来滥用 Jenkins 服务器。
Groovy 脚本和 Jenkins
Jenkins 的特点是能够在通过 Jenkins 服务器访问的控制台内 任意执行 Groovy scripts 。脚本控制台始终在 Jenkins 的/script
端点上可用。
在大多数情况下,这是在 Jenkins 身份验证(基本的服务器端身份验证、 LDAP 或任何其他身份验证解决方案)之后实现的。它只对在 Jenkins 服务器上具有“总体/读取”权限的用户安全。
Jenkins 脚本控制台访问(未经验证)
在某些情况下, Jenkins 部署的访问控制过于松懈。这导致能够在不进行身份验证的情况下访问 Jenkins 服务器上的任何内容,包括脚本控制台(图 3 )。
图 3 显示了/script
端点被访问并呈现脚本控制台引擎,而无需询问凭据。此时,攻击者可以执行多个操作,包括:
- 使用 Groovy 转储所有机密
- 执行系统命令以降级、破坏或销毁运行 Jenkins 的底层服务器上的数据
- 使用 Groovy 函数快速解密以前发现的秘密
显然,在没有身份验证的情况下访问 Jenkins 脚本控制台具有重大意义。攻击者可以在整个网络中横向移动和/或提升权限,中断或注入服务器上运行的构建,等等。
上面提供的示例只是一个 Jenkins 服务器,它可能无法保存攻击者所寻求的秘密。下一节探讨攻击者如何扩展这种类型的攻击。
Jenkins 服务器的扩展利用
根据网络或环境的不同,可能会为不同的团队和办公室部署数百个 Jenkins 服务器。攻击者可以手动尝试这种类型的攻击,但这将花费大量时间,而眼尖的防御者可能会缩短时间。
看到这种扩展的机会,我开始研究如何获取主机列表,枚举对/script
端点的访问,并在规模上进行利用。因此, GroovyWaiter 脚本诞生了。
缓解措施
强烈建议遵循基本访问控制的适当安全做法。你也应该 适当的保护Jenkins 服务器 。简单地添加身份验证和适当的访问控制,就可以区别于完全网络攻击和阻止攻击者。