#!/usr/bin/env bash # query_mitm_flows — Consulta capturas .mitm con mitmdump: vuelca flujos a stdout # o exporta a HAR. Acepta uno o varios archivos (también globs expandidos por el shell). query_mitm_flows() { local -a files=() local filter="" local har_out="" local mitmdump_bin="" # ── Parseo de argumentos ──────────────────────────────────────────────────── while [[ $# -gt 0 ]]; do case "$1" in --filter) [[ -z "${2:-}" ]] && { echo "ERROR: --filter requiere un valor" >&2; return 1; } filter="$2"; shift 2 ;; --har) [[ -z "${2:-}" ]] && { echo "ERROR: --har requiere una ruta de salida" >&2; return 1; } har_out="$2"; shift 2 ;; --mitmdump) [[ -z "${2:-}" ]] && { echo "ERROR: --mitmdump requiere la ruta al binario" >&2; return 1; } mitmdump_bin="$2"; shift 2 ;; --*) echo "ERROR: opcion desconocida: $1" >&2; return 1 ;; *) files+=("$1"); shift ;; esac done # ── Validar que se paso al menos un archivo ───────────────────────────────── if [[ ${#files[@]} -eq 0 ]]; then echo "ERROR: se requiere al menos un archivo .mitm como argumento" >&2 echo "Uso: query_mitm_flows [--filter EXPR] [--har OUT] [--mitmdump BIN]" >&2 return 1 fi # ── Verificar que cada archivo existe ────────────────────────────────────── local -a valid_files=() for f in "${files[@]}"; do if [[ -f "$f" ]]; then valid_files+=("$f") else echo "ERROR: archivo no encontrado: $f" >&2 fi done if [[ ${#valid_files[@]} -eq 0 ]]; then echo "ERROR: ningun archivo valido encontrado (el patron no matcheo nada)" >&2 return 1 fi # ── Autodetectar mitmdump ─────────────────────────────────────────────────── if [[ -z "$mitmdump_bin" ]]; then if command -v mitmdump &>/dev/null; then mitmdump_bin="mitmdump" elif [[ -x "$HOME/.local/bin/mitmdump" ]]; then mitmdump_bin="$HOME/.local/bin/mitmdump" else echo "ERROR: mitmdump no encontrado. Instala mitmproxy:" >&2 echo " pip install mitmproxy o pip install --user mitmproxy" >&2 return 1 fi fi if [[ ! -x "$(command -v "$mitmdump_bin" 2>/dev/null || echo "$mitmdump_bin")" ]]; then echo "ERROR: binario mitmdump no ejecutable: $mitmdump_bin" >&2 return 1 fi # ── Construir y ejecutar el comando ──────────────────────────────────────── local -a cmd=("$mitmdump_bin" -n) # Añadir todos los archivos de entrada con -r for f in "${valid_files[@]}"; do cmd+=(-r "$f") done # Modo HAR if [[ -n "$har_out" ]]; then cmd+=(--set "hardump=${har_out}") fi # Filtro de flujos (argumento posicional al final) if [[ -n "$filter" ]]; then cmd+=("$filter") fi "${cmd[@]}" local exit_code=$? if [[ -n "$har_out" && $exit_code -eq 0 ]]; then echo "HAR exportado a ${har_out}" >&2 fi return $exit_code } # Ejecutar si se llama directamente if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then query_mitm_flows "$@" fi