CVE-2017-8291及利用样本分析(二)

简介: CVE-2017-8291及利用样本分析

0x03 Lazarus组织利用样本分析:

0x03.1 样本1:

样本名称:라자루스_에어컨계약.hwp

MD5:EC0C543675374A0EE9A83A4D55CA1A6C

使用HwpScan2打开文档,可以看到其中的PS脚本:


图片29 PS脚本


导出解压后的PS脚本,其中Y101变量存储加密后Shellcode,直接改写该脚本将Y101变量解密并写入一EPS文件中:


图片30 解密Shellcode


EPS脚本中有如下语句:








label13 label10 aload 
/label82 true def /label83 0 def 
{     .eqproc     /label84 true def     /label69 0 def     label6                                             {         /label84 true def         /label3 label7 label69 get def                       /label85 label3 length 16#20 sub def             label3 label85 get         {                 label84             { /label84 false def }             { /label84 true def exit }             ifelse         }         repeat         label84             { /label82 false def exit }         if         /label69 label69 1 add def     }     repeat     label84         { /label82 false def exit }     if     /label83 label83 1 add def } loop 
label82     { quit }     { } ifelse 
label2 0 label2 label3 label85 16#18 add 16#7E put label3 label85 16#19 add 16#12 put label3 label85 16#1A add 16#00 put label3 label85 16#1B add 16#80 put put

可以看出其确实利用了CVE-2017-8291

继续分析解密后的EPS脚本可以看到其调用了VirtualProtect()函数:


图片31 调用VirtualProtect


x32dbg中打开gbb.exe,最新的HWP已经移除该组件,笔者分析时使用的HWP版本如下:


图片32 HWP版本


之后修改命令行,其参数为打开文档后于Temp目录下释放的PS脚本(即HwpScan2中的BIN0001.ps)完整路径:


图片33 改变命令行


VirtualProtect()函数处设断后F9运行,成功断下:


图片34 于VirtualProtect()断下


通过0xAABBCCDD标志确定ECX指向:


图片35 标志0xAABBCCDD


由ECX给函数传递参数,获取系统函数调用地址:


图片36 传递参数



图片37 获取系统函数调用地址


判断当前进程是否运行在WOW64环境中:


图片38 IsWow64Process


获取当前系统内所有进程的快照:


图片39 获取快照


获取第一个进程的句柄:


图片40 Process32First


通过Process32Next()枚举进程,并传递给sub_026AF131函数判断是否为explorer.exe


图片41 枚举并判断


返回explorer.exe进程ID:


图片42 explorer.exe进程ID


之后将Shellcode注入到explorer.exe进程中:


图片43 调用函数



图片44 第一次写入



图片45 第二次写入


x64dbg附加到explorer.exe上,分析其Shellcode功能。同样是通过0xAABBCCDD标志确定RCX指向:


图片46 标志0xAABBCCDD


由ECX给函数传递参数,获取系统函数调用地址:


图片47 传递参数



图片48 获取系统函数调用地址


之后调用sub_4890EE0判断当前进程是否为explorer.exe进程:


图片49 判断当前进程


移动指针指向,并将gozdeelektronik[.]net提取出来:


图片50 移动指针



图片51 提取gozdeelektronik[.]net


载入WinInet.dll


图片52 载入WinInet.dll


获取即将调用函数调用地址:


图片53 获取函数调用地址


之后从gozdeelektronik[.]net下载第二阶段载荷movie.jpg:


图片54 下载第二阶段载荷


0x03.2 样本2:

样本名称:2020년 연구ㆍ전문원 및 수자원분야 경력사원 선발 모집요강.hwp

MD5:F90770D4A320BF15E51FDD770845DCE5

同样是先使用HwpScan2查看该文档:


图片55 HwpScan2


tomato变量存储的是未加密的EPS脚本,可直接将其内容复制出来查看。其与上一利用脚本不同之处在于其采用拼接方式来定义名称字符串:








......{(KE) (RN) (EL) (32) (.D) (LL) 6 zyx01}......{(Vi) (rt) (ua) (lP) (rotect) 5 zyx01}......{(Ex) (it) (pro) (ce) (ss) 5 zyx01}......

调试方法同上,不再赘述。可以成功在VirtualProtect()函数处断下:


图片56 于VirtualProtect()断下


获取GetProcAddress()调用地址:


图片57 获取GetProcAddress()调用地址


获取LoadLibrary()调用地址:


图片58 GetProcAddress(LoadLibrary)


载入msvcrt.dll并获取system()函数调用地址:


图片59 载入msvcrt.dll



图片60 GetProcAddress(system)


通过call 02250806指令来为system()函数传递参数:


图片61 调用system()


其执行指令的功能是于TEMP目录下创建一名为adsutil.vbs的VBS脚本,写入内容并执行该脚本:


图片62 指令功能


该VBS脚本经整理后内容如下:


图片63 VBS脚本内容


该脚本功能是于https[:]//matteoragazzini[.]it下载第二阶段载荷,解码后写入svchost.exe中并执行之。

0x04 Kimsuky组织某样本分析:

样本名称:(첨부2)20-0206_법인_운영상황_평가표_서식(법인작성용).hwp

MD5:8AD471517E7457EB6EEA5E3039A3334F

HwpScan2查看该文档,会发现该样本不同于Lazarus组织的两个样本在于其EPS脚本最后部分:


图片64 HwpScan2


同样是在VirtualProtect()函数处断下:


图片65 于VirtualProtect()断下


通过ECX给sub_02544D7D传递参数获取系统函数调用地址:


图片66 获取函数调用地址


调用GetComputerName()获取计算机名并于其后添加经过计算的十六进制值,之后通过异或及指定运算来为即将创建的文件命名:


图片67 计算文件名


于临时目录下创建文件:


图片68 创建文件


之后再次计算一文件名并创建文件:


图片69 创建另一文件


调用ZwQuerySystemInformation()遍历系统所有打开的句柄,此时SystemInformationClass=SystemHandleInformation,若缓冲区不足则把申请内存的大小扩大一倍之后调用RtlReAllocateHeap()再次申请,直至成功为止:


图片70 ZwQuerySystemInformation()


接下来调用ZwQueryObject()查询对象的类型,找到打开的EPS文件:


图片71 ZwQueryObject()


使用CreateFileMapping()MapViewOfFile()函数将EPS文件映射到进程内存空间中:


图片72 映射文件


映射完成:


图片73 映射完成


移动指针指向EPS脚本最后部分:


图片74 定位


调用VirtualAlloc()函数为其开辟内存空间:


图片75 VirtualAlloc


解密并写入到分配的内存空间中:


图片76 解密并写入


实际上解密后的该部分将被注入到HimTrayIcon.exe进程中,详见下文分析。获取当前系统内所有进程的快照之后通过Process32Next()枚举进程:


图片77 枚举进程



图片78 跳出循环


遍历线程,找到HimTrayIcon.exe之后打开并挂起线程:


图片79 遍历线程


将解密出来的Shellcode写入到进程:


图片80 注入


之后调用RtlCreateUserThread()函数恢复线程的执行。最终释放内存空间并退出:


图片81 退出


其注入Shellcode可以附加HimTrayIcon.exe之后调试,亦可将Shellcode转成exe之后调试,笔者选择转成exe之后再进行调试。解密内存中的PE文件:


图片82 解密PE文件


获取系统文件夹并拼接路径:


图片83 GetSystemDirectoryA


创建进程:


图片84 CreateProcess


调用GetThreadContext()函数,若失败则直接TerminateProcess


图片85 GetThreadContext


获取系统版本信息,以此来判断下一步如何执行:


图片86 GetVersionEx


多次调用WriteProcessMemory()函数于创建的进程中写入PE文件内容:


图片87 写入PE文件


恢复线程执行:


图片88 ResumeThread


0x05 参考链接:

Wikipedia —— https://zh.wikipedia.org/wiki/PostScript官方参考文献 —— https://web.archive.org/web/20170218093716/https://www.adobe.com/products/postscript/pdfs/PLRM.pdfPOC —— https://raw.githubusercontent.com/rapid7/metasploit-framework/master/data/exploits/CVE-2017-8291/msf.epsGhostscript 9.21 —— https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/tag/gs921GhostButt - CVE-2017-8291利用分析—— https://paper.seebug.org/310


后台回复:CVE-2017-8291获取本文pdf



相关文章
|
Python
简易评分系统
如果用户名及口令不合法,用户名或口令最多可输入3次,验证错误超过3次以后,自动退出系统。
130 0
|
机器学习/深度学习 算法 数据挖掘
Sentieon | 应用教程: 使用DNAscope对HiFi长读长数据进行胚系变异检测分析
Sentieon | 应用教程: 使用DNAscope对HiFi长读长数据进行胚系变异检测分析
119 0
|
存储 安全 JavaScript
CVE-2017-12824及利用样本分析(二)
笔者于书写此文之前从未接触过InPage,该文权当笔者于学习过程中的文章学习笔记,其中如有不当或错误之处,望读者不吝赐教,笔者感激不尽。
|
存储 安全 虚拟化
CVE-2017-0261及利用样本分析
CVE-2017-0261及利用样本分析
|
存储 NoSQL 安全
CVE-2017-8291及利用样本分析
CVE-2017-8291及利用样本分析
|
安全 Windows
CVE-2018-0798及利用样本分析
•成因:EQNEDT32.exe在解析Matrix record时,并未检查长度,从而造成栈溢出。无论打不打CVE-2017-11882补丁都可以成功触发,使得攻击者可以通过刻意构造的数据内容及长度覆盖栈上的函数返回地址,从而劫持程序流程。
|
存储 安全 JavaScript
CVE-2017-11882及利用样本分析
Windows的公式编辑器EQNEDT32.EXE读入包含MathType的OLE数据,在拷贝公式字体名称时没有对名称长度进行校验,使得攻击者可以通过刻意构造的数据内容覆盖栈上的函数返回地址,从而劫持程序流程。
|
安全 Windows
CVE-2017-12824及利用样本分析(一)
笔者于书写此文之前从未接触过InPage,该文权当笔者于学习过程中的文章学习笔记,其中如有不当或错误之处,望读者不吝赐教,笔者感激不尽。
|
机器学习/深度学习 数据采集 运维
基于支持向量机的网络⼊侵检测系统的全面调查和分类
基于支持向量机的网络⼊侵检测系统的全面调查和分类
|
SQL 安全 JavaScript
常见漏洞分类
常见漏洞分类
339 0
常见漏洞分类