跳转到内容

Runner

runner.sh 是套件编排器,负责按顺序执行套件目录中所有编号脚本、捕获输出并记录结果元数据。它安装在虚拟机的 /opt/traffic-generator/suites/runner.sh 路径下。

Terminal window
runner.sh <suite-name> [--dry-run]

参数:

参数是否必填描述
suite-name套件目录名称(例如 web-app-attacksapi-attacks
--dry-run打印将要执行的内容,但不实际运行任何脚本

示例:

Terminal window
# 运行 web-app-attacks 套件
/opt/traffic-generator/suites/runner.sh web-app-attacks
# 演练模式预览 api-attacks 脚本
/opt/traffic-generator/suites/runner.sh api-attacks --dry-run
# 运行机器人模拟
/opt/traffic-generator/suites/runner.sh bot-simulation

Runner 从 /opt/traffic-generator/config.env 读取配置:

Terminal window
# 必填:目标 FQDN(F5 XC 负载均衡器域名)
TARGET_FQDN=demo.example.com
# 可选:用于基线测试的直接源站 IP(绕过 F5 XC)
TARGET_ORIGIN_IP=

该文件在 Terraform 部署时根据 target_fqdntarget_origin_ip 变量自动写入。若需在部署后更改目标,请直接在虚拟机上编辑此文件。

config.env 中的任何变量均可在运行套件前通过导出方式覆盖:

Terminal window
# 仅为本次运行覆盖目标 FQDN
TARGET_FQDN=staging.example.com /opt/traffic-generator/suites/runner.sh web-app-attacks
# 通过 export 覆盖
export TARGET_FQDN=staging.example.com
/opt/traffic-generator/suites/runner.sh web-app-attacks

配置文件路径本身也可以被覆盖:

Terminal window
CONFIG_FILE=/tmp/my-config.env /opt/traffic-generator/suites/runner.sh web-app-attacks

--dry-run 标志会打印每个将要执行的脚本,而不实际运行:

Terminal window
/opt/traffic-generator/suites/runner.sh web-app-attacks --dry-run

输出:

=== 01-sqli.sh ===
[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/01-sqli.sh demo.example.com
=== 02-xss.sh ===
[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/02-xss.sh demo.example.com
=== 03-command-injection.sh ===
[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/03-command-injection.sh demo.example.com
=== 04-path-traversal.sh ===
[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/04-path-traversal.sh demo.example.com
=== 05-nikto-scan.sh ===
[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/05-nikto-scan.sh demo.example.com
=== 06-nuclei-scan.sh ===
[DRY-RUN] Would execute: /opt/traffic-generator/suites/web-app-attacks/06-nuclei-scan.sh demo.example.com
=== Suite Complete ===
Passed: 0 | Failed: 0 | Skipped: 6
Results: /opt/traffic-generator/results/20260425-143000-web-app-attacks

可使用演练模式在部署后验证套件结构,或在针对新目标运行套件前进行预览。

每次套件运行都会创建一个带时间戳的结果目录:

/opt/traffic-generator/results/<YYYYMMDD-HHMMSS>-<suite-name>/

目录结构:

/opt/traffic-generator/results/20260425-143000-web-app-attacks/
meta.json
01-sqli.sh.log
02-xss.sh.log
03-command-injection.sh.log
04-path-traversal.sh.log
05-nikto-scan.sh.log
06-nuclei-scan.sh.log

每个脚本的标准输出和标准错误均被捕获到以脚本命名的 .log 文件中。

meta.json 文件记录套件执行的元数据:

{
"suite": "web-app-attacks",
"target": "demo.example.com",
"started": "2026-04-25T14:30:00Z",
"completed": "2026-04-25T14:45:23Z",
"status": "completed",
"passed": 5,
"failed": 1,
"skipped": 0
}
字段描述
suite套件名称
target本次运行使用的目标 FQDN
started套件启动的 UTC 时间戳
completed套件完成的 UTC 时间戳
status执行期间为 running,完成后为 completed
passed以退出码 0 退出的脚本数量
failed以非零退出码退出的脚本数量
skipped被跳过的脚本数量(不可执行或演练模式)

每个脚本均可在不使用 Runner 的情况下独立执行:

Terminal window
# 直接运行单个脚本
/opt/traffic-generator/suites/web-app-attacks/01-sqli.sh demo.example.com
# 运行特定的 API 攻击脚本
/opt/traffic-generator/suites/api-attacks/01-vampi-owasp-top10.sh demo.example.com

脚本接受目标 FQDN 作为第一个位置参数。脚本不会直接读取 config.env——只有 Runner 才会读取。独立运行时,必须显式传入 FQDN。

要依次运行所有套件:

Terminal window
for suite in web-app-attacks api-attacks bot-simulation reconnaissance ssl-scanning javascript-exploits traffic-generation; do
echo "========================================="
echo "Starting suite: ${suite}"
echo "========================================="
/opt/traffic-generator/suites/runner.sh "$suite"
echo ""
done

这将在所有 F5 XC 安全功能上生成全面的流量。根据目标响应时间,完整运行预计需要 45 至 80 分钟。

无需维持 SSH 会话,即可从本地计算机运行套件:

Terminal window
TGEN_IP=$(terraform output -raw public_ip)
# 运行单个套件
ssh azureuser@${TGEN_IP} '/opt/traffic-generator/suites/runner.sh web-app-attacks'
# 运行套件并覆盖目标
ssh azureuser@${TGEN_IP} 'TARGET_FQDN=staging.example.com /opt/traffic-generator/suites/runner.sh api-attacks'
# 在后台运行(断开连接后安全)
ssh azureuser@${TGEN_IP} 'nohup /opt/traffic-generator/suites/runner.sh web-app-attacks > /tmp/web-app-attacks.log 2>&1 &'
# 稍后检查结果
ssh azureuser@${TGEN_IP} 'ls -la /opt/traffic-generator/results/ | tail -5'
ssh azureuser@${TGEN_IP} 'cat /opt/traffic-generator/results/$(ls -t /opt/traffic-generator/results/ | head -1)/meta.json'

对于长时间运行的套件,请使用 nohuptmux 防止 SSH 断开连接时进程被终止:

Terminal window
ssh azureuser@${TGEN_IP} 'tmux new-session -d -s traffic "/opt/traffic-generator/suites/runner.sh reconnaissance"'
# 稍后重新连接以查看进度
ssh -t azureuser@${TGEN_IP} 'tmux attach-session -t traffic'
  1. 加载配置 —— Runner 读取 config.env(或 CONFIG_FILE 覆盖路径),然后检查环境中的 TARGET_FQDN

  2. 验证套件 —— 确认指定套件目录存在于套件目录下。若未找到,则列出可用套件。

  3. 创建结果目录 —— 创建 /opt/traffic-generator/results/<timestamp>-<suite>/ 目录,并写入初始 meta.jsonstatus: running)。

  4. 执行脚本 —— 按名称排序遍历套件目录中匹配 [0-9]* 的文件。跳过不可执行的文件。将 TARGET_FQDN 作为第一个参数传入。将输出捕获到 <script-name>.log

  5. 记录结果 —— 使用完成时间戳及通过/失败/跳过计数更新 meta.json