记一次钓鱼样本分析上
原文首发做:奇安信攻防社区
https://forum.butian.net/share/3701
好久没写文章了,简单写篇样本分析的文章记录下前几天分析的一个样本,这个样本还是比较经典的,做了些反分析的手段,也使用了一些比较流行免杀对抗技术,能够免杀一些杀软;这篇文章我们主要看这个loader怎么做的,以及如何正常分析这样的样本和快速拿到c2;同时也分享一些奇奇怪怪的知识:如何提取样本特征做威胁狩猎以及对样本对抗的一些思考和想法;
0x01 前言
好久没写文章了,简单写篇样本分析的文章记录下前几天分析的一个样本,这个样本还是比较经典的,做了些反分析的手段,也使用了一些比较流行免杀对抗技术,能够免杀一些杀软;这篇文章我们主要看这个loader怎么做的,以及如何正常分析这样的样本和快速拿到c2;同时也分享一些奇奇怪怪的知识:如何提取样本特征做威胁狩猎以及对样本对抗的一些思考和想法;
样本是一次演习活动别人分享出来的,通过微步可以下载;
下载地址
0x02 基本信息
样本信息:
name:汪涵-上海交大硕士-应聘系统安全岗20240722转换pdf.exe
md5:aeae584563bb8bf0961bd99aaeb41cf0
0x03 分析
首先样本exe伪装pdf,加了各pdf的图标资源;
一、上火绒剑
这里直接上火绒剑,开启系统监控,然后运行样本,粗略的看下样本的行为
这里我们直接把样本丢到虚拟机并双击运行:
没有发现外联行为,进程起来之后,1秒不到很快就自动挂了,行为主要都是一些文件读取和注册标读取操作;
行为列表的最后,我们发现两个可疑的操作,文件读取和注册表读取
第一个动作时读取桌面文件目录,第二个动作时读了一个特殊的注册表(似乎和虚拟机有关,键里面有wmware);
这里第二个特征比较有辨识度,我们尝试google下:
简答看下第二个帖子:这个帖子总结了一些常见反虚拟化操作,根据帖子中下面描述,攻击者可以通过检查特定注册表值来判断当前运行环境是否是在虚拟机Vmware和VirtualBox,其中我们看到 上面的HKEY_CLASSES_ROOT\\Applications\\VMwareHostOpen.exe可以用来检测对当前环境是否是Vmware:
该动作的堆栈调用情况,这里记录下,之后调试分析的时候会用到:
二、上IDA
直接定位调用的堆栈处,调用函数的RVA:0xfa97,可以看到这个函数就是两个注册表OPEN操作,第一个就是我们刚刚分析的可能是用来检测当前运行环境是否在Vmware虚拟机中的:
通过RVA:0xfa97的函数回溯,找到调用链:
这里我们反着,从底层向上一个个来看下这些函数;
1、sub_14000DDA0
如下图,这个函数里面我们简单看,对一些条件做了判断,然后最后满足某种条件,就会调用CreateThread新建线程执行StartAddress处的逻辑;大致是有四个条件,其中一个就是我们刚刚分析的对注册表 虚拟机项的判断;
这里我简单看下另外三个条件函数是在做什么:
sub_14000F974
代码实现如下:
通过SHGetFolderPathW获取桌面路径(第二个参数CSIDL 0X11),然后通过FindFirstFileW和FindNextFileW遍历目录下的文件;遍历的时候没有其他逻辑只是一个计数,最后判断数量是否大于10个,来返回;比较明显的通过桌面文件数量来对抗虚拟机和沙箱;
sub_14000FB54
代码逻辑如下:
通过SHGetKnewFolderPath 获取指定文件路径;其中&rfid参数含义及解释,我们可以知道这里是通过guid来获取文件路径,和上面的CSIDL异曲同工;
该参数的值:
从而windows SDK里面的knownfolders.h(或者参考:https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid),找内置的这个值对应文件夹路径是 《最近》目录;
然后通过FindFirstFileW和FindNextFileW遍历《最近使用》目录下的文件;遍历的时候没有其他逻辑只是一个计数,最后判断数量是否大于10个,来返回;比较明显的通过《最近使用》文件夹下的文件数量来对抗虚拟机和沙箱;
sub_14000FC7B
这个不用多说,用来检测系统上装没装微信,(这个注册表是微信安装目录的键值对所在):
同时这里我们也分析下,下面的创建线程要执行的代码是干什么的:
如下,弹窗报错,然后结束,这里应该就是检测到虚拟机就调用这个来伪装结束:
2、sub_14000D8A3
这个函数上来的逻辑比较清晰,从资源段拿到了数据;
然后数据存在的情况下,调用了一堆函数处理;
我们先来看sub_140011220这个函数,根据图中文字分析,我们可以大致推测出,这个应该是个memorycopy操作,参数1是目的地址,参数2是源地址,参数3是copy的字节数;
这样我们就能简单看出,此处的逻辑是:把对应资源段提出来的内容的前0x90个字节赋值给v23,然后调用上面分析的反虚拟化函数处理v23,然后开辟一个空间,空间大小是资源大小-0xb0,把资源段的0xb0偏移开始位置的内容复制到开辟的空间里面v12;
接着,根据反虚拟化函数sub_14000dda0的结果调用函数对提取出来的资源段0x0b偏移核心内容v12进行处理,这里有一个细节就是决定两个处理逻辑的是资源段里面的某个值,所以这里大概率是攻击者可以配置修改;
上图中的处理,跟进函数细节,你会发现一堆看不懂的逻辑运算以及操作;这里我们用常规思维+一些细节去猜就行了,然后动态调试的时候来证实下我们的猜想即可;
从逻辑上看,这里从资源段拿了一堆数据,现在是对这堆数据操作,是不是大概率是有可能是解密操作;
从函数参数和实现上看,传入的第四个参数是128,这里我们对数据要敏感,128是aes加密的最小单元,如下图,我们看到de42偏移的这个函数逻辑里面,有模128取余操作,是不是和aes里面的填充或者解分组(ecb)啥的是不是有有可能有关系;
所以这里大概率是解密操作;我们不做详细分析了;
接着还有一堆逻辑,我们简单分为几块,如下图,第一块是简单看,看不出来逻辑的一些项,尝试看下函数实现,也没有相关明显发现;
第二块,这里是通过GetAdaptersInfo(xp之前使用)来获取网络适配器的信息,AdapterName就是适配器的guid,这个值加了个值然后赋值给v19了,v18变量记录的是获取到的网络相关信息结构体IP_ADAPTER_INFO的大小;
接着往下的逻辑,我们看到上面获取到的两个值v18、v19,作为第二和第三个参数都传入了函数 sub_14000E71F;
函数sub_14000E71F的实现如下:通过v19(guid)作为随机种子,获取伪随机值;v18是返回的数组大小,返回数组每个元素都是通过v19异或第一个参数(第一个参数是前面资源段解密后的内容数组,这里按个取数组值)然后再异或伪随机(种子是guid)获得的值;最后返回该字节数组;这里看上去是一个特定环境的解密,依赖于获取到的网络设备的guid信息(后面动态调试的时候会发现其实不然,这里只是虚晃一枪);
上面返回的数组,在sub_14000D8A3 里面也是直接作为返回值,返回了,如下图:
最后一部分逻辑,如下图,两个函数:
- 点赞
- 收藏
- 关注作者
评论(0)