实现 GriffonAD 在 Active Directory 配置利用中的模块化部署
探讨 GriffonAD 工具在 AD 渗透测试中的应用,包括枚举、利用路径搜索与命令生成,提供工程化参数与检测规避策略。
在 Active Directory (AD) 环境中,配置错误往往成为渗透测试的核心靶点。GriffonAD 作为一个基于 BloodHound JSON 文件的 Python 工具,专为利用 AD 不良配置而设计。它不直接在目标系统上执行操作,而是生成详细注释的命令脚本,让测试人员手动控制执行过程。这种设计不仅提升了操作的灵活性,还降低了被检测的风险。本文将聚焦于 GriffonAD 的模块化实现,涵盖枚举、利用和规避检测的关键步骤,提供可落地的参数配置和监控清单,帮助安全从业者高效应对 AD 配置弱点。
GriffonAD 的核心机制与准备工作
GriffonAD 的优势在于其模块化结构,通过 config.ml 文件定义多种利用场景,如强制更改密码 (ForceChangePassword)、添加密钥凭证链接 (AddKeyCredentialLink) 和资源-based 约束委派 (RBCD)。这些模块支持条件谓词,确保路径搜索优先选择高优先级攻击向量。安装前,确保环境满足要求:Python 3.x、impacket 库(需手动复制 dacledit.py 到 impacket/examples),并通过 pip install -r requirements.txt 完成依赖安装。
准备 BloodHound 数据是第一步。使用 bloodhound.py 收集 AD JSON 文件,命令示例:./bloodhound.py -u 用户名 -d 域 -p 密码 -ns DNS_IP -c DCOnly
。此步骤聚焦域控制器 (DC) 信息,输出 users.json、computers.json 等文件。参数优化:-c AllCollections 可扩展到完整枚举,但为规避检测,建议在低峰期执行,并限制查询深度至 1000 个对象,避免触发 AD 日志警报。
在 .NET 互操作层面,GriffonAD 生成的命令常需通过 PowerShell 模块执行,利用 System.DirectoryServices 命名空间访问 LDAP。导入 Active Directory 模块:Import-Module ActiveDirectory
。若在非域成员主机上运行,可加载 Microsoft.ActiveDirectory.Management.dll 以实现远程 LDAP 绑定,减少本地足迹。
枚举与 ACL 分析:识别弱点参数
枚举阶段,GriffonAD 分析 ACL 以突出高价值目标 (HVT)。运行 ./griffon.py json/*
会过滤 admincount=1 的用户,并标记黄色高亮表示潜在漏洞,如 GenericAll 或 WriteDacl 权限。关键参数:
--select FILTER
:过滤目标名称前缀,例如--select IT
只显示 IT 相关组,减少输出噪声,提高分析效率。--groups
和--members
:显示组权限及其成员,结合--ous
扩展到 OU 和 GPO 链接。--sysvol PATH
:分析 SYSVOL 中的本地管理员成员和特权,如 SeDebugPrivilege。检索 SYSVOL:echo -e "recurse\nprompt\nmget *" | smbclient -U '域/用户%密码' '//IP/SYSVOL'
。
这些参数的落地清单包括监控阈值:如果黄色 HVT 超过 5 个,优先调查;对于 SYSVOL,检查 Restricted Groups 中的本地管理员添加,阈值设为 OU 级别 >3 个本地特权用户。引用 GriffonAD 文档:“如果有黄色高亮的 user,那听起来不错!” 这强调了视觉化输出的实用性。
在规避检测时,使用 PowerShell 的 .NET interop 避免标准 cmdlet 日志:Add-Type -AssemblyName System.DirectoryServices
后,通过 DirectoryEntry 对象查询 LDAP,而非 Get-ADUser,降低 Event ID 4662 的触发率。
利用路径搜索:从拥有的资产到 Domain Admin
路径搜索是 GriffonAD 的核心,利用 owned 文件定义起始点。格式:SAMACCOUNTNAME:TYPE:SECRET
,如 WORKSTATION$:password:0d3c811f...
或 Tracy:password:Spring2025
。运行 ./griffon.py json/* --fromo
从 owned 用户开始搜索到 DA 的路径。
优化参数:
--fromv
:从易受攻击用户 (NP、空白密码、Kerberoastable) 开始,适用于初始 foothold。--from USER
:指定任意用户测试路径。--rights
:显示 ACE 名称而非动作,便于合规审计。--onlyadmin
:仅显示到 DA 的路径,过滤无关输出。--no-follow
:不递归新目标,只列出当前场景,如 GenericAll 可用于重置密码或添加 SPN。
对于多目标,many
表示批量利用:GenericAll 覆盖 admincount=0 的所有用户/组(若在 Account Operators)。落地清单:owned 文件限 50 行,避免内存溢出;路径深度阈值设为 4 步,若超过则拆分执行。结合 .NET interop,在 PowerShell 中实现路径验证:使用 PrincipalContext 验证凭证有效性,代码片段:
Add-Type -AssemblyName System.DirectoryServices.AccountManagement
$context = New-Object System.DirectoryServices.AccountManagement.PrincipalContext([System.DirectoryServices.AccountManagement.ContextType]::Domain, "域")
$valid = $context.ValidateCredentials("用户", "密码")
这绕过 AD 模块日志,提供静默枚举。
脚本生成与执行:工程化参数与清单
生成脚本:./griffon.py json/* --fromo -s0 --dc-ip DC_IP
。输出包含注释的命令,红色高亮参数需手动调整,如目标 DN 或凭证。嵌入工具如 attr.py (修改 LDAP 属性)、addspn.py (添加 SPN) 和 dacledit.py (粒度 ACL 编辑) 支持自定义。
自定义选项通过 --opt
实现:
--opt noforce
:禁用 ForceChangePassword,回退到 AddKeyCredentialLink。--opt noaddcomputer
:避免 RBCD 中的添加计算机场景。--opt allgpo
:迭代所有 GPO 场景,默认仅 GPOAddLocalAdmin。--opt nofull
:WriteDacl 时仅授予特定权,而非 FullControl。--opt allkeys
:Key Admins 组迭代所有用户/计算机。
执行清单:
- 验证 DC 连通性:ping DC_IP,超时 <500ms。
- 备份 ACL:使用 getbyname.py 导出目标属性。
- 渐进执行:先测试单步,如 toggleNP.py 禁用不要预认证。
- 回滚策略:若失败,dacledit.py 恢复 ACL,阈值:变更后 10 分钟内监控 Event ID 5136。
规避检测:脚本生成后,通过 PowerShell 的 Invoke-Expression 动态加载,避免文件落地;结合 AMSI 绕过,如反射加载 .NET 程序集,减少 PowerShell.exe 进程痕迹。监控点:SIEM 规则检测异常 LDAP 修改 (Event ID 5136/4742),阈值 >5 次/分钟触发警报。
风险管理与最佳实践
GriffonAD 的非执行设计降低了风险,但误用可能导致实际入侵。风险限:依赖 BloodHound 数据准确性,若 JSON 过期,路径无效;.NET interop 需处理异常,如 LDAP 绑定失败 (HRESULT 0x8007203A)。最佳实践:在隔离 lab 中测试,如 GriffonAD 提供的 vulnerable AD lab;日志监控:启用 AD 审计,焦点 ACL 变更;回滚清单:预存快照,变更后 5 分钟验证权限。
通过这些模块化参数和清单,GriffonAD 不仅简化了 AD exploitation,还提升了操作的安全性。在渗透测试中,结合 PowerShell 的 .NET 能力,可实现高效、隐蔽的配置利用。未来,可扩展到 Azure AD 场景,进一步强化云原生防御。
(字数:1028)