韩国办公处理软件HanSoft Office缓冲区溢出漏洞

 

一、漏洞简介

Hancom 公司为韩国的政府所支持的软件公司。目前主要的是两个产品系列,一个是Hancom Office,另一个是ThinkFree Office。Hancom Office套件里主要包含HanCell(类似微软的Excel),HanShow (类似微软的PowerPoint),HanWord(也就是HWP,类似微软的Office Word)等。

Hancom Office办公套件在韩国是非常流行的办公文档处理软件,有超过75%以上的市场占有率。当Hancom Office在处理畸形的hwp文件格式时,发生空指针引用,从而造成程序崩溃。

官网:https://www.hancom.com/index.jsp

 

二、利用windbg脚本进行污点分析

在实际的漏洞挖掘中,当我们分析一个程序如何处理一个特殊的文件类型时,往往需要大量的时间人工分析、基于经验的合理推理,才能得出,程序第一次打开该文件是什么时候,是什么时候读写和解析该文件的,又是哪块模块进行处理的。

有人说,对于文件的解析分析,只需要在 CreateFileW/A、ReadFile 等相应关键函数下断点即可;但是当在windbg调试器里下CreateFileW时,问题就会出现,该程序调用CreateFileW的地方太多,比如:程序加载dll的时候,会调用CreateFileW,程序初始化配置时加载的配置文件,也会调用CreateFileW。所以在分析的时候,很难拿到一手的资料。

我的解决思路是,通过编写windbg 脚本自动化分析并列出我想要的内容,类似于”白眉”工具。但由于写了1000多行的wds脚本,代码很乱,而且在通过实验去验证自己的想法的时候,也遇到了大量的麻烦;用原生的windgb语法或者借用pykd,写的python脚本都没有达到预期;python写的脚本,不能达到自动化分析;通过原生的windgb语法可以达到比较流畅的自动化,但是仍然很卡,目前具体原因未知,在换了几个系统和windbg版本后,能够完成基本的功能。

下面是我从代码里提取出来的一部分内容:

$$ $><C:\Users\admin\Desktop\a\CreateFileW_script.wds

bp CreateFileW "
r $t0=poi(esp+4)
as /mu ${/v:$FileName} $t0
.echo
.printf \"[*] Currently open file:%mu\",$t0
.echo
.block
{
  .if($spat(@\"${$FileName}\",@\"*test.hwp\"))
  {
    .printf \"[+] ok...find file:%mu\",$t0
    .echo
    kb
    ad ${/v:$FileName}
    gu
    !handle eax f
  }
  .else
  {
    .printf \"[-] no...find file:%mu\",$t0
    .echo
    ad ${/v:$FileName}
    g
  }
}

通过上图可以知道第一次打开test.hwp文件的函数调用流程,这样我们就可以点对点分析,然后结合winAFL或oss-fuzz,快速写出dome.fuzz程序,来模糊测试特定模块。

HwpViewer-->HwpVApp!CHncAppShield-->kernel32!CreateFileW

当然,在漏洞利用的时候,windbg脚本也是相当给力的,可以可视化观察hwp文件格式里的那段特殊字符,在这就不展开详述了。

 

三、漏洞分析

通过windbg打开crash.hwp文件,发现漏洞发生在insp32ml.dll模块,而该模块确实是由俄罗斯写的(模块链接:http://www.informatic.ru/eng),并不是Hancom公司自己的。

可以发现在自己写的strlen函数里,v1是我们可控的字符串参数,在取v1里的内容时,没有进行字符串结束符的过滤检查,造成循环在v1里取值,最后读到未分配的内存地址,从而发生异常。

 

四、影响版本

HOffice_2020_TRIAL.exe 11.0.1.1
HOffice_2018_Viewer.exe
HOffice2014VP_Viewer.exe

(完)