2012年12月26日 星期三

Windows 如何恢復SID方法


Widnows中創建使用者或電腦、群組時都會生成SID號,那麼如果用戶把自己的登錄帳戶刪除,那些EFS加密檔已經無法使用,但是只要滿足以下條件的話,還是有一線生機:


EFS加密原理
EFS加密實際上綜合了對稱加密和不對稱加密:

  • 隨機生成一個檔加密金鑰(叫做FEK),用來加密和解密檔。
  • 這個FEK會被當前帳戶的公開金鑰進行加密,加密後的FEK副本保存在檔$EFS屬性的DDF欄位裡。
(1) 必須知道該被刪帳戶的密碼。
(2) 該被刪帳戶的設定檔必須存在。
(3) 要想解密檔,首先必須用當前用戶的私密金鑰去解密FEK,然後用FEK去解密文件。

這樣還不足於確保EFS的安全性。系統還會對EFS添加兩層保護措施:

(1) Windows會用64位元組的主金鑰(Master Key)對私密金鑰進行加密,加密後的私密金鑰保存在以下資料夾:%UserProfile%\Application Data\Microsoft\Crypto\RSA\SID
提示 Windows系統裡的各種私有金鑰,都用相應的主金鑰進行加密。Windows Vista的BitLocker加密,也用其主金鑰對FVEK(全卷加密金鑰)進行加密。
(2) 為了保護主金鑰,系統會對主金鑰本身進行加密(使用的金鑰由帳戶密碼派生而來),加密後的主金鑰保存在以下資料夾:%UserProfile%\Application Data\Microsoft\Protect\SID

提示 EFS金鑰的結構部分,參考自《Windows Internals 4th》的第12章。
回到“任務描述”部分所述的兩個條件,現在我們應該明白原因了:
(1) 必須知道該被刪帳戶的密碼:沒有帳戶密碼,就無法解密主金鑰。因為其加密金鑰是由帳戶密碼派生而來的。
(2) 該被刪帳戶的設定檔必須存在:加密後的私密金鑰和主金鑰(還包括證書和公開金鑰),都保存在設定檔裡,所以設定檔萬萬不可丟失。

原來的使用者帳戶已經被刪除,怎麼辦?方法是讓系統再造一個完全一樣的SID新建一個用戶將SID改變與舊帳戶一樣即可
恢復步驟
為了方便描述,這裡假設被刪帳戶的用戶名為Admin,Windows安裝在C盤。

1.再造SID
首先確認被刪帳戶的SID,這裡可以進入以下資料夾:
C:\Documents and Settings\Admin\Application Data\Microsoft\Crypto\RSA
在其下應該有一個以該被刪帳戶的SID為名的資料夾,例如是S-1-5-21-4662660629-873921405-788003330-1004(RID為1004)
在Windows中,下一個新建帳戶所分配的RID是由HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account註冊表項的F鍵值所確定的。F鍵值是二進位類型的資料,在偏移量0048處的四個位元組,定義下一個帳戶的RID。那麼也就是說,只需要修改0048處的四個位元組,就能達到目的(讓新建帳戶獲得1004的RID)
確認好以後,別忘記把Admin帳戶的設定檔轉移到別的地方!

(1) 預設情況下,只有system帳戶才有許可權訪問HKEY_LOCAL_MACHINE\SAM,這裡在CMD命令提示視窗,運行以下命令,以system帳戶身份打開登錄編輯程式:
pexec -i -d -s %windir%\regedit.exe
提示 可以在以下網站下載psexec:
http://www.sysinternals.com/Utilities/PsExec.html

(2) 定位到HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account註冊表項,按兩下打開右側的F鍵值。


(3) 這裡要說明一下,Windows是以十六進位、而且以反轉形式保存下一個帳戶的RID。什麼意思呢?也就是說,如果是1004的RID,對應十六進位就是03EC,但是我們必須把它反轉過來變成EC03,再擴展為4個位元組,就是EC 03 00 00。
所以,我們應該把F鍵值的0048偏移量處,把其中四個位元組改為“EC 03 00 00”。

(4) 重啟以後,新建一個同名帳戶Admin,它的SID應該和以前是完全一樣。如果不相信的話,可以借助GetSID或者PsGetSID等工具測試一下。

2.“破解”EFS
接下來的方法就非常簡單了,用新建的Admin帳戶身份登錄系統,隨便加密一個檔,然後註銷,用管理員帳戶登錄系統,把原來保留的設定檔複製到C:\Documents and Settings\Admin資料夾下。
再用Admin帳戶登錄系統,現在可以解密原來的EFS檔了。

疑難排解
1.如果已經重裝系統,那怎麼辦?
“聲明”部分提到的那篇文章裡提到,如果還記得原來帳戶的密碼,並且設定檔沒有被刪除的話,還有希望。這時候可以借助sysinternals的NEWSID工具把系統的電腦SID重設為原來的值,再用前面描述的方法構造所需的RID,這樣就可以獲得所需的帳戶SID。剩餘步驟完全一樣。
http://www.sysinternals.com/Utilities/NewSid.html

2.有用戶曾經遇到這樣的問題:登錄系統時收到提示說密碼過期,需要重設,重設密碼登錄後發現打開EFS文件。

KB890951提到這個問題。其解釋是因為在修改密碼時,系統還沒有載入設定檔(有點語焉不詳),原文如下:
This problem occurs because the user profile for the current user is not loaded correctly after you change the password.
設定檔和EFS有何相干?看完本文,大家應該知道,EFS的私密金鑰和主金鑰都是保存在設定檔裡的。由於設定檔沒有載入,所以主金鑰的加密版本沒有得到更新(沒有跟上帳戶密碼的變化),導致主金鑰無法正確解密,從而無法解密私密金鑰和FEK。這就是問題的真正原因。
該KB提供了一個內部補丁,可以解決這個問題。KB890951的連結如下:
http://support.microsoft.com/kb/890951

3.有關公開金鑰的問題

為了容易理解,筆者故意忽略了公開金鑰。公開金鑰保存也保存在帳戶的設定檔裡:
%UserProfile%\Application Data\Microsoft\SystemCertificates\My\Certificates
在EFS恢復的操作中,必須確保公開金鑰也要複製到新帳戶的設定檔裡。儘管看起來公開金鑰與EFS解密無關(它負責加密)。
原來,加密檔$EFS屬性的DDF欄位裡除了有帳戶SID和加密的FEK副本外,還有公開金鑰的指紋資訊(Public Key Thumbprint)和私密金鑰GUID信息(私密金鑰的某種散列值)。
系統在掃描加密檔$EFS屬性中的DDF欄位時,根據使用者設定檔裡的公開金鑰中所包含的公開金鑰指紋和私密金鑰GUID資訊,當然還有帳戶的SID,來判斷該帳戶是否具有對應的DDF欄位,從而判斷該用戶是否屬於合法的EFS檔擁有者。
所以公開金鑰也很重要。
當然公開金鑰是可以“偽造”的(可以偽造出所需的公開金鑰指紋和私密金鑰GUID),以欺騙EFS系統,具體方法可以參考國外的那篇原稿,此處不再贅述。
加強EFS的安全
由於EFS把所有的相關金鑰都保存在Windows分區,所以這可能給EFS帶來一定的安全隱患。目前有一些協力廠商工具號稱可以破解EFS,這些工具首先攻擊SAM配置單中繼檔,嘗試破解帳戶密碼,從而破解帳戶密碼→主金鑰的加密金鑰→主金鑰→EFS私密金鑰→FEK的“金鑰鏈”。

1 則留言:

  1. 请问windows 2012、8.1、10这些系统怎样才能设设定想要的SID?
    sysinternals的NEWSID试用后不成功,windows10彻底崩溃了。

    回覆刪除