Pular para o conteúdo

Runner

runner.sh é o orquestrador de suítes que executa todos os scripts numerados em um diretório de suíte em ordem, captura a saída e registra os metadados dos resultados. Ele é instalado em /opt/traffic-generator/suites/runner.sh na VM.

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

Argumentos:

ArgumentoObrigatórioDescrição
suite-nameSimNome do diretório da suíte (ex.: web-app-attacks, api-attacks)
--dry-runNãoExibe o que seria executado sem rodar nenhum script

Exemplos:

Terminal window
# Executar a suíte web-app-attacks
/opt/traffic-generator/suites/runner.sh web-app-attacks
# Dry-run para visualizar os scripts de api-attacks
/opt/traffic-generator/suites/runner.sh api-attacks --dry-run
# Executar simulação de bot
/opt/traffic-generator/suites/runner.sh bot-simulation

O runner lê a configuração de /opt/traffic-generator/config.env:

Terminal window
# Obrigatório: FQDN de destino (domínio do load balancer F5 XC)
TARGET_FQDN=demo.example.com
# Opcional: IP de origem direta para testes de linha de base (ignora o F5 XC)
TARGET_ORIGIN_IP=

Este arquivo é gravado automaticamente durante o provisionamento do Terraform a partir das variáveis target_fqdn e target_origin_ip. Para alterar o destino após a implantação, edite este arquivo diretamente na VM.

Qualquer variável em config.env pode ser substituída exportando-a antes de executar a suíte:

Terminal window
# Substituir o FQDN de destino para uma única execução
TARGET_FQDN=staging.example.com /opt/traffic-generator/suites/runner.sh web-app-attacks
# Substituir via export
export TARGET_FQDN=staging.example.com
/opt/traffic-generator/suites/runner.sh web-app-attacks

O caminho do próprio arquivo de configuração também pode ser substituído:

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

O sinalizador --dry-run exibe cada script que seria executado sem de fato executá-lo:

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

Saída:

=== 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

Use o dry-run para verificar a estrutura da suíte após a implantação ou antes de executá-la contra um novo destino.

Cada execução de suíte cria um diretório de resultados com timestamp:

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

Estrutura:

/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

A saída padrão (stdout) e a saída de erro (stderr) de cada script são capturadas em um arquivo .log nomeado de acordo com o script.

O arquivo meta.json registra os metadados de execução da suíte:

{
"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
}
CampoDescrição
suiteNome da suíte
targetFQDN de destino utilizado na execução
startedTimestamp UTC de quando a suíte foi iniciada
completedTimestamp UTC de quando a suíte foi concluída
statusrunning durante a execução, completed ao finalizar
passedNúmero de scripts que saíram com código 0
failedNúmero de scripts que saíram com código diferente de zero
skippedNúmero de scripts ignorados (não executáveis ou dry-run)

Cada script pode ser executado de forma independente sem o runner:

Terminal window
# Executar um único script diretamente
/opt/traffic-generator/suites/web-app-attacks/01-sqli.sh demo.example.com
# Executar um ataque específico de API
/opt/traffic-generator/suites/api-attacks/01-vampi-owasp-top10.sh demo.example.com

Os scripts aceitam o FQDN de destino como primeiro argumento posicional. Eles não leem config.env diretamente — somente o runner faz isso. Ao executar de forma independente, você deve passar o FQDN explicitamente.

Para executar todas as suítes em sequência:

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

Isso gera tráfego abrangente para todos os recursos de segurança do F5 XC. Espere que a execução completa leve de 45 a 80 minutos, dependendo dos tempos de resposta do destino.

Execute suítes a partir da sua máquina local sem manter uma sessão SSH:

Terminal window
TGEN_IP=$(terraform output -raw public_ip)
# Executar uma única suíte
ssh azureuser@${TGEN_IP} '/opt/traffic-generator/suites/runner.sh web-app-attacks'
# Executar uma suíte com substituição de destino
ssh azureuser@${TGEN_IP} 'TARGET_FQDN=staging.example.com /opt/traffic-generator/suites/runner.sh api-attacks'
# Executar em segundo plano (seguro contra desconexão)
ssh azureuser@${TGEN_IP} 'nohup /opt/traffic-generator/suites/runner.sh web-app-attacks > /tmp/web-app-attacks.log 2>&1 &'
# Verificar resultados posteriormente
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'

Para suítes de longa duração, use nohup ou tmux para evitar que a desconexão do SSH encerre o processo:

Terminal window
ssh azureuser@${TGEN_IP} 'tmux new-session -d -s traffic "/opt/traffic-generator/suites/runner.sh reconnaissance"'
# Reconectar posteriormente para acompanhar o progresso
ssh -t azureuser@${TGEN_IP} 'tmux attach-session -t traffic'
  1. Carregar configuração — O runner lê o config.env (ou a substituição via CONFIG_FILE), e em seguida verifica o TARGET_FQDN no ambiente.

  2. Validar suíte — Confirma que o diretório de suíte nomeado existe sob o diretório de suítes. Lista as suítes disponíveis caso não seja encontrado.

  3. Criar diretório de resultados — Cria /opt/traffic-generator/results/<timestamp>-<suite>/ e grava o meta.json inicial com status: running.

  4. Executar scripts — Itera pelos arquivos que correspondem a [0-9]* no diretório da suíte, ordenados por nome. Ignora arquivos não executáveis. Passa TARGET_FQDN como primeiro argumento. Captura a saída em <script-name>.log.

  5. Registrar resultados — Atualiza o meta.json com o timestamp de conclusão e as contagens de aprovações/falhas/ignorados.