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
