?病毒样本下载来源于i春秋逆向版主Crazyman_Army主题帖《记一次蔓灵花APT组织针对巴基斯坦定向的样本分析》,是一个Downloader,Crazyman_Army已经对关键得恶意代码进行了分析与整理,链接:https://bbs.ichunqiu.com/thread-50002-1-1.html
?对于个人而言,看过APT分析报告,但是很少逆向相关得恶意代码,毕竟样本少,既然发现了一枚,走过路过不能错过。
??APT(Advanced Persistent Threat)是指高级持续性威胁,特别有针对性得方式。
?个人对于APT的理解?:APT是综合了社会工程学,人性弱点,系统漏洞等等,多方因素协调恶意代码发起Attack,长期潜伏,时效长达半年或者更久,收集大量的数据为attack做准备。有组织,有纪律,是一名合格的"间谍",隐蔽性很强(代码的隐蔽性),运行方式独特,难以查杀。
?
线上恶意代码分析如下:
????????????????????图片一:线上分析
?通过在线分析,与原贴中杀毒识别的个数略有差异,这是一个被明确且已能被防范的样本。
?
手动分析如下:
?1、Exinfo PE查看文件信息,如下所示:
????????????????????图片二:样本信息
?通过Exinfo PE观察,样本没有加壳,而且是c++编写的,是图形用户界面程序(GUI)。
?
?2、IDA静态分析:
????????????????????图片三:GUI流程
????????????????????图片四:过程化流程
?下面在IDA中具体的分析一下代码,先看图片三中的GUI流程,如下所示:
????????????????????图片五:GUI代码分析
?通过ShowWindow第二个参数填入SW_HIDE数值(也就是0),意味着创建了一个隐藏窗口,调用sub_401330去执行恶意代码。
?进入函数sub_401330之后,发现了大量的数据的初始化及循环解密字符串的环节,如下所示:
????????????????????图片六:数据初始化
????????????????????图片七:字符串解密
?根据个人习惯,遇到着这情况就要动态调试,单纯的靠静态去分析有些麻烦,下面通过动态分析去还原这些数据的操作。
?
?3、IDA动态调试:
?主要分析sub_401330函数都干了那些事情,首先初始化了一堆数据,如图片六所示,然后又结束进程?句柄参数还是NULL,如下所示:
????????????????????图片八:TerminateProcess
?句柄为空,返回值会是INVALID_HANDLE无效的句柄值,接下来通过字符串运算获取了注册表(自启动路径),如下所示:
????????????????????图片九:获取自启动路径
?接下来拷贝了获取的字符串,如下所示:
????????????????????图片十:拷贝
?运算字符串获取msdtcv,如下所示:
????????????????????图片十一:msdtcv
?拼接成msdtcv.exe,如下所示:
????????????????????图片十二:msdtcv.exe
?这时候已经拼接成一个后缀为.exe的程序了,按照一般的套路基本都是查找资源,锁定资源释放到某一个文件夹下,运行释放的可执行代码,终止当前进程,其实这个套路也是,只不过是拷贝了自己,如下所示:
????????????????????图片十三:_mkdir
?先在C盘下创建了一个文件夹,应该是准备来文件夹下拷贝或者写入资源,如下所示:
????????????????????图片十四:字符串拼接
?如上图用了rep movs 汇编指令进行了文件夹路径与msdtcv.exe拼接,高级语言的就是strcat函数,既然路径野拼接出来了,接下来理论是要该路径的程序落实,获取了当前程序运行路径,接着获取了Open字符串,如下所示:
????????????????????图片十五:Open
?感觉前奏应该快完了,可是发现了一个新函数,不用说应该前奏还没结束,继续跟如新函数一探究竟,如下所示:
????????????????????图片十六:SHGetFolderPathA
?官方给出的函数解释Deprecated. Gets the path of a folder identified by a CSIDL value.,获取CSIDL路径,这个函数已废弃。继续接着看,如下所示:
????????????????????图片十七:cmd命令
?看到了上面字符串格式:copy "" "" 拷贝当前数据到c:\intel\msdtcv.exe,与猜测的步骤吻合,确实要拷贝了,既然cmd无非那几个函数可以作为参数执行cmd指令,WinExec、ShellExecute、CreateProcess等API来实现,样本中用到了ShellExecute与CreateProcess,继续分析,如下图所示:
????????????????????图片十八:reg cmd命令
?利用cmd进行自启动,这个函数运算拼接获取了这些即将会被用到的字符串,向下继续分析,碰见了函数如下:
????????????????????图片十九:sub_401F00函数
?对于数据则很简单,有编程基础的人没有一点难度,贴上一张IDA转成C之后的图:
????????????????????图片二十:Reg API
?打开及检索AppId键值,如果存在则写入路径c:\intel\msdtcv.exe,如下所示:
????????????????????图片二十一:设置成功
?为什么要在Environment下的AppID中设置呢?HKEY_CURRENT_USER根键中的信息的修改都会导致对HKEY_USERS.Default中子键信息的修改,修改当前用户环境,AppId设置为运行路径,后面会使用cmd的命令,调用%AppId%环境变量启动且退出,如下所示:
?这种方式相对于直接调用敏感的API来说很聪明,接着又开了注册表,如下所示:
????????????????????图片二十二:RegOpenKeyEx
?通过观察参数,我们就可以确定这是对自启动键值进行相关操作,下面调用了CreateThread函数,如下图所示:
????????????????????图片二十三:CreateThread
?重点分析一下上图中标红处的回调函数,如下所示:
????????????????????图片二十四:回调函数分析
?意图很明显了,样本字符串的规律来看,这个样本只要是对字符串赋值,意味着后面一定会有运算解密,果真如下所示:
????????????????????图片二十五:解密代码
?上面一段代码动态解密出来的字符串是ComSpec,其实也就是%ComSpec%环境变量,来看一下,如下所示:
????????????????????图片二十六:echo %ComSpec%
?前面获取了大量的cmd指令,又获取了cmd.exe可执行路径,下面必须是创建cmd进程,否则那么多的sub不就白费了.....如下所示:
????????????????????图片二十七:CreateThread
?接下来向cmd.exe写入执行的数据,完成了cmd命令拷贝,如下图所示:
????????????????????图片二十八:WriteFile
?回调函数结束了它的使命,创建了cmd线程且利用匿名管道写入执行的cmd指令,实现自身拷贝,这段代码还是比较有意思。接下来到了分水岭,也就是当前进程的终点了,如下图所示:
????????????????????图片二十九:分水岭
?如图二十二,我们明白这是要检测是否已存在启动项,如果响应成功则执行如下:
????????????????????图片三十: 执行1
?那么上述代码就结束了exit退出了,然后运行msdtcv.exe,其实还是自己,我继续来下看,下面就是网络相关的操作,接着调用了一个sub_4037b0,这是一个有意思的函数,如下图所示:
????????????????????图片三十一:RegOpenKeyEx
????????????????????图片三十二:MachineGuid
?有意思的代码如上,MachineGuid?这个就是所谓的超级硬件唯一标识,但是什么都没有操作....只是做了判断获取了标识符数据,应该另有用处,如下所示:
????????????????????图片三十三:sub_4037b0返回值
?进行了WSA初始化及socket操作,如下所示:
????????????????????图片三十四:gethostname
????????????????????图片三十五:sub_402520返回值
?接着调用了函数sub_4025B0,函数内容如下所示:
????????????????????图片三十六:收集系统信息
?函数sub_4025B0里面大量的采集了操作系统的信息,应该是为了发送给服务端,为后续下载的恶意代码兼容性提供数据支撑,线性分析发现sub_402070函数,收集的数据形成GET请求,包含了系统唯一标识及版本数据等信息,如下所示:
????????????????????图片三十七:GET报文形成
?数据也收集,下面就发送吧,sub_402890函数包含了完整socket操作,并且发送给了服务器,如下图所示:
????????????????????图片三十八:send与recv
?还有最后一个函数sub_402BA0,我们继续看一下,如下所示:
????????????????????图片三十九:socket
????????????????????图片四十:send Data
?通过上面数据我们发现,仍在是在与服务进行通讯,格式化拼接数据发送到服务器端,下面则是下载并写入本地恶意代码,如下所示:
????????????????????图片四十一:获取绝对路径
?以上C++代码环境在windows10 64bit下测试,那么意味了当前系统的该路径并且写入文件数据,比较有意思的,服务端下载的恶意代码进行了数据解密,通过对文件光标选择性读写数据,抽取真正执行的恶意代码,然后创建线程,如下所示:
????????????????????图片四十二:选择性恶意代码读写
?为什么这样做呢?为了混淆免杀,下载下来的恶意代码为了避免被杀毒软件查杀,可以在代码中进行混淆,不论是从PE偏移点的改变或者是对一些敏感字符的匹配都有可能失效,躲避一些所谓的启发式查杀,最后在本地生成真正的恶意代码且执行,如下所示:
????????????????????图片四十三:运行恶意代码文件
?最后在收集数据,调用sub_402890函数,也就是上面分析完整的socket操作,如上图三十八所示,调用图如下所示:
?最后是获取了时间与伪随机数,且这是一个大循环,又会回到当初分水岭WSACleanup的地方,如下所示:
????????????????????图片四十四:数据提供
?以上就是整个样本的分析,其实发现有意思的是字符串获取的方式以及恶意代码下载后躲避启发式查杀的手段。本身程序并不携带任何具有恶意性的操作,而是收集了当前系统大量的数据发送服务端(特洛伊),服务器端根据当前系统下载兼容的混淆恶意代码,在本地进行文件解密且运行,可惜是下载不下来恶意代码了....
?最后,有兴趣的朋友可以到文章开头中Crazyman_Army帖子中下载APT的样本,学习研究一下。
原文地址:http://blog.51cto.com/13352079/2349855