Windows NT及Windows2000中對用戶帳戶的安全管理使用了安全帳號管理器(security account manager)的機制,安全帳號管理器對帳號的管理是通過安全標(biāo)識進行的,安全標(biāo)識在帳號創(chuàng)建時就同時創(chuàng)建,一旦帳號被刪除,安全標(biāo)識也同時被刪除。安全標(biāo)識是唯一的,即使是相同的用戶名,在每次創(chuàng)建時獲得的安全標(biāo)識都時完全不同的。因此,一旦某個帳號被刪除,它的安全標(biāo)識就不再存在了,即使用相同的用戶名重建帳號,也會被賦予不同的安全標(biāo)識,不會保留原來的權(quán)限。
安全賬號管理器的具體表現(xiàn)就是%SystemRoot%\\system32\\config\\sam文件。SAM文件是Windows NT的用戶帳戶數(shù)據(jù)庫,所有NT用戶的登錄名及口令等相關(guān)信息都會保存在這個文件中。SAM文件可以認(rèn)為類似于Unix系統(tǒng)中的Passwd文件,不過沒有這么直觀明了。Passwd使用的是存文本的格式保存信息,這是一個Linux Passwd文件內(nèi)容的例子:
|
Unix中的Passwd文件中每一行都代表一個用戶資料,每一個賬號都有七部分資料,不同資料中使用“:”分割格式如下,
|
除了密碼是加密的以外(這里的密碼部分已經(jīng)Shadow了)其他項目非常清楚明了。
而NT中就不是這樣,雖然他也是用文件保存賬號信息,不過如果我們用編輯器打開這些NT的SAM文件,除了亂碼什么也看不到。因為NT系統(tǒng)中將這些資料全部進行了加密處理,一般的編輯器是無法直接讀取這些信息的。注冊表中的
|
保存的就是SAM文件的內(nèi)容,在正常設(shè)置下僅對System是可讀寫的。
NT的帳號信息在SAM文件中是如何存儲的呢?
在SAM文件中保存了兩個不同的口令信息:LanManager(LM)口令散列算法和更加強大的加密NT版,LM就是NT口令文件的弱點。我們來看看LM口令算法是如何加密口令的,考慮這樣一個口令:Ba01cK28tr,這樣的口令已經(jīng)可以稱的上是一個安全的口令了,雖然沒有!#等特殊字符,但是已經(jīng)包含大寫字母,小寫字母和數(shù)字,并且具有無規(guī)律性??梢哉J(rèn)為是符合安全的要求的一個口令。
LM對口令的處理方法是:如果口令不足14位,就用0把口令補足14位,并把所有的字母轉(zhuǎn)稱大寫字母。之后將處理后的口令分成兩組數(shù)字,每組是7位。剛才我們所提到的口令經(jīng)處理后就變成BA01CK2和8TR0000部分。然后由這兩個7位的數(shù)字分別生成8位的DES KEY,每一個8位的DES KEY都使用一個魔法數(shù)字(將0x4B47532140232425用全是1的一個KEY進行加密獲得的)再進行一次加密,將兩組加密完后的字符串連在一起,這就是最終的口令散列。這個字符傳看起來是個整體,但是象L0phtcrack這樣的破解軟件,他能將口令字符串的兩部分獨立的破解。因此,破解上面所提到口令(10位),由于口令已經(jīng)被分解為兩部分破解,而后面的那部分口令由于只有3位,破解難度可想而知并不困難。實際的難度就在前面的七位口令上了。因此就NT而言,一個10位的口令與一個7位的口令相比并沒有太高的安全意義。由此還可以了解:1234567*$#這樣的口令可能還不如SHic6這樣的口令安全。(關(guān)于如何設(shè)置安全口令的問題不是本文的范圍,有興趣的可以參考相關(guān)文章)
而正式的口令(加密NT版)是將用戶的口令轉(zhuǎn)換成unicode編碼,然后使用MD4算法將口令加密。
NT之所以保留兩種不同版本的口令是由于歷史原因造成的,在一個純NT的環(huán)境中應(yīng)該將LAN manager口令關(guān)閉。因為LAN manager口令使用了較弱的DES密鑰和算法,比較容易破解。相比較之下,使用較強加密算法的NT正式口令要安全些。
但是這兩種口令的加密方法從總體上來說強度還是不足,因此,微軟在Win NT4的SP3之和以后的補丁中,提供了一個Syskey.exe的小工具來進一步加強NT的口令。這個軟件是可以選擇使用的,管理員只要運行一下這個程序并回答一些設(shè)置問題就可以添加這項增強功能。(Windows2000已經(jīng)作為缺省安裝設(shè)置了)
Syskey被設(shè)計用來防止輕易獲得SAM口令,它是如何工作的呢?
當(dāng)Syskey被激活,口令信息在存入注冊表之前還進行了一次加密處理。然而,在機器啟動后,一個舊的格式的信息還是會保存在內(nèi)存中。因為,這個舊格式的口令信息是進行網(wǎng)絡(luò)驗證的所需要的。
可以這樣認(rèn)為:Syskey使用了一種方法將口令信息搞亂。或者說使用了一個密鑰,這個密鑰是激活Syskey由用戶選擇保存位置的。這個密鑰可以保存在軟盤,或者在啟動時由用戶生成(通過用戶輸入的口令生成),又或者直接保存在注冊表中。由于沒有官方的正式技術(shù)說明如何關(guān)閉Syskey,所以Syskey一旦啟用就無非關(guān)閉,除非用啟用Syskey之前的注冊表備份恢復(fù)注冊表。
將Syskey激活后系統(tǒng)有什么發(fā)生了什么,如何關(guān)掉Syskey呢?
-1-
將Syskey激活后,在注冊表HKLM\\System\\CurrentControlSet\\Control\\Lsa下被添加了新的鍵值\'SecureBoot\'中保存了Syskey的設(shè)置:
|
但是把主鍵刪除或者把值設(shè)成0并沒能將Syskey關(guān)閉,看來還有其他的地方。
-2-
HKLM\\SAM\\Domains\\Account\\F 是一個二進制的結(jié)構(gòu),通常保存著計算機的SID和其他的描述信息。當(dāng)syskey被激活后,其中的內(nèi)容就變大了(大小大約是原來的兩倍) 增加的部分估計是加密的KEY+一些標(biāo)記和其他的數(shù)值,這些標(biāo)記和數(shù)值中一定有一部分包括 SecureBoot 相同的內(nèi)容。所以,在NT4(已安裝SP6補丁包)將這些標(biāo)記位設(shè)為0可能就可以關(guān)閉Syskey了。在改變這些設(shè)置時系統(tǒng)給出了一個錯誤提示說明SAM和系統(tǒng)設(shè)置相互沖突,但是在重新啟動計算機后,系統(tǒng)已經(jīng)不再使用Syskey了。
-3-
再Windows2000中還有另一個地方還存儲著關(guān)于syskey的信息
HKLM\\security\\Policy\\PolSecretEncryptionKey\\
這也是一個二進制的結(jié)構(gòu),也是使用同樣的存儲方式,將這里相應(yīng)部分同樣設(shè)為0,syskey就已經(jīng)從Windows2000中移除了。(如果這三部分修改出現(xiàn)錯誤(不一致),系統(tǒng)會在下次啟動是自動恢復(fù)為默認(rèn)值)
-4-
然后就是口令信息部分。舊的口令信息是長度是16字節(jié),但使用Syskey后長度全部被增加到20字節(jié)。其中頭四個字節(jié)看起來想是某種計數(shù)器,可能是歷史使用記錄計數(shù)器。奇怪的是,當(dāng)Syskey被激活時,他并不立即記錄,而是在系統(tǒng)下次啟動時才記錄。而且,當(dāng)密鑰被改變時,口令信息似乎并沒有相應(yīng)更新。
責(zé)任編輯 趙毅 zhaoyi#51cto.com TEL:(010)68476636-8001