2024年3月10日发(作者:)
深信服科技EasyConnectVpn 0day漏洞分析与利用
环境: xp sp3
浏览器: xp sp3 自带的ie6
(安装install程序,程序目录C:Program FilesSangforSSL)
一、先用windbg加载poc(c:)
然后g运行程序,出现异常,异常情况如下:
0:000> g
(8): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=0000004a ebx=022cde82 ecx=0013e140 edx=00140000 esi=0013df00
edi=0013e140
eip=77c12332 esp=0013dea0 ebp=0013deac iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010202
msvcrt!wscanf+0x6c:
77c12332 8802 mov byte ptr [edx],al ds:0023:00140000=41
*** ERROR: Symbol file could not be found. Defaulted to export symbols for
C:Program -
然后kv 查看异常时的堆栈情况,猜测出现异常的模块。
异常处的代码:
0:000> u msvcrt!wscanf+0x6c
msvcrt!wscanf+0x6c:
77c12332 8802 mov byte ptr [edx],al //此处发生异常
77c12334 ff01 inc dword ptr [ecx]
77c12336 0fb6c0 movzx eax,al
77c12339 eb0c jmp msvcrt!wscanf+0x81 (77c12347)
77c1233b 0fbec0 movsx eax,al
77c1233e 51 push ecx
77c1233f 50 push eax
77c12340 e818c9ffff call msvcrt!_flsbuf (77c0ec5d)
使用IDA打开,定位到偏移0x46c0处,
猜测出现异常可能是因为sprintf的问题。
二、使用OD打开poc文件
F9运行,ie弹出Active警告,暂时先不运行,在OD中Ctrl + g 定位到出现异
常的代码处,地址:77c12332
当然你可以看到CSClientManagerPrj+0x46c0处的代码
不过这对后面的分析已经无关紧要了。
一直F9,执行到
77c12332 8802 mov byte ptr [edx],al
后,一直F9,会发现我们poc中的字符串被逐个放到内存上(堆栈)
一边F9一边你观察内存数据变化,在内存数据覆盖到0013ffed时,此时注
意慢点执行,在执行几次F9,观察edx的值,当edx值为0014000时,出现
异常(即windbg中异常时edx的值)。为什么edx = 0014000时会出现异常
呢,我们看下内存
由上如图可知,140000开始3000大小的内存空间是只读属性,所有
mov byte ptr [edx],al
时发生了写异常。
由此我们可以判断漏洞形成的原因是:
因为未对字符串的长度做判断,导致在sprintf时字符串覆盖到只读区域,引
发了写异常。
三、漏洞利用:
由上分析可以,造成漏洞的原因并不是字符串过长覆盖函数返回地址,而是
覆盖了到了只读区域,出现内存写异常。
在F9执行
77c12332 8802 mov byte ptr [edx],al
我们可以翻看下堆栈附近的变化
可知字符串覆盖了异常栈上的异常处理链。OD产看seh链
可知覆盖的异常处理正是当前函数异常时对应的异常处理函数。
因为在xp sp3下需绕过safeseh,构造堆栈数据如下:
在调试跟踪时,发现大于7f的数据在复制到内存中时,会发生变化,即非可见字符是不
能被直接存放到内存中的,猜测可能是字符在ascii ->unicode->ascii时发生了变化,所以
在构造堆栈时,所有数据都必须是小于7f的即可见字符。
使用OD查找程序中No SafeSeh 的模块。
EasyConnect vpn的几个模块都是关闭SafeSeh的。使用Ollyfindaddr查找pop pop ret
查找结果很多,从中选择一个全小于7f的地址
10013439 Found:POP EDI POP ESI RETN at 0x10013439 Module: C:Program
由于数据要小于7f,所以jmp 06 (eb 06)也不能使用了,为了能保证程序跳到我们的
shellcode,这里使用jnz 06 jz 04(75 06 74 04)
Jnz 06 jz 04
0x10013439
纯字符shellcode
我们这里使用弹框计算器的shellcode,测试效果见


发布评论