Kerberos認證原理
Kerberos是一種認證機制,目的是通過密鑰系統為客戶端/服務器應用程式提供強大的可信任的第三方認證服務:保護服務器防止錯誤的用戶使用,同時保護它的用戶使用正確的服務器,即支持雙向驗證,kerberos最初由MIT麻省理工開發,微軟從Windows 2000開始支持Kerberos認證機制,將kerberos作為域環境下的主要身份認證機制,理解kerberos是域滲透的基礎,
kerberos認證框架
kerberos機制中主要包含三個角色:Client、Server、KDC(Key Distribution Center)密鑰分發中心,Client代表用戶,用戶有自己的密碼,Server上運行的服務也有自己的密碼,KDC是受信任的三方認證中心,它擁有用戶和服務的密碼資訊,KDC服務默認會安裝在域控中,Client想要訪問Server的服務(xxx service),前提是通過KDC認證,再由KDC發放的票據決定Client是否有權限訪問Server的服務,框架圖如下:
kerberos認證術語初識
KDC(Key Distribution center):密鑰分發中心,在域環境中,KDC服務默認會安裝在域控中,
AS(Authentication Service):認證服務,驗證client的credential(身份認證資訊),發放TGT,
TGT(Ticket Granting ticket):票據授權票據,由KDC的AS發放,客戶端獲取到該票據后,以后申請其他應用的服務票據(ST)時,就不需要向KDC的AS提交身份認證資訊(credential),TGT具有一定的有效期,
TGS(Ticket Granting Service):票據授權服務,驗證TGT,發放ST,
ST(Service Ticket):服務票據,由KDC的TGS發放,是客戶端應用程式訪問Server某個服務的憑證,Server端驗證通過則完成Client與Server端信任關系的建立,
先由簡到繁地去梳理以上術語的關系,首先Client想要訪問Server的某個服務,就需要通過KDC的認證,獲取到服務票據(ST),服務會驗證服務票據(ST)來判斷Client是否通過了KDC認證,為了避免Client每次訪問Server的服務都要向KDC認證(輸入密碼),KDC設計時分成了兩個部分,一個是AS,另一個是TGS,AS接收Client的認證資訊,認證通過后給Client發放一個可重復使用的票據TGT,后續Client使用這個TGT向TGS請求ST即可,
Authenticator:驗證器,不能重復使用,與票據(時效內能重復使用)結合用來證明Client宣告的身份,防止票據被冒用,
windows域kerberos認證流程
第一步 AS認證(獲取TGT)
請求:Client 向KDC的AS發起認證請求,身份認證資訊包含了用戶密碼hash(user_hash)加密的timestamp預認證資訊pre-authentication data,以及用戶名(user)、客戶端資訊(client info)、服務名(krbtgt)等未加密資訊,
生成session key以及TGT:域控中存盤了域中所有用戶密碼hash(user_hash),KDC的AS依據用戶名查找相應的user_hash,成功解密預認證資訊,驗證客戶端通過,然后會生成一個sessionkey-TGS(后續用于加密Client與TGS通信),以及TGT(由krbtgt hash加密的sessionkey-TGS、user、client info、lifetime、timestamp等資訊),
注:krbtgt賬戶是創建域時系統自動創建的,可以認為是為了kerberos認證服務而創建的賬號,
注:TGT是KDC加密的,Client無法解密,并且具有有效期,客戶端用其向TGS請求ST,
回應:AS用user_hash加密sessionkey-TGS,與TGT一起生成REP回應發送給客戶端,客戶端解密回應成功說明資料包是KDC發送來的,并且獲得sessionkey-TGS以及TGT,sessionkey-TGS用于后續加密通信,
第二步 TGS認證(獲取ST)
通過第一步,客戶端解密AS的回應后,可以得到一個sessionkey-TGS以及TGT,
請求:用戶想訪問Aservice服務,于是向TGS請求訪問Aservice的ST,首先客戶端會生成驗證器Authenticator,內容包含user、client info、lifetime、timestamp資訊,并且用sessionkey-TGS加密,客戶端將驗證器、Aservice資訊、TGT發送給TGS請求ST,
生成session key以及ST:TGS收到請求,利用krbtgt hash解密TGT,獲取到sessionkey-TGS,user、client info等資訊,然后利用sessionkey-TGS解密驗證器,校驗驗證器和TGT中的user資訊,如果一致,則說明該請求符合TGT中宣告的用戶,該用戶是通過AS認證的,然后TGS會為用戶user和服務Aservice之間生成新的session key sessionkey-Aservice,并用sessionkey-TGS加密sessionkey-Aservice,再生成一個ST,內容包含user、client info、lifetime、timestamp、sessionkey-Aservice,ST用Aservice的service_hash加密,
注:驗證器Authenticator只能使用一次,是為了防止TGT被冒用,kerberos設計之初,產生票據的概念就是為了避免重復的常規密碼驗證,因為票據在有效期內可以重復使用,為了避免冒用,設計出session key以及Authenticator,session key只有真正的客戶端、服務知道,利用session key加密驗證器,服務就可以解密對比驗證器以及票據中宣告的用戶、客戶端資訊是否一致,一致說明票據來自可信客戶端,
回應:TGS將sessionkey-TGS加密后的sessionkey-Aservice以及service_hash加密的ST回應給客戶端,
第三步 服務認證
通過第二步,Client獲取到sessionkey-Aservice以及ST,接下來Client利用sessionkey-Aservice加密Authenticator,連同ST去請求Server的Aservice,Aservice 利用自己的service_hash解密ST,獲得sessionkey-Aservice,再解密Authenticator驗證Client宣告的user資訊,通過認證后Aservice還需要用sessionkey-Aservice加密一段資訊回傳給Client,Client利用sessionkey-Aservice解密成功說明Aservice用自己service_hash成功解密出了sessionkey-Aservice,是可信服務端,
至此,kerberos認證流程完成,Client可訪問Aservice提供的服務,
NTLM認證
NTLM認證采用質詢/應答(Challenge/Response)的訊息交換模式,NTLM既可用于域環境下的身份認證,也可以用于沒有域的作業組環境,主要有本地認證和網路認證兩種方式,
本地認證:
用戶登陸windows時,windows首先會呼叫winlogon.exe行程接收用戶輸入的密碼,之后密碼會被傳遞給lsass.exe行程,行程會先在記憶體中存盤一份明文密碼,并將密碼加密為NTLM hash,與本地SAM資料庫中用戶的NTLM hash對比,一致則登陸成功,
網路認證:
如下為NTLM域環境中網路認證流程,
第一步:首先用戶輸入正確用戶密碼登陸到客戶端主機,用戶想要訪問某個服務器的服務,客戶端先發送一個包含用戶名明文的資料包給服務器,發起認證請求,
第二步:服務器生成一個亂數,稱為Challenge,回傳給客戶端,
第三步:客戶端接收到Challenge后,用密碼hash加密,生成Response,發送給服務,
第四步:服務將Response、用戶名、Challenge發送給域控驗證,域控使用本地資料庫(NTDS.dit)中保存的對應用戶的NTLM hash對Challenge進行加密,得到的結果與Response進行對比,一致則認證成功,然后將認證結果回傳給服務端,
相關攻擊基礎
windows下的用戶密碼hash
windows系統下的用戶密碼hash通常指的是Security Account Manager中保存的用戶密碼hash,也就是SAM檔案中的hash,mimikatz讀取出已登錄用戶的NTLM hash都是同一個hash,域控中NTDS.dit的hash,如下密碼均為Aa123456,都是NTLM hash值,(以下操作均需以管理員權限執行)
SAM中的hash
先匯出sam,mimikatz讀取(本地用戶ate/Aa123456),

mimikatz讀取,

mimikatz從記憶體dump出的hash
如下,cmd運行mimikatz.exe,在mimikatz會話中執行privilege::debug和sekurlsa::logonpasswords,

testdomain\test1密碼Aa123456的hash,
域控中NTDS.dit的hash
如下,testdomain\test1密碼Aa123456的hash,域中先利用ntdsutil匯出NTDS.dit,SYSTEM和SECURITY檔案,
匯出檔案的位置,
利用NTDSDumpEx查看,如下,
PTH
通過前面的內容,可以看到kerberos、NTLM認證程序的關鍵,首先就是基于用戶密碼hash的加密,所以在域滲透中,無法破解用戶密碼hash的情況下,也可以直接利用hash來完成認證,達到攻擊的目的,這就是hash傳遞攻擊(Pass The Hash),如下,192.168.39.100為域控的地址,192.168.39.133為登陸過域管理賬號的終端,獲取到了域管理的hash,在192.168.39.133模擬pth來接管域控,
攻擊成功后獲取到一個shell,雖然是本機的,但可以操控域控,如下:
SPN
SPN 是指服務主體名稱(Service Principal Names),就是一個具體的服務在域里的唯一識別符號,服務要使用kerberos認證,就需要正確配置SPN,服務可以使用別名或者主機名稱向域注冊SPN,注冊完成后,可在域控使用ADSI編輯器連接到LDAP目錄,查看服務的SPN,
SPN分為兩種,一種是注冊在機器賬戶上的,一種是注冊在域用戶賬戶中的,當服務的權限為Local System或Network Service,則SPN注冊在機器帳戶下,當服務的權限為一個域用戶,則SPN注冊在域用戶帳戶下,
比如,域控機器(也是一個機器賬戶)里的DNS服務(用ADSI編輯器連接LDAP查看),

域用戶可向域控LDAP目錄查詢SPN資訊,從而獲取到域內安裝了哪些服務,

抓包可以看到是通過LDAP協議查詢獲得SPN資訊,

通過SPN查詢的方式發現域內的服務相比埠掃描更為隱蔽,但是也有缺陷,可能漏掉一些未注冊的服務,
黃金票據和白銀票據
黃金票據
黃金票據(Golden Ticket)是可換取任意服務票據(ST)的票據授權票據(TGT),前面kerberos認證原理提到TGT是由域控krbtgt的密碼Hash加密的,所以偽造金票的前提是控制了域控,
偽造金票需要域名、域sid、krbtgt的密碼hash,如下在域控獲取krbtgt hash,
在mimikatz.log中找到其NTLM hash,
用普通用戶偽造金票并訪問域控,獲取域sid,注意不包含最后-xxxx,
/user指定偽造用戶名,/domain指定域,/sid指定sid,/krbtgt指定krbtgt hash,/ptt直接將票據匯入記憶體,
成功之后可訪問域控C盤,注意要用主機名(如下WIN-xxxxx)而不是IP,
白銀票據
白銀票據(Silver Tickets)是指偽造的服務票據(ST),只能用來訪問特定的服務,通過kerberos的認證原理得知ST是由TGS頒發的,使用了服務的密碼hash加密,所以在偽造銀票的時候需要知道服務的密碼hash,下面通過創建LDAP銀票訪問域控LDAP服務來演示銀票的偽造和利用,
域控的LDAP服務是由網路服務賬戶運行的,其對應sid是S-1-5-20,域控上通過mimikatz獲取hash,執行mimikatz.exe log privilege::debug sekurlsa::logonpasswords exit,

普通用戶偽造銀票并匯入記憶體獲取權限,可取到域控krbtgt hash,/target指定服務主機名,/rc4指定服務密碼的hash,/service指定服務,如下,
文章摘抄自 西部陸戰隊 酒仙橋六號部隊
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/104973.html
標籤:其他
上一篇:機器翻譯
