首页  编辑  

EFS加密的一线生机-加密帐户被删的补救方法

Tags: /计算机文档/Windows应用技巧/   Date Created:

        EFS 加密的一线生机-加密帐户被删的补救方法

Referer: http://blogs.itecn.net/blogs/ahpeng/archive/2006/04/20/Hack_in_EFS.aspx

引子: 看到新闻组里那么多网友"哭诉" EFS 问题,早就想写一篇 EFS 的文章。但是苦于手头资料太少,很多概念尚未圆润贯通,匆匆草就之下,这误人子弟的罪责,怕是逃不过的。

声明: 本文参考了国外一篇"牛"文,由于要掌握这篇国外文章,读者必须具备一些 NTFS 底层知识,否则难窥其堂奥。故此笔者四处网罗资料,加上穿凿附会,希望能帮助读者诸君更方便省时地领会这篇文章,舞好 EFS 这把双刃剑。文章链接如下:

<http://www.beginningtoseethelight.org/efsrecovery/index.php>

这里需要提醒用户注意:本文并非为了证明微软的 EFS 存在 " 漏洞 " ,也不是专为马大哈们准备的包治百病的 " 后悔药 " 。事实上如果没有导出 EFS 证书和私钥,那么一旦删除用户、或者重装系统, EFS 加密文件就不属于你了。

提示 本文适用于 Windows XP Professional 单机环境,并假设没有恢复代理 (DRF) 和共享访问帐户 ( 多个 DDF)

任务描述

如果某个用户把自己的登录帐户删除,那么其他用户将无法访问其 EFS 加密文件。更可恶的是,一旦公司里的某个用户心怀怨气,恶意加密了本属于别的用户的重要文件,将会导致严重问题。一般情况下,这些 EFS 加密文件已经被判了死刑,但是实际上只要满足以下条件的话,我们还是可以在末日来临之前打开逃生的天窗:

(1) 必须知道该被删帐户的密码。

(2) 该被删帐户的配置文件必须存在。如果使用"本地用户和组"管理单元删除帐户,则配置文件保留的机会很大,如果使用"用户帐户"控制面板删除帐户,则有一半机会保留配置文件。如果配置文件不幸被删,则只能祈祷可以借助 Easy Recovery 之类的数据恢复工具进行恢复。

可能有些朋友会觉得这两个条件比较苛刻,此处卖个关子先……

EFS 加密原理

大家知道, EFS 加密实际上综合了对称加密和不对称加密:

(1) 随机生成一个文件加密密钥 ( 叫做 FEK) ,用来加密和解密文件。

(2) 这个 FEK 会被当前帐户的公钥进行加密,加密后的 FEK 副本保存在文件 $EFS 属性的 DDF 字段里。

(3) 要想解密文件,首先必须用当前用户的私钥去解密 FEK ,然后用 FEK 去解密文件。

看到这里,似乎 EFS 的脉络已经很清晰,其实不然,这样还不足于确保 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 加密的密钥架构如图 1 所示。

1

提示 EFS 密钥的结构部分,参考自《 Windows Internals 4th 》的第 12 章。

回到" 任务描述 "部分所述的两个条件,现在我们应该明白原因了:

(1) 必须知道该被删帐户的密码:没有帐户密码,就无法解密主密钥。因为其加密密钥是由帐户密码派生而来的。

提示 难怪 Windows XP 2000 不同,管理员重设帐户密码,也不能解密 EFS 文件。

(2) 该被删帐户的配置文件必须存在:加密后的私钥和主密钥 ( 还包括证书和公钥 ) ,都保存在配置文件里,所以配置文件万万不可丢失,否则就会彻底"鬼子不能进村"。重装系统后,原来的配置文件肯定被删,这时候当然不可能恢复 EFS 文件。

可能有用户会想,只需新建一个同名的用户帐户,然后把原来配置文件复制给新帐户,不就可以解密 EFS 文件了?原因在于帐户的 SID ,因为新建用户的 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)

现在我们要设法让新建帐户同样具有 1004 RID ,这样就能达到目的。

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 帐户身份打开注册表编辑器:

psexec -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 ",如图 2 所示。

2

(4) 重要: 别忘了重启计算机!

(5) 重启以后,新建一个同名帐户 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 " 密钥链 "

为了防止攻击者窥视我们的 EFS 文件,可以借助以下三种方法:

1 .导出删除私钥

可以用证书向导导出 EFS 加密证书和私钥,并且在 " 证书导出向导 " 对话框里选择删除私钥,如图 3 所示。

3

删除私钥以后,攻击者就没有办法访问 EFS 加密文件了,而我们需要访问时,只需导入先前备份的证书和私钥即可。

2 System Key 提供额外的保护

System Key 可以对 SAM 配置单元文件和 EFS 私钥提供额外保护。 Windows XP System Key 默认保存在本地,我们可以运行 syskey 命令,强制系统将 System Key 保存在软盘里,或者用启动密码 (startup password) 来生成 System Key

由于 EFS" 密钥链"的根密钥 (System Key) 没有保存在本地计算机中, 所以攻击者将更加难以破解 EFS 加密。

提示 BitLocker 加密的 recovery key ,类似于 syskey startup password ,都是借助启动时所输入的一串密码来生成所需的密钥。

3 BitLocker 提供更彻底的保护

本方法仅适用于 Windows Vista(Enterprise Ultimate Edition)

最彻底的保护方法,首推 Windows Vista 新引入的 BitLocker 加密,这时候 Windows 分区的所有内容全部被加密 ( 包括 SAM 配置单元、 EFS 密钥 )

BitLocker(TPM1.2) 加密可以看成是 Windows 启动保护器。在系统启动时, TPM 芯片会负责分析各个重要的启动组件,以判断自己是否位于原来的计算机环境。如果是的话,就依次释放 BitLocker 加密所需的密钥链,我们才能顺利地访问 Windows ,才能访问 EFS 文件。

如果攻击者企图把硬盘挂接到别的计算机上,系统就会拒绝释放密钥,整个 Windows Vista 分区处于加密状态。

如果攻击者窃取了计算机,并且窃取了 BitLocker 所需所有条件 (TPM 芯片自不必说,假设也获得密钥 U ) 。这时候系统能够顺利引导,并且成功释放 BitLocker 密钥链。但是攻击者还必须想办法知道帐户的密码, 否则无法登录系统, Windows 分区依然处于加密状态

EFS 额外保护的原理如图 4 所示。

4

4 .题外话:为什么释放 BitLocker 密钥以后, Windows 分区依然处于加密状态?

所以尽管 BitLocker 密钥已经释放,但是 Windows 分区并没有被立即全部解密。否则每次启动,都要解密整个 Windows 分区,得花多少时间 ( 笔者的 Vista 分区完全解密,共花 3 小时 )

原来 BitLocker 加密是以一个 FVE Filter Driver 来实现加密和解密,该 Filter Driver 处于文件系统驱动的下层。登录系统以后,用户需要访问文件时,文件系统会自动请求 FVE Filter Driver 进行解密,猜想应该是一次解密一个 Block ,每个 Block 可能是 512 字节 ( EFS 一样 ) ,不敢确定。对于用户来说,这个过程是完全透明的,同时对性能的影响很小,几乎可以忽略不计。 EFS 加密的情况有点类似。

写在最后

这里非常敬佩国外微软技术爱好者的执着,事实上该作者还有一篇经典的文章 ( 描述 SAM 配置单元文件的二进制结构 ) ,链接如下,非常值得推荐。

很难想象,要编写这样的文章,得花费多少的人力和时间,要做多少的实验才能在 SAM 数据库逐个字节地找出其对应的含义!

本文的目的,也是为了向这些国外的作者致敬。

<http://www.beginningtoseethelight.org/ntsecurity/index.php>

posted on 2006 4 20 1:35 ahpeng <http://blogs.itecn.net/user/Profile.aspx?UserID=2131>

img_1231.bmp (426.4KB)
img_1371.bmp (717.2KB)
img_28817.bmp (1.5MB)
img_4283.bmp (943.4KB)