安全帳號管理器SAM文件基礎知識

Windows NT及Windows2000中對用戶帳戶的安全管理使用了安全帳號管理器(security account manager)的機制,安全帳號管理器對帳號的管理是通過安全標識進行的,安全標識在帳號創建時就同時創建,一旦帳號被刪除,安全標識也同時被刪除。安全標識是唯一的,即使是相同的用戶名,在每次創建時獲得的安全標識都時完全不同的。因此,一旦某個帳號被刪除,它的安全標識就不再存在了,即使用相同的用戶名重建帳號,也會被賦予不同的安全標識,不會保留原來的權限。安全賬號管理器的具體表現就是%SystemRoot%\\system32\\config\\sam文件。SAM文件是Windows NT的用戶帳戶數據庫,所有NT用戶的登錄名及口令等相關信息都會保存在這個文件中。SAM文件可以認爲類似於Unix系統中的Passwd文件,不過沒有這麼直觀明瞭。Passwd使用的是純文本的格式保存信息,這是一個Linux Passwd文件內容的例子:
 
0: root:8L7v6:0:0:root:/root:/bin/bash 
1: bin:*:1:1:bin:/bin:
2: daemon:*:2:2:daemon:/sbin:
3: adm:*:3:4:adm:/var/adm:
4: lp:*:4:7:lp:/var/spool/lpd:
5: sync:*:5:0:sync:/sbin:/bin/sync
6: shutdown:*:6:0:shutdown:/sbin:/sbin/shutdown
7: halt:*:7:0:halt:/sbin:/sbin/halt
8: mail:*:8:12:mail:/var/spool/mail:
9: news:*:9:13:news:/var/spool/news:
10: uucp:*:10:14:uucp:/var/spool/uucp:
11: operator:*:11:0perator:/root:
12: games:*:12:100:games:/usr/games:
13: gopher:*:13:30:gopher:/usr/lib/gopher-data:
14: ftp:*:14:50:FTP User:/home/ftp:
15: nobody:I0iJ.:99:99:Nobody:/home/httpd:/bin/bash
16: david:c6CuzM:500:500::/home/david:/bin/bash
17: dummy:fIVTl4IgU:501:503::/home/dummy:/bin/bash
18: msql:!!:502:504::/home/msql:/bin/bash
 
Unix中的Passwd文件中每一行都代表一個用戶資料,每一個賬號都有七部分資料,不同資料中使用“:”分割格式如下, 
 
賬號名稱:密碼:uid:gid:個人資料:用戶目錄:shell
 
除了密碼是加密的以外(這裏的密碼部分已經Shadow了)其他項目非常清楚明瞭。
  而NT中就不是這樣,雖然他也是用文件保存賬號信息,不過如果我們用編輯器打開這些NT的SAM文件,除了亂碼什麼也看不到。因爲NT系統中將這些資料全部進行了加密處理,一般的編輯器是無法直接讀取這些信息的。註冊表中的
HKEY_LOCAL_MACHINE\\SAM\\SAM  HKEY_LOCAL_MACHINE\\SECURITY\\SAM
 
保存的就是SAM文件的內容,在正常設置下僅對System是可讀寫的。
NT的帳號信息在SAM文件中是如何存儲的呢?
在SAM文件中保存了兩個不同的口令信息:LanManager(LM)口令散列算法和更加強大的加密NT版,LM就是NT口令文件的弱點。我們來看看LM口令算法是如何加密口令的,考慮這樣一個口令:Ba01cK28tr,這樣的口令已經可以稱的上是一個安全的口令了,雖然沒有!#等特殊字符,但是已經包含大寫字母,小寫字母和數字,並且具有無規律性。可以認爲是符合安全的要求的一個口令。
LM對口令的處理方法是:如果口令不足14位,就用0把口令補足14位,並把所有的字母轉稱大寫字母。之後將處理後的口令分成兩組數字,每組是7位。剛纔我們所提到的口令經處理後就變成BA01CK2和8TR0000部分。然後由這兩個7位的數字分別生成8位的DES KEY,每一個8位的DES KEY都使用一個魔法數字(將0x4B47532140232425用全是1的一個KEY進行加密獲得的)再進行一次加密,將兩組加密完後的字符串連在一起,這就是最終的口令散列。這個字符傳看起來是個整體,但是象L0phtcrack這樣的破解軟件,他能將口令字符串的兩部分獨立的破解。因此,破解上面所提到口令(10位),由於口令已經被分解爲兩部分破解,而後面的那部分口令由於只有3位,破解難度可想而知並不困難。實際的難度就在前面的七位口令上了。因此就NT而言,一個10位的口令與一個7位的口令相比並沒有太高的安全意義。由此還可以瞭解:1234567*$#這樣的口令可能還不如SHic6這樣的口令安全。(關於如何設置安全口令的問題不是本文的範圍,有興趣的可以參考相關文章)
而正式的口令(加密NT版)是將用戶的口令轉換成unicode編碼,然後使用MD4算法將口令加密。
NT之所以保留兩種不同版本的口令是由於歷史原因造成的,在一個純NT的環境中應該將LAN manager口令關閉。因爲LAN manager口令使用了較弱的DES密鑰和算法,比較容易破解。相比較之下,使用較強加密算法的NT正式口令要安全些。
但是這兩種口令的加密方法從總體上來說強度還是不足,因此,微軟在Win NT4的SP3之和以後的補丁中,提供了一個Syskey.exe的小工具來進一步加強NT的口令。這個軟件是可以選擇使用的,管理員只要運行一下這個程序並回答一些設置問題就可以添加這項增強功能。(Windows2000已經作爲缺省安裝設置了)
Syskey被設計用來防止輕易獲得SAM口令,它是如何工作的呢?
當Syskey被激活,口令信息在存入註冊表之前還進行了一次加密處理。然而,在機器啓動後,一箇舊的格式的信息還是會保存在內存中。因爲,這個舊格式的口令信息是進行網絡驗證的所需要的。
可以這樣認爲:Syskey使用了一種方法將口令信息搞亂。或者說使用了一個密鑰,這個密鑰是激活Syskey由用戶選擇保存位置的。這個密鑰可以保存在軟盤,或者在啓動時由用戶生成(通過用戶輸入的口令生成),又或者直接保存在註冊表中。由於沒有官方的正式技術說明如何關閉Syskey,所以Syskey一旦啓用就無非關閉,除非用啓用Syskey之前的註冊表備份恢復註冊表。
將Syskey激活後系統有什麼發生了什麼,如何關掉Syskey呢?
將Syskey激活後,在註冊表HKLM\\System\\CurrentControlSet\\Control\\Lsa下被添加了新的鍵值\'SecureBoot\'中保存了Syskey的設置:
 
1 - KEY保存在註冊表中 
2 - KEY由用戶登錄時輸入的口令生成 
3 - KEY保存在軟盤中
 
但是把主鍵刪除或者把值設成0並沒能將Syskey關閉,看來還有其他的地方。
HKLM\\SAM\\Domains\\Account\\F 是一個二進制的結構,通常保存着計算機的SID和其他的描述信息。當syskey被激活後,其中的內容就變大了(大小大約是原來的兩倍) 增加的部分估計是加密的KEY+一些標記和其他的數值,這些標記和數值中一定有一部分包括 SecureBoot 相同的內容。所以,在NT4(已安裝SP6補丁包)將這些標記位設爲0可能就可以關閉Syskey了。在改變這些設置時系統給出了一個錯誤提示說明SAM和系統設置相互衝突,但是在重新啓動計算機後,系統已經不再使用Syskey了

再Windows2000中還有另一個地方還存儲着關於syskey的信息HKLM\\security\\Policy\\PolSecretEncryptionKey\\ 這也是一個二進制的結構,也是使用同樣的存儲方式,將這裏相應部分同樣設爲0,syskey就已經從Windows2000中移除了。(如果這三部分修改出現錯誤(不一致),系統會在下次啓動是自動恢復爲默認值)

然後就是口令信息部分。舊的口令信息是長度是16字節,但使用Syskey後長度全部被增加到20字節。其中頭四個字節看起來想是某種計數器,可能是歷史使用記錄計數器。奇怪的是,當Syskey被激活時,他並不立即記錄,而是在系統下次啓動時才記錄。而且,當密鑰被改變時,口令信息似乎並沒有相應更新。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章