☆ 从注册表中还原出LM Hash、NTLM Hash 启用SYSKEY机制后,注册表中保存的是加密后的LM Hash、NTLM Hash,2K/XP/2003正 是这样的情形。逆向分析samsrv.dll中如下函数,了解这个加密算法: SamrQueryInformationUser SamrQueryInformationUser2 SampQueryInformationUserInternal SampRetrieveUserPasswords SampDecryptSecretData -------------------------------------------------------------------------- SampSecretSessionKey : CA 7C 56 6F 36 9F 17 64 CC 30 77 3E 00 A5 67 60 RID : E8 03 00 00 (1000) SampMagicConstantStringA : 4C 4D 50 41 53 53 57 4F 52 44 00 ("LMPASSWORD") MD5/RC4KEY : 30 58 58 7D 01 14 0F FA BE 2C E3 99 8C F3 0D 10 Encrypted LM Hash/RC4 IN : D3 B8 C2 84 97 05 50 83 B0 55 46 A3 C9 F4 5B C6 RC4/DES Encrypted Message : ED 0E B6 92 76 8E 43 25 B1 52 28 32 18 05 43 32 E8030000E8030000E8030000E803 (Derived From RID) | str_to_key() | V E800C0000E400C00007400600006A006 (DESKEY Derived From RID) DESKEY1 Derived From RID : E8 00 C0 00 0E 40 0C 00 DESKEY2 Derived From RID : 00 74 00 60 00 06 A0 06 DES/LM Hash : 42 2B 15 72 AE 4B 9C DE E2 C2 FA D4 5B 16 A0 FF -------------------------------------------------------------------------- 按上述顺序将SampSecretSessionKey、RID、SampMagicConstantStringA拼接到一个 缓冲区中,对该缓冲区求MD5单向哈希值,生成的16字节做为RC4KEY。 将Encrypted LM Hash做为RC4的输入数据,求出16字节的RC4输出数据,做为DES密文。 将RID不断填充到一个缓冲区中,直到满14字节为止。利用str_to_key()函数将之转 换成两组DESKEY。参<>: https://scz.617.cn/network/200210141957.txt 用DESKEY1、DESKEY2分别解密DES密文的前8字节、后8字节,将明文拼接到一起,即 16字节的LM Hash。 还原NTLM Hash时,算法同上,但不再使用SampMagicConstantStringA、Encrypted LM Hash,转而使用SampMagicConstantStringB、Encrypted NTLM Hash。 -------------------------------------------------------------------------- SampSecretSessionKey : CA 7C 56 6F 36 9F 17 64 CC 30 77 3E 00 A5 67 60 RID : E8 03 00 00 (1000) SampMagicConstantStringB : 4E 54 50 41 53 53 57 4F 52 44 00 ("NTPASSWORD") MD5/RC4KEY : 96 BE 87 40 08 8B 57 18 35 A0 E9 6E 50 95 C9 E7 Encrypted NTLM Hash/RC4 IN : 93 75 EE 45 2C 8D E1 FD D3 50 F6 62 FC 5B 3C 5E RC4/DES Encrypted Message : D3 38 99 8E 85 03 DA 20 A6 D5 09 1C 48 2A 81 4A E8030000E8030000E8030000E803 (Derived From RID) | str_to_key() | V E800C0000E400C00007400600006A006 (DESKEY Derived From RID) DESKEY1 Derived From RID : E8 00 C0 00 0E 40 0C 00 DESKEY2 Derived From RID : 00 74 00 60 00 06 A0 06 DES/NTLM Hash : 6E AB 0E A8 EB 87 C8 E9 38 22 D6 D9 E5 59 87 81 -------------------------------------------------------------------------- 这里所涉及的MD5、RC4、DES全部是标准算法,任一加密算法库中的相应函数均可用 于此处。如果你想省点事,可以使用我挖出来的一个小库samcrypt.lib: https://scz.617.cn/misc/200401061504.txt ☆ 参考资源 [11] SAM的散列存储加密解密算法以及SYSKEY的计算 - flashsky[2003-06-04] http://www.xfocus.net/releases/200306/a550.html [13] Windows 2k/NT/XP's syskey encryption - Nicola Cuomo http://studenti.unina.it/~ncuomo/syskey/syskey.txt