电脑常识文选 | QQ专区 | 硬件Diy | 电脑教程 | 电脑应用 | 网络应用 | Office | 操作系统 | 电脑学习 | 电脑知识库 | 网页制作 | 应用软件 | 电脑硬件
电脑故障 | 电脑网络 | 病毒防治 | 安全防护 | 电脑爱好者 | 电脑知识 | 软件应用 | 电脑医生 | cpu | 主板 | 硬盘 | 内存 | 显卡 | 显示器 | 键盘鼠标
本文相关内容
·宽带终极加速:突破Internet最后防线
·宽带Web服务器(ADSLWebServer) V1.2
·宽带一年了为什么没有自动停网啊?
·宽带应用手册:网上电影任我“当”
·宽带用户快进来!ADSL常见经典故障大全
·宽带用户必读,宽带安装和使用问题集
·宽带用户易被攻击 用户需注意七大方面
·宽带网技术介绍
·宽带时代的网络协同工具
·宽带上网比拨号上网有什么好?
·宽带上网安全环境下Sniffer攻防实例
·宽带上网,网通离我家有10来里地,信号传不过来,有办法吗?
·宽带上网中,ADSL和FTTB LAN(在速度方面等)哪个比较好?
·宽带上网能接上,可网页qq游戏却不能打开?
·宽带上网如何查当月已上了多少小时?
·宽带拨号错误代码表
·宽带不稳定问题
·宽带常见故障及解决方法
·宽带的连接平均一小时断一次,正常吗?
·宽带的问题 iAs
·宽带共享上网软件
·宽带共享上网实现方法
·宽带共享上网应用常见问题解答
·宽带和端口、MAC地址捆绑后还会发生账号被盗吗?
·宽带极限优化攻略 你全都知道吗?
·快得不可思议是怎么回事?
·快递是投递到收件人手中吗
·客服信箱到底有没人在 出错了找他结果没人答
·快进来看看 问个问题
·狂拽~用别人的服务器做硬盘!
  ★宽带拨号连接密码恢复原理

宽带拨号连接密码恢复原理

添加记录: 网络应用  类别: 网络应用  发布日期: 2006.09.20

编者按:在读者来信中,经常有朋友询问如何做一名成功的黑客或安全专家,如何才能找到好的安全技术学习方法。其实,除了掌握一些必备的基础知识和工具外,还要懂得编程等技术;另外攻防思路的养成和培训也是很重要的。因为技术可以通过努力学习而有所成就,但攻防的思维方式即使苦心钻研往往也无大的收获,就得多多借鉴高手的经验了。在本文中,作者通过对NT平台拨号连接密码恢复原理的研究,层层索引,步步入微的思维方法就值得推荐。

前段时间我的ADSL密码忘记了,但幸好还保存在拨号连接里面,于是我到网上找了些星号密码显示工具,可惜不起作用。后来找到一种名为Dialupass的工具,这家伙不负我所望,把密码给我还原出来了 (用的Dialupass v2.42,我的系统是Windows XP) 。抱着浓厚的兴趣,我决定深入研究。略有收获,愿与大家共享。

Dialupass星号密码显示之谜

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

小知识:

Windbg工具:

Windbg是微软开发的免费源码级调试工具。可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。

Anti-Debug技术:

Anti-Debug,即反跟踪技术。防止 Cracker 用 SoftICE 之类的调试器动态跟踪,分析软件。反跟踪技术一般是具有针对性的,即针对某种调试器的反跟踪,而不能防止所有的调试器跟踪。

在用S-ICE跟踪的过程中,发现有这么一个调用:GetProcAddress(xx, “IsDebugPresent”)。原来真的有Anti-Debug功能,好在比较简单。统计了一下,总共有五处进行了Anti-Debug检查。

OK,情况查明了,便换回Windbg来调试。在Windbg里面有这么一个断点可绕过Anti-Debug检测:bp KERNEL32!IsDebuggerPresent “g poi(esp);r eax=0;g”。

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

1. 关键函数不直接调用,而是用LoadLibraryA和GetProcAddress来获取函数地址后再CALL;
2. 函数名是经过编码的,反汇编后看字符串是看不到的;
3. 关键地方一概用花指令来迷惑你和反汇编软件。

编者按:在读者来信中,经常有朋友询问如何做一名成功的黑客或安全专家,如何才能找到好的安全技术学习方法。其实,除了掌握一些必备的基础知识和工具外,还要懂得编程等技术;另外攻防思路的养成和培训也是很重要的。因为技术可以通过努力学习而有所成就,但攻防的思维方式即使苦心钻研往往也无大的收获,就得多多借鉴高手的经验了。在本文中,作者通过对NT平台拨号连接密码恢复原理的研究,层层索引,步步入微的思维方法就值得推荐。

前段时间我的ADSL密码忘记了,但幸好还保存在拨号连接里面,于是我到网上找了些星号密码显示工具,可惜不起作用。后来找到一种名为Dialupass的工具,这家伙不负我所望,把密码给我还原出来了 (用的Dialupass v2.42,我的系统是Windows XP) 。抱着浓厚的兴趣,我决定深入研究。略有收获,愿与大家共享。

Dialupass星号密码显示之谜

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

小知识:

Windbg工具:

Windbg是微软开发的免费源码级调试工具。可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。

Anti-Debug技术:

Anti-Debug,即反跟踪技术。防止 Cracker 用 SoftICE 之类的调试器动态跟踪,分析软件。反跟踪技术一般是具有针对性的,即针对某种调试器的反跟踪,而不能防止所有的调试器跟踪。

在用S-ICE跟踪的过程中,发现有这么一个调用:GetProcAddress(xx, “IsDebugPresent”)。原来真的有Anti-Debug功能,好在比较简单。统计了一下,总共有五处进行了Anti-Debug检查。

OK,情况查明了,便换回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 函数来获取密码。

关键字:LsaRetrievePrivateData和RasDialParams

根据Dialupass的原理,写了个类似的工具(完整的源代码x_dialupass.c可以从.net/src/x_dialupass.c">http://security.xici.net/src/x_dialupass.c获取)。后来用LsaRetrievePrivateData和RasDialParams做关键字,重新在Google搜索了一遍,找到一些类似的代码。

小提示:

参考资源①和②是俄罗斯人公布的演示代码,没有对LsaRetrievePrivateData返回的数据进行拆分用户名和密码。参考资源③是日本人公布的完整的应用程序的代码,可惜在对LsaRetrievePrivateData返回的数据进行拆分处理时存在BUG,导致有些情况下用户名和密码取得不正确。

①http://www.lwteam.ru/modules/ne ws/article.php?storyid=167
②http://www.wasm.ru/forum/index.php?action=vthread&forum=12&topic=4873
③http://homepage2.nifty.com/spw/software/rtrick/

后来发现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(HKEY_LOCAL_MACHINE的缩写)\SECURITY\Policy\Secrets\RasDialParams!SID#0\CurrVal”。

SID对应的是用户的String SID (“HKLM\SECURITY”这个键只有System有权限读写)。

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

解密后,在“<<”标志处还有一个判断(如图所示)。


假如[esi+45h]为0的话(esi是LsarOpenSecret函数返回的Handle),它会把解密后的数据再进行一次加密,不管是Windows 2000还是Windows 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

_LsapDbSecretCipherKey是如何产生的?

开始我以为在同一版本的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的大作后(http://www.xfocus.net/articles/200306/550.html),我才明白这就是传说中的“SYSKEY”。用Flashsky的代码验证一下:

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.原料:“HKLM\SECURITY”键只有SYSTEM有权限读写。我们可以把代码插入到SYSTEM进程里面去运行,或者把这个键修改为ADMIN有权限读,或者提升本进程权限。

2.催化剂:如何获取_LsapDbSysKey解密用的函数,_LsapDbDecryptKeyWithSyskey为非导出函数。可以用Flashsky的代码来获取SYSKEY,利用公开的MD5和RC4库函数来解密。

直接从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.工具:解密函数LsapCrDecryptValue为非导出函数,怎么办?或许可以根据特征码来搜索,但总觉得不太可靠。幸好,LsapCrDecryptValue调用的advapi32!SystemFunction005是导出函数。或者直接利用公开的DES库函数,自己来运算。

注:x_dialupass2.cpp中的代码演示了直接从注册表中读取数据并解密之的过程,完整的源代码可从http://security.xici.net/src/x_dialupass2.cpp获取。
(出处:http://www.8s8s.net)



上一篇:宽带宝典 视频文件字幕的获得与使用 下一篇:宽带拨号错误代码表

电脑常识文选风云榜
声卡音箱 | 软驱光驱 | 打印机 | 机箱电源 | BIOS | 操作系统 | 局域网 | 浏览器 | 网卡 | 电脑死机

电脑常识文选 © 2006 版权所有

提示:本站致力于电脑使用常识,电脑故障排除,计算机使用小窍门的分享与传播,内容仅供参考,按此操作责任自负。