原文地址:https://www.crowdstrike.com/blog/
Jenkins是领先的开源自动化服务器,在开发团队中很受欢迎。最近,已经观察到以大型Jenkins服务器为目标来部署加密矿工的对手。他们还使用Jenkins发起了针对性的违规行为,以维护对开发人员环境的访问。有许多记录良好的博客文章,讨论了通过漏洞利用,Web控制台和漏洞利用后的利用以及对Jenkins的访问。
该博客重点介绍了攻击者通常用来获取,维护和窃取数据的技术。CrowdStrike的红色团队利用这些技术在开发环境受到威胁的情况下执行对手仿真练习。
2 定位Jenkins
定位和识别Jenkins服务器取决于使用情况。对于大多数红队来说,詹金斯将可以在内部网络的某个位置访问。可以通过多种方式获得对这些服务器的访问权限。观察到的最常见方法是使用最近披露的漏洞并加以利用的对手,身份验证插件中的错误配置以及以前获得的凭据。
并非总是针对有针对性的违规使用漏洞利用。但是,最近,有人发现有人在使用Jenkins漏洞。
3 Java反序列化
可以利用Java反序列化漏洞(CVE-2017-1000353)在未修补的Jenkins服务器上获得远程代码执行。Exploit-db(https://www.exploit-db.com/exploits/41965/)包含一个可修改的概念验证(POC),可用于测试这一点。
在不使用漏洞利用的情况下,攻击者通常会利用先前受损的凭据或配置错误的Jenkins服务器来获取访问权限。默认情况下,Jenkins需要身份验证,但是开发团队通常会更改身份验证,这可能会使服务器容易受到攻击,具体取决于其配置方式。Jenkins支持各种身份验证插件,包括LDAP,Kerberos单点登录(SSO),SAML等。最常见的错误配置之一是如下所示的“全局安全配置”中的匿名读取访问委派。
虽然默认情况下未启用,但匿名读取访问可用于访问构建历史记录和凭据插件。在某些情况下,还启用了匿名脚本控制台访问,这将启用对Java运行时的完全访问,从而允许执行命令。强烈建议锁定对Jenkins的访问,特别是对Web控制台的访问,因为配置不正确的身份验证插件是攻击者获得对Jenkins的访问并进一步执行任务的常见方式。
身份验证插件使开发团队可以自定义其环境的登录名。这些插件因组织而异,例如,没有Active Directory的组织可以选择使用Google登录插件。重要的是要注意,无论采用哪种实现方式,都应适当保护这些身份验证方法。已经观察到对手利用身份验证方法来获取Web控制台访问权限,因此,应对这些方法进行彻底的边缘测试。例如,如果使用Active Directory插件,是否所有Active Directory用户都可以通过Web控制台进行身份验证?如果是这样,已经获得域凭据的攻击者将能够进行身份验证并尝试利用Jenkins服务器。
Jenkins是一个Java应用程序,它支持多种操作系统,最常见的是Windows,Ubuntu / Debian和Red Hat / CentOS。尽管Jenkins Web应用程序的功能几乎相同,但是Windows和Linux安装之间存在一些显着差异,如下所述:
Windows
默认情况下,在Windows上安装时,Jenkins将使用NT AUTHORITY \ SYSTEM帐户。强烈建议更改此用户帐户,因为SYSTEM授权帐户对Windows系统具有完全权限。如果要访问脚本控制台,则攻击者将相对容易地完全控制系统。通常,建议您使用在本地系统上具有有限权限的服务帐户。
类UNIX
默认情况下,在Linux上安装时,Jenkins将创建一个服务帐户。默认情况下,此用户帐户没有sudo或root访问权限,但是,这始终值得检查。如果要访问脚本控制台,则攻击者将具有与Jenkins服务帐户相同的权限。
脚本控制台
该詹金斯脚本控制台是在Web控制台,允许用户执行詹金斯Groovy脚本观看的应用程序。当被访问时,脚本控制台允许对Java的完全访问,并且可以用来在Java运行时过程中执行任何操作。最显着的是能够执行命令,如下所示,对于Linux和Windows安装。
从这里,攻击者可以生成信标,列出文件,解密存储的密码等。重要的是要注意,使用execute方法,所有命令都作为Java进程的子进程运行(Windows上的Java.exe和/ usr / bin / java(在Ubuntu上)。
当检测到恶意的Jenkins服务器活动时,识别可疑的进程树可能是一个有用的指示。例如,通过脚本控制台生成PowerShell命令时,会观察到以下情况:
可以通过多种方式来获得这些文件。如果对服务器建立了SSH访问或C2,则可以直接从服务器复制这些文件并进行泄漏。在此示例中,攻击者利用以下Groovy脚本利用内置的Java方法获取这些文件:
使用上面的Groovy脚本,攻击者能够检索每个文件而不会产生潜在的恶意子进程。攻击者还使用Base64类方法检索二进制格式的hudson.util.Secret文件。可以使用Jenkins测试实例查看此脚本的用法。
还可以使用以下脚本从脚本控制台直接解密文件中存储的密码credentials.xml
:
对Jenkins脚本控制台的访问为攻击者提供了多种方法来获取Jenkins服务器上的关键文件和敏感文件,因此应禁用或限制其访问权限。
在无法访问脚本控制台的情况下,根据配置,可以查看Web控制台并潜在地计划作业或查看生成历史记录的用户仍然可以获得有价值的信息。经过几次评估,CrowdStrike红色团队确定了可以重新配置但不能创建作业的情况,反之亦然。
如示例所示,可以通过Web控制台通过查看默认页面来确定允许通过身份验证的用户使用哪些权限。在这种情况下,不需要用户进行身份验证即可配置/创建作业。
有了作业创建访问权限,攻击者可以在Jenkins服务器上创建本地作业,并使用它执行命令,然后在控制台输出中查看结果。允许用户访问构建历史记录和控制台输出也可能会将秘密,源代码,密钥等泄露给具有Web控制台访问权限的任何人。应该检查控制台输出和构建历史记录,以获取攻击者可能利用的敏感信息。
要在具有作业创建访问权限的Jenkins服务器上执行命令,请创建具有给定项目名称的Freestyle项目。
创建后,可以在Freestyle项目中配置各种选项。为简单起见,请忽略所有选项,然后单击“添加构建步骤”。
对于此测试实例,我们将其配置为“执行Windows批处理命令”并运行一些基本命令,包括添加本地管理员帐户,但是,这可以是在Windows批处理文件(.bat)中运行的任何内容。
单击“保存”后,可以通过从Web控制台中选择“立即构建”选项来构建新创建的Freestyle项目。
构建完成后,可以在控制台输出上查看输出,如下所示。
重要的是要注意,因为Jenkins服务器配置为允许匿名创建,所以与Freestyle项目创建关联的用户是未知的。
通过创建作业,可能性几乎与脚本控制台访问相同,但是对于攻击者只能重新配置作业的情况呢?这些情况几乎相同,但是,攻击者必须编辑现有作业并计划构建。在下面的示例中,我们将重新配置Freestyle项目“ BackupProject”,以打印出存储在凭据插件中的机密信息。首先,为可修改项目选择“配置”选项。
选择后,攻击者可以重新配置构建环境,以将机密和凭据存储在环境变量中。然后,可以在构建步骤中使用这些环境变量并将其输出到文件中。在这种情况下,攻击者可以将结果输出到(C:/ Program Files(x86)/ Jenkins / userContent /)上可全局访问的userContent文件夹。
在Windows系统环境中,在Unix系统上使用%字符和$字符来访问变量。
构建修改后的项目后,可以在以下位置查看结果: http://jenkins/userContent/out.txt
该userContent文件夹是一个特殊的文件夹中的内容不受到超出总体/读取访问的任何访问控制。在攻击者可能后门现有构建项目的情况下,该文件夹可能是存储凭据/秘密控制台输出的可行位置。每次生成后,控制台输出结果(包括凭据/秘密)都可以重定向到此文件夹。
詹金斯(Jenkins)等自动化系统是对手的宝贵目标。管理员花时间保护和审核Jenkins安装非常重要,因为这些系统很可能会成为网络中攻击者的目标。
为了帮助解决此问题,CrowdStrike建议Jenkins管理员根据对最近对手活动的观察,注意以下几点:
credentials.xml, master.key
和hudson.util。Secret
?上面的列表不是确保Jenkins安全的完整指南,将取决于组织。