jptorres26/CimSweep

GitHub: jptorres26/CimSweep

基于PowerShell CIM/WMI的远程终端信息采集工具,可在所有Windows版本上无代理执行事件响应和威胁狩猎操作。

Stars: 0 | Forks: 0

#### 主版本 [![构建状态](https://ci.appveyor.com/api/projects/status/58jy9aie7w6aac0y/branch/master?svg=true)](https://ci.appveyor.com/project/mattifestation/cimsweep/branch/master) # CimSweep CimSweep 是一套基于 CIM/WMI 的工具,能够在所有版本的 Windows 上远程执行事件响应和威胁狩猎操作。CimSweep 还可用于进行攻击性侦察,而无需向磁盘投放任何有效载荷。自 Windows XP 和 Windows 2000 以来,Windows Management Instrumentation 已默认安装且其相应服务默认运行,并且在包括 Windows 10、Nano Server 和 Server 2016 在内的最新版本 Windows 中完全受支持。 ## 更新日志 有关发布历史和安全加固更新,请参阅 [CHANGELOG.md](./CHANGELOG.md)。 ## 背景 基于代理的防御工具功能非常强大,但它们也需要将代理部署到每个系统。基于代理的解决方案在我们的行业中绝对有其一席之地,但它们往往价格昂贵,而且很容易被坚定的攻击者检测/阻止。CimSweep 可以在无需部署代理的情况下大规模获取时间敏感的数据。 之所以称为 CimSweep,是因为它利用了 PowerShell 中功能极其强大的 CIM cmdlet。CIM cmdlet 默认支持 WSMan 协议,但也可以回退到在不支持或未启用 Windows Remote Management (WinRM) 服务的系统上使用 DCOM。有关 CIM cmdlet 的更多信息,请参阅: * [CIM cmdlet 简介](https://blogs.msdn.microsoft.com/powershell/2012/08/24/introduction-to-cim-cmdlets/) * [什么是 CIM?为什么在 PowerShell 中使用它?](https://blogs.technet.microsoft.com/heyscriptingguy/2014/01/27/what-is-cim-and-why-should-i-use-it-in-powershell/) CIM cmdlet 最强大的功能之一是它们允许建立可以跨重启存活的 CIM 会话。CIM 会话可以加速远程查询,并使分析师能够建立一次会话,然后将其传递给任何支持 -CimSession 参数的函数——所有 CimSweep 函数在设计上 都支持此参数。 ## 要求 #### 分析师系统 1. 需要 PowerShell 3 或更高版本。CIM cmdlet 是在 PSv3 中引入的。 2. 需要对目标主机拥有提升的凭证。默认情况下,所有远程 WMI/CIM 操作都需要属于管理员组成员用户的凭证。 #### 目标主机 1. 任何从 Windows XP 或 Windows 2000 回溯的 Windows 操作系统。 2. WMI 服务 (winmgmt) 必须正在运行。它默认处于运行状态。 3. 主机和网络防火墙必须允许远程 WMI/CIM 管理端口通过。 * [从 Windows Vista 开始远程连接 WMI](https://msdn.microsoft.com/en-us/library/windows/desktop/aa822854) 4. 对于需要 WSMan 协议的系统,WinRM 服务必须正在运行。如果 PowerShell 远程处理已启用,则 WinRM 服务已经在运行。WinRM 可以通过 PowerShell 在本地启用,也可以通过 GPO 在企业中远程启用。 * [使用组策略启用和配置 Windows PowerShell 远程处理](https://web.archive.org/web/20150514151313/http://blog.crayon.no/blogs/janegil/archive/2010/03/04/enable_2D00_and_2D00_configure_2D00_windows_2D00_powershell_2D00_remoting_2D00_using_2D00_group_2D00_policy.aspx) * [使用域 GPO 配置 WSMan 服务](https://greencircle.vmturbo.com/docs/DOC-1911) * [WSMan 提供程序](https://technet.microsoft.com/en-us/library/hh847813.aspx) CimSweep 由两个组件组成:核心功能和域特定功能。 ## 核心功能 在核心层面,CimSweep 可以轻松地从任何 Windows 操作系统远程获取以下信息: * 注册表项、值、值类型和值内容,可选递归 * 目录和文件列表,可选递归 * 事件日志条目 * 服务 * 进程 此核心功能旨在为事件响应人员、威胁狩猎操作员或任何需要远程通过 WMI 定位信息的其他人员提供开发域特定功能的便利。 ## 域特定功能 基于 CimSweep 中的核心函数集,贡献者可以轻松编写能够获取高度针对性信息的函数。此类信息的示例包括: * 攻击者持久性工件:注册表 Run 键、开始菜单项、WMI 持久性等 * 扫描已知恶意工件的存在:例如,清扫已知恶意文件、已知恶意注册表项/值 * 发挥您的想象力!CimSweep 支持清扫各种取证工件。请考虑使用 Sysinternals Autoruns 和 regripper 等工具。CimSweep 使贡献者能够重新实现这些出色的工具,而无需将任何工具推送到目标系统! ## 用法 CimSweep 是使用 Import-Module cmdlet 导入的 PowerShell 模块。有关导入 PowerShell 模块的帮助,请运行 `Get-Help Import-Module -Full` 或参阅 [导入 PowerShell 模块](https://msdn.microsoft.com/en-us/library/dd878284(v=vs.85)。aspx)。 导入后,您可以通过运行 `Get-Command -Module CimSweep` 查看导出的函数。 每个函数的详细文档和使用示例可以通过运行 `Get-Help FunctionName -Full` 找到。例如,要获取 Get-CSDirectoryListing 的详细帮助,请运行 `Get-Help Get-CSDirectoryListing -Full`。 虽然 CimSweep 函数在本地运行良好,但它设计为使用 CIM 会话在远程系统上运行。[New-CimSession](https://technet.microsoft.com/en-us/library/jj590760) cmdlet 用于创建 CIM 会话。建议参阅[这篇文章](https://blogs.msdn.microsoft.com/powershell/2013/08/19/cim-cmdlets-some-tips-tricks/)以获取有关建立 CIM 会话的更多信息。 以下是我连接到测试实验室中几台计算机时的常用工作流程示例: ``` .\scripts\Install-CimSweepDependencies.ps1 -IncludePSScriptAnalyzer ``` ## PowerShell 5.1 验证工作流程 对于在 Windows PowerShell 5.1 下以工作为中心的验证,此仓库包含固定的测试依赖项和可运行脚本: * Pester `4.10.1` * PSScriptAnalyzer `1.24.0` ### 安装固定的测试依赖项 ``` .\scripts\Invoke-CimSweepTests.ps1 -Suite All -IncludePSScriptAnalyzer ``` ### 使用固定的 Pester 运行测试 ``` .\scripts\Invoke-CimSweepSmoke.ps1 -ComputerName 'HOST1','HOST2' -Protocol Auto ``` 测试工件(Pester XML、CSV 摘要、分析器发现)写入 `.\artifacts\tests_`。 每次运行还会在输出目录中写入结构化 JSONL 日志到 `Run.log.jsonl`。 ### 运行单命令快速检查 ``` .\scripts\Invoke-CimSweepSmoke.ps1 -ComputerName localhost -Protocol Dcom -SkipDeepChecks ``` 或进行快速本地检查: ``` .\scripts\Invoke-CimSweepValidation.ps1 -ComputerName 'HOST1','HOST2' -Protocol Auto ``` 快速检查工件写入 `.\artifacts\smoke_`。 每次运行还会在输出目录中写入结构化 JSONL 日志到 `Run.log.jsonl`,包括每个检查的失败类别。 当使用 `-Protocol Auto` 时,快速检查运行器会先尝试 WSMan,然后根据每个主机回退到 DCOM。 会话结果导出到 `Sessions.summary.csv/json`,检查输出以确定性的每主机名称写入:`..clixml`。 ### 运行完整验证(依赖项 + 测试 + 快速检查)一条命令 验证写入顶层结构化日志到: * `.\artifacts\validation_\Run.log.jsonl` 当前失败类别包括: * `Authentication` * `Authorization` * `Transport` * `TestFailure` * `SmokeFailure` * `NamespaceMissing` * `ClassMissing` * `NotFound` * `Dependency` * `ParameterBinding` * `UnsupportedPlatform` * `Unknown` ## 贡献和函数设计 我一个人做不到!我非常希望得到社区的贡献。 #### 贡献要求 以下所有要求都将附带相应的 Pester 测试以确保合规性。 1. 所有函数必须具有 OutputType 属性和基于注释的帮助中的 .OUTPUTS 块。了解函数输出的对象类型非常重要,包括自定义 PowerShell 对象。您可以通过为每个对象包含 PSTypeName 属性来为自定义对象应用类型名称。自定义对象类型名称必须以 CimSweep 开头——例如 CimSweep.RegistryKey。 2. 所有函数必须支持 -CimSession 参数以及相应的 .PARAMETER 文档。 3. 所有函数名称必须带有 "CS" 名词前缀。 4. 所有函数必须包含 .SYNOPSIS 帮助块。 5. 所有函数必须在 .SYNOPSIS 中包含作者姓名。 6. 所有函数必须在 .SYNOPSIS 中包含 BSD 许可证条款。 7. 所有函数必须包含 .DESCRIPTION 帮助块。 8. 每个定义的参数都必须包含 .PARAMETER 块。 9. 所有函数必须包含至少一个 .EXAMPLE 块。 #### 可选的设计注意事项 1. 您的函数应该包含 Pester 测试!!!否则,您怎么能确信它按设计工作,并且能够抵御重构?没有 Pester 测试,您只能猜测您的代码在生产环境中是否稳定。 2. 所有非核心函数都应该使用 Write-Progress。当跨 1000 个系统运行清扫时,进度条会非常有用。 3. 所有错误或详细消息都应包含本地或远程会话的计算机名称。这在诊断大量远程会话上的问题时非常有帮助。 #### 额外的设计注意事项 1. 尽量减少对 CimSweep 函数/CIM cmdlet 的调用!CimSweep 函数必须可扩展。许多核心 CimSweep 函数有许多可以最小化 WMI 方法调用的参数,因此请利用它们。此外,如果您发现现有 CimSweep 函数可以更高效的方法,请提交 pull request 或 issue! 2. 在调用 CimSweep 函数/CIM cmdlet 之前始终执行筛选。换句话说,在使用 CIM 时,不要筛选原始结果,而是使用 -Filter 参数来约束 WMI 查询。此外,如果合理的话,考虑不返回完整的 WMI 对象。Get-CimInstance 中的 -Property 参数用于实现这一点。例如,我需要从 Win32_OperatingSystem 获取 Windows 系统目录和 Windows 目录。因此,不要获取整个 WMI 对象,您可以运行:`Get-CimInstance -ClassName Win32_OperatingSystem -Property SystemDirectory, WindowsDirectory` 3. 永远不要依赖硬编码路径。例如,不要假设 Windows\System32 在 C: 盘中。您通常可以从注册表或其他 WMI 类获取正确的文件路径。例如,系统目录可以通过 Win32_OperatingSystem 类的 SystemDirectory 属性获取。另一个例子:如果您想要获取用户开始菜单文件夹的路径,请使用以下注册表项获取它:`SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders`。 4. 尽量避免在 Get-CSDirectoryListing 和 Get-CSRegistryKey 中使用 -Recurse 开关。函数应尽可能快速地返回高保真信息。也就是说,不要撒大网。 5. 获取用户特定注册表项/值的信息时,不要使用 HKCU 配置单元。相反,使用 HKU 配置单元并遍历每个用户 SID。Get-HKUSID 辅助函数旨在获取 HKU 配置单元中的用户 SID。 6. 请考虑某些 WMI 类/方法在某些操作系统中不存在。例如,许多 WMI 类中存在的 GetSecurityDescriptor 方法在 Windows XP 中不存在。此外还有相当长的类列表尚未在 Nano Server 中提供。请考虑在多个操作系统版本中进行测试。理想情况下,CimSweep 应该与操作系统版本无关。如果需要可能在特定操作系统中不可用的类或方法,请在您的函数中使用 Get-CimClass 执行验证。 7. 如果某个函数只是相当于一行命令的函数包装器,就不要编写 CimSweep 函数。例如,如果您想获取大量系统的配置的时区,不要编写 CimSweep 函数来完成此任务。相反,只需运行 `Get-CimInstance -ClassName Win32_TimeZone`。CimSweep 旨在补充对 CIM cmdlet 的单独调用。
标签:AI合规, CIM, Conpot, DCOM, HTTP工具, IPv6, Libemu, PE 加载器, PowerShell, Windows安全, Windows管理, WinRM, WMI, WSMan, 数据集, 无代理, 无线安全, 系统信息收集, 系统取证, 远程执行, 远程管理