内网渗透协议学习
字数 3121 2025-08-06 01:23:31
内网渗透协议学习文档
Kerberos协议详解
基本概念与角色
Kerberos是一种由MIT提出的网络身份验证协议,通过密钥加密技术为客户端/服务器应用程序提供强身份验证。
核心角色:
- Client(用户):发出访问服务的角色
- Server(服务):提供服务的角色
- KDC(Key Distribution Center):密钥分发中心,默认安装在域控中
关键名词:
- AD(Account Database):账户数据库
- Master Key:用户密码的hash值
- Ticket(票据):域网络对象相互访问的凭证
- TGT(Ticket Granting Ticket):用于向KDC获取服务票据的凭证
- TGS(Service Ticket):用于向Server请求服务的凭证
- Authentication Service:认证Client身份并发放TGT的服务
- Ticket Granting Service:检验TGT并生成TGS的服务
Kerberos认证流程
-
AS_REQ(认证服务请求):
- Client向KDC发送请求,凭据是Client的hash加密的时间戳
- 包含预认证数据(PA-ENC-TIMESTAMP和PA-PAC-REQUEST)
-
AS_REP(认证服务响应):
- KDC验证成功后返回TGT
- TGT使用krbtgt的NTLM hash加密
-
TGS_REQ(票据发放服务请求):
- Client凭借TGT向KDC请求特定服务的TGS
-
TGS_REP(票据发放服务响应):
- KDC验证TGT后返回TGS
- TGS使用目标服务的hash加密
-
AP_REQ(服务请求):
- Client凭借TGS向Server发起服务请求
-
AP_REP(服务响应):
- Server验证TGS后返回服务响应
AS_REQ数据包结构分析
- pvno:Kerberos版本号(通常为5)
- msg-type:消息类型(krb-as-req)
- padata:预认证数据列表
- PA-ENC-TIMESTAMP:Client用Master Key加密的时间戳
- PA-PAC-REQUEST:关于微软PAC扩展的请求
- req-body:
- kdc-options:KDC选项标识位
- cname:Client主机名(PrincipalName类型)
- realm:服务端域名
- sname:服务端身份(krbtgt和所属域)
- till:到期时间
- etype:加密类型列表
- addresses:地址信息
AS_REP数据包结构分析
- msg-type:krb-as-rep
- padata:加密类型信息
- crealm:Client所属域
- cname:Client身份名
- ticket:TGT票据
- tkt-vno:票据版本
- realm:KDC所属域
- sname:krbtgt身份
- enc-part:使用krbtgt的NTLM hash加密的TGT主体
- enc-part:使用Client的hash加密的Session key
TGS_REQ数据包结构分析
- msg-type:krb-tgs-req
- padata:
- PA-TGS-REQ:包含TGT票据
- PA-PAC-OPTIONS:PAC选项
- req-body:
- realm:域信息
- sname:请求的服务名称
- till:到期时间
- etype:加密类型列表
TGS_REP数据包结构分析
- msg-type:krb-tgs-rep
- crealm:Client所属域
- cname:Client身份名
- ticket:最终服务票据
- 使用目标服务的hash加密
- 包含Server session key、Client info、到期时间
- enc-part:使用Session key加密的Server session key
Kerberos安全问题
-
用户名枚举:
- 用户名不存在:错误码6(KDC_ERR_C_PRINCIPAL_UNKNOWN)
- 密码错误:错误码24(KDC_ERR_PREAUTH_FAILED)
- 通过错误码差异可枚举有效用户名
-
黄金票据攻击:
- TGT使用krbtgt的NTLM hash加密
- 获取krbtgt hash后可伪造任意TGT
- 可绕过密码验证直接获取服务访问权限
NTLM协议详解
Windows密码存储机制
Windows不保存明文密码,只保存密码hash:
- 本地用户hash存储在SAM文件中
- 域用户hash存储在域控的NTDS.DIT文件中
格式示例:
Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0:::
- LM Hash:AAD3B435B51404EEAAD3B435B51404EE
- NTLM Hash:31D6CFE0D16AE931B73C59D7E0C089C0
LM Hash算法
- 将密码转为大写并转为十六进制字符串,不足14字节补0
- 分成两个7byte部分,每部分转为56bit byte流
- 分为7bit一组,每组末尾加0凑足8bit
- 两组分别作为Key对"KGS!@#$%"进行DES加密
- 加密结果拼接得到最终LM Hash
LM Hash弊端:
- 密码长度限制为14字符
- 不区分大小写
- 后半部分为固定值表示密码≤7位
- DES加密强度不足
NTLM Hash算法
- 将密码转为十六进制形式
- 进行unicode编码
- 使用MD4算法对编码结果进行hash计算
NTLM本地认证流程
- 用户输入密码后,winlogon将密码交给lsass进程
- lsass将明文密码加密为NTLM hash
- 与SAM数据库中的hash比对验证
关键组件:
- winlogon:Windows登录进程
- lsass:本地安全认证服务
- SAM:安全账户管理数据库(%systemroot%\system32\config\SAM)
NTLM身份验证机制
采用Challenge/Response验证机制,分为三步:
-
协商:
- Client发送用户信息和功能列表
-
质询:
- Server返回支持的功能列表和随机Challenge
-
身份验证:
- Client使用NTLM hash和Challenge计算Response
- 返回Response、用户名和Challenge
关键概念:
- Challenge:服务端生成的随机字符(NTLMv1为8位,v2为16位)
- Net-NTLM hash:基于用户hash生成的中间值
- Response:本质上是Net-NTLM hash
渗透测试相关技术点
Kerberos攻击面
-
AS-REP Roasting:
- 针对不需要预认证的账户
- 获取AS-REP响应后可离线破解
-
Kerberoasting:
- 请求服务票据(TGS)
- 离线破解服务账户密码
-
黄金票据:
- 需要krbtgt的NTLM hash
- 可生成任意TGT
-
白银票据:
- 需要服务账户的NTLM hash
- 伪造特定服务的TGS
NTLM攻击面
-
Pass-the-Hash:
- 直接使用NTLM hash进行认证
- 不需要知道明文密码
-
NTLM Relay:
- 中继NTLM认证到其他系统
- 可提升权限或横向移动
-
Net-NTLMv1破解:
- v1协议安全性较低
- 可离线破解获得NTLM hash
防御建议
-
Kerberos防御:
- 禁用RC4加密,使用AES
- 启用PAC验证
- 监控异常票据请求
-
NTLM防御:
- 禁用LM Hash和NTLMv1
- 启用SMB签名
- 限制NTLM使用范围
-
通用防御:
- 定期轮换krbtgt密码
- 监控异常认证活动
- 实施最小权限原则