How to Forge a Kerberos Ticket by Yourself
字数 2175 2025-08-06 08:35:09
Kerberos票据伪造攻击技术详解
1. Kerberos票据伪造攻击概述
Kerberos票据伪造攻击是指攻击者通过伪造Kerberos票据来获取未经授权的访问权限。主要分为两种类型:
-
黄金票据(Golden Ticket)攻击:
- 获取域控制器的krbtgt账户的长期密钥(哈希值)
- 可以伪造任意特权账户的TGT(Ticket Granting Ticket)
- 可以插入任意的特权属性证书(PAC)
- 使攻击者能够为AD中的任何帐户生成身份验证材料
- 完全获取域内访问权限
-
白银票据(Silver Ticket)攻击:
- 获取应用程序服务器的长期密钥
- 绕过KDC直接伪造TGS票据
- 用于访问特定服务器上的服务或资源
2. 技术实现原理
2.1 黄金票据攻击实现
-
获取必要信息:
- 域名称(domain)
- 域SID(sid)
- krbtgt账户的哈希值(rc4/aes128/aes256)
-
构建PAC结构:
- 包含用户授权信息
- 包含服务器签名和KDC签名
- 需要正确签名才能被接受
-
构造EncTicketPart:
- 包含票据标志、会话密钥、客户端信息等
- 使用krbtgt密钥加密
-
封装为KRB_CRED结构:
- 包含完整的票据信息
- 用于提交到内存中
2.2 白银票据攻击实现
-
获取必要信息:
- 目标服务名称(service)
- 目标服务器名称(target)
- 服务账户的哈希值(rc4/aes128/aes256)
- 域SID(sid)
-
构建PAC结构:
- 与黄金票据类似但更简单
- 不需要KDC签名
-
构造服务票据:
- 针对特定服务构建
- 使用服务账户密钥加密
-
封装并提交:
- 同样封装为KRB_CRED结构
- 提交到内存使用
3. 关键数据结构
3.1 PAC结构
typedef struct _PACTYPE {
ULONG cBuffers;
ULONG Version;
PAC_INFO_BUFFER Buffers[1];
} PACTYPE, *PPACTYPE;
typedef struct _PAC_INFO_BUFFER {
ULONG ulType;
ULONG cbBufferSize;
ULONG64 Offset;
} PAC_INFO_BUFFER, *PPAC_INFO_BUFFER;
重要缓冲区类型:
- 0x00000001: 登录信息(KERB_VALIDATION_INFO)
- 0x00000006: 服务器校验和
- 0x00000007: KDC校验和
- 0x0000000A: 客户端名称和票据信息
3.2 KERB_VALIDATION_INFO结构
typedef struct _KERB_VALIDATION_INFO {
FILETIME LogonTime;
FILETIME LogoffTime;
// ...其他时间字段...
RPC_UNICODE_STRING EffectiveName;
// ...其他字符串字段...
ULONG UserId;
ULONG PrimaryGroupId;
ULONG GroupCount;
PGROUP_MEMBERSHIP GroupIds; // 组成员信息
// ...其他字段...
} KERB_VALIDATION_INFO, *PKERB_VALIDATION_INFO;
3.3 Ticket ASN.1定义
Ticket ::= [APPLICATION 1] SEQUENCE {
tkt-vno [0] INTEGER (5),
realm [1] Realm,
sname [2] PrincipalName,
enc-part [3] EncryptedData -- EncTicketPart
}
EncTicketPart ::= [APPLICATION 3] SEQUENCE {
flags [0] TicketFlags,
key [1] EncryptionKey,
crealm [2] Realm,
cname [3] PrincipalName,
transited [4] TransitedEncoding,
authtime [5] KerberosTime,
starttime [6] KerberosTime OPTIONAL,
endtime [7] KerberosTime,
renew-till [8] KerberosTime OPTIONAL,
caddr [9] HostAddresses OPTIONAL,
authorization-data [10] AuthorizationData OPTIONAL // 包含PAC
}
3.4 KRB_CRED ASN.1定义
KRB-CRED ::= [APPLICATION 22] SEQUENCE {
pvno [0] INTEGER (5),
msg-type [1] INTEGER (22),
tickets [2] SEQUENCE OF Ticket,
enc-part [3] EncryptedData -- EncKrbCredPart
}
4. 实现步骤详解
4.1 初始化阶段
-
获取命令行参数:
- 用户(user)
- 域(domain)
- 服务(service)
- 目标(target)
- SID(sid)
- 密钥(rc4/aes128/aes256)
-
初始化Kerberos认证包:
- 通过
LsaConnectUntrusted建立连接 - 通过
LsaLookupAuthenticationPackage获取Kerberos包标识符
- 通过
4.2 构建PAC结构
-
生成KERB_VALIDATION_INFO:
- 设置用户信息、组信息等
- 重要字段:UserId、PrimaryGroupId、GroupIds
-
构建PAC_INFO_BUFFER数组:
- 包含登录信息、客户端信息、校验和等
-
计算签名:
- 服务器签名(使用服务密钥)
- KDC签名(使用krbtgt密钥)
4.3 构建票据
-
设置票据基本信息:
- 票据版本(tkt-vno=5)
- 领域(realm)
- 服务名称(sname)
- 客户端名称(cname)
-
设置时间信息:
- authtime
- starttime
- endtime
- renew-till
-
设置票据标志(flags):
- 可转发(forwardable)
- 可更新(renewable)
- 预认证(pre-authent)
-
生成会话密钥:
- 随机生成会话密钥
-
构建EncTicketPart:
- 包含上述所有信息
- 包含PAC结构
-
加密EncTicketPart:
- 黄金票据:使用krbtgt密钥加密
- 白银票据:使用服务密钥加密
4.4 封装为KRB_CRED
-
构建KRB_CRED结构:
- 包含完整的票据信息
- 包含加密的EncKrbCredPart
-
ASN.1编码:
- 使用BER编码规则
- 确保正确嵌套和标记
4.5 票据传递(Pass The Ticket)
-
构建KERB_SUBMIT_TKT_REQUEST:
- 设置MessageType为KerbSubmitTicketMessage
- 包含KRB_CRED数据
-
调用LsaCallAuthenticationPackage:
- 提交票据到内存缓存
- 需要SeTcbPrivilege权限
5. 防御措施
-
保护krbtgt账户:
- 定期更改krbtgt密码(两次更改间隔24小时)
- 监控krbtgt账户活动
-
保护服务账户:
- 使用强密码
- 限制服务账户权限
-
检测异常票据:
- 监控异常票据请求
- 检测票据中的异常时间戳
-
启用高级安全功能:
- 启用Kerberos Armoring
- 使用AES加密而非RC4
-
日志监控:
- 监控域控制器上的Kerberos事件
- 特别关注4769(请求Kerberos服务票据)事件
6. 实际利用示例
6.1 黄金票据攻击
GoldenTicket.exe /user:Administrator /domain:pentest.com /sid:S-1-5-21-1536491439-3234161155-253608391 /krbtgt:6b88c9ed6723e3de59eb76f5b73f6a69 /ptt
6.2 白银票据攻击
GoldenTicket.exe /domain:pentest.com /sid:S-1-5-21-1536491439-3234161155-253608391 /target:dc01.pentest.com /rc4:8236c3452e65add7b5756945975fd883 /service:ldap /user:Administrator /ptt
7. 总结
Kerberos票据伪造攻击是AD环境中危害极大的攻击技术,特别是黄金票据攻击可以完全控制整个域。防御这类攻击需要多层次的防护措施,包括保护关键账户、监控异常活动和使用更强的加密算法。理解这些攻击技术的原理对于有效防御至关重要。