筆者管理的單位局域網(wǎng)中有上百臺電腦,各臺主機所安裝的系統(tǒng)不盡相同。在服務(wù)器上安裝的是Windows 2003/2008系統(tǒng),在客戶機安裝的有Windows XP、Windows 7/8、Vista等系統(tǒng)。單位員工操作電腦的水平參差不齊,往往會遇到各種類型的問題。對于有些比較馬虎的用戶,免不了碰到丟三落四的情況。
比如,幾天前某位員工更改了登錄密碼,并對一些文件進行了EFS加密處理,然后就去出差了?;貋碇髤s怎么也想不起密碼來,造成無法登錄系統(tǒng)的窘?jīng)r。筆者考慮到雖然可以使用Win PE U盤引導(dǎo)系統(tǒng),利用其內(nèi)置的工具清除密碼,但是這會造成EFS加密的文件無法打開的問題。看來,最好的辦法就是將正確的密碼找回來,這樣問題就會迎刃而解。
要想找回遺忘的密碼,就必須先了解Windows的密碼管理機制。在所有的Windows版本中,每個用戶都有唯一的帳號和與之關(guān)聯(lián)的登錄密碼,用戶使用自己的帳號密碼才能進入系統(tǒng)。
登錄密碼由字符、數(shù)字和各種符號組成。當(dāng)用戶設(shè)置或改變登錄密碼時,Windows并不單純的存儲這些字符串,Windows使 用 DES、MD4等加密算法對密碼字符串進行加密形成LM Hash(LAN Manager Hash)散列和NTLM Hash(Windows NT Hash)散列。其中LM Hash散列相對于NTLM Hash散列而言比較脆弱,主要用于與老版本的Windows兼容?,F(xiàn)在新版本的Windows又提供了NTLM v2以及Kerberos密碼驗證技術(shù)。
Windows將這些Hash散列值存儲在本地安全帳戶數(shù)據(jù)庫中(Security A c c o u n t s M a n a g e r Database,簡稱 SAM),對于Windows2003/2008等域控制器而言,密碼Hash散列值保存在活動目錄(Active Directory)中。對于NTLM Hash散列來說是不可逆的,也就是說不可能根據(jù)散列值直接得到登錄密碼。
但是,只要得到了LM Hash散列或NTLM Hash散列,利用窮舉法或者利用字典法,測試所有可能的密碼值,仍可能找回遺忘的密碼。Windows的密碼Hash在默認(rèn)情況下通常由兩部分組成,第一部分是LM-Hash,第二部分是NTLM-Hash。下面我們簡單談?wù)剝煞NHash的設(shè)生成機制。
圖1 選擇身份驗證級別
系統(tǒng)需要將密碼變?yōu)長M-Hash時,先將密碼(假設(shè)為“Password”)轉(zhuǎn)換為大寫狀態(tài),并將其轉(zhuǎn)換為十六進制數(shù)據(jù),如果其長度小于14就在后面補零,使其長度變?yōu)?4位。然后系統(tǒng)將其切割成兩組長度為7字節(jié)的數(shù)據(jù),經(jīng)過函數(shù)Str_To_Key()處理得到兩組8字節(jié)數(shù)據(jù)。接著將這兩部分?jǐn)?shù)據(jù)作為DESKEY,對魔術(shù)字符(“KGS!@#$%”)進行標(biāo)準(zhǔn)DES加密,最后將加密后的兩組數(shù)據(jù)進行簡單拼接得到所需的LMHash散列。
從以上分析中不難看出,其弱點有三個,其一,因為其采用了大寫轉(zhuǎn)換方式,會導(dǎo)致多個明文口令對應(yīng)一個LM-Hash,其二,當(dāng)密碼長度小于8字節(jié)時,會執(zhí)行補零操作,然后執(zhí)行加密,這會降低其安全性,導(dǎo)致破解難度降低。其三,因為DES算法輸入可逆算法,造成密碼存在破譯的風(fēng)險。
而NTLM-Hash與之相比,安全性就大大提高了。假設(shè)密碼為“hellopwd”,系統(tǒng)現(xiàn)將其轉(zhuǎn)換為Unicode字符串,而不需要進行補零操作。之后對該Unicode串進行標(biāo)準(zhǔn)的MD4加密處理,不管數(shù)據(jù)源長度如何,MD4加密會固定產(chǎn)生128位哈希值,其長度為16字節(jié),這就是最終的MTLM-Hash散列。NTLM-Hash對密碼大小寫敏感,而且MD4加密真正的單向哈希函數(shù),無法進行直接逆向破解,安全性得到了可靠保障。
但是,微軟雖然強調(diào)了NTLM-Hash的安全性,卻回避了一個安全問題,那就是為了保證Windows不同版本的兼容性,NTLM-Hash默認(rèn)總是和LM-Hash一起使用,這就會造成對系統(tǒng)安全造成損害。因為解密者可能首先利用LM-Hash的弱點,通過窮舉法得到原始密碼的大小寫不敏感版本,再利用NTLMHash修正出原始密碼的大小寫敏感版本,進而得到真實的密碼。
說到這里,我們就會想到,如果能夠阻止Windows存儲LM-Hash密碼散列,僅僅存儲安全性很高的NTLMHash散列,不就可以有效提高密碼的安全性了?
具體實現(xiàn)方法是運行“gpedit.msc”程序,在組策略窗口左側(cè)點擊“計算機配置→Windows設(shè)置→安全設(shè)置→本地策略→安全選項”分支,在右側(cè)窗口中雙擊“網(wǎng)絡(luò)安全:不要再下次更改密碼時存儲LAN Manager的哈希值”項,在彈出的窗口中選擇“已啟動”項,保存后退出。
圖2 PPA使用界面
之后雙擊“網(wǎng)絡(luò)安全:LAN Manager身份驗證級別”項,在彈出窗口(如圖1)中的列表中盡量選擇“僅發(fā)送NTLM響應(yīng)”、“僅發(fā)送 NTLM2響應(yīng)”、“僅發(fā)送NTLM2響應(yīng),拒絕LM”項來提供安全性,選擇的NTLM版本越高,安全性也越高。如果選擇“僅發(fā)送NTLM2響應(yīng)。拒絕LM和NTLM”項,則密碼的驗證安全性最高。然后重啟系統(tǒng)后就實現(xiàn)了上述要求。此外,最簡單的方法是設(shè)置長度最少為15位的密碼,讓系統(tǒng)自動存儲無法用于驗證用戶身份的LM-Hasm值,也可以實現(xiàn)異曲同工的目的。當(dāng)然,為了防止破解者使用SAMinside這款工具來獲取Hash值,最好禁用“Task Schduler”服務(wù)讓破譯者無功而返。
和Windows XP/2003中的密碼存儲機制來說,在Windows7/8/2008等較新的系統(tǒng)中,微軟采用了更大安全的密碼存儲機制。
例如,在Windows 2008中,不僅禁用了LM Hash散列,而且不允許使用簡單密碼,這 導(dǎo) 致 了SAMinside、LC5、Cain等 工 具 不 是 無法運行,就是面對復(fù)雜的密碼無計可施。那么,如何才能從這些系統(tǒng)中找回遺忘的密碼呢?這就需要使用Proactive Password Auditor(PPA)、Ophcrack 等更加高級的工具了。
例如,PPA這款軟件提供了多種密碼破譯機制。在其主窗口打開“Hashes”面板,可以看到預(yù)設(shè)了DUMP file、Registry of Local Computer,Registry Files(SAM,SYSTEM)、Memory of Local Computer、Memory of Remote Computer等5種得到Windows密碼Hash散列數(shù)據(jù)的方法。我們這里需要針對SAM文件進行破譯。如果Windows系統(tǒng)沒有使用活動目錄的話,那么所有用戶的帳號以及密碼信息都保存在注冊表中。即使用戶使用了Syskey命令對帳號數(shù)據(jù)庫進行了加密,PPA都能夠從注冊表中分析帳號及密碼信息,從而得到密碼的Hash散列值。
在Hashes面板中選擇“Registry of Local Computer”項,點擊“Dump”按鈕,在彈出窗口中的SAM Registry” 欄 中 點擊“Browse”按鈕,選擇事先 取 得 的 Vista、Windows 7/8/2008等系統(tǒng)的SAM文件,勾選“File name of the SYSTEM Registry file”項,點擊“Browse”按鈕,選擇事先取得的SYSTEM文件。點擊“DUMP”按鈕,PPA根據(jù)對SAM的分析,并嘗試進行簡單破解,然后將帳號以密碼的詳細(xì)信息顯示出來。同時,會顯示所有賬戶的基本信息,例如名稱、賬戶ID、散列類型等(如圖2所示)。
對于簡單的密碼,PPA能迅速破譯,如果密碼比較復(fù)雜,PPA還提供了窮舉法、字典猜測法、Rainbow彩虹表算法等破解方法。
以窮舉法為例,首先在PPA的用戶帳號分析列表中選中一個賬戶名,根據(jù)其密碼Hash散列的類型(例如LM+ NTLM),在 Attack面板中選 中“Brute-force”,同 時設(shè)定破解的類型(LM Attack或 NTLM Attack)。 然 后 選中“Brute-force Attack”面板,根據(jù)需要勾選“All Latin”(所有的字符)、“All Digits”(所 有 的 數(shù) 字)、“Special”(特殊符號),或者勾選“Custom charset”(自定義字符),點擊“Define”按鈕在自定義字符窗口中輸入任意字符串即可。在Password中設(shè)置密碼的最小和最大長度。設(shè)置完成后,點擊菜單“Recovery→Start Recovery”項,PPA就 可 以進行密碼分析操作,PPA的效率很高,普通的密碼很快就會被猜解出來了。點擊 菜 單“Recovery→Stop Recovery”停止破譯。
為了提高破譯的速度,可以借助于彩虹表進行操作。所謂彩虹表,其實就是體積龐大的,針對各種可能的密碼組合預(yù)設(shè)的HASH值的集合。彩虹表針對各種加密算法都提供對應(yīng)的文件。對于簡單的彩虹表來說,體積只有幾十兆或幾百兆。對于大型的彩虹表來說,體積可能高達上百GB。
有了彩虹表,PPA可以快速的進行HASH值比對,來找到真實的密碼。對于不太復(fù)雜的密碼,使用彩虹表可以瞬間破譯,即使對于我們自己覺得很復(fù)雜的密碼,在彩虹表面前,破譯所花費的時間不過幾十秒而已。在PPA主 界 面 中 的“Attack”欄中選擇“Rainbow”項,在“Rainbow attack”面板中點擊“Rainbow tables list”按鈕,在彩虹表管理窗口中點擊“Add”按鈕,導(dǎo)入事先準(zhǔn)備好的彩虹表文件,彩虹表文件的后綴一般為“.rc”。對于一般的密碼破譯來說,使用免費版的彩虹表足矣。添加好彩虹表文件后,在PPA中選擇目標(biāo)賬戶,點擊菜單“Recovery→Start Recovery”項,就可以快速找回失落的密碼了。
此外,使用Ophcrack這款解密軟件,配之以彩虹表這一強大的密碼字典,也可以快速找回丟失的Windows密碼。