f74d0d8e32
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
102 lines
3.7 KiB
Bash
102 lines
3.7 KiB
Bash
#!/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 <file_or_glob> [--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
|