集權(quán)攻防——身份認(rèn)證協(xié)議之NTLM
在Kerberos出現(xiàn)之前,NTLM被廣泛應(yīng)用于工作組和域環(huán)境,是更早的用于對用戶進(jìn)行身份驗(yàn)證的協(xié)議。
相比于Kerberos,NTLM的認(rèn)證原理比較簡單,主要通過對比客戶端和服務(wù)端加密后的數(shù)據(jù),判斷其是否一致,以確定用戶身份。
如果用做菜來比喻,那么被加密的數(shù)據(jù)就是“原材料”,加密密鑰就是“秘方”,原理就是“用不同的秘方做出來的菜味道不一樣”。當(dāng)秘方只有客戶端和服務(wù)端知道,服務(wù)端確定用戶身份時,只需要用該秘方和客戶端做同一盤菜,對比兩盤菜的味道,如果一樣,那就是真實(shí)的客戶端。

目前NTLM有兩個版本,別是NTLMv1和NTLMv2,他們間最主要的區(qū)別體現(xiàn)在被加密數(shù)據(jù)的長度上,也就是“原材料”的種類。在v1版本中數(shù)據(jù)長度是8位,而v2版本中增加到16位。
v2版本相較于v1安全性更高,在網(wǎng)絡(luò)中應(yīng)用較多。因此,本篇文章中,我們將基于NTLMv2的認(rèn)證原理,詳細(xì)介紹“客戶端登錄”、“訪問服務(wù)器資源”和“域環(huán)境下申請服務(wù)”這三種情況的認(rèn)證過程。
客戶端登錄?
回憶我們平常登錄電腦的過程,輸好密碼后就直接跳轉(zhuǎn)到了桌面,整個過程不過一兩秒鐘。但其實(shí)在這短暫的兩秒中,電腦內(nèi)部發(fā)生了多重“反應(yīng)”,從而實(shí)現(xiàn)對我們身份的驗(yàn)證。
首先,我們輸入的密碼會被交給Lsass進(jìn)程,這個進(jìn)程對明文密碼進(jìn)行加工,生成唯一的密碼哈希。
然后,Lsass進(jìn)程將從本地內(nèi)存中,找到該用戶賬戶對應(yīng)的密碼哈希。
最后再比較兩者,如果相同,證明該用戶的身份是真實(shí)的,則允許登錄。

這之中有個關(guān)鍵點(diǎn):原本存在于本地內(nèi)存中的密碼哈希,是從何而來的呢?
原理是這樣的,這個值早在用戶注冊時,就由Lsass存儲在系統(tǒng)中了。這樣做的目的,就是為了在系統(tǒng)重啟時,快速幫助驗(yàn)證用戶身份,保障用戶數(shù)據(jù)安全。
訪問服務(wù)器資源
在開放網(wǎng)絡(luò)環(huán)境下,用戶要訪問服務(wù)器資源,就需要向服務(wù)器提交申請。在NTLM認(rèn)證過程中,服務(wù)器接到申請后,除了驗(yàn)證用戶身份,還要判斷該用戶是否有使用資源的權(quán)限、自己是否有能力提供服務(wù)等。
接下來我們說說這個過程。
同本地賬戶類似,用戶在訪問服務(wù)器之前,也需要先在服務(wù)器中存有自己的賬號,以便在身份驗(yàn)證時進(jìn)行信息對比。
首先用戶注冊一個賬號,該賬號密碼以哈希形式存儲在服務(wù)器中,形成只有用戶和服務(wù)器知道的“秘方”。
用戶請求訪問服務(wù)時,先將自己的用戶名提供給服務(wù)器,并且附上想要訪問的服務(wù)內(nèi)容。

服務(wù)端接收到請求后,先檢查該用戶是不是有資格訪問服務(wù),也就是查找該用戶是否存在于數(shù)據(jù)庫中;如果存在,再進(jìn)一步確認(rèn)自己是否能滿足請求。
如果該用戶確實(shí)存在,服務(wù)器就會發(fā)送一個隨機(jī)數(shù)給客戶端,叫用戶做“一道菜”來證明自己不是偽冒的,這個隨機(jī)數(shù)就是“原材料“。這時候,伴隨著“原材料”一起發(fā)送給客戶端的,還有它能提供的服務(wù)列表。

客戶端收到數(shù)據(jù)后,將隨機(jī)數(shù)取出,用自己的密鑰哈希加工,得到色香味唯一的菜肴。然后將“做好的菜”和原料以及自己的用戶名放在一起,組成身份驗(yàn)證包,再次發(fā)給服務(wù)端。

服務(wù)端從自己的數(shù)據(jù)庫中找到該用戶的“秘方”,使用同樣的“原材料”——隨機(jī)數(shù)做菜。然后比較兩道菜,如果相同,則認(rèn)為用戶身份真實(shí),就可以響應(yīng)其請求了。

域環(huán)境下申請服務(wù)
域環(huán)境下申請服務(wù)時,NTLM的認(rèn)證過程和第二種情況基本一樣,只是在最后驗(yàn)證用戶身份時,并不是由服務(wù)器來進(jìn)行,而是域控。
這是為什么呢?
在AD域安全管理系列科普文章中,我們提到,AD域內(nèi)所有賬戶信息都存儲在域控上。這說明,域環(huán)境下的服務(wù)器上并沒有用戶“秘方”,“秘方”只存在于域控上。
所以服務(wù)器接收到身份驗(yàn)證包后,會將它轉(zhuǎn)發(fā)給域控,由域控來進(jìn)行驗(yàn)證。
域控在數(shù)據(jù)庫中找到該用戶對應(yīng)的密碼哈希,同樣加工該隨機(jī)數(shù),得到加密后的值。將這個值與客戶端加密的值進(jìn)行比較,最后把結(jié)果返回給服務(wù)器。

結(jié)語?
由上可見,無論哪種情況下,NTLM在認(rèn)證過程中,都沒有在網(wǎng)絡(luò)上單獨(dú)傳遞密碼,這減少了密碼泄露的可能,提高了系統(tǒng)安全性。
但NTLM的認(rèn)證方式也不是絕對安全的,基于密碼哈希的認(rèn)證方式,讓攻擊者在不需要獲取明文密碼的情況下,也能直接傳遞密碼哈希通過認(rèn)證。有的攻擊者甚至將客戶端發(fā)送給服務(wù)器的驗(yàn)證信息截獲,用來進(jìn)行明文爆破或NTLM中繼攻擊。
為了防范這樣的威脅,我們需要選擇安全性更高的認(rèn)證協(xié)議或采取專門的安全運(yùn)營方案。