feat: scaffold inicial de web_proxy (proxy de interceptacion liviano)
This commit is contained in:
Executable
+78
@@ -0,0 +1,78 @@
|
||||
#!/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 "<html><body>web_proxy e2e</body></html>" > "$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 >/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)"
|
||||
Reference in New Issue
Block a user