windows域環境下認證和攻擊初識


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)。

5772dd0660cae779cab1b684c20f0eed

mimikatz讀取。

9ede533b2c30e5ac4870580144ac6b6e

mimikatz從內存dump出的hash

如下,cmd運行mimikatz.exe,在mimikatz會話中執行privilege::debug和sekurlsa::logonpasswords。

a351cc718815fca940ca2670213baca4

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查看)。

0efa404903ffcb4f4fe0b97151ae71ca

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

4d0b29f6f5be5982be090a529a71fc4e

抓包可以看到是通過LDAP協議查詢獲得SPN信息。

4561bc7f8aa4d08c929afe8452331f97

通過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。

197cd5a9fd0f50c758c4cacafc008930

普通用戶偽造銀票並導入內存獲取權限,可取到域控krbtgt hash。/target指定服務主機名,/rc4指定服務密碼的hash,/service指定服務,如下。


文章摘抄自 西部陸戰隊 酒仙橋六號部隊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM