。
任務(wù)描述
如果某個用戶把自己的登錄帳戶刪除,那么其他用戶將無法訪問其EFS加密文件。更可惡的是,一旦公司里的某個用戶心懷怨氣,惡意加密了本屬于別的用戶的重要文件,將會導(dǎo)致嚴(yán)重問題。一般情況下,這些EFS加密文件已經(jīng)被判了死刑,但是實(shí)際上只要滿足以下條件的話,我們還是可以在末日來臨之前打開逃生的天窗:
(1) 必須知道該被刪帳戶的密碼。
(2) 該被刪帳戶的配置文件必須存在。如果使用“本地用戶和組”管理單元刪除帳戶,則配置文件保留的機(jī)會很大,如果使用“用戶帳戶”控制面板刪除帳戶,則有一半機(jī)會保留配置文件。如果配置文件不幸被刪,則只能祈禱可以借助Easy Recovery之類的數(shù)據(jù)恢復(fù)工具進(jìn)行恢復(fù)。
可能有些朋友會覺得這兩個條件比較苛刻,此處賣個關(guān)子先……
EFS加密原理
大家知道,EFS加密實(shí)際上綜合了對稱加密和不對稱加密:
(1) 隨機(jī)生成一個文件加密密鑰(叫做FEK),用來加密和解密文件。
(2) 這個FEK會被當(dāng)前帳戶的公鑰進(jìn)行加密,加密后的FEK副本保存在文件$EFS屬性的DDF字段里。
(3) 要想解密文件,首先必須用當(dāng)前用戶的私鑰去解密FEK,然后用FEK去解密文件。
看到這里,似乎EFS的脈絡(luò)已經(jīng)很清晰,其實(shí)不然,這樣還不足于確保EFS的安全性。系統(tǒng)還會對EFS添加兩層保護(hù)措施:
(1) Windows會用64字節(jié)的主密鑰(Master Key)對私鑰進(jìn)行加密,加密后的私鑰保存在以下文件夾:
%UserProfile%\Application Data\Microsoft\Crypto\RSA\SID
提示 Windows系統(tǒng)里的各種私有密鑰,都用相應(yīng)的主密鑰進(jìn)行加密。Windows Vista的BitLocker加密,也用其主密鑰對FVEK(全卷加密密鑰)進(jìn)行加密。
(2) 為了保護(hù)主密鑰,系統(tǒng)會對主密鑰本身進(jìn)行加密(使用的密鑰由帳戶密碼派生而來),加密后的主密鑰保存在以下文件夾:
%UserProfile%\Application Data\Microsoft\Protect\SID
整個EFS加密的密鑰架構(gòu)如圖1所示。
圖1
提示 EFS密鑰的結(jié)構(gòu)部分,參考自《Windows Internals 4th》的第12章。
回到“任務(wù)描述”部分所述的兩個條件,現(xiàn)在我們應(yīng)該明白原因了:
(1) 必須知道該被刪帳戶的密碼:沒有帳戶密碼,就無法解密主密鑰。因?yàn)槠浼用苊荑€是由帳戶密碼派生而來的。
提示 難怪Windows XP和2000不同,管理員重設(shè)帳戶密碼,也不能解密EFS文件。
(2) 該被刪帳戶的配置文件必須存在:加密后的私鑰和主密鑰(還包括證書和公鑰),都保存在配置文件里,所以配置文件萬萬不可丟失,否則就會徹底“鬼子不能進(jìn)村”。重裝系統(tǒng)后,原來的配置文件肯定被刪,這時候當(dāng)然不可能恢復(fù)EFS文件。
可能有用戶會想,只需新建一個同名的用戶帳戶,然后把原來配置文件復(fù)制給新帳戶,不就可以解密EFS文件了?原因在于帳戶的SID,因?yàn)樾陆ㄓ脩舻?/span>SID不可能和老帳戶一樣,所以常規(guī)方法是不可能奏效的。我們必須另辟蹊徑,讓系統(tǒng)再造一個完全一樣的SID!
恢復(fù)步驟
為了方便描述,這里假設(shè)被刪帳戶的用戶名為Admin,Windows安裝在C盤。
1.再造SID
注意 本方法取自“聲明”部分提到的那篇文章。
首先確認(rèn)被刪帳戶的SID,這里可以進(jìn)入以下文件夾:
C:\Documents and Settings\Admin\Application Data\Microsoft\Crypto\RSA
在其下應(yīng)該有一個以該被刪帳戶的SID為名的文件夾,例如是S-1-5-21-4662660629-873921405-788003330-1004(RID為1004)
現(xiàn)在我們要設(shè)法讓新建帳戶同樣具有1004的RID,這樣就能達(dá)到目的。
在Windows中,下一個新建帳戶所分配的RID是由HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account注冊表項(xiàng)的F鍵值所確定的。F鍵值是二進(jìn)制類型的數(shù)據(jù),在偏移量0048處的四個字節(jié),定義下一個帳戶的RID。那么也就是說,只需要修改0048處的四個字節(jié),就能達(dá)到目的(讓新建帳戶獲得1004的RID)!
確認(rèn)好以后,別忘記把Admin帳戶的配置文件轉(zhuǎn)移到別的地方!
(1) 默認(rèn)情況下,只有system帳戶才有權(quán)限訪問HKEY_LOCAL_MACHINE\SAM,這里在CMD命令提示符窗口,運(yùn)行以下命令,以system帳戶身份打開注冊表編輯器:
psexec -i -d -s %windir%\regedit.exe
提示 可以在以下網(wǎng)站下載psexec:
http://www./Utilities/PsExec.html
(2) 定位到HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account注冊表項(xiàng),雙擊打開右側(cè)的F鍵值。
(3) 這里要說明一下,Windows是以十六進(jìn)制、而且以反轉(zhuǎn)形式保存下一個帳戶的RID。什么意思呢?也就是說,如果是1004的RID,對應(yīng)十六進(jìn)制就是03EC,但是我們必須把它反轉(zhuǎn)過來變成EC03,再擴(kuò)展為4個字節(jié),就是EC 03 00 00。
所以,我們應(yīng)該把F鍵值的0048偏移量處,把其中四個字節(jié)改為“EC 03 00 00”,如圖2所示。

圖2
(4) 重要:別忘了重啟計(jì)算機(jī)!
(5) 重啟以后,新建一個同名帳戶Admin,它的SID應(yīng)該和以前是完全一樣。如果不相信的話,可以借助GetSID或者PsGetSID等工具測試一下。
2.“破解”EFS
接下來的方法就非常簡單了,用新建的Admin帳戶身份登錄系統(tǒng),隨便加密一個文件,然后注銷,用管理員帳戶登錄系統(tǒng),把原來保留的配置文件復(fù)制到C:\Documents and Settings\Admin文件夾下。
再用Admin帳戶登錄系統(tǒng),現(xiàn)在可以解密原來的EFS文件了。
疑難解答
1.如果已經(jīng)重裝系統(tǒng),那怎么辦?
“聲明”部分提到的那篇文章里提到,如果還記得原來帳戶的密碼,并且配置文件沒有被刪除的話,還有希望。這時候可以借助sysinternals的NEWSID工具把系統(tǒng)的計(jì)算機(jī)SID重設(shè)為原來的值,再用前面描述的方法構(gòu)造所需的RID,這樣就可以獲得所需的帳戶SID。剩余步驟完全一樣。
http://www./Utilities/NewSid.html
2.有用戶曾經(jīng)遇到這樣的問題:登錄系統(tǒng)時收到提示說密碼過期,需要重設(shè),重設(shè)密碼登錄后發(fā)現(xiàn)打開EFS文件。
KB890951提到這個問題。其解釋是因?yàn)樵谛薷拿艽a時,系統(tǒng)還沒有加載配置文件(有點(diǎn)語焉不詳),原文如下:
This problem occurs because the user profile for the current user is not loaded correctly after you change the password.
配置文件和EFS有何相干?看完本文,大家應(yīng)該知道,EFS的私鑰和主密鑰都是保存在配置文件里的。由于配置文件沒有加載,所以主密鑰的加密版本沒有得到更新(沒有跟上帳戶密碼的變化),導(dǎo)致主密鑰無法正確解密,從而無法解密私鑰和FEK。這就是問題的真正原因。
該KB提供了一個內(nèi)部補(bǔ)丁,可以解決這個問題。KB890951的鏈接如下:
http://support.microsoft.com/kb/890951
3.有關(guān)公鑰的問題
為了容易理解,筆者故意忽略了公鑰。公鑰保存也保存在帳戶的配置文件里:
%UserProfile%\Application Data\Microsoft\SystemCertificates\My\Certificates
在EFS恢復(fù)的操作中,必須確保公鑰也要復(fù)制到新帳戶的配置文件里。盡管看起來公鑰與EFS解密無關(guān)(它負(fù)責(zé)加密)。
原來,加密文件$EFS屬性的DDF字段里除了有帳戶SID和加密的FEK副本外,還有公鑰的指紋信息(Public Key Thumbprint)和私鑰GUID信息(私鑰的某種散列值)。
系統(tǒng)在掃描加密文件$EFS屬性中的DDF字段時,根據(jù)用戶配置文件里的公鑰中所包含的公鑰指紋和私鑰GUID信息,當(dāng)然還有帳戶的SID,來判斷該帳戶是否具有對應(yīng)的DDF字段,從而判斷該用戶是否屬于合法的EFS文件擁有者。
所以公鑰也很重要。
當(dāng)然公鑰是可以“偽造”的(可以偽造出所需的公鑰指紋和私鑰GUID),以欺騙EFS系統(tǒng),具體方法可以參考國外的那篇原稿,此處不再贅述。
加強(qiáng)EFS的安全
由于EFS把所有的相關(guān)密鑰都保存在Windows分區(qū),所以這可能給EFS帶來一定的安全隱患。目前有一些第三方工具號稱可以破解EFS,這些工具首先攻擊SAM配置單元文件,嘗試破解帳戶密碼,從而破解帳戶密碼→主密鑰的加密密鑰→主密鑰→EFS私鑰→FEK的“密鑰鏈”。
為了防止攻擊者窺視我們的EFS文件,可以借助以下三種方法:
1.導(dǎo)出刪除私鑰
可以用證書向?qū)?dǎo)出EFS加密證書和私鑰,并且在“證書導(dǎo)出向?qū)?/span>”對話框里選擇刪除私鑰,如圖3所示。
圖3
刪除私鑰以后,攻擊者就沒有辦法訪問EFS加密文件了,而我們需要訪問時,只需導(dǎo)入先前備份的證書和私鑰即可。
2.System Key提供額外的保護(hù)
System Key可以對SAM配置單元文件和EFS私鑰提供額外保護(hù)。Windows XP的System Key默認(rèn)保存在本地,我們可以運(yùn)行syskey命令,強(qiáng)制系統(tǒng)將System Key保存在軟盤里,或者用啟動密碼(startup password)來生成System Key。
由于EFS“密鑰鏈”的根密鑰(System Key)沒有保存在本地計(jì)算機(jī)中, 所以攻擊者將更加難以破解EFS加密。
提示 BitLocker加密的recovery key,類似于syskey的startup password,都是借助啟動時所輸入的一串密碼來生成所需的密鑰。
3.BitLocker提供更徹底的保護(hù)
本方法僅適用于Windows Vista(Enterprise和Ultimate Edition)。
最徹底的保護(hù)方法,首推Windows Vista新引入的BitLocker加密,這時候Windows分區(qū)的所有內(nèi)容全部被加密(包括SAM配置單元、EFS密鑰)。
BitLocker(TPM1.2)加密可以看成是Windows啟動保護(hù)器。在系統(tǒng)啟動時,TPM芯片會負(fù)責(zé)分析各個重要的啟動組件,以判斷自己是否位于原來的計(jì)算機(jī)環(huán)境。如果是的話,就依次釋放BitLocker加密所需的密鑰鏈,我們才能順利地訪問Windows,才能訪問EFS文件。
如果攻擊者企圖把硬盤掛接到別的計(jì)算機(jī)上,系統(tǒng)就會拒絕釋放密鑰,整個Windows Vista分區(qū)處于加密狀態(tài)。
如果攻擊者竊取了計(jì)算機(jī),并且竊取了BitLocker所需所有條件(TPM芯片自不必說,假設(shè)也獲得密鑰U盤)。這時候系統(tǒng)能夠順利引導(dǎo),并且成功釋放BitLocker密鑰鏈。但是攻擊者還必須想辦法知道帳戶的密碼,否則無法登錄系統(tǒng),Windows分區(qū)依然處于加密狀態(tài)。
EFS額外保護(hù)的原理如圖4所示。
圖4
4.題外話:為什么釋放BitLocker密鑰以后,Windows分區(qū)依然處于加密狀態(tài)?
所以盡管BitLocker密鑰已經(jīng)釋放,但是Windows分區(qū)并沒有被立即全部解密。否則每次啟動,都要解密整個Windows分區(qū),得花多少時間(筆者的Vista分區(qū)完全解密,共花3小時)!
原來BitLocker加密是以一個FVE Filter Driver來實(shí)現(xiàn)加密和解密,該Filter Driver處于文件系統(tǒng)驅(qū)動的下層。登錄系統(tǒng)以后,用戶需要訪問文件時,文件系統(tǒng)會自動請求FVE Filter Driver進(jìn)行解密,猜想應(yīng)該是一次解密一個Block,每個Block可能是512字節(jié)(和EFS一樣),不敢確定。對于用戶來說,這個過程是完全透明的,同時對性能的影響很小,幾乎可以忽略不計(jì)。EFS加密的情況有點(diǎn)類似。
寫在最后
這里非常敬佩國外微軟技術(shù)愛好者的執(zhí)著,事實(shí)上該作者還有一篇經(jīng)典的文章(描述SAM配置單元文件的二進(jìn)制結(jié)構(gòu)),鏈接如下,非常值得推薦。
很難想象,要編寫這樣的文章,得花費(fèi)多少的人力和時間,要做多少的實(shí)驗(yàn)才能在SAM數(shù)據(jù)庫逐個字節(jié)地找出其對應(yīng)的含義!
本文的目的,也是為了向這些國外的作者致敬。
http://www./ntsecurity/index.php