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



相关文章
QT QTreeWidget 实现模糊查询和多选的勾选状态
#QT QTreeWidget 实现模糊查询和勾选状态 本文的主要代码基本都是总结2篇博客实现了模糊查询模糊查询和勾选状态QTreeWidget实现勾选基本上所有的操作都是递归操作,个人测试了性能,如果1w项左右的数据时,没啥问题,如果有几w,那么勾选所有的,效率很慢,需要几秒钟,大家可以测试,不废话了,直接上代码:如果有啥不懂的,可以在留言,会很详细的给出解释的
476 0
|
JSON 安全 前端开发
浅析CORS跨域漏洞与JSONP劫持
浅析CORS跨域漏洞与JSONP劫持
662 3
|
7月前
|
人工智能 搜索推荐 程序员
用 Go 语言轻松构建 MCP 客户端与服务器
本文介绍了如何使用 mcp-go 构建一个完整的 MCP 应用,包括服务端和客户端两部分。 - 服务端支持注册工具(Tool)、资源(Resource)和提示词(Prompt),并可通过 stdio 或 sse 模式对外提供服务; - 客户端通过 stdio 连接服务器,支持初始化、列出服务内容、调用远程工具等操作。
1826 4
|
存储 负载均衡 中间件
Nginx反向代理配置详解,图文全面总结,建议收藏
Nginx 是大型架构必备中间件,也是大厂喜欢考察的内容,必知必会。本篇全面详解 Nginx 反向代理及配置,建议收藏。
Nginx反向代理配置详解,图文全面总结,建议收藏
|
12月前
|
缓存 Java 开发者
Java多线程并发编程:同步机制与实践应用
本文深入探讨Java多线程中的同步机制,分析了多线程并发带来的数据不一致等问题,详细介绍了`synchronized`关键字、`ReentrantLock`显式锁及`ReentrantReadWriteLock`读写锁的应用,结合代码示例展示了如何有效解决竞态条件,提升程序性能与稳定性。
834 6
|
安全 网络协议 Shell
Python PIL远程命令执行漏洞复现(CVE-2017-8291 CVE-2017-8291)
Python PIL远程命令执行漏洞复现(CVE-2017-8291 CVE-2017-8291)
788 0
|
SQL 前端开发 Java
基于Java的宠物领养管理网站系统设计与实现
基于Java的宠物领养管理网站系统设计与实现
381 1
|
Kubernetes 负载均衡 Cloud Native
从零开始入门 K8s | 理解 CNI 和 CNI 插件
网络架构是 K8s 中较为复杂的方面之一。K8s 网络模型本身对某些特定的网络功能有着一定的要求,因此,业界已经有了不少的网络方案来满足特定的环境和要求。CNI 意为容器网络的 API 接口,为了让用户在容器创建或销毁时都能够更容易地配置容器网络。在本文中,作者将带领大家理解典型网络插件地工作原理、掌握 CNI 插件的使用。
从零开始入门 K8s | 理解 CNI 和 CNI 插件
|
前端开发 JavaScript
web前端面试高频考点——JavaScript 篇(二)【JS 异步进阶】Event Loop、then 和 catch、async/await、宏任务微任务、手撕 Promise 源码
web前端面试高频考点——JavaScript 篇(二)【JS 异步进阶】Event Loop、then 和 catch、async/await、宏任务微任务、手撕 Promise 源码
424 0
|
存储 NoSQL 安全
CVE-2017-8291及利用样本分析
CVE-2017-8291及利用样本分析