#!/usr/bin/env bash # # e2e_capture.sh — prueba de roundtrip completa del stack de captura. # # Levanta un servidor HTTP local, arranca el proxy mitmproxy a traves de las # funciones del registry, hace pasar trafico por el, y verifica que: # - se crea un archivo .mitm con contenido, # - la captura sobrevive a un SIGKILL (flush por flujo), # - la consulta a HAR devuelve las entradas esperadas con sus codigos. # # Emite "CAPTURE_OK" en stdout si todo pasa; cualquier otro caso es fallo. # Diseñado para ser idempotente y autolimpiante (puertos altos, dir temporal). set -uo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REGISTRY_ROOT="${FN_REGISTRY_ROOT:-$(cd "$SCRIPT_DIR/../../.." && pwd)}" export FN_REGISTRY_ROOT="$REGISTRY_ROOT" START_FN="$REGISTRY_ROOT/bash/functions/cybersecurity/start_mitm_capture.sh" QUERY_FN="$REGISTRY_ROOT/bash/functions/cybersecurity/query_mitm_flows.sh" PROXY_PORT=18906 UPSTREAM_PORT=18913 WORK="$(mktemp -d /tmp/web_proxy_e2e.XXXXXX)" cleanup() { [[ -n "${PROXY_PID:-}" ]] && kill -9 "$PROXY_PID" 2>/dev/null [[ -n "${SRV_PID:-}" ]] && kill -9 "$SRV_PID" 2>/dev/null rm -rf "$WORK" } trap cleanup EXIT fail() { echo "CAPTURE_FAIL: $*" >&2; exit 1; } mkdir -p "$WORK/www" "$WORK/cap" echo "web_proxy e2e" > "$WORK/www/index.html" # --- 1. Upstream HTTP local (respuesta valida garantizada) ------------------- setsid bash -c "cd '$WORK/www' && exec python3 -m http.server $UPSTREAM_PORT" /dev/null 2>&1 & SRV_PID=$! disown "$SRV_PID" 2>/dev/null || true sleep 1 # --- 2. Arrancar el proxy via funcion del registry --------------------------- JSON="$(bash "$START_FN" --port "$PROXY_PORT" --out "$WORK/cap" --rotate-min 20)" \ || fail "start_mitm_capture fallo" PROXY_PID="$(printf '%s' "$JSON" | python3 -c 'import sys,json;print(json.load(sys.stdin)["pid"])' 2>/dev/null)" [[ -n "$PROXY_PID" ]] || fail "no se obtuvo PID del proxy ($JSON)" sleep 2 # --- 3. Trafico via proxy ---------------------------------------------------- for path in / /index.html /alpha /beta; do curl -s -x "http://127.0.0.1:$PROXY_PORT" "http://127.0.0.1:$UPSTREAM_PORT${path}" -o /dev/null \ || fail "curl fallo en $path" done sleep 1 # --- 4. Verificar captura ---------------------------------------------------- MITM="$(find "$WORK/cap" -name 'traffic-*.mitm' | head -1)" [[ -n "$MITM" ]] || fail "no se creo archivo .mitm" BYTES_BEFORE="$(stat -c%s "$MITM")" [[ "$BYTES_BEFORE" -gt 0 ]] || fail "el .mitm quedo vacio antes de matar" # --- 5. Durabilidad: SIGKILL no debe perder datos ---------------------------- kill -9 "$PROXY_PID" 2>/dev/null PROXY_PID="" sleep 1 BYTES_AFTER="$(stat -c%s "$MITM")" [[ "$BYTES_AFTER" -eq "$BYTES_BEFORE" && "$BYTES_AFTER" -gt 0 ]] \ || fail "la captura no sobrevivio al SIGKILL ($BYTES_BEFORE -> $BYTES_AFTER)" # --- 6. Consulta a HAR ------------------------------------------------------- bash "$QUERY_FN" "$MITM" --har "$WORK/out.har" >/dev/null 2>&1 || fail "export HAR fallo" ENTRIES="$(python3 -c "import json;print(len(json.load(open('$WORK/out.har'))['log']['entries']))" 2>/dev/null)" [[ "$ENTRIES" == "4" ]] || fail "HAR esperaba 4 entradas, obtuvo ${ENTRIES:-0}" echo "CAPTURE_OK ($ENTRIES flujos, ${BYTES_AFTER}B, sobrevivio SIGKILL)"