在无需使用本地管理员权限的情况下,检测远程机器上是否安装了某个服务(盲检测)和/或该服务是否正在运行(如果其暴露了命名管道)。
更详细地说,运行此脚本会远程连接到目标 SMB 服务(445/tcp),并执行以下操作:
通过 [MS-LSAT] RPC 调用 LsarLookupNames() 检查指定的服务是否已安装。 无需使用特权帐户,但只能进行“盲”查询(无法列出服务,只能查询特定服务的状态)。
检查目标上是否存在指定的 命名管道。服务(进程)可能会暴露其特有的命名管道,这些管道可被非特权用户看到。因此,检查特定服务特有的命名管道可以帮助我们推断特定服务是否正在运行。
这是一个独立的 Python 脚本,使用 Impacket,无需安装任何东西。 已在最新的 Kali 和 Arch Linux 上,使用官方最新版 Impacket(0.10.0 和 0.9.24)以及 Python(3.9 和 3.10)进行过测试。
要检查的服务、服务名称以及服务特有的命名管道均在 conf 文件夹下的 JSON 配置文件中指定(或者使用 CSV 文件——如果这样更顺手的话,这是我后来才意识到的方式 :),因此也提供了一个自定义的 csv2json 转换器)。要理解该格式,请参阅附带的示例。
包含的配置文件:
用例可以通过添加更多的服务/命名管道来扩展,EDR 配置还很不完整,欢迎自行添加。
脚本使用 JSON 配置格式,但后来我意识到编写 CSV 更加方便,因此附带了 csv2json.py 脚本,用于将 CSV 转换为 JSON。
针对单个目标运行以枚举 AV/EDR 服务(或其他任何内容)非常简单:
./serviceDetector.py -conf conf/edr.json evil.corp/johndoe:[email protected]
也支持 Kerberos 身份验证(KRB5CCNAME 环境变量指向 ccache 文件):
./serviceDetector.py -conf conf/edr.json -k -no-pass server.ecorp.local
要高效地对多个目标运行,GNU parallel 非常有用:
cat targets.txt | parallel -j 50 ./serviceDetector.py evil.corp/johndoe:Passw0rd1@{}
请注意,在批量运行之前,先对单个目标进行测试,以防止帐户被锁定(例如在密码拼写错误的情况下)。
Opsec 注意事项:请注意,并发地大规模登录不同目标可能会触发 SOC 警报。
这里使用的两种技术并非新事物。
[MS-LSAT] RPC 调用 LsarLookupNames() 此前已被 Vincent Le Toux(@mysmartlogon)在出色的 PingCastle 工具的 Antivirusscanner 模块中使用。
这种用于检测正在运行服务的命名管道方案受到了 Lee Christensen(@tifkin_)的这条推文 的启发,当时他用这种方法来检测 WebClient 服务。 这种用于 AV/EDR 检测的技术也曾被 NSA 的 NamedPipeTouch 工具使用(该工具由 Shadow Brokers 组织泄露)。