CMLoot 旨在轻松查找存储在 System Center Configuration Manager (SCCM/CM) SMB 共享中的有趣文件。这些共享用于在企业 Windows 环境中向 Windows 客户端分发软件,可能包含带有密码、证书 (pfx) 等的脚本/配置文件。大多数 SCCM 部署配置为允许所有用户读取共享上的文件,有时仅限计算机账户访问。
SCCM/CM 的内容库具有“复杂”(令人头疼)的文件结构,CMLoot 将为您解开这个难题: https://techcommunity.microsoft.com/t5/configuration-manager-archive/understanding-the-configuration-manager-content-library/ba-p/273349
本质上,DataLib 文件夹包含 .INI 文件,.INI 文件的命名格式为原始文件名 + .INI。.INI 文件包含文件的哈希值,而文件本身存储在 FileLib 中,格式为 <文件夹名:哈希的前 4 个字符>\完整哈希。
可以对 CM 中的包应用访问控制。但这只保护文件描述符 (DataLib) 的文件夹,而不保护实际文件本身。CMLoot 在清单记录期间会将其无法访问(访问被拒绝)的任何包记录到文件 _noaccess.txt 中。然后,Invoke-CMLootHunt 可以使用此文件来枚举访问控制试图保护的实际文件。
Windows Defender for Endpoint (EDR) 或其他安全机制可能会触发,因为脚本通过 SMB 解析大量文件。
通过 Active Directory 搜索 CM 服务器,或通过在安装了 System Center 的工作站上获取此注册表项来查找 CM 服务器:
(Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\SMS\DP -Name ManagementPoints).ManagementPoints
可能部署了多个 CM 服务器,它们可能包含不同的文件,因此请务必找到所有服务器。
然后,你需要创建一个清单文件,该文件只是一个包含文件描述符 (.INI) 引用的文本文件。 以下命令将解析 SCCM 服务器上的所有 .INI 文件,以创建可用文件列表。
PS> Invoke-CMLootInventory -SCCMHost sccm01.domain.local -Outfile sccmfiles.txt
然后使用上面创建的清单文件下载感兴趣的文件:
使用 GridView 选择文件(处理大型清单文件时效果可能有所不同):
PS> Invoke-CMLootDownload -InventoryFile .\sccmfiles.txt -GridSelect
通过复制清单文本中的一行来下载单个文件:
PS> Invoke-CMLootDownload -SingleFile \\sccm\SCCMContentLib$\DataLib\SC100001.1\x86\MigApp.xml
下载所有具有特定文件扩展名的文件:
PS> Invoke-CMLootDownload -InventoryFile .\sccmfiles.txt -Extension ps1
文件默认会下载到执行脚本所在文件夹中的 CMLootOut 目录,可以通过 -OutFolder 参数更改。文件保存格式为 (folder: filext)\(first 4 chars of hash>_original filename)。
搜索 CMLootInventory 发现无法访问的文件:
Invoke-CMLootHunt -SCCMHost sccm -NoAccessFile sccmfiles_noaccess.txt
批量提取 MSI 文件:
Invoke-CMLootExtract -Path .\CMLootOut\msi
运行清单,扫描可用文件:

使用 GridSelect 选择文件:

下载所有扩展名:

搜索“无法访问”的文件并提取 MSI:

Tomas Rzepka / WithSecure