跳到內容

Runner

runner.sh 是套件協調器,負責依序執行套件目錄中所有已編號的腳本、擷取輸出並記錄結果元資料。它安裝於 VM 上的 /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 變數自動寫入。若要在部署後變更目標,請直接在 VM 上編輯此檔案。

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. 驗證套件 — 確認指定的套件目錄存在於 suites 目錄下。若未找到,則列出可用套件。

  3. 建立結果目錄 — 建立 /opt/traffic-generator/results/<timestamp>-<suite>/ 並寫入初始 meta.json,狀態設為 status: running

  4. 執行腳本 — 依名稱排序後,迭代套件目錄中符合 [0-9]* 的檔案。略過不可執行的檔案。將 TARGET_FQDN 作為第一個引數傳入。將輸出擷取至 <script-name>.log

  5. 記錄結果 — 以完成時間戳記及通過/失敗/略過的計數更新 meta.json