专栏首页DevOps持续集成危险: 持续集成系统保护不好有多糟糕?|入侵系统完整过程 | 检查版本更新 | 禁止匿名用户

危险: 持续集成系统保护不好有多糟糕?|入侵系统完整过程 | 检查版本更新 | 禁止匿名用户

原文地址:https://www.crowdstrike.com/blog/

1 简介

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服务器。

4 解析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命令时,会观察到以下情况:

在某些情况下,攻击者可能选择避免使用内置的Java方法来生成命令和控制方法(C2),而不是依靠PowerShell进行后期开发。在许多詹金斯妥协,攻击者试图访问该文件credentials.xml,master.key和hudson.util.Secret。这些文件负责加密机密,在某些情况下还用于存储凭据。该master.key文件用于加密hudson.util.Secret文件,该文件用于加密凭据插件中的秘密。该credentials.xml文件包含针对Jenkins用户的加密密码短语和密钥。

可以通过多种方式来获得这些文件。如果对服务器建立了SSH访问或C2,则可以直接从服务器复制这些文件并进行泄漏。在此示例中,攻击者利用以下Groovy脚本利用内置的Java方法获取这些文件:

使用上面的Groovy脚本,攻击者能够检索每个文件而不会产生潜在的恶意子进程。攻击者还使用Base64类方法检索二进制格式的hudson.util.Secret文件。可以使用Jenkins测试实例查看此脚本的用法。

还可以使用以下脚本从脚本控制台直接解密文件中存储的密码credentials.xml

对Jenkins脚本控制台的访问为攻击者提供了多种方法来获取Jenkins服务器上的关键文件和敏感文件,因此应禁用或限制其访问权限。

5 创建项目

在无法访问脚本控制台的情况下,根据配置,可以查看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文件夹是一个特殊的文件夹中的内容不受到超出总体/读取访问的任何访问控制。在攻击者可能后门现有构建项目的情况下,该文件夹可能是存储凭据/秘密控制台输出的可行位置。每次生成后,控制台输出结果(包括凭据/秘密)都可以重定向到此文件夹。

6 结论

詹金斯(Jenkins)等自动化系统是对手的宝贵目标。管理员花时间保护和审核Jenkins安装非常重要,因为这些系统很可能会成为网络中攻击者的目标。

为了帮助解决此问题,CrowdStrike建议Jenkins管理员根据对最近对手活动的观察,注意以下几点:

  1. 任何人都可以通过身份验证访问Jenkins Web控制台吗?
    • 这包括脚本控制台访问吗?
    • 他们可以查看凭证或构建历史吗?
    • 他们可以创建建筑或安排工作吗?
  2. 经过身份验证的用户具有什么权限?
    • 这包括脚本控制台访问吗?
    • 他们可以查看凭证或构建历史吗?
    • 他们可以创建建筑或安排工作吗?
  3. 在构建历史记录或控制台输出中是否存储了任何敏感信息?
  4. 詹金斯可以上网吗?您的组织需要它吗?
  5. Jenkins服务帐户是否以执行其功能所需的最少特权运行?
  6. 凭证如何存储?
    • 谁可以访问credentials.xml, master.key和hudson.util。Secret

上面的列表不是确保Jenkins安全的完整指南,将取决于组织。

本文分享自微信公众号 - DevOps持续集成(devopsadmin)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Jenkins实践文档(一)- Jenkins简介

    Jenkins官网 Jenkins前身是Hudson,使用java语言开发的自动化发布工具。在中大型金融等企业中普遍使用Jenkins来作为项目发布工具。 Je...

    泽阳
  • Jenkins简介

    Jenkins官网 Jenkins前身是Hudson,使用java语言开发的自动化发布工具。在中大型金融等企业中普遍使用Jenkins来作为项目发布工具。Jen...

    泽阳
  • Jenkins as Code-基础设施-项目-系统配置

    Jenkins的安装和部署相对简单,安装方式有很多。 可以使用一些常见的配置管理工具(Ansible、Puppet、Chef)进行安装部署,还可以使用Docke...

    泽阳
  • 安装持续集成工具Jenkins

    Jenkins是一个流行的持续集成框架,可以在我们提交项目的时候自动测试、运行和部署项目。虽然Jenkins使用Java编写,但是由于Jenkins支持多种语言...

    乐百川
  • 看,我都不用手动配置

    Jenkins 非常灵活,如今已成为实现 CI/CD 的事实标准,同时拥有一个活跃的社区来维护几乎所有工具和用例的插件。但是灵活也是要付出代价的:除了 Jenk...

    LinuxSuRen
  • 基于 Jenkins 的 DevOps 平台应该如何设计凭证管理

    了解到行业内有些团队是基于 Jenkins 开发 DevOps 平台。而基于 Jenkins 实现的 DevOps 平台,就不得不考虑凭证的管理问题。

    LinuxSuRen
  • 基于Chrome插件的开发工具链

    在项目开发过程中,时不时会碰上需要使用一些工具来做一些自动操作或者附加功能。特别是有一些外部组件只会提供Web工具,或者如果产品会发布在Web上的时候,在线上的...

    owent
  • 【php增删改查实例】第十四节 - 用户管理模块(起步)

    剽悍一小兔
  • 根据原理撸一个带bug的PromiKit

    之前我们说了PromiseKit今天就带领大家来分析一下这个PromiseKit,之后我们再根据PromiseKit的思想剥茧抽丝的简易的撸一个微型的Promi...

    大话swift
  • 行内元素空白“消消乐”

    相信大家应该都遇到过下面这个问题:“HTML 源码中行内元素之间的空白显示在了屏幕上”。可能大家都有自己的小技巧来消除这些意料之外的空白。但是方法有很多,有时候...

    歪马

扫码关注云+社区

领取腾讯云代金券