分享
 
 
 

NT平台拨号连接密码恢复原理

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

前段时间ADSL密码忘记了,但幸好还保存在拨号连接里面,于是到网上找了些星号密码显示工具,可惜不起作用。后来找到一种名为dialupass的工具,这家伙还真的把密码给我还原出来了。(用的dialupass v2.42,我的系统是windows xp)

看起来dialupass非普通的星号密码显示工具,那它的原理是什么呢?上GOOGLE查了一翻,没找到相关资料(可能是我用的关键字有问题)。 一生气便操起家伙(windbg)准备把它大卸八块。郁闷的是,用windbg加载后,密码就还原不出来了,显示是星号。换替补ollydbg上场,情况依旧。莫非这小工具有Anti-Debug功能?当时只是一丝怀疑,因为实在不相信这样的小工具作者会花心思来保护。

后来在用s-ice跟踪的过程中,发现有这么一个调用:

GetProcAddress(xx, "IsDebugPresent")。

晕倒,原来真的有Anti-Debug功能,好在比较简单。统计了一下,总共有5处进行了Anti-Debug检查。情况查明了,便换回windbg来调试,在windbg里面下这么一个断点便可绕过Anti-Debug检测:

bp KERNEL32!IsDebuggerPresent "g poi(esp);r eax=0;g"

花了些时间跟踪了一下,把dialupass恢复密码的流程都搞清楚了。这小程序猫腻还挺多的,总结如下:

1. 关键函数不直接调用,而是用LoadLibraryA和GetProcAddress来获取函数地址后再CALL。

2. 函数名是经过编码的,反汇编后看字符串是看不到的。

3. 关键地方一概用花指令来迷惑你和反汇编软件。

其实原理很简单,就是用rasapi32.dll里面的一些函数来获取拨号连接的一些信息,再用 ADVAPI32!LsaRetrievePrivateData 函数来获取密码。根据dialupasss的原理,写了个类似的工具,源代码参见后面的x_dialupass.c。后来用"LsaRetrievePrivateData"和"RasDialParams"做关键字,重新在GOOGLE搜索了一遍,找到一些类似的代码。

参考资源[1]和[2]的是俄罗斯人公布的演示代码,没有对LsaRetrievePrivateData返回的数据进行拆分用户名和密码。参考资源[3]是日本人公布的完整的应用程序的代码,可惜在对LsaRetrievePrivateData返回的数据进行拆分处理时存在BUG,导致有些情况下用户名和密码取的不正确。后来发现lsadump2 DUMP出来的数据里面包含了"LsaRetrievePrivateData"返回的数据。lsadump2的原理大致如下:

1)插入一线程到lsass.exe进程

2)打开LSA Policy database

3)从注册表"HKLM\SECURITY\Policy\Secrets"中枚举子键

4)LsarOpenSecret

5)LsarQuerySecret

进一步跟踪后发现,其实ADVAPI32!LsaRetrievePrivateData是通过NdrClientCall2 发送RPC调用到lsass.exe进程,lsass.exe里面再调用LsarOpenSecret、LsarQuerySecret来完成获取拨号连接信息过程的。(注:LsarOpenSecret里面有权限判断,非ADMIN组用户是没有权限来调用ADVAPI32!LsaRetrievePrivateData的)。跟踪了一下LsarQuerySecret,发现它返回的数据其实是从注册表中读取。保存拨号连接信息的注册表键值为:

HKLM\SECURITY\Policy\Secrets\RasDialParams!SID#0\CurrVal

SID对应的是用户的string SID。(“HKLM\SECURITY”这个键只有SYSTEM有权限读写,连admin都没有权限)

LsarQuerySecret从注册表中读取出来数据后,接着调用LsapCrDecryptValue函数来解密,对于同一台机器来说,解密时用的KEY始终都是固定的,这个KEY在lsasrv.dll里面。变量名为"_LsapDbSecretCipherKey"。在windows 2003里面,变量名不一样,对应的有两个,分别为"LsapDbSecretCipherKeyWrite"和"LsapDbSecretCipherKeyRead",但这两个变量里面的数据是一样的。LsapCrDecryptValue用的似乎是标准DES算法,解密时主要流程如下:

lsasrv!LsapCrDecryptValue

|_ advapi32!SystemFunction005

|_ advapi32!DecryptDataLength

|_ advapi32!SystemFunction002

|_ advapi32!DES_ECB_LM

|_ advapi32!des

解密后,在"

.text:785462F0 call_LsapCrDecryptValue@12

.text:785462F5 testeax, eax

.text:785462F7 mov [ebp+var_8], eax

.text:785462FA jl

loc_785838E1

.text:78546300

.text:78546300 loc_78546300:

.text:78546300 cmp byte ptr [esi+45h], 0

.text:78546304 jzshort loc_7854632E

......

.text:7854632E loc_7854632E:

.text:7854632E lea eax, [ebp+var_10]

.text:78546331 pusheax

.text:78546332 push[ebp+arg_8]

.text:78546335 push[ebp+var_C]

.text:78546338 call_LsapCrEncryptValue@12

假如[esi+45h]为0的话(esi是LsarOpenSecret函数返回的HANDLE),它会把解密后的数据再进行一次加密,不管是2000还是2003,这时用的KEY始终都是固定为“SystemLibraryDTC”。lsadump2里面调用LsarOpenSecret得到的HANDLE,偏移0x45处值为1,所以LsarQuerySecret函数返回的就是解密后的数据了。而在调用ADVAPI32!LsaRetrievePrivateData时,LsarOpenSecret返回的HANDLE偏移。0x45处值为0x0,所以LsarQuerySecret返回的是解密后又加密的数据,所以在ADVAPI32!LsaRetrievePrivateData里面还有一个对应的解密过程。相应的,LsapCrEncryptValue加密的主要流程如下:

lsasrv!LsapCrEncryptValue

|_ advapi32!SystemFunction004

|_ advapi32!EncryptDataLength

|_ advapi32!SystemFunction001

|_ advapi32!DES_ECB_LM

|_ advapi32!des

开始我以为在同一版本的windows里面,_LsapDbSecretCipherKey是固定的,后来发现我错了。那么这个_LsapDbSecretCipherKey是如何产生的?流程如下:

(1)调用ntdll!NtConnectPort打开 L"\Security\WxApiPort"

(2)调用ntdll!NtRequestWaitReplyPort得到一些数据 。ebp-40处为NtRequestWaitReplyPort返回的LPCMESSAGE。

kd; dd ebp-40

0006fcb8 00400028 00000002 000000dc 000000d8

0006fcc8 00000024 00000000 00000000 00000000

0006fcd8 00000001 00000010 00000010 fd317e3e

0006fce8 7e24e86d d12503d3 5f7d01a8 7665f528

kd; db ebp-14

0006fce4 3e 7e 31 fd 6d e8 24 7e-d3 03 25 d1 a8 01 7d 5f

(3)将上述"ebp-14"处的0x10字节数据COPY到lsasrv.dll里面的"_LsapDbSysKey"变量。 "_LsapDbSysKey"在不同的机器上面(即使版本相同)都是不一样的。它是怎么产生的?有幸拜读了flashsky的大作后(参考资源[4]),才明白这就是传说中的"SYSKEY"。用flashsk的代码验证一下:

c:\;getsyskey

3e 7e 31 fd 6d e8 24 7e d3 03 25 d1 a8 01 7d 5f

跟踪系统启动过程,可知道"\Security\WxApiPort"是由winlogon.exe进程创建的,然后lsass进程通过这个LPC PORT从winlogon进程获取SYSKEY,随后winlogon进程会关闭这个LPC PORT。所以在系统启动完成之后,用"Process Explorer"等工具是看不到这个LPC PORT存在的,而且在winlogon和LSASS进程空间都搜索不到上述SYSKEY。

(4)从注册表"HKLM\SECURITY\Policy\PolSecretEncryptionKey"中读取出来一段数据,调用函数_LsapDbDecryptKeyWithSyskey,把它用"_LsapDbSysKey"来解密, "_LsapDbSecretCipherKey"就在解密完后的数据里面。("LsapDbDecryptKeyWithSyskey"函数做的其实就是MD5和RC4运算)了解原理后,我们就可以直接从注册表里面来获取拨号连接中的密码等数据了。但有几个问题需要解决:

(1)原料。

Q:"HKLM\SECURITY"键只有SYSTEM有权限读写?

A:我们可以把代码插入到SYSTEM进程里面去运行,或者把这个键修改为ADMIN有权限读,或者提升本进程权限。

(2)催化剂:)

Q: 如何获取"_LsapDbSysKey"?解密用的函数_LsapDbDecryptKeyWithSyskey为非导出函数,怎么办?

A1: 用flashsky的代码来获取SYSKEY,利用公开的MD5和RC4库函数来解密。

A2: 直接从lsass.exe进程里面搜索"_LsapDbSecretCipherKey",它的结构如下:

typedef struct _LSA_BLOB {

DWORD cbData;

DWORD cbMaxData;

BYTE* pbData;

} LSA_BLOB;

pbData指向存储KEY的地址,KEY长度固定为0x10字节,即cbData和cbMaxData都是固定为0x10。所以从lsass进程的空间里面搜索"\x10\x00\x00\x00\x10\x00\x00\x00"即可找到正确的KEY。结果可能会有多个,可以把所有搜索到的KEY都试一下,总有一个正确的。

(3)工具

Q: 解密函数LsapCrDecryptValue为非导出函数,怎么办?

A: 或许可以根据特征码来搜索,但总觉得不太可靠。

幸好,LsapCrDecryptValue 调用的advapi32!SystemFunction005是导出函数:)。或者直接利用公开的DES库函数,自己来运算。x_dialupass2.cpp 中的代码演示了直接从注册表中读取数据并解密之的过程,没有太多实际意义。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有