。
任務(wù)描述
如果某個(gè)用戶把自己的登錄帳戶刪除,那么其他用戶將無(wú)法訪問(wèn)其EFS加密文件。更可惡的是,一旦公司里的某個(gè)用戶心懷怨氣,惡意加密了本屬于別的用戶的重要文件,將會(huì)導(dǎo)致嚴(yán)重問(wèn)題。一般情況下,這些EFS加密文件已經(jīng)被判了死刑,但是實(shí)際上只要滿足以下條件的話,我們還是可以在末日來(lái)臨之前打開逃生的天窗:
(1) 必須知道該被刪帳戶的密碼。
(2) 該被刪帳戶的配置文件必須存在。如果使用“本地用戶和組”管理單元?jiǎng)h除帳戶,則配置文件保留的機(jī)會(huì)很大,如果使用“用戶帳戶”控制面板刪除帳戶,則有一半機(jī)會(huì)保留配置文件。如果配置文件不幸被刪,則只能祈禱可以借助Easy Recovery之類的數(shù)據(jù)恢復(fù)工具進(jìn)行恢復(fù)。
可能有些朋友會(huì)覺(jué)得這兩個(gè)條件比較苛刻,此處賣個(gè)關(guān)子先……
EFS加密原理
大家知道,EFS加密實(shí)際上綜合了對(duì)稱加密和不對(duì)稱加密:
(1) 隨機(jī)生成一個(gè)文件加密密鑰(叫做FEK),用來(lái)加密和解密文件。
(2) 這個(gè)FEK會(huì)被當(dāng)前帳戶的公鑰進(jìn)行加密,加密后的FEK副本保存在文件$EFS屬性的DDF字段里。
(3) 要想解密文件,首先必須用當(dāng)前用戶的私鑰去解密FEK,然后用FEK去解密文件。
看到這里,似乎EFS的脈絡(luò)已經(jīng)很清晰,其實(shí)不然,這樣還不足于確保EFS的安全性。系統(tǒng)還會(huì)對(duì)EFS添加兩層保護(hù)措施:
(1) Windows會(huì)用64字節(jié)的主密鑰(Master Key)對(duì)私鑰進(jìn)行加密,加密后的私鑰保存在以下文件夾:
%UserProfile%\Application Data\Microsoft\Crypto\RSA\SID
提示 Windows系統(tǒng)里的各種私有密鑰,都用相應(yīng)的主密鑰進(jìn)行加密。Windows Vista的BitLocker加密,也用其主密鑰對(duì)FVEK(全卷加密密鑰)進(jìn)行加密。
(2) 為了保護(hù)主密鑰,系統(tǒng)會(huì)對(duì)主密鑰本身進(jìn)行加密(使用的密鑰由帳戶密碼派生而來(lái)),加密后的主密鑰保存在以下文件夾:
%UserProfile%\Application Data\Microsoft\Protect\SID
整個(gè)EFS加密的密鑰架構(gòu)如圖1所示。
圖1
提示 EFS密鑰的結(jié)構(gòu)部分,參考自《Windows Internals 4th》的第12章。
回到“任務(wù)描述”部分所述的兩個(gè)條件,現(xiàn)在我們應(yīng)該明白原因了:
(1) 必須知道該被刪帳戶的密碼:沒(méi)有帳戶密碼,就無(wú)法解密主密鑰。因?yàn)槠浼用苊荑€是由帳戶密碼派生而來(lái)的。
提示 難怪Windows XP和2000不同,管理員重設(shè)帳戶密碼,也不能解密EFS文件。
(2) 該被刪帳戶的配置文件必須存在:加密后的私鑰和主密鑰(還包括證書和公鑰),都保存在配置文件里,所以配置文件萬(wàn)萬(wàn)不可丟失,否則就會(huì)徹底“鬼子不能進(jìn)村”。重裝系統(tǒng)后,原來(lái)的配置文件肯定被刪,這時(shí)候當(dāng)然不可能恢復(fù)EFS文件。
可能有用戶會(huì)想,只需新建一個(gè)同名的用戶帳戶,然后把原來(lái)配置文件復(fù)制給新帳戶,不就可以解密EFS文件了?原因在于帳戶的SID,因?yàn)樾陆ㄓ脩舻?/span>SID不可能和老帳戶一樣,所以常規(guī)方法是不可能奏效的。我們必須另辟蹊徑,讓系統(tǒng)再造一個(gè)完全一樣的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)該有一個(gè)以該被刪帳戶的SID為名的文件夾,例如是S-1-5-21-4662660629-873921405-788003330-1004(RID為1004)
現(xiàn)在我們要設(shè)法讓新建帳戶同樣具有1004的RID,這樣就能達(dá)到目的。
在Windows中,下一個(gè)新建帳戶所分配的RID是由HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account注冊(cè)表項(xiàng)的F鍵值所確定的。F鍵值是二進(jìn)制類型的數(shù)據(jù),在偏移量0048處的四個(gè)字節(jié),定義下一個(gè)帳戶的RID。那么也就是說(shuō),只需要修改0048處的四個(gè)字節(jié),就能達(dá)到目的(讓新建帳戶獲得1004的RID)!
確認(rèn)好以后,別忘記把Admin帳戶的配置文件轉(zhuǎn)移到別的地方!
(1) 默認(rèn)情況下,只有system帳戶才有權(quán)限訪問(wèn)HKEY_LOCAL_MACHINE\SAM,這里在CMD命令提示符窗口,運(yùn)行以下命令,以system帳戶身份打開注冊(cè)表編輯器:
psexec -i -d -s %windir%\regedit.exe
提示 可以在以下網(wǎng)站下載psexec:
http://www./Utilities/PsExec.html
(2) 定位到HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account注冊(cè)表項(xiàng),雙擊打開右側(cè)的F鍵值。
(3) 這里要說(shuō)明一下,Windows是以十六進(jìn)制、而且以反轉(zhuǎn)形式保存下一個(gè)帳戶的RID。什么意思呢?也就是說(shuō),如果是1004的RID,對(duì)應(yīng)十六進(jìn)制就是03EC,但是我們必須把它反轉(zhuǎn)過(guò)來(lái)變成EC03,再擴(kuò)展為4個(gè)字節(jié),就是EC 03 00 00。
所以,我們應(yīng)該把F鍵值的0048偏移量處,把其中四個(gè)字節(jié)改為“EC 03 00 00”,如圖2所示。
圖2
(4) 重要:別忘了重啟計(jì)算機(jī)!
(5) 重啟以后,新建一個(gè)同名帳戶Admin,它的SID應(yīng)該和以前是完全一樣。如果不相信的話,可以借助GetSID或者PsGetSID等工具測(cè)試一下。
2.“破解”EFS
接下來(lái)的方法就非常簡(jiǎn)單了,用新建的Admin帳戶身份登錄系統(tǒng),隨便加密一個(gè)文件,然后注銷,用管理員帳戶登錄系統(tǒng),把原來(lái)保留的配置文件復(fù)制到C:\Documents and Settings\Admin文件夾下。
再用Admin帳戶登錄系統(tǒng),現(xiàn)在可以解密原來(lái)的EFS文件了。
疑難解答
1.如果已經(jīng)重裝系統(tǒng),那怎么辦?
“聲明”部分提到的那篇文章里提到,如果還記得原來(lái)帳戶的密碼,并且配置文件沒(méi)有被刪除的話,還有希望。這時(shí)候可以借助sysinternals的NEWSID工具把系統(tǒng)的計(jì)算機(jī)SID重設(shè)為原來(lái)的值,再用前面描述的方法構(gòu)造所需的RID,這樣就可以獲得所需的帳戶SID。剩余步驟完全一樣。
http://www./Utilities/NewSid.html
2.有用戶曾經(jīng)遇到這樣的問(wèn)題:登錄系統(tǒng)時(shí)收到提示說(shuō)密碼過(guò)期,需要重設(shè),重設(shè)密碼登錄后發(fā)現(xiàn)打開EFS文件。
KB890951提到這個(gè)問(wèn)題。其解釋是因?yàn)樵谛薷拿艽a時(shí),系統(tǒng)還沒(méi)有加載配置文件(有點(diǎn)語(yǔ)焉不詳),原文如下:
This problem occurs because the user profile for the current user is not loaded correctly after you change the password.
配置文件和EFS有何相干?看完本文,大家應(yīng)該知道,EFS的私鑰和主密鑰都是保存在配置文件里的。由于配置文件沒(méi)有加載,所以主密鑰的加密版本沒(méi)有得到更新(沒(méi)有跟上帳戶密碼的變化),導(dǎo)致主密鑰無(wú)法正確解密,從而無(wú)法解密私鑰和FEK。這就是問(wèn)題的真正原因。
該KB提供了一個(gè)內(nèi)部補(bǔ)丁,可以解決這個(gè)問(wèn)題。KB890951的鏈接如下:
http://support.microsoft.com/kb/890951
3.有關(guān)公鑰的問(wèn)題
為了容易理解,筆者故意忽略了公鑰。公鑰保存也保存在帳戶的配置文件里:
%UserProfile%\Application Data\Microsoft\SystemCertificates\My\Certificates
在EFS恢復(fù)的操作中,必須確保公鑰也要復(fù)制到新帳戶的配置文件里。盡管看起來(lái)公鑰與EFS解密無(wú)關(guān)(它負(fù)責(zé)加密)。
原來(lái),加密文件$EFS屬性的DDF字段里除了有帳戶SID和加密的FEK副本外,還有公鑰的指紋信息(Public Key Thumbprint)和私鑰GUID信息(私鑰的某種散列值)。
系統(tǒng)在掃描加密文件$EFS屬性中的DDF字段時(shí),根據(jù)用戶配置文件里的公鑰中所包含的公鑰指紋和私鑰GUID信息,當(dāng)然還有帳戶的SID,來(lái)判斷該帳戶是否具有對(duì)應(yīng)的DDF字段,從而判斷該用戶是否屬于合法的EFS文件擁有者。
所以公鑰也很重要。
當(dāng)然公鑰是可以“偽造”的(可以偽造出所需的公鑰指紋和私鑰GUID),以欺騙EFS系統(tǒng),具體方法可以參考國(guó)外的那篇原稿,此處不再贅述。
加強(qiáng)EFS的安全
由于EFS把所有的相關(guān)密鑰都保存在Windows分區(qū),所以這可能給EFS帶來(lái)一定的安全隱患。目前有一些第三方工具號(hào)稱可以破解EFS,這些工具首先攻擊SAM配置單元文件,嘗試破解帳戶密碼,從而破解帳戶密碼→主密鑰的加密密鑰→主密鑰→EFS私鑰→FEK的“密鑰鏈”。
為了防止攻擊者窺視我們的EFS文件,可以借助以下三種方法:
1.導(dǎo)出刪除私鑰
可以用證書向?qū)?dǎo)出EFS加密證書和私鑰,并且在“證書導(dǎo)出向?qū)?/span>”對(duì)話框里選擇刪除私鑰,如圖3所示。
圖3
刪除私鑰以后,攻擊者就沒(méi)有辦法訪問(wèn)EFS加密文件了,而我們需要訪問(wèn)時(shí),只需導(dǎo)入先前備份的證書和私鑰即可。
2.System Key提供額外的保護(hù)
System Key可以對(duì)SAM配置單元文件和EFS私鑰提供額外保護(hù)。Windows XP的System Key默認(rèn)保存在本地,我們可以運(yùn)行syskey命令,強(qiáng)制系統(tǒng)將System Key保存在軟盤里,或者用啟動(dòng)密碼(startup password)來(lái)生成System Key。
由于EFS“密鑰鏈”的根密鑰(System Key)沒(méi)有保存在本地計(jì)算機(jī)中, 所以攻擊者將更加難以破解EFS加密。
提示 BitLocker加密的recovery key,類似于syskey的startup password,都是借助啟動(dòng)時(shí)所輸入的一串密碼來(lái)生成所需的密鑰。
3.BitLocker提供更徹底的保護(hù)
本方法僅適用于Windows Vista(Enterprise和Ultimate Edition)。
最徹底的保護(hù)方法,首推Windows Vista新引入的BitLocker加密,這時(shí)候Windows分區(qū)的所有內(nèi)容全部被加密(包括SAM配置單元、EFS密鑰)。
BitLocker(TPM1.2)加密可以看成是Windows啟動(dòng)保護(hù)器。在系統(tǒng)啟動(dòng)時(shí),TPM芯片會(huì)負(fù)責(zé)分析各個(gè)重要的啟動(dòng)組件,以判斷自己是否位于原來(lái)的計(jì)算機(jī)環(huán)境。如果是的話,就依次釋放BitLocker加密所需的密鑰鏈,我們才能順利地訪問(wèn)Windows,才能訪問(wèn)EFS文件。
如果攻擊者企圖把硬盤掛接到別的計(jì)算機(jī)上,系統(tǒng)就會(huì)拒絕釋放密鑰,整個(gè)Windows Vista分區(qū)處于加密狀態(tài)。
如果攻擊者竊取了計(jì)算機(jī),并且竊取了BitLocker所需所有條件(TPM芯片自不必說(shuō),假設(shè)也獲得密鑰U盤)。這時(shí)候系統(tǒng)能夠順利引導(dǎo),并且成功釋放BitLocker密鑰鏈。但是攻擊者還必須想辦法知道帳戶的密碼,否則無(wú)法登錄系統(tǒng),Windows分區(qū)依然處于加密狀態(tài)。
EFS額外保護(hù)的原理如圖4所示。
圖4
4.題外話:為什么釋放BitLocker密鑰以后,Windows分區(qū)依然處于加密狀態(tài)?
所以盡管BitLocker密鑰已經(jīng)釋放,但是Windows分區(qū)并沒(méi)有被立即全部解密。否則每次啟動(dòng),都要解密整個(gè)Windows分區(qū),得花多少時(shí)間(筆者的Vista分區(qū)完全解密,共花3小時(shí))!
原來(lái)BitLocker加密是以一個(gè)FVE Filter Driver來(lái)實(shí)現(xiàn)加密和解密,該Filter Driver處于文件系統(tǒng)驅(qū)動(dòng)的下層。登錄系統(tǒng)以后,用戶需要訪問(wèn)文件時(shí),文件系統(tǒng)會(huì)自動(dòng)請(qǐng)求FVE Filter Driver進(jìn)行解密,猜想應(yīng)該是一次解密一個(gè)Block,每個(gè)Block可能是512字節(jié)(和EFS一樣),不敢確定。對(duì)于用戶來(lái)說(shuō),這個(gè)過(guò)程是完全透明的,同時(shí)對(duì)性能的影響很小,幾乎可以忽略不計(jì)。EFS加密的情況有點(diǎn)類似。
寫在最后
這里非常敬佩國(guó)外微軟技術(shù)愛(ài)好者的執(zhí)著,事實(shí)上該作者還有一篇經(jīng)典的文章(描述SAM配置單元文件的二進(jìn)制結(jié)構(gòu)),鏈接如下,非常值得推薦。
很難想象,要編寫這樣的文章,得花費(fèi)多少的人力和時(shí)間,要做多少的實(shí)驗(yàn)才能在SAM數(shù)據(jù)庫(kù)逐個(gè)字節(jié)地找出其對(duì)應(yīng)的含義!
本文的目的,也是為了向這些國(guó)外的作者致敬。
http://www./ntsecurity/index.php