How to Forge a Kerberos Ticket by Yourself
字数 2175 2025-08-06 08:35:09

Kerberos票据伪造攻击技术详解

1. Kerberos票据伪造攻击概述

Kerberos票据伪造攻击是指攻击者通过伪造Kerberos票据来获取未经授权的访问权限。主要分为两种类型:

  1. 黄金票据(Golden Ticket)攻击

    • 获取域控制器的krbtgt账户的长期密钥(哈希值)
    • 可以伪造任意特权账户的TGT(Ticket Granting Ticket)
    • 可以插入任意的特权属性证书(PAC)
    • 使攻击者能够为AD中的任何帐户生成身份验证材料
    • 完全获取域内访问权限
  2. 白银票据(Silver Ticket)攻击

    • 获取应用程序服务器的长期密钥
    • 绕过KDC直接伪造TGS票据
    • 用于访问特定服务器上的服务或资源

2. 技术实现原理

2.1 黄金票据攻击实现

  1. 获取必要信息

    • 域名称(domain)
    • 域SID(sid)
    • krbtgt账户的哈希值(rc4/aes128/aes256)
  2. 构建PAC结构

    • 包含用户授权信息
    • 包含服务器签名和KDC签名
    • 需要正确签名才能被接受
  3. 构造EncTicketPart

    • 包含票据标志、会话密钥、客户端信息等
    • 使用krbtgt密钥加密
  4. 封装为KRB_CRED结构

    • 包含完整的票据信息
    • 用于提交到内存中

2.2 白银票据攻击实现

  1. 获取必要信息

    • 目标服务名称(service)
    • 目标服务器名称(target)
    • 服务账户的哈希值(rc4/aes128/aes256)
    • 域SID(sid)
  2. 构建PAC结构

    • 与黄金票据类似但更简单
    • 不需要KDC签名
  3. 构造服务票据

    • 针对特定服务构建
    • 使用服务账户密钥加密
  4. 封装并提交

    • 同样封装为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 初始化阶段

  1. 获取命令行参数:

    • 用户(user)
    • 域(domain)
    • 服务(service)
    • 目标(target)
    • SID(sid)
    • 密钥(rc4/aes128/aes256)
  2. 初始化Kerberos认证包:

    • 通过LsaConnectUntrusted建立连接
    • 通过LsaLookupAuthenticationPackage获取Kerberos包标识符

4.2 构建PAC结构

  1. 生成KERB_VALIDATION_INFO:

    • 设置用户信息、组信息等
    • 重要字段:UserId、PrimaryGroupId、GroupIds
  2. 构建PAC_INFO_BUFFER数组:

    • 包含登录信息、客户端信息、校验和等
  3. 计算签名:

    • 服务器签名(使用服务密钥)
    • KDC签名(使用krbtgt密钥)

4.3 构建票据

  1. 设置票据基本信息:

    • 票据版本(tkt-vno=5)
    • 领域(realm)
    • 服务名称(sname)
    • 客户端名称(cname)
  2. 设置时间信息:

    • authtime
    • starttime
    • endtime
    • renew-till
  3. 设置票据标志(flags):

    • 可转发(forwardable)
    • 可更新(renewable)
    • 预认证(pre-authent)
  4. 生成会话密钥:

    • 随机生成会话密钥
  5. 构建EncTicketPart:

    • 包含上述所有信息
    • 包含PAC结构
  6. 加密EncTicketPart:

    • 黄金票据:使用krbtgt密钥加密
    • 白银票据:使用服务密钥加密

4.4 封装为KRB_CRED

  1. 构建KRB_CRED结构:

    • 包含完整的票据信息
    • 包含加密的EncKrbCredPart
  2. ASN.1编码:

    • 使用BER编码规则
    • 确保正确嵌套和标记

4.5 票据传递(Pass The Ticket)

  1. 构建KERB_SUBMIT_TKT_REQUEST:

    • 设置MessageType为KerbSubmitTicketMessage
    • 包含KRB_CRED数据
  2. 调用LsaCallAuthenticationPackage:

    • 提交票据到内存缓存
    • 需要SeTcbPrivilege权限

5. 防御措施

  1. 保护krbtgt账户

    • 定期更改krbtgt密码(两次更改间隔24小时)
    • 监控krbtgt账户活动
  2. 保护服务账户

    • 使用强密码
    • 限制服务账户权限
  3. 检测异常票据

    • 监控异常票据请求
    • 检测票据中的异常时间戳
  4. 启用高级安全功能

    • 启用Kerberos Armoring
    • 使用AES加密而非RC4
  5. 日志监控

    • 监控域控制器上的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环境中危害极大的攻击技术,特别是黄金票据攻击可以完全控制整个域。防御这类攻击需要多层次的防护措施,包括保护关键账户、监控异常活动和使用更强的加密算法。理解这些攻击技术的原理对于有效防御至关重要。

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结构 重要缓冲区类型: 0x00000001: 登录信息(KERB_ VALIDATION_ INFO) 0x00000006: 服务器校验和 0x00000007: KDC校验和 0x0000000A: 客户端名称和票据信息 3.2 KERB_ VALIDATION_ INFO结构 3.3 Ticket ASN.1定义 3.4 KRB_ CRED ASN.1定义 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 黄金票据攻击 6.2 白银票据攻击 7. 总结 Kerberos票据伪造攻击是AD环境中危害极大的攻击技术,特别是黄金票据攻击可以完全控制整个域。防御这类攻击需要多层次的防护措施,包括保护关键账户、监控异常活动和使用更强的加密算法。理解这些攻击技术的原理对于有效防御至关重要。