最近闲来无事,找到了一个大佬分析的病毒复现学习下。
样本hash:ae986dd436082fb9a7fec397c8b6e717
app.any.run地址:https://app.any.run/tasks/c5066e3d-974b-499a-971f-954dbf2d5c5d/
样本提取密码:infected
参考链接:
https://www.anquanke.com/post/id/208525#h2-1
https://www.52pojie.cn/forum.php?mod=viewthread&tid=1218242&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline
将样本下载到虚拟机后将后缀改为exe,可以看到样本伪装成了eset的升级程序,图标如下
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
样本分析的工具有很多,如火绒剑,systracer,Procmon,Sysmon等,这里采用火绒剑进行行为分析
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
可以看到病毒伪装成了ESET的更新程序,并弹出了一个对话框来欺骗用户(啧,真狗啊)
但是,根据我们多年的经验判断,未知程序运行后的对话框、提示框一类的东西纯属骗人,不能信的。这个样本模仿的是ESET的杀软弹框,除此之外,还有些而已软件会尝试伪装成微软官方、office官方等常见权威官方来欺骗用户。因此,当我们运行未知程序时一定要慎而又慎。
回归正题,在此时的火绒剑窗口中,我们可以看到本程序的所有行为
但是,让我疑惑不解的是,我的分析貌似有些问题,大佬们可以扫描到三个可疑项,但是我只能扫描到一个(但是另外两个可疑项确实起了作用,切换别的扫描软件我也没有发现问题所在,需要后续继续努力啊)。
嗯~~~,不愧是大佬的图,三个蓝色的部分很是引人瞩目啊
第一个是BA_extract_pe:这个动作代表释放PE文件。结合上面的file_touch、file_open、file_write、file_chmod等操作,我们可以知道程序会在C:UsersxxxAppDataRoaming这个路径下释放一个名为eset_update.exe的PE文件
第三个是BA_register_autorun:表示应用程序通过注册表将自己写入了开机自启动
当然,除了文件相关的行为,我们往下看还可以看到与网络请求相关的行为(毕竟一个病毒不可能只是自启动嘛,不和外界交互一下怎么显得自己很厉害呢)
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
根据火绒剑和Fakenet的监控显示,本地主机(192.168.7.38:53)正在不断的向目标主机general-second.org-help.com发起请求。
通过奇安信的情报平台(https://ti.qianxin.com/)对该地址进行查询
emmmmm,打了很多标签,下面也有很多的情报来源,一看就不是什么正经网站。
不过根据标签的显示,我们可以看到该域名很有可能被APT组织KimSuky使用,所以该样本很有可能来源于该组织。而该组织有一个特点,那就是在病毒样本中他们喜欢用一些小动物的英文名称做标记,所以在分析样本时我们也可以稍加注意,说不定会有意外的收获呢。
1、样本会将自身复制到%appdata%路径下并且重命名为eset_update.exe
2、样本会向恶意域名general-second.org-help.com发起请求,进行交互
借用一些工具(如PEID、DIE)等查看下样本的PE信息是一个好习惯
利用PEID的插件Krypto ANAlyzer查看文件的加密信息,可以看到BASE64和CRC32两种
使用IDA加载样本,在Imports窗口中我们可以看到导入表中一共加载了124个API函数。
上面我圈出了一些API函数,首先是Reg操作相关的API,恶意软件通常会通过注册表实现一系列的恶意操作,如设置开机自启动、获取计算机的一些基本信息等
除了注册表相关的API,还有CreateFile、GetFileSize、ReadFile等文件操作的API,这里应该是通过这些API实现文件的拷贝。
在最下面还有一些网络请求API函数。我们可以选择一个API函数进行交叉引用,一层一层往上找,从而找到最终调用的地方。
如对InternetOpen进行交叉引用,最终我们可以找到该函数通过WinMain函数中StartAddress的sub_401AA0调用
shift+f12打开字符串窗口,字符串共276行,大部分都很正常,但在字符串表的后半部分,可以看到如下与网络请求相关的信息以及重命名的文件名称:eset_update.exe
我们也可以对eset_update.exe进行交叉引用,最后确定在WinMain的sub_403600中进行了引用。
前置工作已经做的差不多了,下面开始上代码。由于篇幅的原因,可能很多地方不能讲的那么详细,有需要的朋友可以翻看参考链接,里面有大佬超级详细的分析,强推!!!
IDA加载样本后,代码停在WinMain处,F5反汇编处理
WinMain里面的函数功能当然是需要自己一点一点的去测试的,至于测试流程我就不在详细叙述(说多了都是泪啊)
sub_4011E0:加载dll和相关字串解密获取相关api函数地址
sub_403600:文件的自拷贝和自启动等操作 sub_401580:获取当前环境变量设置
GetLastError多用于返回错误代码,通过辨析错误代码数值来判断下一步应该进行哪种操作。样本中通过判断返回值是否为1379,来判断本地组是否已存在,这点查找资料可知。
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
但是经过大佬的提点和多方资料的查找,发现这里判断是否为1379其实并没有什么用。。。。
这里应该判断GetLastError的值是否等于ERROR_ALREADY_EXISTS,而此处的是否等于1379并没有实际意义,并不能起到防止多开的作用
sub_4011E0函数主要用于加载dll和相关字符串,解密后获取相关API函数地址,函数内部调用sub_401040对传入字符串进行解密处理。解密流程为将加密字符串减5即可。
解密后通过加载Kernel32.dll,利用GetProcAddress函数来获取API函数地址,相关部分做了注释,截图如下
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
另外,为了方便解密,我写了一个脚本(毕竟那么多API函数和dll文件,一个一个手动算会死人的)
s = 'NSNSJY3iqq'
str = ''
for i in range(len(s)):
str = str + chr(ord(s[i]) - 5)
print(str)
总的来说,这块内容就是调用了函数sub_401040处理加密字符串,加载了三个dll文件WININET.dll、urlmon.dll、Kennel32.dll,通过GetProcAddress函数获取相关API地址。
sub_403600函数内部功能为文件自拷贝、自启动设置、程序弹窗设置。程序首先通过SHGetFolderPathA函数获取自启动文件夹C:/Documents and Settings/当前用户/Application Data,通过GetModuleFileNameA函数获取当前程序运行的直接路径,通过strcmp判断当前执行文件夹是否等于C:/Documents and Settings/当前用户/Application Data。
如果相同,通过CopyFileA将文件拷贝到C:/Documents and Settings/当前用户/Application Data目录下,然后通过向注册表SOFTWAREMicrosoftWindowsCurrentVersionRun写入eset_update值,从而使病毒样本达到自启动的目的。
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
Sub_401580函数主要功能为获取本机网卡信息和获取磁盘序列号以及随机数的生成,首先通过GetAdaptersInfo获取网卡信息,然后又通过GetVolumeInformationA来获取磁盘序列号,获取之后,还会通过调用GetTickCount获取时间来生成一个随机数
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
sub_401770函数用于获取操作系统的一些基本信息,如通过GetVersion函数获取相关系统版本信息,通过GetNativeSystemInfo获取系统位数,还有就是将获取到的信息格式化成新的字符串
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
sub_402790函数用于注册表信息的修改主要就是对XhwjjsWnggtsxItrfns和XTKYFWJaRnhwtxtkyansit|xaHzwwjsy[jwxntsaXhwjjsxf{jwx解密后做拼接,然后将存储在qword_41A620处的恶意url(generl-second.org-help.com)写入注册表内
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
CreateThread函数用于创建相关网络请求进程,内部包括设置请求头、请求方式和协议号,同时还包含了base64编码等操作
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
其中,sub_402F30函数内设置了请求头、请求方式、协议号
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
sub_401AA0函数进去后,经过一系列验算后会发起网络请求。首先通过SHGetFolderPathA获取环境变量路径,并且对wzsiqq873j}j进行解密。
在往下,程序会加载一个rundll32.exe文件,说明程序在后面会下载一个dll文件到本地,然后通过rundll32.exe调用启动dll文件。
再往下程序会获取C:Users用户AppDataLocalTemp相关文件下,然后将tmp.LOG与该文件夹进行拼接。
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
这里会对文件名进行一个分割添加动物后缀,然后修改SOFTWAREMicrosoftWindowsCurrentVersionRun和SOFTWAREMicrosoftWindowsCurrentVersionScreensaversScreenRibbonsDomain两个参数达到自启动和修改屏保属性的目的
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
继续往下看,接下来样本会将传进来的参数通过|分割,然后比较分割后的字符串是否有tiger标志。如果包含了tiger标志,则通过cmd执行指令,这里的指令是服务器下发的。
![原创 | 病毒分析之伪装eset升级程序 原创 | 病毒分析之伪装eset升级程序]()
在代码中,我们除了tiger外还可以看到wolf、snake、bear、monkey等多种动物标记。这些都表明了该样本属于KimSuky的远控木马,下发的远控指令为一些动物名称。
sub_4011E0:加载dll和相关字符串解密获取相关api函数地址
sub_403600:移动自身并重命名、设置开机自启动、创建对话框
sub_401580:获取网卡信息、磁盘信息、随机数拼接
sub_401770:获取操作系统版本信息、系统位数
sub_401AA0:经过一系列验算后发起网络请求
忙忙碌碌好多天,总算是了却了一段心事。分析木马其实并不算难,难的问题在于静下心来一点一点的分析、测试。毕竟要想一次就精准把控到关键点基本不可能,哪怕再厉害的大佬也有跑飞的时候。不急不躁,才是分析木马和病毒的最佳状态。
本文始发于微信公众号(SecIN技术平台):原创 | 病毒分析之伪装eset升级程序
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
点赞
https://cn-sec.com/archives/313011.html
复制链接
复制链接
-
左青龙
- 微信扫一扫
-
-
右白虎
- 微信扫一扫
-
评论