网络安全/欺诈检测

利用 GroovyWaiter 大规模开发和保护 Jenkins 实例

Jenkins CI / CD 解决方案为开发人员提供了一种创建自动化、可扩展和高度可配置的管道的方法,以确保代码库保持最新,并且可以毫不费力地推出。当开发人员向任何代码推送新的提交时, Jenkins 都可以接受这些更改,并运行一系列测试和构建,然后通过一条无缝管道将其交付生产。

詹金斯在全球拥有超过 30 万台装置,并在稳步增长。任何一家拥有软件开发团队的公司都可能有一个或多个 Jenkins 的实例与之交互。

由于这种普遍性, Jenkins 经常成为威胁行为者的目标,特别是暗示这些管道包含秘密和公司最密切的软件来源。

GroovyWaiter 是一个简单的 Python 脚本,它将获取一个 URL 文件,对于每个 URL ,它将尝试枚举对 Jenkins 脚本控制台的未经验证的访问(下面将进一步解释)。如果它能够访问 Console ,如果 Jenkins 服务器运行的是 Linux ,它将执行id命令;如果服务器运行的 Windows ,则执行whoami.exe命令。

脚本将在扫描时显示找到的主机(图 1 )。扫描完成后,它将显示表中运行的命令的输出(图 2 )。

A screencapture showing GroovyWaiter script enumerating a list of URLs for script console access.
图 1 。 GroovyWaiter 脚本枚举用于脚本控制台访问的 URL 列表
A screencapture of GroovyWaiter script results of command execution in a pretty print table.
图 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 )。

Web page showing Jenkins Script Console with log-in button at the top, showing unauthenticated access.
图 3 。未经身份验证访问 Jenkins 脚本控制台的示例

图 3 显示了/script端点被访问并呈现脚本控制台引擎,而无需询问凭据。此时,攻击者可以执行多个操作,包括:

  • 使用 Groovy 转储所有机密
  • 执行系统命令以降级、破坏或销毁运行 Jenkins 的底层服务器上的数据
  • 使用 Groovy 函数快速解密以前发现的秘密

显然,在没有身份验证的情况下访问 Jenkins 脚本控制台具有重大意义。攻击者可以在整个网络中横向移动和/或提升权限,中断或注入服务器上运行的构建,等等。

上面提供的示例只是一个 Jenkins 服务器,它可能无法保存攻击者所寻求的秘密。下一节探讨攻击者如何扩展这种类型的攻击。

Jenkins 服务器的扩展利用

根据网络或环境的不同,可能会为不同的团队和办公室部署数百个 Jenkins 服务器。攻击者可以手动尝试这种类型的攻击,但这将花费大量时间,而眼尖的防御者可能会缩短时间。

看到这种扩展的机会,我开始研究如何获取主机列表,枚举对/script端点的访问,并在规模上进行利用。因此, GroovyWaiter 脚本诞生了。

缓解措施

强烈建议遵循基本访问控制的适当安全做法。你也应该 适当的保护Jenkins 服务器 。简单地添加身份验证和适当的访问控制,就可以区别于完全网络攻击和阻止攻击者。

 

Tags