报告更新相关时间节点 |
2018年4月18日,完成漏洞预警简报 2018年5月9日,形成综合分析报告 |
披露申明
本报告中出现的IOC(Indicators of Compromise,威胁指标),进一步包括涉及到相关攻击事件的样本文件MD5等哈希值、域名、IP、URL、邮箱等威胁情报信息,由于其相关信息的敏感性和特殊性,所以在本报告中暂不对外披露,在报告中呈现的相关内容(文字、图片等)均通过打码隐藏处理。
若您对本报告的内容感兴趣,需要了解报告相关细节或相关IOC,可与360追日团队通过电子邮件进行联系,另外我们目前只提供电子邮件联系方式:360zhuiri@360.cn,敬请谅解!
第一章 概述
日前,360核心安全事业部高级威胁应对团队在全球范围内率先监控到了一例使用0day漏洞的APT攻击,捕获到了全球首例利用浏览器0day漏洞的新型Office文档攻击,我们将该漏洞命名为“双杀”漏洞。该漏洞影响最新版本的IE浏览器及使用了IE内核的应用程序。用户在浏览网页或打开Office文档时都可能中招,最终被黑客植入后门木马完全控制电脑。对此,我们及时向微软分享了该0day漏洞的相关细节,并第一时间对该APT攻击进行了分析和追踪溯源,确认其与APT-C-06组织存在关联。
2018年4月18日,在监控发现该攻击活动后,360核心安全事业部高级威胁应对团队在当天就与微软积极沟通,将相关细节信息提交到微软。微软在4月20日早上确认此漏洞,并于5月8号发布了官方安全补丁,对该0day漏洞进行了修复,并将其命名为CVE-2018-8174。在漏洞得到妥善解决后,我们于5月9日发布本篇报告,对攻击活动和0day漏洞进一步的技术披露。
第二章 中国受影响情况
根据我们监测到的数据来看,此次利用“双杀”0day漏洞发动的攻击影响地区主要集中在一些外贸产业活跃的重点省份,受害目标主要是一些外贸企业单位和相关机构。
第三章 攻击流程分析
此次捕获到的APT攻击相关的诱饵文档为犹太小语种的意第绪语[1]内容,文档通过CVE-2017-0199的OLE autolink漏洞利用方式嵌入恶意网页,所有的漏洞利用代码和恶意荷载都通过远程的服务器加载。
图1
中招用户点击打开诱饵文档后,首先word进程将访问远程的IE vbscript 0day(CVE-2018-8174)网页,漏洞触发后将执行Shellcode,然后再发起多个请求从远程的服务器获取payload数据解密执行。
图 2
Payload在执行的过程中word进程会在本地释放3个DLL后门程序,通过powershell命令和rundll32命令分别执行安装后门程序,后门的执行过程使用了公开的UAC绕过技术,并利用了文件隐写技术和内存反射加载的方式来避免流量监测和实现无文件落地加载。
图 3Payload执行流程
攻击的主要过程如下图所示:
图4 攻击整体执行流程
第四章 漏洞分析
1. 漏洞修复进程
时间 |
进程 |
2018年4月18日 |
360核心安全事业部高级威胁应对团队发现高危漏洞 |
2018年4月19日 |
360核心安全事业部高级威胁应对团队将漏洞的详细信息提交至微软 |
2018年4月20日早晨 |
微软官方确认漏洞 |
2018年5月9日凌晨 |
微软发布新一轮安全更新,修复漏洞,并公开致谢360 |
2018年5月9日 |
360核心安全事业部高级威胁应对团队发布详细版报告披露漏洞细节 |
2018年4月18日,360核心安全事业部高级威胁应对团队监控发现到高危0day漏洞,。该漏洞影响最新版本的IE浏览器及使用IE内核的应用程序,且已被发现用于有蓄谋有计划的APT攻击。当天,360核心安全事业部高级威胁应对团队立即与微软积极沟通,将漏洞细节信息提交到微软。微软在4月20日早上确认此漏洞,并于5月8号发布了官方安全补丁,对该0day漏洞进行了修复,将其命名为CVE-2018-8174。
CVE-2018-8174是 Windows VBScript Engine 代码执行漏洞。由于VBScript脚本执行引擎(vbscript.dll)存在代码执行漏洞,攻击者可以将恶意的VBScript嵌入到Office文件或者网站中,一旦用户不小心点击,远程攻击者可以获取当前用户权限执行脚本中的恶意代码。
2. 漏洞原理分析
通过静态分析漏洞利用样本,我们发现样本充斥着大量的混淆,所以首先对样本做了去混淆和标识符重命名。
根据我们捕获到漏洞利用样本制作的POC,可以较为直观的分析出漏洞的原理。POC如下:
图5
具体的流程是这样的:
1) 先创建了 cla1实例赋值给b,再给b赋值0,因为此时b引用技术为1导致cla1的Class_Terminate函数被调用。
2) 在Class_Terminate函数中再次将b赋值给c,再将0赋值给b来平衡引用计数。
3) Class_Terminate返回后,b对象指向的内存将会被释放,这样就得到了一个指向被释放对象b内存数据的指针c
4) 如果再次使用其他对象占位这块被释放的内存,那么将导致典型的UAF或者Type Confusion问题
3. 漏洞利用分析
该0 day漏洞利用多次UAF来完成类型混淆,通过伪造数组对象完成任意地址读写,最终通过构造对象后释放来获取代码执行。代码执行并没有使用传统的ROP或者GodMod,而是通过脚本布局Shellcode来稳定利用。
伪造数组达到任意写目的
通过UAF制造2个类的mem成员指向的偏移相差0x0c字节,通过对2个对象mem成员读的写操作伪造一个0x7fffffff大小的数组。
图6
typedef struct tagSAFEARRAY {
USHORT cDims; // cDims = 0001
USHORT fFeatures; fFeatures =0x0880
ULONG cbElements; //一个元素所占字节(1个字节)
ULONG cLocks;
PVOID pvData; //数据的Buffer从0x0开始
SAFEARRAYBOUND rgsabound[1];
} SAFEARRAY, *LPSAFEARRAY;
typedef struct tagSAFEARRAYBOUND {
ULONG cElements; //元素个数(0x7fffffff,用户态空间)
LONG lLbound; //索引的起始值(从0开始)
} SAFEARRAYBOUND, *LPSAFEARRAYBOUND;
伪造的数组大致情况是:一维数组,元素有7fffffff个,每个元素占用1字节,元素内存地址为0。所以该数组可访问的内存空间为0x00000000到0x7ffffffff*1。因此通过该数组可以任意地址读写。但是在lIlIIl在存放的时候,存放的类型是string类型,故只需要将该数据类型将会被修改为0x200C,即VT_VARIANT|VT_ARRAY,数组类型,即可达到目的。
读取指定参数的内存数据
图8
图9
攻击代码中,主要使用上面的函数来读取参数所指定的内存地址的数据。利用思路是在VBS中数据类型为bstr类型,通过vb中lenb(bstr xx)返回字符串地址前4个字节的内容(即bstr类型size域内容)的特性,获取指定内存读能力。
就是上面的代码所示,假如传进来的参数为addr(0x11223344),首先该数值加4,为0x11223348,然后设置variant类型为8(string类型)。然后调用len函数,发现是BSTR类型,vbscript会认为其向前4字节即0x11223344就是存放长度的地址内存。因此执行len函数,实际上就返回了制定参数内存地址的值。
获取关键DLL基值
1、攻击者通过以下方式泄露CScriptEntryPoint对象的虚函数表地址,该地址属于Vbscript.dll。
图10
2、通过以下方式获取vbscript.dll基地址。
图11
3、由于vbscript.dll导入了msvcrt.dll,因此通过遍历vbscript.dll导入表获取msvcrt.dll基地址, msvcrt.dll又引入了kernelbase.dll、ntdll.dll,最后获取了NtContinue、VirtualProtect函数地址。
图12
绕过DEP执行shellcode
1、 利用任意读写的手段修改某个VAR的type类型为0x4d,再赋值为0让虚拟机执行VAR::Clear函数。
图13
2、 通过精心控制使代码执行ntdll!ZwContinue函数,第一次参数CONTEXT结构体也是攻击者精心构造的
图 14
3、 ZwContinue的第一个参数是指向CONTEXT结构体的指针,CONTEXT结构体如下图所示,可以计算出EIP和ESP在CONTEXT中的偏移
图15
4、 实际运行时CONTEXT中的Eip和Esp的值以及攻击者的意图如下图所示
图16
第五章 Powershell荷载分析
诱饵文档DOC文件被执行之后会启动Powershell命令来执行下阶段的载荷。
图17
首先,Powershell 会对传入的参数名称进行模糊匹配,并且是不区分大小写的。
使用的参数 |
原始参数 |
备注 |
-noProFi |
-NoProfile |
不加载 Windows PowerShell 配置文件。 |
-NOLo |
-NoLogo |
启动时隐藏版权标志。 |
-ex BYPpass |
-ExecutionPolicy bypass |
绕过powershell 的默认安全策略。 |
-wIndowSTYle hiddEN |
-WindowStyle |
将窗口样式设置为Hidden模式。 |
然后,对混淆的命令执行解密。
图18
接下来,脚本使用特殊的User-Agent 访问URL页面请求下一步的载荷并且执行。
图19
被请求的载荷文件的大小约为199K,代码片段如下。
图20
图21
通过搜索,我们发现这份代码是由invoke-ReflectivePEInjection.ps1[2]修改而来的。代码中的buffer_x86 和 buffer_x64 是同样的功能的不同版本的dll文件,文件的导出模块名:ReverseMet.dll。
DLL文件从配置中解密ip地址,端口和休眠时间信息,解密算法xor 0xA4之后再减去 0x34,代码如下。
图22
解密配置文件从ip地址***.***.**.28端口1021获取下一步的载荷并且执行,连接上tcp端口之后先获取4个字节做大小来申请一块内存,并把后续获取的写入在新的线程中执行获取的shellcode载荷。
图23
由于样本CC服务器的端口已经关闭,所以我们未能获取到下一步的载荷进行分析。
第六章 UAC绕过荷载分析
诱饵文档DOC文件除了使用powershell加载荷载以外,还使用rundll32.exe在本地执行了另一套后门程序。其利用的后门程序有几个值得注意的特点:程序使用了COM接口进行文件Copy操作,实现UAC绕过,并使用了两次系统DLL劫持,利用了cliconfg.exe与SearchProtocolHost.exe的缺省DLL,实现白利用;最后在组件下发过程中,利用了文件隐写技术和内存反射加载的方式来避免流量监测和实现无文件落地加载。
图24
1. Retro(复古)后门执行分析
本次攻击使用的后门程序实际为APT-C-06组织已知的Retro(复古)系列后门,下面来具体分析一下该后门程序的执行流程。
首先通过rundll32执行伪装为zlib库函数的DLL,执行后门安装函数uncompress2和uncompress3。
其使用COM接口进行UAC绕过,将自身DLL拷贝到System32路径下实现DLL劫持,其劫持的目标为cliconfg.exe与SearchProtocolHost.exe。
图25
通过COM接口将AppData目录下的DLL文件copy到System32目录下,命名为msfte.dll和NTWDBLIB.dll。
图26
随后将文件NTWDBLIB.dll拷贝到System目录下,并执行系统自带的cliconfig实现DLL劫持,加载NTWDBLIB.dll。
图27
NTWDBLIB.dll的作用为重启系统服务WSearch,进而实现msfte.dll的启动。
图28
图29
随后脚本会在TEMP目录下生成MO4TH2H0.bat文件并执行,内容为删除系统目录下的NTWDBLIB.DLL和自身BAT。
图30
图31
msfte.dll为最终的后门程序,其导出伪装为zlib,核心导出函数为AccessDebugTracer和AccessRetailTracer。其主要功能为与CC通信,进一步下载执行后续的DLL程序。
图32
与之前分析的样本类似,其同样采用了图片隐写传输和内存反射加载的方式实现
其解密的CC通讯信息如下:
图33
请求的格式为:
hxxp://CC_Address /s7/config.php ?p=M&inst=7917&name=
其中参数p为当前进程权限,有M与H两类,inst参数为当前