-
-
[原创]输出挑战响应计算值
-
发表于: 2025-5-31 22:30 102
-
XPSP3文件共享访问使用NTLMSSP的挑战响应机制。
本机客户端访问对方文件,对方返回服务端挑战。
客户端产生挑战以及用对方挑战计算响应。
在如下地方:
xpsp3 msv1_0.dll [5.1.2600.5512]
msv1_0!MspLm20GetChallengeResponse+0x5aa:
77c48e35 6a08 push 8
77c48e37 8d45ec lea eax,[ebp-14h]
77c48e3a 50 push eax // ebp-14h = clicha[8] 自己的挑战
@@77c48e3b e85794ffff call msv1_0!SspGenerateRandomBits (77c42297) //036产生随机数
^^sysfun036(clicha,8)
77c48e40 8d4318 lea eax,[ebx+18h]
77c48e43 8b08 mov ecx,dword ptr [eax]
77c48e45 894de4 mov dword ptr [ebp-1Ch],ecx
77c48e48 8b4804 mov ecx,dword ptr [eax+4]
77c48e4b 894de8 mov dword ptr [ebp-18h],ecx
77c48e4e 50 push eax // [ebx+18h] 计算后输出
77c48e4f 8d4dec lea ecx,[ebp-14h]
77c48e52 51 push ecx // ebp-14h = clicha[8] 自己的挑战
77c48e53 50 push eax // ebx+18h = srvcha[8] 对方的挑战
@@77c48e54 e853fdffff call msv1_0!MsvpCalculateNtlm2Challenge (77c48bac) //md5
^^md5(srvcha,clicha,srvchaencry)
77c48e59 8d9578fdffff lea edx,[ebp-288h]
77c48e5f 52 push edx // 计算后客户响应18h
77c48e60 8d4610 lea eax,[esi+10h]
77c48e63 8d4b18 lea ecx,[ebx+18h]
77c48e66 50 push eax // esi+10h 可能是密码散列之类18h
77c48e67 51 push ecx // ebx+18h //md5后的对方挑战8h
@@77c48e68 e8cbfdffff call msv1_0!SystemFunction009 (77c48c38) //009计算响应 des??
^^sysfun009(srvchaen,hashxx,resp)
77c48e6d 8bf8 mov edi,eax
77c48e6f 85ff test edi,edi
挑战都是用036系统函数计算出来的。
响应是用009系统函数计算出来。
其他已知的006系统函数计算lm,007系统函数计算ntlm
用调试脚本也可以输出这些挑战响应,但是格式不太好控制。
用调试脚本如下:
bp 77c48e40 ".echo ==clicha==;db @ebp-14 l8;g"
bp 77c48e54 ".echo ==md5 a1_3==;dd @esp l3;.echo =srvcha=;db poi(@esp) l8;.echo =clicha=;db poi(@esp+4) l8;g"
bp 77c48e59 ".echo =after md5=;db @ebx+18 l8;g"
bp 77c48e68 ".echo =009 des a1_3=;dd @esp l3;.echo =a1=;db @ebx+18 l8;.echo =a2=;db @esi+10 l18;g"
bp 77c48e6d ".echo =after 009 a3=resp=;db ebp-288 l18;g"
测试输出如下:
==clicha==
00c9f410 15 bf b1 e9 ef 67 d7 40
==md5 a1_3==
00c9f0c0 00c9f490 00c9f410 00c9f490
=srvcha=
00c9f490 e7 58 2f 13 e9 00 8b ce
=clicha=
00c9f410 15 bf b1 e9 ef 67 d7 40
=after md5=
00c9f490 99 82 5d 8f 48 b9 a0 23
=009 des a1_3=
00c9f0c0 00c9f490 000c2438 00c9f19c
=a1=
00c9f490 99 82 5d 8f 48 b9 a0 23
=a2=
000c2438 0b ed 68 39 1b 48 18 b8 33 27 23 40 ff 7f 9a 70 72 f2 f9 cb 35 32 47 e7
=after 009 a3=resp=
00c9f19c 23 b4 26 7d 9a 82 0e c9 c9 41 9f bb b8 b0 be 4a 37 5b b2 21 e8 b6 26 4a
以上输出不太好用中文,不太方便认识。。。
所以用hook方法做一个简易输出测试dll,注入调试输出即可。
/*
77c48e54 e853fdffff call msv1_0!MsvpCalculateNtlm2Challenge (77c48bac) //md5
*/
int WINAPI hv_hrecvchal(LPBYTE srvcha8, LPBYTE clicha8, LPBYTE srvcha8encry)
{
showinfo("[*] ====hv_hrecvchal====\n");
int r;
showinfo("[*] 接收的服务端挑战:");
showhex((unsigned char*)srvcha8, 8);
showinfo("[*] 产生的客户端挑战:");
showhex((unsigned char*)clicha8, 8);
r = ((Phv_hrecvchal)sets[Idxhv_hrecvchal].oldfun)(srvcha8, clicha8, srvcha8encry);
showinfo("[*] 加密后的服务端挑战:");
showhex((unsigned char*)srvcha8encry, 8);
return r;
}
/*
77c48e68 e8cbfdffff call msv1_0!SystemFunction009 (77c48c38)
*/
int WINAPI hv_hsendauth(void* srvcha8encry, void* hashxx18h, void* cliresp18h)
{
showinfo("[*] ====hv_hsendauth====\n");
int r;
showinfo("[*] 加密后的服务端挑战:");
showhex((unsigned char*)srvcha8encry, 8);
showinfo("[*] 可能是密码散列之类:");
showhex((unsigned char*)hashxx18h, 0x18);
r = ((Phv_hsendauth)sets[Idxhv_hsendauth].oldfun)(srvcha8encry, hashxx18h, cliresp18h);
showinfo("[*] 计算后的客户端响应:");
showhex((unsigned char*)cliresp18h, 0x18);
return r;
}
这样调试输出就直观多了。
[*] ====hv_hrecvchal====
[*] 接收的服务端挑战:e1e8b184de2edd87
[*] 产生的客户端挑战:20ec0adb729ff040
[*] 加密后的服务端挑战:3e53800867fb71b8
[*] ====hv_hsendauth====
[*] 加密后的服务端挑战:3e53800867fb71b8
[*] 可能是密码散列之类:0bed68391b4818b833272340ff7f9a7072f2f9cb353247e7
[*] 计算后的客户端响应:c7963d4f3f488f0b0f287f6071236054e882cea03c8431ff
[*] ====hv_hrecvchal====
[*] 接收的服务端挑战:03b9d6f2bfe79dbb
[*] 产生的客户端挑战:b78102557f4255ec
[*] 加密后的服务端挑战:12e72a0d58af9fb5
[*] ====hv_hsendauth====
[*] 加密后的服务端挑战:12e72a0d58af9fb5
[*] 可能是密码散列之类:0bed68391b4818b833272340ff7f9a7072f2f9cb353247e7
[*] 计算后的客户端响应:5841f3a6bafe05595e71acc8fdfc6b560de670c110f4112d
赞赏
- [求助]测试挑战响应反射失败不知什么原因 68
- [原创]挑战响应机制的测试及其反射攻击可能性 92
- [原创]输出挑战响应计算值 103
- [原创]在xpsp3上再验证用ntlm散列直接登录 1152
- [求助]ie11 下 退不出 2457