深度分析及防护:加密木马攻击,海莲花?
2015-06-15
随着匿名者攻击事件的跟踪分析走向深入,5月28日,又一系列针对中国的攻击行为浮出水面。这个被大家称为“海莲花”组织所实施的攻击,其攻击特性是怎样的,到底是单纯的木马,还是APT?随之而来的攻防思路会发生怎样的转变?用户又该如何应对?
本报告从此次攻击事件中截获的典型木马样本入手,分析其攻击行为,对比木马及APT的特性,为用户思考下一步的应对方案,给出了转变思路的攻防模型,提出未来攻防战中胜负判断标准及发展方向,并推荐了应对此次攻击的解决方案及实施步骤。
目录
-
攻击:是谁?
- 海莲花
- 样本分析
-
攻击:是木马还是APT
- 木马特性
- APT特性
- 要关注的事情
-
防护:思路转换
- 怎么理解
- 怎么做
-
防护:NGTP方案
- 完整部署
- 简化部署
- 产品部署
- 终端防护
- 威胁情报
- 关于js1996官网登录
攻击:是谁?
js1996官网登录威胁响应中心一直在持续关注网络攻击事件并进行跟踪分析,这些攻击事件中有来自国内的,也有来自国外,如同现实社会中的恐怖主义一样,有些事件会有组织公开承认,比如匿名者(Anonymous),但也有一些事件是没有组织对其负责的,这些事件js1996官网登录的专家会用相关的模型进行分类研究,其中的一个参考指标就是其攻击行为及惯用的攻击形式。
海莲花
2015年5月28日,一系列针对中国海事机构的攻击行为浮出水面,业界有传攻击事件涉及30多个国家,事后未有组织声称对这些攻击事件负责,但其中可以看到的是,相关海事机构的攻击大多数来自木马。如果说这些攻击是来自某个黑客组织,那么这个组织无疑是比较低调的,低调到没看到其公开的命名。可能是由于这些攻击目标常涉及中国的海事及相关机构,某公司将其命名为“海莲花”,但考虑到这些攻击的一些特性,1多采用木马,2多针对海事机构,3攻击有一定的数量,4如果存在这个组织,他们很低调,那可能使用海马(Seahorse)称呼他们更为贴切。
样本分析
js1996官网登录威胁响应中心在日常监测中获取到了该组织的一些木马样本,考虑到国内用户的使用习惯,选择了一个具有代表性的加密木马(Encrypting Trojan horse)进行分析,通过分析可以看到其完整的执行过程。样本通常是一个可执行文件,可能其图标类似word.exe程序,执行后会生成两个比较的关键的文件qq.exe以及Bundle.rdb文件。
随后向IP地址193.169.244.73发起连接
通过追踪对应的IP地址,发现其所在区域及绑定域名来自乌克兰,目前域名页面获取已经失效,但不排除有相关的反追踪技术手段。而从过去的持续跟踪情况来看,美国和乌克兰的域名较多。
样本整个完整的执行过程如下:
1 点击之后样本会释放出形如XXXX.tmp的文件并运行;
2 该文件首先会释放一个正常的doc文件运行,用以迷惑普通用户;
3 然后释名为qq.exe和Bundle.rdb的两个文件;
4 用户一旦运行了”qq.exe”;
5 这个李鬼就会将Bundle.rdb文件注入到一个僵尸进程中;
6 Bundle.rdb实现与攻击者的服务器进行交互。
下面我们将其中的一些追踪的技术细节呈现出来,通过这些细节呈现,有利于后续对该木马进行查杀和防护,以及为整体分析攻击组织的行为提供信息及数据支撑。
木马样本入口分析
样本信息
从截获的样本来看,该样本伪装为word文档,引诱用户去点击,而传播途径也主要通过邮件传输,U盘拷贝等形式传播。先检查该样本有没有加壳。
也就是说该样本并没有采用传统的加壳技术来躲避查毒软件的查杀,而是采用了其他加密的方式来绕过扫描。
查找木马程序入口
上图是IDA反汇编后,截取的winmain函数的主要部分,从图中大体可以看出该样本运行时会检测命令参数开始部分是否含有”–ping”字符串。如果有该参数会直接进入SUB_40CF20函数中运行;如果没有该参数,之后会创建临时文件,并通过CreateProcessW函数以新进程的方式启动该临时文件(也就是子体)。
接下来我们分析两个方面:
-关注该木马(母体)创建的是什么临时文件(子体),子体的启动参数是什么(图中给出的commandline) -如果母体没有参数“–ping”情况,在sub_40cf20函数里面做什么动作
母体执行过程
分析母体入口
分析到这里,我们只知道该样本要带有”–ping”,但是还不知道到底有什么参数;那么能做的就是直接在虚拟机中启动它,不需带有任何参数,根据我们的静态分析可知,这种情况下会先生成一个子体,然后通过CreateProcessW来启动该子体.
启动windbg,虽然知道了母体里面有winmain函数,但是在没有符号文件的情况下windbg还不能识别出winmain入口函数,所以在windbg加载母体后,需要找到一个断点来动态调试winmain函数。通过IDA反汇编知道,在winmain函数里面先是调用了一个API函数GetComputerNameA。
在运行G命令号会断在此处,如下图所示
查看该函数的参数
用GU命令该函数运行完成后,可以看到该函数已经取得了主机名,如下图:
对于虚拟机系统:
接下来会将大写字母变成变成小写,如下图
转换后的结果:
之后会通过CoInitialize函数告诉Windows以单线程的方式创建com对象,CoInitialize并不装载COM 库,它只用来初始化当前线程,让线程注册一个套件,而线程运行过程中必然在此套件。如下图:
母体如何产生子体
下面的动作就是要判断它启动时是否带有参数,如果没有参数就会在临时文件夹建立一个文件
显示获取当前用户的临时目录,之后会在该目录下产生一个随机文件名。
在创建了临时文件后,接着就会先得到母体文件,同时产生一个随机字符串,该随机字符串会作为将来子体启动时参数部分,之后将释放产生的子体(前面只是产生临时文件还没有写入数据,就是要写入数据,写入的大部分内容还是母体的数据),同时在构造出CreateProcessW函数启动子体程序时的参数部分。入下图
子体躲避杀毒软件
当产生新的文件时,杀毒软件通常都有有所觉察,为了能躲避传统杀毒软件的查杀,在生成子体时,利用了加密技术对子体做了块加密。下面是函数SUB_40AFF0产生随机字符串的主要过程,
由下图可知,在复制母体过程中对母体本身先做了处理,函数SUB_40CEA0调用SUB_40CB30,该函数在复制写入之前对母体做的处理,调用过程和处理过程如下图:
由下图可知,在复制母体过程中对母体本身先做了处理,函数SUB_40CEA0调用SUB_40CB30,该函数在复制写入之前对母体做的处理,调用过程和处理过程如下图:
子体躲避杀毒软件
当产生新的文件时,杀毒软件通常都有有所觉察,为了能躲避传统杀毒软件的查杀,在生成子体时,利用了加密技术对子体做了块加密。下面是函数SUB_40AFF0产生随机字符串的主要过程,
由下图可知,在复制母体过程中对母体本身先做了处理,函数SUB_40CEA0调用SUB_40CB30,该函数在复制写入之前对母体做的处理,调用过程和处理过程如下图:
接下来就是要创建一个子进程(子体),同时检查启动的该子体和参数
从上图可知createprocessw第一个参数是”c:UsershomeAppDataLocalTempDBE3.tmp”第二个参数是” “C:UsershomeAppDataLocalTempDBE3.tmp” –pingC:ocean est.exe 98A92D9A03B32BBB789802827DD0F5FB245F07A28BE4E9251E55C06A43DAA994A0852C6623D4FEB93139B4A028463B7BF27F727372E5813871AFD7D01AB44430”
也就是子体名字叫DBE3.tmp(在多次调试过程中,每次产生的临时文件都不一样),产生的随机字符串实在太长了。
子体执行过程
分析子体入口
到目前为止,母体的启动过程基本上分析完成了,我们在开始说到如果有—ping参数及其他部分,会进入SUB_40CF20函数。如下图
由于我们并不知道母体参数ping后面具体接什么内容,所以不与分析。其实不用单独今天分析else后面的内容,因为我们知道了子体主要复制了母体的程序,并添加了子体启动时的参数,通过createprocessW函数启动子体时,子体会直接进入else里面,因为现在已经有”–ping”参数了。所以我们分析子体就会分析到该分支。
子体分析,在上面已经知道了子体时由母体复制而来,并且在子体启动时已经有了参数,根据winmain函数的代码流程可知,子体会进入
子体入口动态跟踪
接下来就是要看函数SUB_40CF20里面做了哪些操作。 以上面得到的子图DBE3.tmp为例,在windbg调试带参数的子体可以像如下设置
为了能够动态调试子函数sub_40CF20,需要在该函数出下断点,但是由于该函数不是标准的API函数,所以也没有符号表,这样很难找到该函数的入口地址。对此我们通过观察IDA今天反汇编代码,可知sub_40CF20在CoInitialize和memicmp函数之后会被调用,所以我们可以在标准API _memicmp或是它之前的CoInitialize函数下断点,然后动态跟进sub_40CF20函数即可。本例在CoInitialize下断点
函数断下来后单步跟踪,跟进IDA静态分析_memicmp比较有没有”–ping”,如果有的话就会执行到sub_40CF20函数,由于子体里面包含了该参数,也就能直接进入else里面,查看伪C和反汇编代码
单步动态跟踪windbg,进入JZ loc_40D6EE
进入else里面首先sleep(0x7d0)只有调用sub_40CF20,并将子体参数作为该该函数的参数传进去,跟进该函数
该函数内部做的操作:
验证子体参数中是否包含” ”,也就是说在启动子体时,
此处参数之间的分割不能是空格,必须是” ” ,生成test.exe生成test.docx文档
子体释放docx文档过程
上面说到sub_40BBA0函数成了docx文档,那么是怎么生成的,其调用过程如下图
也就是说最终调用了函数sub_40B9A0函数,那就看看该函数的主要流程:
上图是截图该还函数的主要代码,从代码中可知该函数利用test.exe,生成了test.docx文档,并打开了该文档,这就是为什么如果我们加参数直接打开DBE3.tmp文件时,生成的test.docx能够自动打开的原因。
子体的反调试技术
为了能够避开虚拟机检测或是在虚拟机中调试,子体中加入动态反调试技术,判断是否有虚拟机
函数调用关系如上图所示,在函数里面做了虚拟机的判断
从代码中看出,该子体会判断自己是否在虚拟机中;进一步跟踪sub_407260看看判断vmware里面是怎么操作的:
Vmware为真主机与虚拟机之间提供了相互沟通的通讯机制,它使用“IN”指令来读取特定端口的数据以进行两机通讯,但由于IN指令属于特权指令,在处于保护模式下的真机上执行此指令时,除非权限允许,否则将会触发类型为“EXCEPTION_PRIV_INSTRUCTION”的异常,而在虚拟机中并不会发生异常,在指定功能号0A(获取VMware版本)的情况下,它会在EBX中返回其版本号“VMXH”。
躲避虚拟机检测机制
经过上面的分析,我们知道了在虚拟中运行会直接退出,因为函数sub_40B840执行完成后返回后,返回了1;同时函数sub_40B930也就返回了1;这样子体就会终止了运行,如下图
但为了在虚拟机中分析子体,技术人员利用动态调试技术,修改代码流程,在sub_40B930返回后,修改返回值让其继续运行,如下图所示
这样程序就能进入if语句里面继续运行。接下来做的事情就是解析参数部分的随机字符串并转化编码
在编码转换完成后,开始解密文件。前面说过,母体在生成子体时会做处理后生成子体,该处理就是分块加密的过程。下面是先根据参数中的随机字符串生成解密秘钥,然后在进行解密。
接下来会遍历进程列表,关闭相关进程。在解密完成后,进入函数sub_40C6F0里面,遍历进程列表如下图
同时在函数里面sub_40C6F0里面完成进程遍历工作,其最终调用了sub_40B380
该还是开始显示遍历系统进程,并取得hash值,与指定的值比较,如果相等则关闭该进程。
释放qq.exe及bundle.rdb文件
为了能够迷惑用户,样本在生成执行文件时,特意命名为qq.exe;在调用关系图中的sub_40B790函数返回后,就会调用sub_40c260函数生成qq.exe文件,如下图
该函数在内部调用sub_40BE40来生成QQ.exe
释放为国际版的QQ.exe,国内的用户通常不会使用这个版本,不知道是攻击者的疏忽还是有其他的目的。
之后在再次调用该函数生成bundle.rdb文件,传入的参数发生了变化