Kerberos协议
Windows密码储存机制
NTHash
在 Windows中, 存储的密码Hash就叫做 NTHash,也叫做 NTLM,其中NTLM 全称是 “NT LAN Manager”,NTHash 是通过对密码明文进行十六进制和unicode转换,然后md4算法运算后得到(算法表示为MD4(UTF-16-LE(password)) )
NTLM (NT LAN Manager)
早期SMB协议在网络上传输明文口令。后来出现 LAN Manager Challenge/Response验证机制,简称LM,它是如此简单以至很容易就被破解。微软提出了WindowsNT挑战/响应验证机制,称之为NTLM。已经有了更新的NTLM v2以及Kerberos验证体系。NTLM是windows早期安全协议,因向后兼容性而保留下来。
windows为了避免密码以明文形式传输(“原始密码在任何情况下都不能被缓存”,这是一条基本的安全准则),只需要用户提交用户名,如果用户名在SAM文件中,那么会发送一个Challenge(随机生成)给客户端,客户端使用本身密码的ntlm hash来与Challenge进行加密生成Response发送回服务端,服务端用SAM文件中存储的ntlm hash和Response进行加密,生成的值与Response比较如果相等就说明正确,接通服务。NTLM v2相比NTLM v1就是更加安全
SAM
SAM的英文名称是:securityaccountmanager;中文名称是:安全账号管理器
文件中储存着该台电脑的账户和密码的hash,可以被mimikatz直接抓取
Kerberos身份认证
这张图很好的说明了Kerberos的整个结构
Kerberos协议过程主要有两个阶段,第一个阶段是KDC对Client身份认证,第二个阶段是Service对Client身份认证。
DC(Domain Control)
域控,域中的老大,可以批量管理域内成员
KDC(key distributed center)
由域控担当
作用:整个安全认证过程的票据生成管理服务,其中包含两个服务,AS和TGS
AS(authentication service)
作用:为client生成TGT的服务,认证服务
TGS(ticket granting service)
作用:为client生成某个服务的ticket,票据授权服务
AS_REQ(request)
Client 发送用户名 (比如Tom) 到 KDC (Key Distribution Center)以向 AS (Authentication Service)请求 TGT 票据等信息
AS_REP(response)
收到请求后,AS 生成随机字符串 Session Key,使用 Tom 的 NTLM Hash 对 Session Key 加密得到密文 A,再使用账号 krbtgt 的 NTLM Hash 对 Session Key 、 Client Info和 timestamp 加密得到 TGT,A 和 TGT 一起返回给 Client。
TGS-REQ
Client 收到请求后,使用自身的 NTLM Hash 解密 A 就能得到 Session Key,然后使用 Session Key 对 Client Info 和 timestamp 加密得到 B,加上 TGT ,发送给 KDC中的 TGS。
TGS-REP
TGS 收到请求后,使用 krbtgt 的 NTLM Hash 解密 TGT,得到 Session Key 和 timestamp 以及 Client Info,同时,使用 TGT 解密出的 Session Key 解密密文B,得到Client Info 和 timestamp。 比对这两部分解密得到的内容以验证是否通过。通过后,生成一个新的随机数 Session Key2,并用它加密 client info 和 timestamp 得到密文 enc-part;使用服务器计算机的NTLM Hash 对 session key2 和 client info 以及 timestamp 加密得到最终的 Ticket,返回给 Client。
AP-REQ
Client 使用 Ticket 和 enc-part 直接请求某服务。
AP-REP
对Ticket 和 enc-part 解密后进行验证授权。
AD(Active Directory)
活动目录
TGT(ticket-granting ticket)
作用:用于获取ticket的票据
client
想访问某个server的客户端
server
提供某种业务的服务
注意:
-
Kerberos 协议设计的思路就是用来在不受信的环境下进行认证的协议。
-
krbtgt 账号的 NTLM Hash 理论上只存在于 KDC 中。这意味着 TGT 只能由 KDC 来解密。如果krbtgt 账号的NTLM Hash泄露了,那么 TGT 就能被解密甚至伪造。伪造的 TGT 叫做黄金票据。
-
Ticket 是由服务器计算机本身的 NTLM Hash 加密的,Client 不能解密。如果该Hash 泄露,那么就可以解密甚至伪造 Ticket。伪造的 Ticket 叫做白银票据。
-
在上述的流程中,涉及到时间戳 timestamp,由于它的存在,才使得被第三方获取了加密信息 A 、B、TGT不会在短时间内被暴力破解。timestamp 一般时间为8小时。
-
Kerberos 协议和 NTLM 协议都会使用 NTLM Hash 对生成的任意随机数加密,然后比对结果。 Kerberos 的主要区别在于添加了第三方——-KDC参与到认证过程中。
-
Client info 中包含域名信息、Client 名称等
AS-REQ:
当域内某个用户试图访问域中的某个服务,于是输入用户名和密码,本机的Kerberos服务会向KDC的AS认证服务发送一个 AS-REQ认证请求。该请求包中包含: 请求的用户名、客户端主机名、加密类型 和 Authenticator(用户NTLM Hash加密的时间戳) 以及一些 其他信息。
DC:win server 2012 (192.168.10.1)
win server 2008 (192.168.10.2)
net config workstation 查看当前主机域信息
AS-REQ阶段产生的攻击方式
Hash传递
我们如果抓到一台主机的hash,域内其他主机可能与这个主机是相同的hash,我们拿着这个hash去撞其他主机
mimikatz
抓取sid为500的administrator的ntlm哈希
privilege::debug
sekurlsa::logonpasswords
sekurlsa::pth /user:administrator /domain:192.168.10.2 /ntlm:81793eb3f3f3fa9a5320ab13a4db6636
起一个cmd
域内用户枚举
AS-REQ 的 cname 值,当用户不存在时,返回包提示错误,所以造成了改攻击方式。user.txt不需要加上@punished.org,也可以使用udp
密码喷洒
并且当用户名存在,密码正确和错误时,返回包也不一样,所以可以进行用户名密码爆破。这种针对所有用户的自动密码猜测通常是为了避免帐 户被锁定,因为针对同一个用户的连续密码猜测会导致帐户被锁定。所以只有对所有用户同时执行特定的密码登录尝试,才能增加破解的概率, 消除帐户被锁定的概率
针对明文:
AS-REP PASS THE TICKET
AS-REP:当KDC接收到请求之后,通过AD活动目录查询得到该用户的密码Hash,用该密码Hash对请求包的Authenticator进行解密,如果解密 成功,则证明请求者提供的密码正确,而且需要时间戳范围在五分钟内,且不是重放,于是预认证成功。KAS成功认证对方的身份之后,发送响应 包给客户端。响应包中主要包括:krbtgt用户的NTLM Hash加密后的TGT认购权证(即ticket这部分) 和 用户NTLM Hash加密的Login Session key(即最外层 enc-part 这部分) 以及一些其他信息。该Login Session Key的作用是用于确保客户端和KDC下阶段之间通信安全。最后TGT认购权 证、加密的Lgoin Session Key、时间戳 和 PAC等信息会发送给客户端。PAC中包含用户的SID,用户所在的组等一些信息。
在enc-part里面最重要的字段是Login session key,作为下阶段的认证密钥。 AS-REP中最核心的东西就是 Login session-key 和 加密的ticket。正常我们用工具生成的凭据是 .ccache 和 .kirbi 后缀的,用mimikatz,kekeo, rubeus生成的凭据是以 .kirbi 后缀的,impacket 生成的凭据的后缀是 .ccache 。两种票据主要包含的都是Login session-key 和 加密的 ticket,因此可以相互转化。
AS-REP Roasting
在AS-REP阶段,最外层的enc-part是用户密码hash加密的。对于域用户,如果设置了"Do not require Kerberos preauthentication",此时向域控的88端口发送AS-REP内容(enc-part底下的ciper,因为这部分是使用用户hash加密的Login Session Key,通过离线爆破就可以获得用户hash)重新组合,能够拼接成"Kerberos 5 AS-REP etype 23"(18200)的格式,接下来可以通过hashcat对其破解,最终获得明文密码,这就构成了AS-REP Roasting攻击
默认这个功能是不启用的,如果启用AS-REP会返回用户hash加密的sessionkey-as,这样我们就能够用john离线破解
使用Empire下的powerview.ps1查找域中设置了"不需要kerberos预认证"的用户
Import-Module .\powerview.ps1
Get-DomainUser -PreauthNotRequired
这里如果运行了没有东西的化有可能是powershell权限问题,或者就是你没配"不需要kerberos预认证"
krbtgt 账号
krbtgt是域创建时,系统创建的账户,这个账户不能登录,作为密钥分发账户,密码由系统随机生成
黄金票据(Gold Ticket)
攻击者在获取了 krbtgt 账号的 ntlm hash 后,就能自己任意伪造 TGT(包括session key,client info等内容),然后直接发送给 kdc,实现任意权限伪造。
伪造黄金票据所需信息
1. 域名称
2. 域的SID值 #通过whoami /user 去掉最后横线的数字剩下的就是SID
administrator的SID就是500
3. 域的KRBTGT账户NTLM-HASH
这个可以用mimikatz来抓
4. 伪造用户名,可以是任意用户名
伪造黄金票据的方法和工具
mimikatz 会模拟域控,向目标域控请求账号密码信息。 这种方式动静更小,不用直接登陆域控,也不需要提取NTDS.DIT文件。需要域管理员或者其他类似的高权限账户。
dcsync:mimikatz中的功能,可以有效地“假冒”一个域控制器,并可以向目标域控制器请求帐户密码数据。
NTDS.DIT是什么
ntds.dit为ad的数据库(C:\Windows\NTDS),内容有域用户、域组、用户hash等信息,域控上的ntds.dit只有可以登录到域控的用户(如域管用户、DC本地管理员用户)可以访问。
用DCSync导出域内所有用户Hash
利用条件:
Administrators组内的用户
Domain Admins组内的用户
Enterprise Admins组内的用户
域控制器的计算机帐户
先加入一个高权限组
提权 privilege::debug
502对应的SID是krbtgt账户的,同时抓到了NTLM Hash
获取域管理权限
这里我们使用一个普通域用户运行mimikatz
接下来伪造一下票据,先查看,没有票据
得到krbtgt hash之后使用mimikatz中的Kerberos::golden功能生成金票golden.kiribi,即伪造成功的TGT
kerberos::golden /admin:administrator /domain:punished.org /sid:S-1-5-21-2037016-3665143091-4119717394 /krbtgt:53b0436d814b06e3a8c8bf3ed9df4995 /ticket:golden.kiribi
输入我们自己伪造的票据
kerberos::list #查看本地保存的票据,观察client name
这里我们已经成为域管了,普通权限的机子不能使用这个命令
Kerberos PAC 验证
为什么有PAC验证
上面的过程我们发现,整个证明过程只是证明了自己是谁,而并没有权限的划分,PAC的全称(Privilege Account Certificate)是用来验证数据合法性的一个扩展功能,防止PAC欺骗,它被包含在 Kerberos Ticket 中以一个数据结构体存在。 PAC 结构体包含安全标识符,组成员身份,用户配置文件信息和密码凭据等信息,防止攻击者利用篡改的 PAC 信息实现未授权访问。通俗的说就是防止越权访问。
认证过程
下图显示了Kerberos PAC 认证过程。
默认情况下 PAC 验证是不开启的,开启后会增加一些网络和性能上的消耗。
MS14-068 漏洞,就是基于 PAC 认证的错误,从而导致域内普通用户可以伪造凭据,从而提权到管理员权限。
参考
https://green-m.me/2019/01/24/play-with-kerberos/#0x01-nthash-%E5%92%8C-net-ntlm