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.pdf•POC —— https://raw.githubusercontent.com/rapid7/metasploit-framework/master/data/exploits/CVE-2017-8291/msf.eps•Ghostscript 9.21 —— https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/tag/gs921•GhostButt - CVE-2017-8291利用分析—— https://paper.seebug.org/310
后台回复:CVE-2017-8291获取本文pdf