WPS 2016远程代码执行漏洞(栈溢出)分析及利用 一、漏洞信息 1. 漏洞简述•漏洞名称:WPS 2016远程代码执行漏洞 •漏洞类型:栈溢出 •漏洞影响:远程代码执行 •利用难度:Easy •基础权限:不需要
2. 漏洞利用打开EXP文档后,使得程序触发栈溢出并破坏SEH链,通过控制SEH处理函数从而绕过GS并执行ShellCode。
3. 漏洞影响漏洞主要影响WPS Office 10.1.0.6489及之前的版本。
4. 解决方案升级到最新版本。
二、漏洞复现 1. 环境搭建靶机环境:WIN10 20H2教育版64位,WPS Office 10.1.0.6489。 调试工具:WinDbg 。 静态分析:IDA Pro。
2. 复现过程1.使用WinDbg附加WPS进程,在WPS中打开POC文件即可触发漏洞。
2.在WinDbg中查看崩溃信息。
三、漏洞分析 1. 基本信息•漏洞文件:wpsxmlrw.dll •漏洞函数:sub_1000C112 •漏洞对象:栈缓冲区
2. 详细分析 1. 基础分析根据栈回溯情况可知,崩溃点为wpsxmlrw模块filterpluginFormatCorrect+0x18b3a偏移处。
通过IDA Pro定位到具体崩溃函数sub_1001AB09。
分析POC文件可以发现w:fareast的值是超长的,综上可知该栈溢出的原因是因为WPS在处理XML文件的时候,因为未对w:fareast的值做验证从而发生栈溢出。
2. 静态分析通过栈回溯跟踪到sub_1000C112函数,可知栈溢出发生在调用 memcpy函数后。
1. 函数调用链sub_1000C112 --> WStr::size --> WStr::c_str --> memcpy
2. 补丁Diff在WPS Office 10.1.0.6489之后的版本中WPS在调用 WStr::size 函数后会对长度进行无符号的大小验证。
3. 漏洞函数分析首先调用WStr::size函数获取w:fareast值的长度,然后调用WStr::c_str函数获取w:fareast值的UTF-8内容,接着调用memcpy函数将内容复制到局部变量中,当复制长度过大时则发生栈溢出。
3. 利用思路该版本wps.exe存在GS、SafeSEH 不存在DEP、ASLR ,WordConvertDll.dll不存在GS、safeSEH、DEP、ASLR 。
从WordConvertDll.dll中寻找 pop pop ret 地址,构造payload覆盖SEH链绕过GS和SafeSEH从而执行Shellcode。
1. 利用条件打开WPS Office 10.1.0.6489并使用繁简体转换功能加载WordConvertDll.dll。
2. 利用过程因为漏洞函数sub_1000C112存在GS,所以覆盖函数返回地址的利用方式不能使用。
POC引起的崩溃表现形式为在GS检测前触发异常,则可以通过覆盖SEH链进行漏洞利用。但是wpsxmlrw.dll存在SafeSEH,为了绕过SafeSEH,需要在不存在SafeSEH和ASLR的模块中寻找 一个跳板指令 pop pop ret 。经过寻找发现WordConvertDll.dll模块的0x51603945地址可以作为跳板。
构造payload从而正确覆盖SEH链,payload构造方式参考《利用SEH异常处理机制绕过GS保护》 当触发异常时则跳转至0x51603945处执行。
因为该版本WPS进程不存在DEP,所以直接执行Shellcode即可。 最终效果
四、缓解措施升级到最新版本。
五、参考文献《利用SEH异常处理机制绕过GS保护》 https://bbs.pediy.com/thread-223443.htm 《windows溢出保护原理与绕过方法概览》 https://bbs.pediy.com/thread-123572.htm
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
最后于 2021-4-8 23:43
被e1ya编辑
,原因:
上传的附件: