Kerberos协议非常复杂,学习时每篇文章都有不同之处,本篇文章查询了MSDN,尽量保证准确性,后续学习过程中如果发现内容有误会及时更正。
认证协议
LM
LAN Manager Challenge/Response 验证机制,简称LM。该方案比NTLM响应时间更早,安全性更低。
认证流程:
- A向B发起请求。
- B返回一个8字节的响应码。
- A将自己的LM Hash分成三部分,每组7字节,每组都使用响应码对其进行加密,然后发送给B。
- 然后B也执行和A相同的操作,不过LM Hash是储存在服务器中A的LM Hash。
- 两个LM-Hash进行比较,一致即认证成功。
NTLM
NTLM身份验证采用Challenge/Response机制,由协商、质询、身份验证三步组成。
域环境认证流程:
- 用户访问客户端计算机并提供域名、用户名和密码。客户端计算密码的加密哈希并丢弃实际密码。
- 客户端将用户名以明文形式发送到服务器。
- 服务器判断用户名是否存在,存在则生成一个16字节的随机数,称为Challenge或Nonce,并返回给客户端。
- 客户端使用用户密码的Hash对服务器返回的随机数进行加密,并将结果返回给服务器,被称为Response。
- 服务器向域控发送以下三项信息:
- 用户名
- 发送给客户端的Challenge
- 从客户端收到的Response
- 域控使用用户名从安全账户管理器数据库中检索用户密码的Hash,并使用此Hash加密Challenge。
- 域控将加密后的Challenge与客户端计算出的Response进行比较,如果相同则认证成功。
Net-NTLMv1
服务器返回8位Challenge,Response加密算法3DES。
Net-NTLMv2
从Windows Vista起,默认使用Net-NTLMv2协议。 服务器返回16位Challenge,Response加密算法HMAC-MD5。
Kerberos
Kerberos协议构成:客户端、服务器、KDC(Key Distribution Center 密钥分发中心)
相关信息
角色 | 作用 |
---|---|
Key Distributed Centser | 密钥分发中心,包含AS和TGS两个服务 |
Authentication Service | 身份验证服务,用于KDC对Client认证生成TGT |
Ticket Granting Ticket | 票据授予票据,用于向KDC获取服务票据的凭证 |
Ticket Granting Service | 票据授予服务,用于KDC为Client生成ST |
Active Directory | 活动目录,用于存储用户、用户组、域相关的信息 |
Server Ticket | 服务票据,也被称为 TGS Ticket,用于访问服务的凭证 |
Application Server | 应用服务器,提供用户所需服务 |
krbtgt | 密钥发行中心服务帐户,不可登陆,发放票据时会使用它的NTLM Hash |
认证流程
AS_REQ
当域内某个客户端试图访问域内的某个服务,输入用户名密码后,客户端会向AS发送AS_REQ(身份验证服务请求):
用户名、请求的服务 请求凭据(使用用户密码Hash加密的时间戳)
AS_REP
KDC检查用户是否在本地数据库,存在则使用存储在本地的NTLM Hash解密凭据验证用户身份,如验证通过且时间戳在有效期内(5分钟),则返回AS_REP(身份验证服务回复):
用户名 TGT:用户名、会话密钥、TGT有效期、具有用户权限的PAC,使用krbtgt账户NTLM Hash加密 Session-Key: 使用用户的NTLM Hash加密
此时,用户拥有 TGT,可用于请求 TGS,然后访问服务。
TGS_REQ
客户端收到消息后,使用自己的NTLM Hash解密AS_REP返回的TGT,得到会话密钥。 然后向TGS发送请求TGS_REQ(票据授予服务请求):
TGT 请求服务的SPN Authenticator:使用会话密钥加密的用户名、时间戳等信息
TGS_REP
TGS收到TGS_REQ后,先在KDC中查找服务的SPN是否存在,如存在使用自己的TGS密钥解密TGS_REQ发送的TGT,得到会话密钥。 使用会话密钥解密TGS_REQ中的Authenticator,验证通过后向客户端发送TGS_REP(票据授予服务回复):
用户名 ST(Server Ticket):用户名、服务会话密钥、票据有效期等信息,使用请求服务的NTLM Hash加密 使用会话密钥加密的服务会话密钥
AP_REQ
客户端使用会话密钥解密TGS,得到服务会话密钥,将ST票据和服务会话密钥缓存到本地。当客户端需要访问某个服务端上的服务时,会向服务端发送AP_REQ(应用程序请求)。
Authenticator:使用服务会话密钥加密的时间戳等信息 ST
AP_REP(可选)
服务端使用自己的NTLM Hash解密ST,获取服务会话密钥、授权用户信息。 服务端使用服务会话密钥解密Authenticator等信息,与ST对比,通过验证后与客户端进行双向验证(此过程需要开启PAC验证服务,没有配置PAC可能会导致白银票据攻击):
双向验证过程:
1. 服务端验证客户端:
i. 服务端发送PAC询问KDC用户有无访问权限。
ii. KDC解密PAC通过SID判断用户组信息、权限等返回给服务端。
iii. Server收到信息并与请求服务的ACL进行比较,决定是否提供服务。
2. 客户端验证服务端:
i. 服务端发送Authenticator(使用服务会话密钥的时间戳)给客户端。
ii. 客户端解密成功则证明验证服务会话密钥一致,双向验证通过。
iii. 服务端开放服务,客户端访问服务。
加密方式
Windows只保存密码Hash值。
格式:Username:RID:LM-Hash:NTLM-Hash
(LM-Hash从Windows Vista开始为空)
工作组环境用户信息保存在%SystemRoot%\System32\config\SAM
域环境用户信息保存在域控C:\Windows\NTDS\NTDS.dit
LM Hash
LM Hash从Windows Vista开始默认禁用。
启用方式:
本地安全策略 => 本地策略 => 安全选项,将不储存LAN管理器哈希值改为禁用。
加密过程:
- 用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。
- 密码的16进制字符串被分成两个7byte部分。每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度。
- 再分7bit为一组,每组末尾加0,再组成一组。
- 上步骤得到的二组,分别作为key为KGS!@#$%进行DES加密。
- 将加密后的两组拼接在一起,得到最终LM Hash值。
缺点:
- 口令不区分大小写。
- 口令长度最多为14字节,超过14字节使用NTLM Hash。
- 如果没有超过7字节后面8字节是固定的(aad3b435b51404ee)。
- DES加密key固定(KGS!@#$%)。
NTLM Hash
NTLM Hash是支持Net NTLM认证协议及本地认证过程中的一个重要参与物,其长度为32位,由数字与字母组成。 可以从Windows系统中的SAM文件和域控的NTDS.dit文件中获得所有用户的Hash,通过Mimikatz读取lsass.exe进程能获得已登录用户的NTLM Hsash。
加密过程:
- 将用户密码转换为十六进制格式。
- 将十六进制格式的密码进行Unicode编码。
- 使用MD4摘要算法对Unicode编码数据进行Hash计算。
Net-NTLM Hash
指网络环境下的NTLM认证中的Hash,NTLM认证中的Response包含Net-NTLM Hash。 在NTLM协议中,NTLM响应分为NTLMv1,NTLMv2,NTLM session v2三种协议,不同协议使用不同格式的Challenge和加密算法。
Net-NTLMv1 Hash
格式:username::hostname:LM response:NTLM response:challenge
修改注册表启用:
reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t REG_DWORD /d 2 /f
reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0\ /v NtlmMinClientSec /t REG_DWORD /d 536870912 /f
reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0\ /v RestrictSendingNTLMTraffic /t REG_DWORD /d 0 /
8位Challenge,Response加密算法3DES。 这种方式相对脆弱,可以基于抓包工具和彩虹表爆破工具进行破解。
Net-NTLMv2 Hash
格式:username::domain:challenge:HMAC-MD5:blob
16位Challenge,Response加密算法HMAC-MD5。
参考链接
https://xz.aliyun.com/t/8187
https://xz.aliyun.com/t/10491
https://www.t00ls.cc/thread-63319-1-1.html
https://websec.readthedocs.io/zh/latest/auth/index.html
https://docs.microsoft.com/zh-cn/archive/blogs/apgceps/packerberos-2