浅析杀软
前言
以前写过一篇介绍杀软原理的,这里再补充一下
0x00 引擎介绍
1.杀软属性
- 对于给定对象,检测是否包含恶意代码
- 能准确识别出恶意代码的类型,如:木马,后门,蠕虫等
- 对于寄生类恶意代码(宏病毒、感染型病毒等),可以从宿主对象中剥离恶意代码,并还原宿主对象数据
2.杀软引擎的构成
一般来说,引擎通常由几个模块构成,
1.数据格式识别、分析模块
负责对待扫描对象的格式进行识别和分析,为扫描核心提供足够的格式相关信息
2.反病毒特征库
由本地特征库和云特征库构成
3.扫描核心
负责整个反病毒引擎的扫描逻辑,不同的扫描技术也由扫描核心来调度。我的理解是扫描核心作为指挥官,根据不同的情况来调度不同的资源进行扫描。
0x01 静态查杀
1.特征码识别:
杀软有自己的病毒库,里面有很多样本,扫描时会抽取扫描对象的一段特征并与病毒库里作比较,如果匹配,那就会认为是病毒。抽取的代码要有适当长度,一方面维持特征代码的唯一性,另一方面又不要有太大的空间与时间的开销。如果一种病毒的特征代码增长一字节,要检测3000种病毒,增加的空间就是3000字节。在保持唯一性的前提下,尽量使特征代码长度短些,以减少空间与时间开销。
主要扫描的有:
1 | 哈希(全文哈希、分段哈希、局部敏感哈希等) |
2.云查杀:
云查杀的不同点在于它的病毒库是放在服务器端的,而不是本地客户端,意思是只要联网病毒库就会同步更新,这种病毒库更加强大。
3.校验和法
根据正常文件的内容,计算其校验和,定期不定期的检查文件的校验是否与正常的校验和一样。其实本质还是特征码,万变不离其宗
4.启发式扫描:
但是面对未知的病毒,换个模样杀软就认不出了吗?所以安全厂商研究出了启发式算法
启发式则是将一类病毒总结后,归纳其特征,其后的演变都为一类病毒,这就是启发式算法。具体启发式算法可以由杀软来定,比如可以使用机器学习把家族病毒聚类,或简单的通过使用通用型yara规则,例如文件大小小于100kb,且没有图标则可以识别为病毒,以此达到查杀病毒。
yara规则:
1 | rule PoisonIvy_Generic_3 { |
简单分析下这段yara规则,标记了hash,最终的匹配规则是 文件大小在500kb以内 并且满足 $k1/all $s/all $h 中的任意一条
,即被认定是病毒。这时候就可以根据破坏相应的规则,比如大小改为500kb+,不去调用相应的dll等来 bypass。
0x02 动态查杀(主动防御)
动态查杀指的是 程序在运行的过程中执行了某些敏感操作,导致杀软查杀。
谈到动态查杀不得不提一个东西叫沙盒。
沙盒:也叫启发式查杀,通过模拟计算机的环境执行目标文件再观察特征行为
沙盒模拟的常见特征:
特征 | 原因 | bypass |
---|---|---|
内存较小 | 不影响计算机正常运行 | 检测计算机内存是不是很小(判断是否是真实计算机) |
时间较快 | 沙盒内置的时间速度比现实世界要快,提高查杀速度,沙盒中的时间流逝很快 | c语言函数判断1s是否有1000ms/判断是否是utc时间 |
进程或文件不完整 | 减少杀毒软件运行时对计算机的消耗 | 判断操作系统进程的个数/调用不可能存在的文件 |
io设备缺失 | 鼠标键盘等事件大部分沙盒都没有 | 检测驱动 usb等/判断鼠标的移动速度等 |
其实主要就是找一台真实的计算机和沙盒的区别到底在哪,找到那些真实的计算机具有而模拟的计算机无法具有的特征,进行绕过即可,思路很简单,也很广,自己拓展会发现更多有意思的点。下面是两个反沙箱的项目,可以看看
https://github.com/nek0YanSu/CheckVM-Sandbox
https://github.com/ZanderChang/anti-sandbox
下面说一下杀软监控动态查杀的点:
计算机相关
系统服务(指的是这些)如果有敏感服务操作的话,容易被监测到
注册表(键值) 修改注册表的行为一般都是敏感行为(高危添加用户、删除用户,没有十足把握bypass,还是算了)
组策略
防火墙
敏感程序(cmd powershell wmi psexec bitsadmin rundll 等)
各种 win32api
这里强调一下,监控进程调用的api不止是api名字,还包括api的 调用顺序、调用源、参数等等 。 相应的bypass,
1
2
3用实现同样功能的api替换
重写对应的api
调用0环的api绕过3环杀软等等,肯定不止这些, 说起来很容易,但具体实现需要很深的底层功底,起码对Windows操作系统的底层实现,win32api等很熟悉,这就需要内功。
文件夹
1
2
3C:/windows/system32
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
C:\tmp等敏感文件夹(cs、msf都会在tmp文件夹下生成一些东西)
绕过:白加黑
算是一个很好的方法,指的是利用Windows系统的一些白文件去执行相应的敏感操作,就不会触发杀软警告,想一想,有哪个普通的程序去执行添加用户的操作呢?
说到底,白加黑解决的是 Windows里面 信任与权限
的问题,Windows 都相信你,它一个杀软有什么办法,权限指的是你的权限是否比杀软的权限高,如果你在0环,杀软在3环,它也没有权限来管你。
网络相关
1.流量特征: cobalt strike 的通信协议,是由 RSA 传输 AES 的密钥,AES的密钥加密后续通信,这也是c2的常规通信手法,但未经修改的profile 和证书,很容易被检测到。
2.内容特征:data字段是否存在命令相关的关键词加密特征(payload是否通讯加密,明文传输就会被查杀)
3.结构特征: 是否存在已知远控的通讯结构( cs 中 beacon 有 sleep)
4.IP : 是否被情报系统标记为恶意
绕过:
- tcp分段:指的是数据包在传输过程中切分后以小段传输(效果也不错,但是网络连接不好很容易断掉)
- 内容加密:针对传输的内容,比如那些执行命令的字符串等等,加密混淆,加密还是不要用简单的编码,你简单的base64编码一下,杀软、edr等还是可以检测到,最好用非对称加密
- 使用合法证书 : 这个自己找渠道获得吧……
0x03 解码技术(Decomposition)
当在当前扫描对象中没有扫描到恶意代码时,扫描核心需要对该对象进行分析,并进行子对象拆分,以便对拆分后的子对象进一步进行扫描。通常,解码技术包括
1 | 1.解压缩 |
文档分析模块:
1 | 可执行文件:PE,elf,Mach-o,NE,LE,MZ,COM,DEX...... |
0x04 沙箱脱壳技术(Generic Unpacking)
一般来说,杀软通过虚拟机动态脱壳的方式来处理壳的问题。对于公开壳,首先已经被加入特征库了,用的话基本是必被杀的,对于公开壳,基本是通过指导脱壳的方式来查杀,而对于未公开的包括自定义壳、代码混淆器等其他代码级对抗技术,均采用通用脱壳查杀。
ps: 动态调试脱壳一般都是手工利用od、windbg这类调试工具调试,杀软的沙箱做不到。
0x05 检测和规避沙箱&&虚拟机
1. 规避沙箱
方法 | 原因 | 执行 |
---|---|---|
延迟执行 | 各类的沙箱检测的时候,运行时间一般都比较短,可以延迟等一会去执行我们的shellcode | 如:延迟30 ,45,60 |
检测开机时间 | 很多沙箱检测完了就会重启,可以用开机时间来判断是否为沙箱 | 判断开机时间是否大于1小时 |
检测物理内存 | 现如今大多数PC机器都是4GB以上的机器,检测RAM是否大于4gb来判断 | 判断内存是否大于4G |
检测CPU核心数 | 很多PC机,都拥有4核心的CPU,很多沙箱和虚拟机为2GB | 判断CPU核心数,是否大于4 |
用户模拟 | 带入我们的参数才能够运行我们的程序 | 判断是否有参数 |
检测文件名 | 很多沙箱基本都要改我们的文件名 | 判断文件名是否被修改 |
检测磁盘容量大小 | 沙箱一般都很小,没办法长时间的运行消耗 | 判断磁盘是否大于80G |
创建互斥体 |
2.检测虚拟机
进程检测
VMware
1 | Vmtoolsd.exe |
VirtualBox
1 | vboxservice.exe |
parakkeks desktop
1 | prl_tools.exe |
注册表检测
通过读取主机具有虚拟机特性的注册表位置来判断是否处于虚拟机环境中。
Vmware
1 | HKEY_CLASSES_ROOTApplications\VMwareHostOpen.exe |
VirtualBox
1 | HKEY_LOCALMACHINE\SOFTWARE\Oracle\VirtualBox Guest Additions |
注册表中能被检测出的位置很多,这里只是举个例子。
磁盘文件检测
VMware
1 | C:\windows\system32\driversVmmouse.sys |
VirtualBox
1 | c:\windows\system32\drivers\VBoxMouse.sys |
MAC地址检测
Vmware
1 | 00:05:69 |
VirtualBox
1 | 08:00:27 |
3.微步沙箱
进程
1 | process id: 1528 , process name : AcrylicService.exe // DNS代理程序,用来检测DNS流量 |
壁纸
1 | C:\Users\vbccsb\AppData\Roaming\Microsoft\Windows\Themes\TranscodedWallpaper.jpg //路径 |
用户名 , 每次运行沙箱的用户名不变 ,都是vbccsb
1 | 主机名:VBCCSB-PC |
系统制作厂商和型号 , 正常PC的系统制作厂商都是电脑的牌子 DELL、LENEVO、ASUS
1 | // 微步 |
4.VT沙箱
文件名,部分沙箱会将样本 Hash 重命名或者下载的样本都是以 HASH命名的文件,也可以通过这个特征检测
1 | 676ef88e8c8772b4751605835cb3a8a5.exe |
进程,部分沙箱也会开以下进程
1 | AcrylicService.exe |
性能 ,大多数沙箱的内存都小于4G
1 | 4.txt:Available Physical Memory: 560 MB |
语言 , 国外沙箱的语言大多为英文
1 | ╰─# grep 'System Locale' *.txt |
时区 ,VT上的沙箱大多为国外时区,国内的时区为东八区
1 | ╰─# grep 'Time Zone' *.txt |
系统制作厂商和型号,部分沙箱的制作厂商为QEMU
1 | ╰─# grep 'System Manufacturer' *.txt |
0x06
1.HW中遇到的杀软
- windows defender
- 360全家桶
- 火绒
- QQ管家
- 阿里安骑士
- sangfor edr
- G01
- 趋势科技
- 麦咖啡 卡巴斯基
2.杀软分组
静态对抗组(上线就可以乱搞)
- sangfor edr
- 麦咖啡
- 阿里安骑士
- 趋势科技
- QQ管家
- G01
行为对抗组(上线了还必须注意操作)
- windows defender
- 360全家桶
- 卡巴斯基
- eset
- 火绒
3.静态对抗组
- sangfor edr: 静态查杀很强,不会查杀父进程,过了静态就可以乱来
- 麦咖啡: 麦咖啡静态查杀也很强,没有行为查杀
- 阿里安骑士:静态一般,但拦截高危cmd操作
- 趋势科技:监控恶意服务创建,行为检测基本无
- QQ管家:?
- G01:静态上传不管是exe还是dll都会被杀,有黑名单机制
tips:将程序后缀改为txt,可以在cmd下直接运行(cmd 会将任意内容开头为MZ的文件当作PE可执行文件尝试允许)
4.行为对抗组
1.eset
- 上线方面
loader使用shellcode分离的方式
- 操作方面
不是企业版没碰到有拦截一些常规操作
2.卡巴斯基
内存扫描能力很强,默认的cs beacon会被检测
- 上线方面
修改cs的profile(可参考:https://xz.aliyun.com/t/9224)
- 操作方面
常规操作是不拦截的
3.火绒
- 上线方面
没啥注意
- 操作方面
不要去做一些乱搞的配置,很容易绕过,不要随意使用提权工具
心跳不要过短
4.360
- 360核心防护
开启了核晶防护之后,需要操作是受限的,大部分的CMD命令是无法使用的,判断是否开启核晶防护,上传EXE执行提升拒绝访问,就算上线了,becaon下运行cmd命令提示拒绝访问
- 上线方面
如果有核晶防护,DLL白加黑解决上线问题(项目推荐:https://github.com/marpie/signed-loaders),避免使用进程注入的方式加载shellcode
- 操作方面
即便有system权限也没办法实现CMD命令注入,就上传我们自己写好的代码进行注入,或者用bof插件进行相关的替代
5.windows defender
- 上线方面
针对cs,不要使用stager shellcode ,使用stage shellcode 上线是要立刻被干掉的,用stageless的shellcode。
- 操作方面
如果出发恶意行为,如提权之类的,会关联到loader程序,上线后可以注入到另外的进程去操作,
使用cs内置的execute-assembly 可能会导致beacon掉线,原因:C#的程序本身是不免杀的,会经过ASMI的扫描
总结
本地引擎&云引擎
目前,国内软件大多数都是采用OEM引擎(自研本地引擎)+云引擎,以云引擎为主,OEM引擎为辅。因为本地引擎需要投入的成本太大,包括但不限于启发式扫描、虚拟沙盒在内的核心技术存在较高技术门槛。而对于云引擎,只需要解决样本采集和云端样本自动分析平台即可。
云引擎由于可以实时同步云端的计算结果,所以实时性较高。但由于网络带宽的限制,在有限的扫描时间内,云引擎只能在本地提取高度抽象的数据特征发送到云端进行匹配,所以一般云引擎会选择哈希类特征(通常是全文哈希)。而哈希类特征的检出能力与样本基本是1:1的关系,即一条哈希特征通常只能检出一个样本,所以恶意代码的快速迭代对云端的样本收集能力、分析处理能力以及云端平台的运营成本来说,都是不小的挑战。
而对于本地引擎,引擎本身技术能力的发展可以放大特征与样本之间的比例,即用少量的特征检出更多的样本。
且引擎抗干扰能力越强,给恶意代码制造者进行免杀设定的技术门槛越高,相应的有效检出时效越长。
另外,本地弓|擎的核心技术可以被应用于云端自动分析平台,所以本地引擎技术的发展对云端的计算结果也有着积极的促进作用。
统计引擎(启发式引擎)
这些引擎本质上都是基于统计学算法,通过对海量样本以固定方法抽取特征,并对特征进行统计、分析,进而产生计算模型。依照计算模型对待扫描样本进行分类,进而推测样本是否属于恶意分类。
感觉这类启发式引擎和机器学习很相似,但是要注意一点,归根结底还是对特征的统计、分析、扫描。