APT蔓灵花分析

 病毒样本下载来源于i春秋逆向版主Crazyman_Army主题帖《记一次蔓灵花APT组织针对巴基斯坦定向的样本分析》,样本连接:https://bbs.ichunqiu.com/thread-50002-1-1.html html

 对于我的而言,看过APT分析报告,可是不多逆向相关得恶意代码,毕竟样本少,既然发现了一枚,走过路过不能错过c++

☛APT(Advanced Persistent Threat)是指高级持续性威胁,特别有针对性得方式编程

我的对于APT的理解✎:APT是综合了社会工程学,人性弱点,系统漏洞等等,多方因素协调恶意代码发起Attack,长期潜伏,时效长达半年或者更久,收集大量的数据为attack作准备。有组织,有纪律,是一名合格的"间谍",隐蔽性很强(代码的隐蔽性),运行方式独特,难以查杀。

线上恶意代码分析以下:
APT蔓灵花分析
                    图片一:线上分析
 经过在线分析,与原贴中杀毒识别的个数略有差别,这是一个被明确且已能被防范的样本。
  
手动分析以下:
一、Exinfo PE查看文件信息,以下所示:
APT蔓灵花分析
                    图片二:样本信息
经过Exinfo PE观察,样本没有加壳,并且是c++编写的,是图形用户界面程序(GUI)。

二、IDA静态分析:
APT蔓灵花分析
                    图片三:GUI流程
APT蔓灵花分析
                    图片四:过程化流程
下面在IDA中具体的分析一下代码,先看图片三中的GUI流程,以下所示:
APT蔓灵花分析
                    图片五:GUI代码分析
经过ShowWindow第二个参数填入SW_HIDE数值(也就是0),意味着建立了一个隐藏窗口,调用sub_401330去执行恶意代码。
 进入函数sub_401330以后,发现了大量的数据的初始化及循环解密字符串的环节,以下所示:
APT蔓灵花分析
                    图片六:数据初始化
APT蔓灵花分析
                    图片七:字符串解密
根据我的习惯,遇到着这状况就要动态调试,单纯的靠静态去分析有些麻烦,下面经过动态分析去还原这些数据的操做。
  
三、OD动态调试:
 主要分析sub_401330函数都干了那些事情,首先初始化了一堆数据,如图片六所示,而后又结束进程?句柄参数仍是NULL,以下所示:
APT蔓灵花分析
                    图片八:TerminateProcess
句柄为空,返回值会是INVALID_HANDLE无效的句柄值,接下来经过字符串运算获取了注册表(自启动路径),以下所示:
APT蔓灵花分析
                    图片九:获取自启动路径
接下来拷贝了获取的字符串,以下所示:
APT蔓灵花分析
                    图片十:拷贝
运算字符串获取msdtcv,以下所示:
APT蔓灵花分析
                    图片十一:msdtcv
拼接成msdtcv.exe,以下所示:
APT蔓灵花分析
                    图片十二:msdtcv.exe
这时候已经拼接成一个后缀为.exe的程序了,按照通常的套路基本都是查找资源,锁定资源释放到某一个文件夹下,运行释放的可执行代码,终止当前进程,其实这个套路也是,只不过是拷贝了本身,以下所示:
APT蔓灵花分析
                    图片十三:_mkdir
先在C盘下建立了一个文件夹,应该是准备来文件夹下拷贝或者写入资源,以下所示:
APT蔓灵花分析
                    图片十四:字符串拼接
如上图用了rep movs 汇编指令进行了文件夹路径与msdtcv.exe拼接,高级语言的就是strcat函数,既然路径野拼接出来了,接下来理论是要该路径的程序落实,获取了当前程序运行路径,接着获取了Open字符串,以下所示:
APT蔓灵花分析
                    图片十五:Open
 感受前奏应该快完了,但是发现了一个新函数,不用说应该前奏还没结束,继续跟如新函数一探究竟,以下所示:
APT蔓灵花分析
                    图片十六:SHGetFolderPathA
 官方给出的函数解释Deprecated. Gets the path of a folder identified by a CSIDL value.,获取CSIDL路径,这个函数已废弃。继续接着看,以下所示:
APT蔓灵花分析
                    图片十七:cmd命令
看到了上面字符串格式:copy "" "" 拷贝当前数据到c:\intel\msdtcv.exe,与猜想的步骤吻合,确实要拷贝了,既然cmd无非那几个函数能够做为参数执行cmd指令WinExec、ShellExecute、CreateProcess等API来实现,样本中用到了ShellExecute与CreateProcess,继续分析,以下图所示:
APT蔓灵花分析
                    图片十八:reg cmd命令
利用cmd进行自启动,这个函数运算拼接获取了这些即将会被用到的字符串,向下继续分析,遇见了函数以下:
APT蔓灵花分析
                    图片十九:sub_401F00函数
对于数据则很简单,有编程基础的人没有一点难度,贴上一张IDA转成C以后的图:
APT蔓灵花分析
                    图片二十:Reg API
打开及检索AppId键值,若是存在则写入路径c:\intel\msdtcv.exe,以下所示:
APT蔓灵花分析
APT蔓灵花分析
                    图片二十一:设置成功windows

为何要在Environment下的AppID中设置呢?HKEY_CURRENT_USER根键中的信息的修改都会致使对HKEY_USERS.Default中子键信息的修改,修改当前用户环境,AppId设置为运行路径,后面会使用cmd的命令,调用%AppId%环境变量启动且退出,以下所示:
APT蔓灵花分析
这种方式相对于直接调用敏感的API来讲很聪明,接着又开了注册表,以下所示:
APT蔓灵花分析
                    图片二十二:RegOpenKeyEx
 经过观察参数,咱们就能够肯定这是对自启动键值进行相关操做,下面调用了CreateThread函数,以下图所示:
APT蔓灵花分析
                    图片二十三:CreateThread
重点分析一下上图中标红处的回调函数,以下所示:
APT蔓灵花分析
                    图片二十四:回调函数分析
 意图很明显了,样本字符串的规律来看,这个样本只要是对字符串赋值,意味着后面必定会有运算解密,果然以下所示:
APT蔓灵花分析
                    图片二十五:解密代码
 上面一段代码动态解密出来的字符串是ComSpec,其实也就是%ComSpec%环境变量,来看一下,以下所示:
APT蔓灵花分析
                    图片二十六:echo %ComSpec%
 前面获取了大量的cmd指令,又获取了cmd.exe可执行路径,下面必须是建立cmd进程,不然那么多的sub不就白费了.....以下所示:
APT蔓灵花分析
                    图片二十七:CreateThread
接下来向cmd.exe写入执行的数据,完成了cmd命令拷贝,以下图所示:
APT蔓灵花分析
                    图片二十八:WriteFile
 回调函数结束了它的使命,建立了cmd线程且利用匿名管道写入执行的cmd指令,实现自身拷贝,这段代码仍是比较有意思。接下来到了分水岭,也就是当前进程的终点了,以下图所示:
APT蔓灵花分析
                    图片二十九:分水岭
如图二十二,咱们明白这是要检测是否已存在启动项,若是响应成功则执行以下:
APT蔓灵花分析
                    图片三十: 执行1
 那么上述代码就结束了exit退出了,而后运行msdtcv.exe,其实仍是本身,我继续来下看,下面就是网络相关的操做,接着调用了一个sub_4037b0,这是一个有意思的函数,以下图所示:
APT蔓灵花分析
                    图片三十一:RegOpenKeyEx
APT蔓灵花分析
                    图片三十二:MachineGuid
 有意思的代码如上,MachineGuid?这个就是所谓的超级硬件惟一标识,可是什么都没有操做....只是作了判断获取了标识符数据,应该另有用处,以下所示:
APT蔓灵花分析
                    图片三十三:sub_4037b0返回值
进行了WSA初始化及socket操做,以下所示:
APT蔓灵花分析
                    图片三十四:gethostname服务器

APT蔓灵花分析
                    图片三十五:sub_402520返回值
接着调用了函数sub_4025B0,函数内容以下所示:
APT蔓灵花分析
APT蔓灵花分析
                    图片三十六:收集系统信息
函数sub_4025B0里面大量的采集了操做系统的信息,应该是为了发送给服务端,为后续下载的恶意代码兼容性提供数据支撑,线性分析发现sub_402070函数,收集的数据造成GET请求,包含了系统惟一标识及版本数据等信息,以下所示:
APT蔓灵花分析
                    图片三十七:GET报文造成
 数据也收集,下面就发送吧,sub_402890函数包含了完整socket操做,而且发送给了服务器,以下图所示:
APT蔓灵花分析
                    图片三十八:send与recv
还有最后一个函数sub_402BA0,咱们继续看一下,以下所示:
APT蔓灵花分析
                    图片三十九:socket
APT蔓灵花分析
                    图片四十:send Data
 经过上面数据咱们发现,仍在是在与服务进行通信,格式化拼接数据发送到服务器端,下面则是下载并写入本地恶意代码,以下所示:网络

APT蔓灵花分析
APT蔓灵花分析
                    图片四十一:获取绝对路径
以上C++代码环境在windows10 64bit下测试,那么意味了当前系统的该路径而且写入文件数据,比较有意思的,服务端下载的恶意代码进行了数据解密,经过对文件光标选择性读写数据,抽取真正执行的恶意代码,而后建立线程,以下所示:
APT蔓灵花分析
APT蔓灵花分析
APT蔓灵花分析
                    图片四十二:选择性恶意代码读写
为何这样作呢?为了混淆免杀,下载下来的恶意代码为了不被杀毒软件查杀,能够在代码中进行混淆,不管是从PE偏移点的改变或者是对一些敏感字符的匹配都有可能失效,躲避一些所谓的启发式查杀,最后在本地生成真正的恶意代码且执行,以下所示:socket

APT蔓灵花分析
                    图片四十三:运行恶意代码文件
 最后在收集数据,调用sub_402890函数,也就是上面分析完整的socket操做,如上图三十八所示,调用图以下所示:
APT蔓灵花分析
 最后是获取了时间与伪随机数,且这是一个大循环,又会回到当初分水岭WSACleanup的地方,以下所示:
APT蔓灵花分析
                    图片四十四:数据提供
 ✍以上就是整个样本的分析,其实发现有意思的是字符串获取的方式以及恶意代码下载后躲避启发式查杀的手段。自己程序并不携带任何具备恶意性的操做,而是收集了当前系统大量的数据发送服务端(特洛伊),服务器端根据当前系统下载兼容的混淆恶意代码,在本地进行文件解密且运行,惋惜是下载不下来恶意代码了....
 最后,有兴趣的朋友能够到文章开头中Crazyman_Army帖子中下载APT的样本,学习研究一下。
ide

相关文章
相关标签/搜索