欢迎光临
我们一直在努力

Kerberos协议概述

1. Kerberos协议概述

1.1 历史背景与设计目标

Kerberos是一种基于密钥的网络认证协议,由麻省理工学院(MIT)在20世纪80年代开发,其名称来源于希腊神话中的三头犬守护者。Kerberos的设计目标是在不安全的网络环境中提供强大的身份认证服务,确保通信双方的身份真实性。

1.2 核心设计原则

  • 第三方信任模型:依赖可信的密钥分发中心(KDC)

  • 对称加密基础:使用共享密钥进行加密认证

  • 票据时效性:所有票据都有明确的有效期限制

  • 单点登录体验:用户只需登录一次即可访问多个服务

2. Kerberos核心组件详解

2.1 密钥分发中心(KDC)

KDC是Kerberos体系的核心权威机构,包含两个关键服务:

认证服务(AS)
  • 职责:验证用户初始身份,颁发票据授予票据(TGT)

  • 工作时机:用户首次登录时激活

  • 关键数据:存储所有用户的密码哈希,用于生成客户端密钥

票据授予服务(TGS)
  • 职责:基于TGT颁发具体服务的访问票据

  • 工作时机:用户请求访问特定服务时

  • 关键数据:存储所有服务账户的密码哈希

2.2 票据(Ticket)系统

票据是Kerberos认证的核心载体,采用分层加密设计:

票据授予票据(TGT)

TGT结构:
– 客户端身份信息(用户名、域名)
– 时间戳和有效期(通常8-10小时)
– 客户端-TGS会话密钥(Client/TGS Session Key)
– 加密方式:使用TGS密钥(krbtgt账户的NTLM Hash)加密

服务票据(Service Ticket)

服务票据结构:
– 客户端身份信息
– 时间戳和有效期(较短,通常几分钟到几小时)
– 客户端-服务器会话密钥(Client/Server Session Key)
– 加密方式:使用目标服务的NTLM Hash加密

2.3 会话密钥(Session Key)机制

会话密钥是临时生成的对称密钥,用于保护客户端与各个服务之间的通信安全:

# 会话密钥生成原理(伪代码)
def generate_session_key():
# 使用强随机数生成器
random_bytes = os.urandom(16) # 128位密钥
session_key = hashlib.sha256(random_bytes).digest()[:16]
return session_key

3. Kerberos认证流程深度解析

3.1 第一阶段:初始认证(AS-REQ/AS-REP)

客户端请求(AS-REQ):

# 客户端发送的认证请求包含:
as_request = {
'username': 'alice', # 明文用户名
'domain': 'company.com', # 域名
'timestamp': current_time, # 当前时间戳
'requested_services': ['TGS'] # 请求TGS服务
}

AS响应(AS-REP):

# AS返回的响应包含双重加密结构:
as_response = {
'part_a': encrypt({
'client_tgs_session_key': session_key,
'tgt_validity': '8 hours'
}, client_key), # 使用客户端密钥加密

'part_b': encrypt({
'client_info': 'alice@company.com',
'client_tgs_session_key': session_key,
'timestamp': issuance_time
}, tgs_key) # 使用TGS密钥加密(TGT)
}

3.2 第二阶段:服务授权(TGS-REQ/TGS-REP)

客户端向TGS请求服务票据:

tgs_request = {
'tgt': encrypted_tgt, # 之前获得的TGT
'authenticator': encrypt({
'client_id': 'alice',
'timestamp': current_time
}, client_tgs_session_key), # 使用会话密钥加密
'requested_service': 'file_server'
}

TGS验证与响应:

# TGS验证步骤:
1. 使用TGS密钥解密TGT,获取client_tgs_session_key
2. 使用client_tgs_session_key解密authenticator
3. 验证时间戳 freshness(防止重放攻击)
4. 比较TGT和authenticator中的客户端身份信息

# 响应包含服务票据:
tgs_response = {
'service_ticket': encrypt({
'client_server_session_key': new_session_key,
'client_info': 'alice@company.com',
'validity_period': '1 hour'
}, service_key), # 使用服务密钥加密

'session_info': encrypt({
'client_server_session_key': new_session_key
}, client_tgs_session_key) # 客户端可解密部分
}

3.3 第三阶段:服务访问(AP-REQ/AP-REP)

客户端向服务端出示票据:

ap_request = {
'service_ticket': encrypted_service_ticket,
'authenticator': encrypt({
'client_id': 'alice',
'timestamp': current_time
}, client_server_session_key)
}

服务端验证流程:

def verify_service_ticket(ap_request):
# 1. 使用服务密钥解密服务票据
ticket_data = decrypt(ap_request.service_ticket, service_key)

# 2. 提取客户端-服务器会话密钥
client_server_key = ticket_data.client_server_session_key

# 3. 使用会话密钥解密认证器
authenticator = decrypt(ap_request.authenticator, client_server_key)

# 4. 验证时间戳和客户端身份
if not verify_timestamp(authenticator.timestamp):
return False # 可能为重放攻击

if authenticator.client_id != ticket_data.client_info:
return False # 身份不匹配

return True # 认证成功


 

票据生命周期:

4. Kerberos安全机制分析

4.1 重放攻击防护

Kerberos通过多重机制防御重放攻击:

时间戳验证:

def is_timestamp_valid(received_ts, current_ts, tolerance=5 * 60):
"""检查时间戳是否在可接受范围内(默认5分钟)"""
return abs(received_ts – current_ts) <= tolerance

票据单次使用:

  • 认证器(Authenticator)设计为一次性使用

  • 服务器维护最近接收的认证器缓存,拒绝重复使用

4.2 加密安全保障

# Kerberos使用的加密算法演进
encryption_algorithms = {
'Kerberos 4': 'DES', # 已淘汰,安全性不足
'Kerberos 5': 'AES-128/256', # 现代标准
'Windows扩展': 'RC4-HMAC' # 向后兼容
}

5. Kerberos攻击技术深度分析

5.1 票据伪造攻击

黄金票据(Golden Ticket)攻击

攻击原理:

  • 获取krbtgt账户的NTLM Hash(域控制器的最高权限)

  • 伪造任意用户的TGT,完全绕过KDC认证

技术实现:

def create_golden_ticket(krbtgt_hash, target_user, domain_sid):
# 使用krbtgt哈希生成伪造TGT
golden_tgt = {
'user_sid': f"{domain_sid}-500", # 管理员RID
'username': target_user,
'groups': ['Domain Admins', 'Enterprise Admins'],
'validity': '10 years', # 超长有效期
'session_key': generate_session_key()
}

# 使用krbtgt哈希加密伪造的TGT
encrypted_tgt = encrypt(golden_tgt, krbtgt_hash)
return encrypted_tgt

检测与防御:

  • 监控krbtgt密码更改频率(正常情况应定期更改)

  • 实施票据签名验证(PAC验证)

  • 使用高级威胁检测工具监控异常票据活动

白银票据(Silver Ticket)攻击

攻击原理:

  • 获取特定服务账户的NTLM Hash

  • 伪造针对该服务的服务票据,绕过TGS验证

技术特点:

def create_silver_ticket(service_hash, target_service, client_user):
silver_ticket = {
'client_user': client_user,
'service_name': target_service,
'session_key': generate_session_key(),
'validity': '1 hour' # 较短有效期
}

# 使用服务账户哈希加密
encrypted_ticket = encrypt(silver_ticket, service_hash)
return encrypted_ticket

黄金票据 vs 白银票据:核心区别

黄金票据(Golden Ticket):伪造TGT

# 黄金票据攻击本质:伪造"身份证办理凭证"
golden_ticket_analogy = {
'攻击目标': 'TGT(票据授予票据)',
'类比': '伪造身份证办理机构的授权凭证',
'攻击点': '在客户端↔TGS之间',
'所需条件': 'krbtgt账户的NTLM Hash',
'影响范围': '整个域的所有服务'
}

白银票据(Silver Ticket):伪造服务票据

# 白银票据攻击本质:伪造具体服务的"入场券"
silver_ticket_analogy = {
'攻击目标': 'Service Ticket(服务票据)',
'类比': '直接伪造某个具体场所的入场券',
'攻击点': '在客户端↔服务端之间',
'所需条件': '目标服务账户的NTLM Hash',
'影响范围': '仅针对特定服务'
}

技术原理深度解析

黄金票据:为什么能绕过AS但不能绕过TGS?

攻击原理:

class GoldenTicketAttack:
def explain_mechanism(self):
"""
黄金票据攻击机制:
1. TGT是使用krbtgt账户的NTLM Hash加密的
2. 攻击者获取krbtgt Hash后,可以自己生成TGT
3. 但服务票据仍然需要向TGS请求获得
"""
attack_flow = {
'step1': '获取krbtgt的NTLM Hash',
'step2': '伪造TGT(包含任意用户信息)',
'step3': '向TGS发送伪造的TGT请求服务票据',
'step4': 'TGS验证TGT签名(使用krbtgt Hash)',
'step5': '由于签名正确,TGS返回合法服务票据',
'关键点': 'TGS只验证TGT签名,不验证用户密码'
}

为什么不能完全绕过KDC?

# TGS的验证逻辑
def tgs_verification_logic(received_tgt, authenticator):
# 1. 使用krbtgt Hash解密TGT(黄金票据能通过这步)
tgt_data = decrypt_tgt(received_tgt, krbtgt_hash)

# 2. 使用TGT中的会话密钥解密认证符
auth_data = decrypt_authenticator(authenticator, tgt_data.session_key)

# 3. 验证时间戳(防重放)
if not verify_timestamp(auth_data.timestamp):
return False

# 4. 比较客户端身份信息
if tgt_data.client_id == auth_data.client_id:
return True # 验证通过,发放服务票据

return False

白银票据:为什么能完全绕过KDC?

攻击原理:

class SilverTicketAttack:
def explain_mechanism(self):
"""
白银票据攻击机制:
1. 服务票据是使用服务账户的NTLM Hash加密的
2. 攻击者获取服务账户Hash后,直接伪造服务票据
3. 完全跳过AS和TGS,直接与服务端交互
"""
attack_flow = {
'step1': '获取目标服务账户的NTLM Hash',
'step2': '直接伪造服务票据(包含会话密钥)',
'step3': '向服务端发送伪造的服务票据',
'step4': '服务端验证票据签名(使用服务账户Hash)',
'step5': '由于签名正确,服务端接受连接',
'关键点': '服务端只验证票据签名,不联系KDC验证'
}

更准确的对比表:

特性

黄金票据(Golden Ticket)

白银票据(Silver Ticket)

伪造对象​

TGT(票据授予票据)

Service Ticket(服务票据)

攻击阶段​

在TGS之前介入

在AP-REQ阶段介入

加密密钥​

krbtgt账户的NTLM Hash

目标服务账户的NTLM Hash

KDC交互​

需要与TGS交互

完全绕过KDC

检测难度​

相对容易(有TGS日志)

更难(无中心日志)

影响范围​

整个域的所有服务

仅特定服务

PAC验证​

可能被PAC验证检测到

绕过PAC验证(如果服务端不严格)

5.2 票据传递攻击(Pass-the-Ticket)

攻击场景:

  • Overpass-the-Hash:将用户哈希转换为Kerberos票据

  • Pass-the-Ticket:直接使用窃取的票据进行认证

  • 防御措施:

    # 增强的票据验证机制
    def enhanced_ticket_validation(ticket, client_ip, device_info):
    # 验证票据来源IP与历史模式是否一致
    if not validate_ip_consistency(ticket, client_ip):
    return False

    # 验证设备指纹信息
    if not validate_device_fingerprint(ticket, device_info):
    return False

    # 实施多因素认证
    if requires_mfa(ticket.target_service):
    return verify_mfa(client_user)

    return True

    5.3 Kerberos中继攻击

    攻击原理:

    • 攻击者截获Kerberos认证流量并转发到其他服务

    • 利用服务端不验证请求来源的漏洞

    防护方案:

    • 实施SMB签名(SMB Signing)

    • 启用EPA(Extended Protection for Authentication)

    • 配置服务约束委派(Constrained Delegation)

    6. Kerberos票据流转与交互关系表

    Kerberos票据流转总览

    票据类型

    交互双方

    产生步骤

    输入材料

    输出结果

    下一步交给谁

    票据作用与内容

    TGT
    (票据授予票据)​

    客户端 ↔ AS​

    第一阶段
    AS-REQ/AS-REP

    • 客户端:用户名
    • AS:用户NTLM Hash
    • AS:krbtgt NTLM Hash

    • 加密的TGT
    • Client/TGS Session Key

    客户端保存,后续交给TGS

    作用:证明客户端已通过身份验证,有权向TGS请求服务票据
    内容:
    – 客户端身份信息
    – 时间戳和有效期(8-10小时)
    – Client/TGS Session Key
    – 加密:krbtgt NTLM Hash

    服务票据
    (Service Ticket)​

    客户端 ↔ TGS​

    第二阶段
    TGS-REQ/TGS-REP

    • 客户端:TGT + 认证符
    • TGS:krbtgt NTLM Hash
    • TGS:服务账户NTLM Hash

    • 加密的服务票据
    • Client/Server Session Key

    客户端保存,后续交给目标服务端

    作用:授权客户端访问特定服务
    内容:
    – 客户端身份信息
    – 目标服务信息
    – 时间戳和有效期(较短)
    – Client/Server Session Key
    – 加密:服务账户NTLM Hash

    认证符
    (Authenticator)​

    客户端 → TGS
    客户端 → 服务端​

    第二、三阶段
    TGS-REQ/AP-REQ

    • 客户端:客户端身份
    • 客户端:Session Key

    • 加密的认证符

    随请求发送给验证方

    作用:证明客户端是票据的合法持有者
    内容:
    – 客户端ID
    – 当前时间戳
    – 可选的子会话密钥
    – 加密:对应的Session Key

    详细交互流程表格

    第一阶段:身份认证(AS交换)

    步骤

    发起方

    接收方

    发送内容

    使用密钥

    返回结果

    下一步动作

    1

    客户端

    AS

    AS-REQ:
    – 用户名(明文)
    – 域名

    无加密

    等待响应

    等待AS验证

    2

    AS

    AD数据库

    查询用户NTLM Hash

    系统内部

    用户Hash

    生成会话密钥

    3

    AS

    客户端

    AS-REP:
    – Part A: Client/TGS Session Key
    – Part B: TGT

    Part A: 用户NTLM Hash
    Part B: krbtgt NTLM Hash

    加密的TGT和Session Key

    客户端解密Part A

    第二阶段:服务授权(TGS交换)

    步骤

    发起方

    接收方

    发送内容

    使用密钥

    返回结果

    下一步动作

    4

    客户端

    TGS

    TGS-REQ:
    – TGT(来自AS-REP)
    – 认证符

    认证符: Client/TGS Session Key

    等待响应

    TGS验证TGT

    5

    TGS

    AD数据库

    查询服务账户NTLM Hash

    系统内部

    服务账户Hash

    生成服务票据

    6

    TGS

    客户端

    TGS-REP:
    – 服务票据
    – Session Key信息

    服务票据: 服务账户NTLM Hash
    Session信息: Client/TGS Session Key

    加密的服务票据

    客户端准备访问服务

    第三阶段:服务访问(AP交换)

    步骤

    发起方

    接收方

    发送内容

    使用密钥

    返回结果

    下一步动作

    7

    客户端

    服务端

    AP-REQ:
    – 服务票据
    – 认证符

    认证符: Client/Server Session Key

    等待验证

    服务端解密验证

    8

    服务端

    客户端

    AP-REP:
    – 时间戳确认
    – 可选的子密钥

    Client/Server Session Key

    认证成功确认

    建立安全会话

    密钥使用关系表

    密钥类型

    拥有者

    生成者

    使用场景

    加密对象

    验证者

    用户NTLM Hash​

    用户/AS

    系统(基于密码)

    AS-REP中加密Session Key

    Client/TGS Session Key

    客户端(解密)

    krbtgt NTLM Hash​

    KDC

    域安装时生成

    TGT的加密/解密

    TGT票据

    AS/TGS

    服务账户NTLM Hash​

    服务端/KDC

    服务安装时设置

    服务票据的加密/解密

    Service Ticket

    TGS/服务端

    Client/TGS Session Key​

    客户端/TGS

    AS随机生成

    TGS-REQ认证符加密

    Authenticator

    TGS

    Client/Server Session Key​

    客户端/服务端

    TGS随机生成

    AP-REQ认证符加密

    Authenticator

    服务端

    攻击路径与防御对应表

    攻击类型

    攻击目标票据

    攻击者需要

    攻击发生阶段

    防御措施

    黄金票据攻击​

    TGT

    krbtgt账户的NTLM Hash

    第一阶段后,第二阶段前

    • 定期轮换krbtgt密码
    • 监控TGT签发异常
    • PAC验证

    白银票据攻击​

    服务票据

    服务账户的NTLM Hash

    完全绕过前两阶段

    • 使用gMSA账户
    • 服务账户密码轮换
    • SMB签名

    票据传递攻击​

    所有票据

    窃取的有效票据

    任何阶段

    • 票据生命周期限制
    • 设备绑定验证
    • 多因素认证

    重放攻击​

    认证符

    截获的认证数据

    第二、三阶段

    • 时间戳验证
    • 认证符单次使用
    • 网络加密

    错误处理与异常流程

    异常情况

    检测点

    处理动作

    错误代码

    后续流程

    TGT过期

    TGS

    拒绝请求,返回错误

    KRB_AP_ERR_TKT_EXPIRED

    客户端重新向AS请求认证

    服务票据过期

    服务端

    拒绝服务访问

    KRB_AP_ERR_TKT_EXPIRED

    客户端重新向TGS请求服务票据

    认证符时间戳偏差

    TGS/服务端

    拒绝请求

    KRB_AP_ERR_SKEW

    客户端同步时间后重试

    加密类型不匹配

    所有阶段

    协商或拒绝

    KRB_AP_ERR_ETYPE_NOSUPP

    使用支持的加密类型重试

    PAC验证失败

    服务端

    拒绝访问

    KDC_ERR_PREAUTH_FAILED

    需要额外身份验证

    这个完整的表格体系清晰地展示了Kerberos协议中所有票据的流转路径、交互关系和安全性考虑,为深入理解Kerberos认证机制提供了系统性的参考框架。

    赞(0)
    未经允许不得转载:171主机测评 » Kerberos协议概述
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址