Files
fn_registry/bash/functions/cybersecurity/query_mitm_flows.sh
T
2026-06-02 21:50:23 +02:00

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