windows 認證機制

2020-10-10 12:00:02

Windows認證協定

Windows認證協定有兩種:

NTLM(NT LAN Manager)

NTLM主要應用於用於Windows NT 和 Windows 2000 Server(或更高版本) 工作組環境

Kerberos

而後者則主要應用於Windows 2000 Server(或更高版本) 域環境

簡單來說,在Windows 2000 Server或者更高版本里,想在工作組環境認證,就用NTLM協定;想在域環境裡面認證,就得用Kerberos協定。

而在AD域環境中,如果需要認證 Windows NT作業系統,也得用NTLM協定。

NTLM認證

Windwos 密碼hash

早期SMB協定在網路上傳輸明文口令,後來出現"LAN Manager Challenge/Response"驗證機制,簡稱LM,由於容易被破解,微軟提出了windows NT挑戰/響應機制,稱之為NTLM。

所以說NTLM主要是一種基於質詢(challenge)/響應(response)訊息互動模式的認證過程。

現在已經有了更新的NTLM v2以及Kerberos驗證體系。windows加密過的密碼口令,我們稱之為hash,windows的系統密碼hash預設情況下一般有兩部分組成:LM-hash,NTLM-hash 。
這是對同一個密碼的兩種不同的加密方式

NTLM hash

在windows系統中比較常見的是從系統匯出來的NTLM hash,通過Hashcat能夠破解出明文密碼。

NTLM hash通常是指windows系統下Securtiy Account Manager中儲存的使用者密碼hash。

在滲透測試中,通常可從windows系統中的SAM檔案和域控的NTDS.dit檔案中獲得所有使用者的hash,通過mimikatz讀取lsass.exe程序能獲得已登陸使用者的NTLM hash

NET-NTLM hash

通常是指網路環境下NTLM認證中的hash

流程

使用者端發起認證請求
伺服器端收到認證請求,向用戶端傳送亂數(chanlleng/挑戰)
使用者端使用NTLM Hash打亂該亂數,生成Net-NTLM Hash,傳送回伺服器端

說的有點懵了,簡單點就是:

1.使用者端向伺服器傳送一個請求,請求中包含明文的登入使用者名稱。伺服器會提前儲存登入使用者名稱和對應的hashpass(應該是密碼hash,我這裡寫作hashpass)

2.伺服器接收到請求後,首先檢查你要登入的使用者名稱存不存在,存在的話不管三七二十,先生成一個16位元的亂數(這個亂數被稱為Challenge),使用儲存的登入使用者的hashpass加密Challenge,生成一個驗證碼(同樣只是個人理解,官方說法或許不叫這個)

3.伺服器將這個16位元數隨機生成的Challenge 明文傳送給使用者端。

4.使用者端接收到Challenge後,使用登入使用者的hashpass對Challenge加密,獲得的結果叫response

5.使用者端將response這個值明文傳送給伺服器

6.伺服器接收使用者端明文傳送過來的response,比較驗證碼response,如果兩個值相同,則驗證成功

注意

要注意的一點是,在2 、4過程中,都是用hashpass去加密challenge,而不是用challenge加密hashpass。

圖解

在這裡插入圖片描述

這樣,在認證登入的過程中,使用者端不需要直接將密碼發給伺服器,減少了中間被嗅探劫持的風險。

Kerberos認證

名詞解釋

KDC(Key Distribution Center):金鑰分發中心裡面包含兩個服務:AS和TGS
AS(Authentication Server):身份認證服務
TGS(Ticket Granting Server):票據授予服務
TGT(Ticket Granting Ticket):由身份認證服務授予的票據,用於身份認證,儲存在記憶體,預設有效期為10小時
Pass The Ticket:如果我們能夠拿到使用者的TGT,並將其匯入到記憶體,就可以冒充該使用者獲得其存取許可權

流程

Kerberos提供了一個集中式的認證伺服器結構,認證伺服器的功能是實現使用者與其存取的伺服器間的相互鑑別。

Kerberos被稱作三頭狗,之所以用它來命名,是因為整個認證過程涉及到三方:使用者端伺服器端KDC(Key Distribution Center)。在Windows域環境中,KDC的角色由DC(Domain Controller)來擔當。

Kerberos是一種基於「票據」的認證方式。票據(Ticket)用來安全的在認證伺服器和使用者請求的服務之間傳遞使用者的身份,同時也傳遞附加資訊。用來保證使用Ticket的使用者必須是Ticket中指定的使用者。Ticket一旦生成,在生存時間內可以被Client多次使用來申請同一個Server的服務。

使用者端要存取伺服器的資源,需要首先購買伺服器端認可的票據。也就是說,使用者端在存取伺服器之前需要預先買好票,等待服務驗票之後才能入場。在這之前,使用者端需要先買票,但是這張票不能直接購買,需要一張認購權證。使用者端在買票之前需要預先獲得一張認購權證。這張認購權證和進入伺服器的入場券均有KDC發售。

簡單說,就是有使用者端、伺服器、KDC三臺機器。

1.我想登入某個賬號,我就在使用者端上輸入我要登入的賬號密碼。使用者端呢,會把你的密碼hash一下,hash後的值呢,這裡叫hashpass。

2.使用者端呢,再用hashpass加密我當前使用者端的資訊、登入的賬號、KDC的id、時間戳資訊,這裡加密後的結果叫A。使用者端就會把A和要登入的賬號發給KDC

3.KDC收到後,首先是AD出馬,AD是資料庫,儲存域裡面所有的賬號資訊。AD一檢查你要要登入的賬號是存在的,就把A轉發給AS。

4.AS裡面事先儲存著你的hashpass,它用hashpass解密A,看到裡面的資訊正常沒問題。說明使用者端的確是用hashpass加密的(不然你用其他的資料加密,AS用hashpass解密後的結果自然是無意義的。)

5.既然使用者端沒問題,那AS就隨機生成一個祕鑰,這裡把它稱作K。然後AS說,使用者端你不是要票(TGT)嗎?那我們來進行一下票據授予服務(TGS)啊。

使用者端就做了兩手準備,首先把TGS服務的名字、id啥的資訊、還有K的值,當前時間戳用hashpass加密好。(把這個加密結果叫②)
然後把上面的資訊加上使用者端的資訊和當前時間戳用TGS祕鑰加密。這個TGS加密的結果呢,只有TGS才能解密。(把這個加密結果叫①)

6.AS把①、②全發給使用者端。使用者端接收一看,媽耶,①我解不開,不曉得啥意思。那就看②,②能用hashpass解開,解開後用戶端拿到了K的值。

然後使用者端就用K加密②解密後的內容、使用者端資訊和當前時間戳,加密後的結果呢就叫驗證器(authenticator)。

7.使用者端將①和驗證器全都發給TGS。TGS一收到,驗證器我解不開,先看①。用TGS祕鑰解開了①(前面說了,①只有TGS才能解開),然後拿到了K的值,和其他資訊。

然後TGS用K解密驗證器

將①和驗證器解密後的結果做個對比,如果沒問題,好,通過驗證。

8.通過驗證後,TGS就隨機生成一個值,我們把它叫做K2。然後票據授予服務不是驗證通過了嗎?TGS小手一揮,給你兩張票據。

票據1裡面有K1、使用者端身份資訊、伺服器 ID、時間戳等資訊,這裡用伺服器端祕鑰加密,只有伺服器才能解密。
票據2裡面同樣有K1、伺服器ID、時間戳資訊,用k加密。

然後TGS將兩張票據全發給使用者端

9.使用者端收到後,同樣解不開票據一,用K解密票據二後,知道了伺服器ID和K1的值。

然後使用者端用K1將票據二解密後的內容、使用者端資訊、時間戳加密。加密的結果叫驗證器2吧。

10.使用者端將票據一、驗證器2全發給伺服器(第9步知道了伺服器的id等資訊)

11.伺服器接收後,先用伺服器祕鑰解密票據一。知道了K1的值及相關資訊。

然後伺服器用K1解密了驗證器2,得到了驗證器2裡面的內容

伺服器就驗證兩者之間的內容,如果通過驗證,就允許使用者端登入。

注意

要注意的地方是8/9/10/11步後面的什麼使用者端資訊、伺服器資訊。有些參考資料上說應該寫成TGS、TGT啥的id等內容,然後這些服務、票據內容裡面包括了使用者端、伺服器端、時間戳資訊。但是因為作者只是個初學者,所以只按自己的理解來寫,如果理解錯了希望有大佬能指出來。

然後上面的時間戳都是指當前時間戳,每個步驟裡面的時間戳都是不一樣的。他們(as,tgs,伺服器)會計算拿到手的資訊裡的時間戳和當前時間戳的時間差,如果隔太久了(比如超過了2分鐘,比如超過了5分鐘。這個時間差是由管理員設定的,預設是5分鐘。)那麼他們會認為這是假的是偽造的,不同意下一步的認證。

下圖揭示了Kerberos整個認證的過程。

圖解

在這裡插入圖片描述在這裡插入圖片描述

利用方式

兩種驗證方式看起來都無懈可擊,是不是就真的安全了呢?
當然不。

NTLM的利用方式

先說說ntlm的利用方式
他有兩種利用方式

1、Pass the hash

首先,如果內網主機的本地管理員賬戶密碼相同,那麼可以通過pass the hash遠端登入到任意一臺主機。

拿下域裡面一臺主機的管理員許可權後,從dump記憶體獲取其他使用者的賬號和hashpass(hash後的密碼),用賬號及hashpass登入其他主機(從前面的認證過程中可以看到,ntlm驗證只用到hashpass,不知道明文的密碼也可以登入)

然後如果恰好某個hashpass對應的賬號是某臺主機的管理員,你就又拿下了一臺主機。在這臺主機裡獲取使用者的hashpass,然後又去其他主機登入……

如此重複下去,總有拿下域管理員的的賬號及hashpass的一天

當然,微軟在2014年釋出了更新修補程式kb2871997禁止本地管理員賬戶用於遠端連線。也就是說除了一些2014年前的未更新的老古董,這個方法基本上沒用了。

不過有大佬驗證過預設的 Administrator (SID 500)賬號例外,利用這個賬號仍可以進行Pass The Hash遠端連線。

在這裡插入圖片描述

參考資料:https://www.tiejiang.org/23508.html

2、Pass the key

mimikatz實現了在禁用ntlm的環境下仍然可以遠端連線,通過利用使用者賬戶的aes key進行遠端連線,即利用pass the key。
注意
1、Windows vista以後,本地管理員administrator預設是禁用狀態,而使用者新增的本地管理員是受限管理員,pass the hash遠端連線後許可權為普通使用者許可權;
2、Pass the key時需要確保系統安裝了修補程式kb2871997

Kerberos的利用方式

票據攻擊(PTT)

Pass The Ticket 1(Golden Ticket)

英文看不懂沒關係,中文意思是黃金票據
黃金票據偽造票據授予服務
黃金票據的利用條件是原先已成功取得域使用者的HASH。

如果你知道TGS的祕鑰,是不是就沒AS什麼事了?(見第5步)
在這裡插入圖片描述
①、②裡面有你要請求的TGS的服務。如果你知道TGS的祕鑰,①、②是不是就由你寫了。然後你再把①發給TGS,TGS一解密,它開具的票據就是你在①②裡面請求的票據授予服務。所以拿到TGS祕鑰後,你就能偽造任意

因為TGS的祕鑰AS知道(第五步)你可以偽造任意服務票據。

TGS的祕鑰是什麼呢?域控裡有個使用者叫krbtgt,專門用來發票據的。就是說TGS的祕鑰,其實就是他這個使用者的祕鑰。所以只要我們知道了這個krbtgt使用者的passhash,就可以偽造黃金票據

Pass The Ticket 2(Silver Ticket)

這裡說的是白銀票據

如果我們知道了伺服器祕鑰。
那麼我們可以偽造票據一,偽造驗證器2.然後直接和伺服器通訊,就沒KDC什麼事了。

黃金、白銀票據的區別
  1. 存取許可權不同:
    Golden Ticket:偽造TGT,可以獲取任何Kerberos服務許可權
    Silver Ticket:偽造TGS,只能存取指定的服務
  2. 加密方式不同:
    Golden Ticket由Kerberos的Hash加密
    Silver Ticket由服務賬號(通常為計算機賬戶)Hash加密
  3. 認證流程不同:
    Golden Ticket的利用過程需要存取域控,而Silver Ticket不需要存取域控