宽带连接用户名称和密码恢复原理.doc_第1页
宽带连接用户名称和密码恢复原理.doc_第2页
宽带连接用户名称和密码恢复原理.doc_第3页
宽带连接用户名称和密码恢复原理.doc_第4页
宽带连接用户名称和密码恢复原理.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

宽带连接用户名称和密码恢复原理 ADSL密码忘记了,但幸好还保存在拨号连接里面,到网上找了些星号密码显示工具,可惜不起作用。后来找到一获得宽带用户名称和密码(/detail/lzwbadboy/8182669)的工具,不负重望把密码还原出来了。(获得宽带用户名称和密码工具界面如下,我的系统是windows xp)。 该工具并非非普通的星号密码显示工具,那它的原理是什么呢?其实原理很简单,就是用rasapi32.dll里面的一些函数来获取拨号连接的一些信息(), 再用 ADVAPI32!LsaRetrievePrivateData 函数来获取密码,后来研究LsaRetrievePrivateData返回的数 据。其原理大致如下: 1)插入一线程到lsass.exe进程 2)打开LSA Policy database 3)从注册表HKLMSECURITYPolicySecrets中枚举子键 4)LsarOpenSecret 5)LsarQuerySecret 进一步研究后发现,其实ADVAPI32!LsaRetrievePrivateData是通过NdrClientCall2发送RPC调用到lsass.exe进程,lsass.exe里面再调用LsarOpenSecret、LsarQuerySecret 来完成获取拨号连接信息过程的。(注:LsarOpenSecret里面有权限判断,非ADMIN组用户是没有权限来调用ADVAPI32!LsaRetrievePrivateData的)跟踪了一下LsarQuerySecret,发现它返回的数据其实是从注册表中读取。保存拨号连接信息的注册表键值为: HKLMSECURITYPolicySecretsRasDialParams!SID#0CurrVal。 SID对应的是用户的string SID。(“HKLMSECURITY”这个键只有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 _LsapCrDecryptValue12 .text:785462F5 test eax, 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 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在不同的机器上面(即使版本相同)都是不一样的。 跟踪系统启动过程,可知道SecurityWxApiPort是由winlogon.exe进程创建的,然后lsass进程通过这个LPC PORT从winlogon进程获取SYSKEY,随后winlogon进程会关闭这个LPC PORT。所以在系统启动完成之后,用Process Explorer等工具是看不到这个LPC PORT存在的,而且在winlogon和LSASS进程空间都搜索不到上述SYSKEY。 (4)从注册表HKLMSECURITYPolicyPolSecretEncryptionKey中读取出来一段数据, 调用函数_LsapDbDecryptKeyWithSyskey,把它用_LsapDbSysKey来解密, _LsapDbSecretCipherKey就在解密完后的数据里面。(LsapDbDecryptKeyWithSyskey函数做的其实就是MD5和RC4运算)了解原理后,我们就可以直接从注册表里面来获取拨号连接中的密码等数据了。但 有几个问题需要解决: (1)原料。 Q:HKLMSECURITY键只有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进程的空间里面搜索x10x00x00x00x10x00x00x00即可找到正确的KEY。结果可能会有多个,可以把所有搜索到的KEY都试一下,总有一个正确的。 (3)工具 Q: 解密函数LsapCrDecryptValue为非导出函数,怎么办? A: 或许可以根据特征码来搜索,但总觉得不太可靠。幸好,LsapCrDecryptValue 调用的advapi32!SystemFunction005是导出函数:)。或者直接利用公开的DES库函数,自己来运算。-=-=-=-=-=-=-=-=-=-= x_dialupass2.cpp -=-=-=-=-=-=-=-=-=-= /* 演示还原NT平台拨号连接密码 原理:直接从注册表中读取加密后的数据,解密之。 可运行于windows 2000/xp/2003平台,必须有权限读取注册表 HKLMSECURITY。 eyas at 2004-10-01 */ #include #include #include #pragma comment(lib, Advapi32.lib) #pragma comment(lib, psapi.lib) /抄袭tombkeeper的代码:) #define FCHK(a) if (!(a) printf(#a failed %dn, GetLastError(); return 0; typedef struct _LSA_BLOB DWORD cbData; DWORD cbMaxData; BYTE* pbData; LSA_BLOB; typedef int (WINAPI *PSystemFunction005)( LSA_BLOB* pDataIn, LSA_BLOB* pDataKey, LSA_BLOB* pDataOut ); PSystemFunction005 SystemFunction005; DWORD dwFlag=0; /来自lsadump2中的dumplsa.c int myisprint (int ch) return (ch = ) & (ch 16) _snprintf (szDumpBuff, sizeof (szDumpBuff), %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%cn, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, myisprint(p0) ? p0 : ., myisprint(p1) ? p1 : ., myisprint(p2) ? p2 : ., myisprint(p3) ? p3 : ., myisprint(p4) ? p4 : ., myisprint(p5) ? p5 : ., myisprint(p6) ? p6 : ., myisprint(p7) ? p7 : ., myisprint(p8) ? p8 : ., myisprint(p9) ? p9 : ., myisprint(p10) ? p10 : ., myisprint(p11) ? p11 : ., myisprint(p12) ? p12 : ., myisprint(p13) ? p13 : ., myisprint(p14) ? p14 : ., myisprint(p15) ? p15 : .); printf (%s, szDumpBuff); p+=16; sz -= 16; if (sz) char buf17; int i = 0; int j = 16 - sz; memset (buf, 0, sizeof (buf); szDumpBuff0 = 0; while (sz-) _snprintf (szDumpBuff+strlen (szDumpBuff), sizeof (szDumpBuff) - strlen (szDumpBuff), %02X, *p); if (myisprint (*p) bufi+ = *p; else bufi+ = .; p+; _snprintf (szDumpBuff+strlen (szDumpBuff), sizeof (szDumpBuff)-strlen (szDumpBuff), %*s%sn, j*3 + 2, , buf); printf (%s, szDumpBuff); DWORD search_LsapDbSecretCipherKey(BYTE *ppKey, DWORD pid) HANDLE hLsass, hLsasrv; DWORD dwRead, i, dwAddr; BYTE *pImage = NULL; MODULEINFO mod; BOOL bRet = FALSE; DWORD dwCount = 0, dwMaxCount=100; FCHK ( (hLsasrv = LoadLibrary(lsasrv.dll) ); FCHK ( GetModuleInformation(GetCurrentProcess(), (HMODULE)hLsasrv, &mod, sizeof(mod) ); FCHK ( hLsass = OpenProcess(PROCESS_VM_READ, FALSE, pid) ); pImage = (BYTE*)malloc(mod.SizeOfImage); ReadProcessMemory(hLsass, (BYTE*)hLsasrv, pImage, mod.SizeOfImage-0x10, &dwRead); *ppKey = (BYTE*)malloc(dwMaxCount*0x10); _try for(i=0;imod.SizeOfImage;i+) if( memcmp(&pImagei, x10x00x00x00x10x00x00x00, 8) = 0) dwAddr = *(DWORD *)(&pImagei+8); if( ReadProcessMemory(hLsass, (LPCVOID)dwAddr, &(*ppKeydwCount*0x10), 0x10, &dwRead) ) dwCount+; /end of for _except(EXCEPTION_EXECUTE_HANDLER) return dwCount; return dwCount; int main(int argc, char *argv) int ret,i,j; HMODULE hAdvApi32; HKEY hKeySecrets; HKEY hKey; DWORD dwType; char Data0x500 = 0; BYTE *pKey; DWORD dwSize; LSA_BLOB LSADataIn; LSA_BLOB LSADataOut; LSA_BLOB LSADataKey; char szSecret500; char szSubKey0x500; DWORD dwErr, dwCount=0; if(argc!=2) printf(Usage: %s n, argv0); return 0; FCHK (hAdvApi32 = LoadLibrary(advapi32.dll); FCHK (SystemFunction005 = (PSystemFunction005) GetProcAddress (hAdvApi32, SystemFunction005) != NULL); FCHK (RegOpenKeyEx (HKEY_LOCAL_MACHINE, SECURITYPolicySecrets, 0, KEY_READ, &hKeySecrets) = ERROR_SUCCESS) FCHK ( ( dwCount = search_LsapDbSecretCipherKey(&pKey, atoi(argv1) ) != 0 ); printf(Search LsapDbSecretCipherKey return: %dn, dwCount); for(j=0;jdwCount;j+) printf(LsapDbSecretCipherKey %dn, j); dump_bytes(&pKeyj*0x10, 0x10); LSADataKey.cbData = LSADataKey.cbMaxData = 0x10; LSADataKey.pbData = &pKeyj*0x10; /search our target for (i=0; TRUE; i+) dwErr = RegEnumKeyA (hKeySecrets, i, szSecret, sizeof (szSecret); if (dwErr != ERROR_SUCCESS) / / No More Secrets / break; printf(n%sn, szSecret); /open it _snprintf(szSubKey, sizeof(szSubKey), SECURITYPolicySecrets%sCurrVal, szSecret); if (ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSubKey, 0, KEY_READ, &hKey ) != ERROR_SUCCESS ) continue; dwSize = sizeof(Data); FCHK (ret = RegQueryValueEx(hKey, , NULL, &dwType, (LPBYT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论