一、前言
二、杀软引擎介绍
2.1 杀软属性
2.2 杀软引擎的构成
三、杀毒软件引擎与病毒库的关系
四、查杀规则
4.1 静态查杀
4.1.1 特征码识别
4.2 云查杀
4.3 校验和法
4.4 启发式扫描:【QVM】
4.5 Yara规则
五、动态查杀【主动防御】
六、对常规杀软的一些见解
总结
免责申明
“本文档所提供的信息旨在帮助网络安全专业人员更好地理解并维护他们负责的网站和服务器等系统。我们鼓励在获得适当授权的情况下使用这些信息。请注意,任何未经授权的使用或由此产生的直接或间接后果和损失,均由使用者自行承担。我们提供的资源和工具仅供学习和研究之用,我们不鼓励也不支持任何非法活动。”
掌握免杀艺术,深入内网核心
一、前言
本文为免杀系列基础了解篇连载的第三篇,也是基础了解篇的最后一篇。本文会尽可能详细的以我的经验对杀软的一些原理以及杀软的查杀规则有一个很详细的说明。仅代表我的观点,有异议可以私聊或者评论,大家一起成长。
二、杀软引擎介绍
2.1 杀软属性
1、对于给定对象,检测是否包含恶意代码
2、能准确识别出恶意代码的类型,如:木马,后门,蠕虫等
3、对于寄生类恶意代码(宏病毒、感染型病毒等),可以从宿主对象中剥离恶意代码,并还原宿主对象数据1
2.2 杀软引擎的构成
一般来说,引擎通常由几个模块构成:
1、数据格式识别、分析模块
负责对待扫描对象的格式进行识别和分析,为扫描核心提供足够的格式相关信息
2、反病毒特征库
由本地特征库和云特征库构成
3、扫描核心
负责整个反病毒引擎的扫描逻辑,不同的扫描技术也由扫描核心来调度。我的理解是扫描核心作为指挥官,根据不同的情况来调度不同的资源进行扫描。
三、杀毒软件引擎与病毒库的关系
首先必须指出杀毒软件的引擎与其病毒库并没有什么直接的关系。
杀毒引擎的任务和功能非常简单,就是对于给定的文件或者程序进程判断其是否是合法程序(对应于杀毒软件厂商自己定义的正常和非异常程序规范而言。
正常的程序规范是指在程序所在系统平台上操所系统本身洗净有定义的或者业界已经公认的程序行为过程,比如操作系统正常运行就必须要求应用程序与系统核心进行进程响应并与交换相关数据。
非异常程序活动是指可能存在非法程序操作结果但能够以较高的置信度确定其非非法程序活动规范的。
一般情况下,相关文件的复制,移动,删除等都奔包括在该界定范围内)。
我们知道病毒的最终目的有些是与合法活动很类似的,在这种情况下,要求软件厂商必须自己有一个行为规范界定规则,在一个给定的范围和置信度下,判断相关操作是否为合法。
在这方面,各个厂商的界定是有区别的,一般而言非美国厂商界定是非常严格的,只有有很高的置信水平的程序行为,他们才判别为非病毒操作。
记得前一阵论坛上有人给了四段简单的代码,很多杀毒软件将其判为病毒或有病毒性质的文件行为,实际上看那几段代码可以知道,其结果并不足以视之为病毒。
【eg】:
现在我将一段非常正常的 C++编写的HelloWorld传到VT平台,看看效果
上传文件hash如下:
4f121c02373700cd2c49931b8b6f55b53ed09687e7fdfa40f812ec7d0f31f721
结果如下图:
7个报毒。可能大家会发现一个问题,在VS没有配置。好的,下面我将配置VS再次查看效果
文件Hash如下:
be191404254a17038fe75a819740bc0705a363b40f0ffb65fc0f47b1f0cd6389
只剩4个报毒,如比较知名的国外某大型商业杀软CrowdStrike Falcon,在没有修改之前是报毒的,但是修改部分特征【只是关闭掉了一些编译时的选项】后,他就不会进行报毒。
用简单的话说,杀毒引擎就是一套判断特定程序行为是否为病毒程序(包括可疑的)的技术机制。一个完整的技术引擎遵守如下的行为过程:
1、非自身程序行为的程序行为捕获。
包括来自于内存的程序运行,来自于给定文件的行为虚拟判断,来自于网络的动态的信息等等。一般情况下,我们称之为引擎前端。这个是90%厂商都使用的方式。
2、基于引擎机制的规则判断。
这个环节代表了杀毒引擎的质量水平,一个好的杀毒引擎应该能在这个环节发现很多或者称之为相当规模的病毒行为,存而避免进入下一个判断环节。传统的反病毒软件引擎使用的是基于特征码的静态扫描技术,即在文件中寻找特定的十六进制字符串,如果找到,就可判定文件感染了某种病毒。但这种方法在当今病毒技术迅猛发展的形势下已经起不到很好的作用了。为了更好的发现病毒,相继开发了所谓的虚拟机,实时监控等相关技术。这个环节被叫做杀毒软件引擎工作的核心层。
3、引擎与病毒库的交互作用。
这个过程往往被认为是收尾阶段,相对于前两个环节,这个阶段速度是非常慢的,杀毒引擎与要将非自身程序行为过程转化为杀毒软件自身可识别的行为标识符(包括静态代码等),然后与病毒库中所存贮的行为信息进行对应,并作出相应处理。当然必须承认,当前的杀毒软件对大量病毒的识别都是在这个阶段完成的。因此一个足够庞大的病毒库往往能够弥补杀毒软件引擎的不足之处。但是必须意识到,如果在核心层阶段就可以结束并清除病毒程序,那么杀毒软件的工作速度将会大幅提升。“很可惜的是,当前我们没有足够聪明的杀毒引擎来完成这个过程”,这就是为什么有病毒库的原因。
四、查杀规则
4.1 静态查杀
4.1.1 特征码识别:
杀软有自己的病毒库,里面有很多样本,扫描时会抽取扫描对象的一段特征并与病毒库里作比较,如果匹配,那就会认为是病毒。抽取的代码要有适当长度,一方面维持特征代码的唯一性,另一方面又不要有太大的空间与时间的开销。如果一种病毒的特征代码增长一字节,要检测3000种病毒,增加的空间就是3000字节。在保持唯一性的前提下,尽量使特征代码长度短些,以减少空间与时间开销。
主要扫描的有:
哈希(全文哈希、分段哈希、局部敏感哈希等)
文件名
函数名
关键代码(包括敏感字符串、api等 ps:有的api会被杀软hook)
4.2 云查杀
云查杀的不同点在于它的病毒库是放在服务器端的,而不是本地客户端,意思是只要联网病毒库就会同步更新,这种病毒库更加强大。
以下为云查杀的位置:
卡巴斯基:
ESET:
火绒:
360
4.3 校验和法
根据正常文件的内容,计算其校验和,定期不定期的检查文件的校验是否与正常的校验和一样。其实本质还是特征码,万变不离其宗
4.4 启发式扫描:【QVM】
但是面对未知的病毒,换个模样杀软就认不出了吗❓
所以安全厂商研究出了启发式算法
启发式则是将一类病毒总结后,归纳其特征,其后的演变都为一类病毒,这就是启发式算法。具体启发式算法可以由杀软来定,比如可以使用机器学习把家族病毒聚类,或简单的通过使用通用型yara规则,例如文件大小小于100kb,且没有图标则可以识别为病毒,以此达到查杀病毒。
4.5 Yara规则
rule PoisonIvy_Generic_3 {
meta:
description = "PoisonIvy RAT Generic Rule"
license = "https://creativecommons.org/licenses/by-nc/4.0/"
author = "Florian Roth"
date = "2015-05-14"
hash = "e1cbdf740785f97c93a0a7a01ef2614be792afcd"
strings:
$k1 = "Tiger324{" fullword ascii
$s2 = "WININET.dll" fullword ascii
$s3 = "mscoree.dll" fullword wide
$s4 = "WS2_32.dll" fullword
$s5 = "Explorer.exe" fullword wide
$s6 = "USER32.DLL"
$s7 = "CONOUT$"
$s8 = "login.asp"
$h1 = "HTTP/1.0"
$h2 = "POST"
$h3 = "login.asp"
$h4 = "check.asp"
$h5 = "result.asp"
$h6 = "upload.asp"
condition:
uint16(0) == 0x5a4d and filesize < 500KB and
(
$k1 or all of ($s*) or all of ($h*)
)
}
简单分析下这段yara规则,标记了hash,最终的匹配规则是 文件大小在500kb以内 并且满足 $k1/all
、 $s/all
、 $h
中的任意一条,即被认定是病毒。这时候就可以根据破坏相应的规则,比如大小改为500kb+,不去调用相应的dll等来 bypass。
这个阶段是我们能否过掉免杀的第一步,也是知道工具被杀的第一步,如果静态过不了,那么你就无法在目标主机上驻足。在国内如果你能将上面的全部做到,那你已经可以过掉大部分国内杀软了。
如最强静态 360。
这里我还要在啰嗦一句:
交流群很多兄弟都有一个小误区,如被杀了以后,只知道被杀了,但是不查看原因,我举例一下:
刚下载的工具解压后报毒被杀
QVM202落地被杀
这些都是在你没有运行之前被杀,也就是上面所阐述的静态被杀。我们只需要去解决静态被杀。如QVM202,我们去添加资源即可,如exe的ICO、详细信息、数字签名【经最近测试,QVM已经识别假签名,如果你添加的签名为程序拷贝,建议不要进行添加。添加后正常不杀的程序也会因为这一个点被报毒】。
五、动态查杀【主动防御】
动态查杀指的是 程序在运行的过程中执行了某些敏感操作,导致杀软查杀。
谈到动态查杀不得不提一个东西叫沙盒。
沙盒:也叫启发式查杀,通过模拟计算机的环境执行目标文件再观察特征行为。
沙盒模拟的常见特征:
其实主要就是找一台真实的计算机和沙盒的区别到底在哪,找到那些真实的计算机具有而模拟的计算机无法具有的特征,进行绕过即可,思路很简单,也很广,自己拓展会发现更多有意思的点。
下面是两个反沙箱的项目,可以看看
https://github.com/nek0YanSu/CheckVM-Sandbox
https://github.com/ZanderChang/anti-sandbox
下面说一下杀软监控动态查杀的点:
1、服务相关
2、注册表(键值) 修改注册表的行为一般都是敏感行为(如:注册表启动项、注册表导出、修改、添加、删除等)
3、敏感命令(如:net user 、whoami、certutil、curl等)
4、网络请求
如Defender对于网络请求下载特别敏感,可以试一下去下正常程序,也会被报毒
5、组策略
6、防火墙
7、敏感程序(cmd powershell wmi psexec bitsadmin rundll 等)
8、各种 win32api
这里强调一下,监控进程调用的api不止是api名字,还包括api的 调用顺序、调用源、参数等等 。相应的bypass方法如下:
用实现同样功能的api替换【这里我们会在纷传圈将大量的可替换API代码示例上传】
重写对应的api
调用0环的api绕过3环杀软
等等,肯定不止这些,如白加黑 算是一个很好的方法,指的是利用Windows系统的一些白文件去执行相应的敏感操作,就不会触发杀软警告,想一想,有哪个普通的程序去执行添加用户的操作呢❓
说到底,白加黑解决的是 Windows里面信任与权限的问题,Windows 都相信你,它一个杀软有什么办法,权限指的是你的权限是否比杀软的权限高,如果你在0环,杀软在3环,它也没有权限来管你。说起来很容易,但具体实现需要很深的底层功底,起码对Windows操作系统的底层实现,win32api等很熟悉,这就需要内功。
六、对常规杀软的一些见解
HW中可能遇到的杀软,大致如下:
windows defender
360全家桶
火绒
QQ管家
阿里安骑士
sangfor edr
G01
趋势科技
麦咖啡
卡巴斯基
ESET
如下我会按照我自己的个人经验进行分组和建议:
静态组【上线后就可以乱搞】
阿里安骑士
麦咖啡
趋势科技
QQ管家
G01
行为对抗组(上线了还必须注意操作)
windows defender
360全家桶
卡巴斯基
eset
火绒
经验之谈一 静态组
SangFor EDR :
静态查杀很强,不会查杀父进程,过了静态就可以乱来
麦咖啡:
麦咖啡静态查杀也很强,没有行为查杀
阿里安骑士:
静态一般,但拦截高危cmd操作
趋势科技:
监控恶意服务创建,行为检测基本无
QQ管家:
傻子保安
G01:
静态上传不管是exe还是dll都会被杀,有黑名单机制,绕过方式如大家非常在行的任意文件上传方式,如前端绕过,比如将程序修改为:.db、.txt都可以运行【cmd 会将任意内容开头为MZ的文件当作PE可执行文件尝试允许】
经验之谈二 行为对抗组
ESET :
上线方面:
分离加载即可绕过
操作方面:
常规的正常操作也不会进行拦截。
卡巴斯基:
上线方面:
上线使用公开的一些免费C2,基本没戏,内存扫描强无敌。
操作方面:
常规的正常操作不会进行拦截。
火绒:
上线方面:
上线没啥需要注意的,但是6.0以上开始有内存扫描。可以使用sleepHook绕过。
操作方面:
不要去做一些乱搞的配置,很容易绕过,不要随意使用提权工具、和添加用户修改注册表、启动powershell等操作。
360:
上线方面:
白加黑强无敌。
操作方面:
任何敏感的操作都会使你的处境变得异常的难。但是本人亲测方法:使用工具执行你想执行的操作即可。如添加用户。
Windows Defender:
上线方面:
上面说过Defender对网络行为较为敏感,针对cs,不要使用stager shellcode ,使用stage shellcode 上线是要立刻被干掉的,用stageless的shellcode。
操作方面:
如果出发恶意行为,如提权之类的,会关联到loader程序,上线后可以注入到另外的进程去操作,使用cs内置的execute-assembly 可能会导致beacon掉线,原因:C#的程序本身是不免杀的,会经过ASMI的扫描。
总结
本地引擎&云引擎
目前,国内软件大多数都是采用OEM引擎(自研本地引擎)+云引擎,以云引擎为主,OEM引擎为辅。因为本地引擎需要投入的成本太大,包括但不限于启发式扫描、虚拟沙盒在内的核心技术存在较高技术门槛。而对于云引擎,只需要解决样本采集和云端样本自动分析平台即可。
云引擎由于可以实时同步云端的计算结果,所以实时性较高。但由于网络带宽的限制,在有限的扫描时间内,云引擎只能在本地提取高度抽象的数据特征发送到云端进行匹配,所以一般云引擎会选择哈希类特征(通常是全文哈希)。而哈希类特征的检出能力与样本基本是1:1的关系,即一条哈希特征通常只能检出一个样本,所以恶意代码的快速迭代对云端的样本收集能力、分析处理能力以及云端平台的运营成本来说,都是不小的挑战。
而对于本地引擎,引擎本身技术能力的发展可以放大特征与样本之间的比例,即用少量的特征检出更多的样本。
且引擎抗干扰能力越强,给恶意代码制造者进行免杀设定的技术门槛越高,相应的有效检出时效越长。
另外,本地弓|擎的核心技术可以被应用于云端自动分析平台,所以本地引擎技术的发展对云端的计算结果也有着积极的促进作用。
启发式引擎
这些引擎本质上都是基于统计学算法,通过对海量样本以固定方法抽取特征,并对特征进行统计、分析,进而产生计算模型。依照计算模型对待扫描样本进行分类,进而推测样本是否属于恶意分类。
感觉这类启发式引擎和机器学习很相似,但是要注意一点,归根结底还是对特征的统计、分析、扫描。
这里我使用了C#
写了一个检测杀软的工具,av列表是采用Json格式的文件,已经收录了545个杀软进程,现在将工具公开,公众号回复:CheckAV 关键词即可获取。
原创 SecretTeam安全团队