pol4ir/MovementHound
GitHub: pol4ir/MovementHound
一款通过主动探测而非组成员身份来枚举 Windows 横向移动有效权限的 PowerShell 工具,可扩展 BloodHound 图谱发现隐藏路径。
Stars: 3 | Forks: 0
捕捉那些漏过基于组的枚举的路径,然后实施横向移动。🐾
## 目录 - [TL;DR](#tldr) - [为什么选择 MovementHound?](#why-movementhound) - [工作原理](#how-it-works) - [技术与模块](#techniques--modules) - [环境要求](#requirements) - [安装说明](#installation) - [用法](#usage) - [扩展 BloodHound](#extending-bloodhound) - [输出](#output) - [路线图](#roadmap) - [检测与防御说明](#detection--defensive-notes) - [致谢](#credits--acknowledgements) - [免责声明](#disclaimer) - [许可证](#license) ## 太长不看 (TL;DR) **MovementHound** 是一款 PowerShell 工具,它基于**主体实际持有的有效权限**(而不是它恰好所属的组),对 Windows 上的横向移动能力执行**主动枚举**。 大多数工具通过检查组成员身份(`Administrators`、`Remote Management Users`、`Distributed COM Users` 等)来决定“该用户能否移动到这里?”。这种方式快速、安静,但在 DACL 和安全描述符偏离默认设置的任何环境中都**不可靠**(在现实世界中,大多数环境都是如此)。MovementHound 牺牲了隐蔽性,换取了**可靠、明确的结果**:它像操作者一样探测目标,暴露你真正拥有的访问权限,并可以将结果直接作为新边反馈到 **BloodHound Legacy** 中。 只需一个脚本、一次一致的输出,就能在一步操作中找出所有被忽略的路径。 ## 为什么选择 MovementHound? **组成员身份是判断主体能力的一个糟糕代理指标。** Windows 的几乎所有访问控制都基于 DACL 和安全描述符,而管理员在试图敷衍解决“非管理员如何启动服务?”这类问题时,会不断重写它们;第三方安装程序为了让其服务账户正常运行,也会悄悄放宽这些描述符。 任何从组成员身份推断访问权限而不是直接探测的方法都存在这种固有缺陷,例如: - 自定义的按 AppID 的启动/激活 ACE 在不属于 `Distributed COM Users` 的情况下授予了 DCOM 执行权限。 - PowerShell 端点 SDDL 上的 Execute (Invoke) ACE 在不属于 `Remote Management Users` 的情况下授予了 PSRemoting 权限。 - 在现代系统中,枚举远程组成员身份本身就需要在目标上拥有本地管理员权限,因此基于组的检查恰恰在你还没有管理员权限的机器上会变盲,而这些机器往往才是值得关注的。 第二个重要原因:许多这些最低权限原语同时也充当了**持久化**手段。在对先前被入侵的环境进行评估时,MovementHound 可以帮助你验证是否遗留了此类低权限落脚点。 最后一个原因是,许多工具依赖不同的技术。在实际攻防中,拥有一个能处理所有这些操作的合一脚本会非常方便,这样你就不会冒遗忘某项技术的风险。 ## 工作原理 **设计上重可靠性轻 OPSEC。** MovementHound 是为受控环境和授权评估而构建的,在这些场景中,牺牲隐蔽性以换取明确的答案不仅是可接受的,而且往往就是最终目的。它不是从组成员身份推断访问权限,而是尝试执行操作(或操作所需的精确句柄/访问掩码请求),并报告实际成功的结果。 事先有必要了解几个设计带来的结果: - **它是主动的,因此充满噪音。** 它会打开句柄、通过 SMB 访问命名管道并探测端点。这是有意为之。(偏向 OPSEC 的模式已列入[路线图](#roadmap)。) - **它并行运行模块**以保持合理的运行时间,但可靠性仍然需要耗费时间。预计总运行时间主要随范围内的主机数量增加而增加,启动后让它自己跑就行。 - **它请求每种技术所需的*最小*访问掩码**,而不是 `*_ALL_ACCESS`。正是这一点让它能够发现那些以管理员权限为中心的检查(探测 `SC_MANAGER_ALL_ACCESS`、`0xF003F` 等)并报告为“无访问权限”的路径。 ## 技术与模块 MovementHound 将一组独立脚本(`Find-SCMAccess`、`Find-DCOMLocalAdminAccess` 等)整合到一个统一的收集器中。下表列出了它枚举的内容,以及每条路径真正需要的**有效权限**,也就是管理员/组检查会漏掉的部分。 | 模块 | 技术 | 它检查的有效权限(你通常会漏掉的部分) | | --- | --- | --- | | **SCM Create** | 远程**服务创建**,绕过 `OpenService` 调用 | SCM `0x0003` = `SC_MANAGER_CREATE_SERVICE` + `SC_MANAGER_CONNECT` | | **SCM Reconfig** ⭐ | **服务重新配置**(`ChangeServiceConfig`) | SCM `0x0001` (`SC_MANAGER_CONNECT`) + service `0x0002` (`SERVICE_CHANGE_CONFIG`) | | **WMIMAN** ⭐ | **基于 WSMAN 的 WMI** | `Remote Management Users` 组成员身份和 `WBEM_REMOTE_ENABLE(0X20)` | | **WMI** | **基于 DCOM 的 WMI** | `COM_RIGHTS_EXECUTE, _EXECUTE_REMOTE (0x5)` 和 `WBEM_REMOTE_ENABLE(0X20)` | | **DCOM** | 通过 `MMC20`、`ShellWindows`、`ShellBrowserWindow`、`Excel` 执行 DCOM | 按 AppID 的启动/激活 ACE,而不仅仅是 `Distributed COM Users` | | **WinRM / WinRS** | PSRemoting(`Microsoft.PowerShell` SDDL)**以及** WinRS (RootSDDL) | 对端点 SDDL / 服务 **RootSDDL** 的 `Execute (Invoke)` 权限,分开检查,因为其中一个可能起作用而另一个不行 | | **Remote Registry** ⭐ | `winreg` + `AllowedPaths`,以及服务 / 任务计划程序 / Autorun / COM 劫持 / 网络提供程序键 | 目标键上的 `SetValue` / `CreateSubKey`(也可通过 WriteOwner/WriteDAC)(+ `winreg` ACL 或 `AllowedPaths` 豁免) | | **RDP** [beta] | `CanRDP` (交互式登录) | `Remote Desktop Users` **和** `SeRemoteInteractiveLogonRight`,评估为*有效权限*,包含 Remote Credential Guard | | **RDP Shadow** [beta] ⭐ | 会话阴影(`mstsc /shadow`) | RDP-Tcp / 控制台 `0x00011` = `WINSTATION_QUERY` + `WINSTATION_SHADOW` (不需要完全控制) | | **SSH** | OpenSSH,带有 **Plink 后备**(包含 `GSS-API`) | 有效的凭据 + `AllowUsers` / `AllowGroups` / `DenyUsers` / `DenyGroups` 评估 | | **URA [soon]** | **用户权限分配**滥用 | 可滥用的权限(例如通往 `SYSTEM` 的路径),从 **SYSVOL** 中的 `GptTmpl.inf` 读取,可通过任意低权限域账户枚举 | ⭐ = 在评估期间经常被**忽略**。常见/众所周知的技术也已被覆盖,即使它们没有打星号。有关每种技术背后的协议级细节,请阅读[系列文章](https://pol4ir.github.io/posts/LateralMovement-WhatYouReallyNeed/)。 ## 环境要求 - 用于运行脚本的 **Windows** 主机(操作机或滩头堡)。 - **PowerShell 5.1** 或 **PowerShell 7+**。 - 有效的**域凭据**/**会话**(核心就在于不需要是管理员)。 - 根据运行的模块,通过相关传输协议(SMB/445、RPC/135 + 动态端口、WinRM/5985-5986、RDP/3389、SSH/22 等)能够直连到目标。 ## 安装说明 ``` # 1) 获取脚本 git clone https://github.com/pol4ir/MovementHound.git cd MovementHound # 2) 允许其在当前会话中运行(根据您的策略进行调整) Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force # 3) Dot-source 该脚本 . .\MovementHound.ps1 ``` 或者直接将其加载到内存中: ``` IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/pol4ir/MovementHound/main/MovementHound.ps1') ``` 入口点为 `Invoke-MovementHound`。 ## 用法 ### 完整 ``` # 使用所有技术枚举整个域内的访问权限 Invoke-MovementHound -lhost
标签:AI合规, BloodHound, IPv6, Libemu, PE 加载器, PowerShell, Prisma Cloud, Web报告查看器, 权限枚举, 横向移动, 编程规范