xdrew87/Echos
GitHub: xdrew87/Echos
一个使用 Rust 实现的模块化 C2 流量仿真器,用于在授权环境中复现信标行为以测试检测系统。
Stars: 24 | Forks: 2
# Echos
[](https://github.com/xdrew87/Echos/actions/workflows/ci.yml)
**用于EDR/NDR检测实验室验证的模块化网络信标仿真器 — 使用 Rust 编写。**
Echos 重放真实的 C2 风格信标流量,使防御者能够在可控、可重复的条件下验证其检测栈(EDR、NDR、IDS/IPS、SIEM)是否能触发正确的告警。它不是后利用框架,不发送有效载荷,不在远程系统上执行代码,也不需要植入物。它纯粹是一个为授权实验室使用而设计的流量生成器。
## 为何选择 Echos?
检测工程需要可重复、可控制的刺激。在实验室中运行真实植入物会带来风险、许可复杂性和噪声。Echos 提供一个单一二进制文件,生成结构准确信标流量——正确的头部、正确的时间分布、正确的协议形态——而无需任何附带负担。
它可用于回答类似以下的问题:
- 我的 NDR 是否会对 Cobalt Strike 风格的 HTTP 头部做出告警?
- 我的 SIEM 是否能正确关联来自同一主机在 5 分钟内发出的 10 次 DNS 信标查询?
- 我的检测规则是否会对来自工作站端点的 SMTP EHLO 探测做出响应?
- 失败信标的指数退避行为是否能绕过我的异常模型?
## 功能特性
- **7 种协议** — HTTP、HTTPS、DNS、ICMP、SMB、WebSocket、SMTP
- **10 种内置配置文件** — Cobalt Strike、APT28、Lazarus、APT29、Emotet、FIN7、ICMP、SMB、WebSocket、SMTP
- **3 种抖动算法** — 均匀分布、高斯分布(Box-Muller)、正弦分布(业务时间调制)
- **有界执行** — `--count N` 或 `--duration SECS`,先到者停止
- **运行时目标覆盖** — `--target` 可在不重新编译的情况下将任意配置文件指向你的监听器
- **外部 TOML 配置** — 无需修改源代码即可定义自定义配置文件
- **结构化日志** — 人类可读或 JSON 格式,支持可选文件输出
- **指数退避** — 连续 3 次信标失败后触发,上限为 300 秒
- **旋转目标池** — 通过为每个配置文件指定多个目标来模拟 DGA/快速浮动
- **安全的 HTTPS 默认设置** — 默认启用证书验证;仅在显式传递 `--insecure-tls` 时禁用
- **干运行模式** — 预览将要执行的操作而不发送任何流量
## 快速开始
```
# Build
git clone https://github.com/xdrew87/echos
cd echos
cargo build --release
# 列出所有配置文件
./target/release/echos --list
# 运行单个信标迭代
./target/release/echos --profile Cobalt --count 1 --target http://127.0.0.1:8080
# 预览而不发送流量
./target/release/echos --profile APT29 --dry-run
```
需要 Rust 1.70+。
## 从源码安装
## 从源码安装
```
git clone https://github.com/xdrew87/echos
cd echos
cargo build --release
./target/release/echos --list
```
需要 Rust 1.70+。
## 示例输出
### `--list`
```
Available Profiles (10 total — 10 built-in, 0 from config)
NAME PROTOCOL DELAY JITTER ALGORITHM ROTATING HEADERS SOURCE
─────────────────────────────────────────────────────────────────────────────────────────────────────
Cobalt HTTP 10s 20% Uniform No 5 Built-in
APT28 DNS 30s 10% Uniform No 0 Built-in
ICMP Beacon ICMP 60s 5% Uniform No 0 Built-in
Lazarus HTTPS 300s 15% Gaussian No 5 Built-in
APT29 HTTPS 600s 10% Sinusoidal No 5 Built-in
Emotet HTTP 60s 25% Gaussian Yes 3 Built-in
FIN7 HTTPS 30s 10% Uniform No 6 Built-in
SMB Beacon SMB 120s 10% Uniform No 0 Built-in
WebSocket Beacon WebSocket 15s 15% Uniform No 0 Built-in
SMTP Beacon SMTP 90s 10% Uniform No 0 Built-in
Target: use --target to override any profile's destination at runtime.
```
### `--dry-run`
```
[DRY RUN] Would run profile "Cobalt" (HTTP → http://127.0.0.1:8080)
Jitter : 20% Uniform
Timeout : 10s
Insecure TLS : No
Count limit : none
Duration : none
```
### 运行配置文件(人类可读日志格式)
```
2026-04-15T04:02:11Z INFO echos started profile=Cobalt protocol=Http target=http://10.0.0.1:8080
2026-04-15T04:02:11Z INFO beacon sent profile=Cobalt protocol=Http target=http://10.0.0.1:8080 attempt=1
2026-04-15T04:02:19Z INFO beacon sent profile=Cobalt protocol=Http target=http://10.0.0.1:8080 attempt=2
2026-04-15T04:02:30Z INFO beacon sent profile=Cobalt protocol=Http target=http://10.0.0.1:8080 attempt=3
─────────────────────────────────────
Run Summary
─────────────────────────────────────
Profile : Cobalt
Protocol : HTTP
Target : http://10.0.0.1:8080
Attempts : 3
Successes : 3
Failures : 0
Failure Rate : 0.0%
Avg Delay : 9.84s
Start : 2026-04-15 04:02:11
End : 2026-04-15 04:02:41
Runtime : 30.2s
Dry Run : No
Insecure TLS : No
─────────────────────────────────────
```
### JSON 日志输出(`--json`)
```
{
"timestamp": "2026-04-15T04:02:11.112Z",
"level": "INFO",
"fields": {
"message": "beacon sent",
"profile": "Cobalt",
"protocol": "Http",
"target": "http://10.0.0.1:8080",
"attempt": 1
},
"target": "echos"
}
```
JSON 汇总(运行结束):
```
{
"profile": "Cobalt",
"protocol": "HTTP",
"target": "http://10.0.0.1:8080",
"attempts": 3,
"successes": 3,
"failures": 0,
"failure_rate_pct": 0.0,
"avg_delay_secs": 9.84,
"start": "2026-04-15 04:02:11",
"end": "2026-04-15 04:02:41",
"runtime_secs": 30.2,
"dry_run": false,
"insecure_tls": false
}
```
## CLI 参考
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `-p, --profile ` | `Cobalt` | 使用的信标配置文件 |
| `--list` | — | 打印可用配置文件并退出 |
| `--target ` | — | 在运行时覆盖配置文件的目标 |
| `--count ` | — | 精确发送 N 次信标迭代后退出 |
| `--duration ` | — | 运行指定秒数后退出 |
| `--config ` | — | 从 TOML 文件加载额外配置文件 |
| `--config-dir ` | — | 从目录中加载所有 `.toml` 配置文件 |
| `--json` | — | 输出结构化 JSON 日志并以 JSON 格式输出汇总 |
| `--verbose` | — | 显示调试级别详细信息 |
| `--quiet` | — | 仅显示警告、错误和最终汇总 |
| `--log-file ` | — | 将日志写入文件(始终为 JSON 格式) |
| `--timeout ` | `10` | 每次连接/请求的超时时间 |
| `--insecure-tls` | — | 接受无效/自签名 TLS 证书(仅 HTTPS) |
| `--dry-run` | — | 打印将要执行的操作并退出而不发送流量 |
当同时指定 `--count` 和 `--duration` 时,Echos 会在**任一**限制首次达到时停止。
## 使用场景
### 红队实验室测试
在运行演练之前,验证你的 C2 监听器流量模式是否与真实威胁行为体不可区分:
```
# 确认 Cobalt Strike HTTP 配置文件到达团队服务器
echos --profile Cobalt --count 5 --target http://teamserver.lab.internal:8080
# 测试 APT29 风格的慢速 HTTPS 信标 10 分钟
echos --profile APT29 --duration 600 --insecure-tls --target https://192.168.10.5:443
```
### 检测工程
按需、可重复地触发特定检测规则:
```
# 触发一次 Cobalt Strike HTTP User-Agent 签名
echos --profile Cobalt --count 1 --target http://sensor.lab.internal:8080
# 生成 10 个 DNS 信标查询用于相关性测试
echos --profile APT28 --count 10
# 触发 SMB 协商探测检测
echos --profile "SMB Beacon" --count 3 --target 192.168.1.50
```
### SIEM 与流水线验证
使用结构化 JSON 输出将结果输入到你的验证流水线中:
```
# 用于 CI/CD 检测验证的可机器可读输出
echos --profile Cobalt --count 10 --json --quiet 2>/dev/null
# 将时间戳运行日志写入磁盘
echos --profile FIN7 --count 20 --json --log-file /tmp/fin7-run.json
# 在 Shell 循环中验证多个配置文件
for profile in Cobalt APT28 Lazarus; do
echos --profile "$profile" --count 1 --json --quiet
done
```
## 安全性与预期用途
Echos 专为**在你拥有或已获得明确书面授权的环境中进行的授权安全测试和验证**而设计。
- 它不发送有效载荷,也不在远程系统上执行代码
- 所有流量均指向你通过 `--target` 指定的目标
- 默认目标指向 `127.0.0.1`,默认不产生外部流量
- TLS 证书默认启用验证
- 在你未控制的网络上生成未经请求的信标流量可能违反计算机欺诈法律
请参阅 [SECURITY.md](SECURITY.md) 了解完整的使用策略。
## 实验室指南
请参阅 [docs/lab-guide.md](docs/lab-guide.md) 获取使用 Echos 设置检测验证实验室的分步指南。
## 路线图
请参阅 [ROADMAP.md](ROADMAP.md) 了解计划中的功能和未来方向。
```
# 列出所有可用配置文件
echos --list
# 干运行以在不发送流量的情况下预览行为
echos --profile Cobalt --dry-run
# 运行时覆盖目标
echos --profile Cobalt --target http://10.0.0.1:8080 --count 5
# 在自签名证书支持下运行 Lazarus 配置文件 60 秒
echos --profile Lazarus --duration 60 --insecure-tls
# 输出结构化 JSON 并将日志保存到文件
echos --profile APT29 --count 3 --json --log-file run.json
# 从 TOML 加载自定义配置文件,安静运行
echos --config examples/echos.toml --profile "My Custom Profile" --count 10 --quiet
# 从目录加载所有 TOML 文件
echos --config-dir ./profiles.d --list
```
## HTTPS 与 TLS 证书验证
默认情况下,Echos **正常验证 TLS 证书**。这是安全、默认的设定。
仅当你的实验室服务器使用自签名证书且你了解其影响时,才传递 `--insecure-tls`:
```
echos --profile Lazarus --insecure-tls --count 1
```
此标志仅影响 HTTPS 配置文件;HTTP、DNS、ICMP、SMB、WebSocket 和 SMTP 配置文件不受影响。
## 配置文件格式
在 TOML 中定义额外的配置文件。在运行时通过 `--config` 或 `--config-dir` 加载它们。
```
# examples/echos.toml
[[profiles]]
name = "My Custom Profile"
protocol = "https"
target = "https://192.168.1.100:8443"
base_delay_secs = 45
jitter_percent = 15.0
jitter_algorithm = "gaussian" # uniform | gaussian | sinusoidal (default: uniform)
[profiles.headers]
User-Agent = "Mozilla/5.0 (compatible; LabScanner/1.0)"
X-Lab-ID = "detection-lab-01"
```
**必需字段:** `name`、`protocol`、`target`、`base_delay_secs`、`jitter_percent`
**可选字段:** `targets`(旋转列表)、`headers`、`jitter_algorithm`
与内置配置文件同名的外部配置文件会静默覆盖内置配置。
## 可用配置文件
| 配置文件 | 协议 | 延迟 | 抖动 | 算法 | 备注 |
|---------|------|-------|--------|-----------|-------|
| Cobalt | HTTP | 10 秒 | 20% | 均匀分布 | Cobalt Strike 风格头部 |
| APT28 | DNS | 30 秒 | 10% | 均匀分布 | DNS 查找信标 |
| ICMP Beacon | ICMP | 60 秒 | 5% | 均匀分布 | 基于 Ping 的探测 |
| Lazarus | HTTPS | 300 秒 | 15% | 高斯分布 | 韩文用户代理,缓慢 C2 |
| APT29 | HTTPS | 600 秒 | 10% | 正弦分布 | Office 365 用户代理,业务时间混合 |
| Emotet | HTTP | 60 秒 | 25% | 高斯分布 | 旋转 4 目标池,DGA 仿真 |
| FIN7 | HTTPS | 30 秒 | 10% | 均匀分布 | CDN 伪装头部 |
| SMB Beacon | SMB | 120 秒 | 10% | 均匀分布 | 端口 445 上的 SMB 协商探测 |
| WebSocket Beacon | WebSocket | 15 秒 | 15% | 均匀分布 | 在 WS 上单个文本帧 |
| SMTP Beacon | SMTP | 90 秒 | 10% | 均匀分布 | 不发送邮件的 EHLO 探测 |
## 抖动算法
| 算法 | 行为 ||------|------|
| `uniform` | 在 `[base × (1−jitter%), base × (1+jitter%)]` 范围内均匀分布的随机延迟 |
| `gaussian` | 以 `base` 为中心、σ = `jitter_amount` 的高斯正态分布,钳制至 > 0.1 秒 |
| `sinusoidal` | 时间调制:01:00 时为 3× base,13:00 时为 1× base,模拟业务时间混合 |
## 下载预构建二进制文件
为 Linux、Windows 和 macOS 提供的预构建二进制文件在每个标记版本中发布于 [发布页面](https://github.com/xdrew87/echos/releases)。
| 平台 | 文件 |
|------|------|
| Linux x86-64 | `echos-linux-x86_64` |
| Windows x86-64 | `echos-windows-x86_64.exe` |
| macOS x86-64 | `echos-macos-x86_64` |
## 贡献
请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解如何添加配置文件、运行测试以及提交拉取请求。
## 免责声明
Echos 专为**在你拥有或已获得明确书面授权的环境中进行授权安全测试和防御性研究**而设计。在你未控制的网络上生成未经请求的通信流量可能违反计算机欺诈法律。作者不对滥用行为承担任何责任。
标签:APT28仿真, APT29仿真, C2流量仿真, Cobalt Strike仿真, DNS信标, EDR检测验证, Emotet仿真, FIN7仿真, HTTPS信标, HTTP信标, ICMP信标, IDS/IPS测试, Lazarus仿真, NDR检测验证, Python安全, Rust实现, SIEM验证, SMB信标, SMTP信标, WebSocket信标, 业务时间调制, 信标模拟, 协议仿真, 可视化界面, 合规测试, 命令与控制模拟, 均匀抖动, 安全检测实验室, 攻击模拟, 文档结构分析, 模块化框架, 正弦抖动, 流量生成器, 网络安全测试, 自定义抖动算法, 通知系统, 驱动签名利用, 高性能流量仿真, 高斯抖动