Análisis Forense de Navegadores con Hindsight
Resumen
Hindsight es una herramienta forense de navegadores de código abierto diseñada para analizar artefactos de Google Chrome y otros navegadores basados en Chromium (Microsoft Edge, Brave, Opera, Vivaldi). Extrae y correlaciona datos de múltiples archivos de bases de datos del navegador para crear una línea de tiempo unificada de la actividad web. Hindsight puede analizar URL, historial de descargas, registros de caché, marcadores, registros de autocompletado, contraseñas guardadas, preferencias, extensiones del navegador, cookies HTTP, almacenamiento local (cookies HTML5), datos de inicio de sesión e información de sesiones/pestañas. La herramienta produce líneas de tiempo cronológicas en múltiples formatos de salida (XLSX, JSON, SQLite) que permiten a los investigadores reconstruir la actividad web del usuario para respuesta a incidentes, investigaciones de amenazas internas y casos penales.
Cuándo Usarlo
- Al investigar incidentes de seguridad que requieran análisis forense de navegadores con Hindsight.
- Al construir reglas de detección o consultas de búsqueda de amenazas para este dominio.
- Cuando los analistas de SOC necesiten procedimientos estructurados para este tipo de análisis.
- Al validar la cobertura de monitoreo de seguridad para técnicas de ataque relacionadas.
Prerrequisitos
- Python 3.8+ con Hindsight instalado (
pip install pyhindsight)
- Acceso a los directorios de perfil del navegador desde una imagen forense
- Datos del perfil del navegador (no cifrados con cifrado a nivel de sistema operativo)
- Timeline Explorer o aplicación de hoja de cálculo para análisis
Ubicaciones de Perfiles de Navegador
| Navegador | Ruta del Perfil en Windows |
|---|
| Chrome | %LOCALAPPDATA%\Google\Chrome\User Data\Default\ |
| Edge | %LOCALAPPDATA%\Microsoft\Edge\User Data\Default\ |
| Brave | %LOCALAPPDATA%\BraveSoftware\Brave-Browser\User Data\Default\ |
| Opera | %APPDATA%\Opera Software\Opera Stable\ |
| Vivaldi | %LOCALAPPDATA%\Vivaldi\User Data\Default\ |
| Chrome (macOS) | ~/Library/Application Support/Google/Chrome/Default/ |
| Chrome (Linux) | ~/.config/google-chrome/Default/ |
Archivos de Artefactos Clave
| Archivo | Contenido |
|---|
| History | Visitas a URL, descargas, búsquedas por palabras clave |
| Cookies | Cookies HTTP con dominio, caducidad, valores |
| Web Data | Entradas de autocompletado, tarjetas de crédito guardadas |
| Login Data | Nombres de usuario y contraseñas guardados (cifrados) |
| Bookmarks | Árbol de marcadores en JSON |
| Preferences | Configuración del navegador y extensiones |
| Local Storage/ | Almacenamiento local HTML5 por dominio |
| Session Storage/ | Almacenamiento específico de sesión por dominio |
| Network Action Predictor | URLs escritas anteriormente |
| Shortcuts | Accesos directos y predicciones de Omnibox |
| Top Sites | Sitios visitados con frecuencia |
Ejecución de Hindsight
Línea de Comandos
hindsight.exe -i "C:\Evidence\Users\suspect\AppData\Local\Google\Chrome\User Data\Default" -o C:\Output\chrome_analysis
hindsight.exe -i "/path/to/profile" -o /output/analysis -b Chrome
hindsight.exe -i "C:\Evidence\Chrome\Default" -o C:\Output\chrome --format jsonl
hindsight.exe -i "C:\Evidence\Chrome\Default" -o C:\Output\chrome --cache
Interfaz Web
hindsight_gui.exe
Detalles del Análisis de Artefactos
Historial de URL y Visitas
Historial de Descargas
Análisis de Cookies
Script de Análisis en Python
import sqlite3
import os
import json
import sys
from datetime import datetime, timedelta
EPOCA_CHROME = datetime(1601, 1, 1)
def chrome_time_a_datetime(chrome_ts: int):
"""Convierte una marca de tiempo de Chrome a datetime."""
if chrome_ts == 0:
return None
try:
return EPOCA_CHROME + timedelta(microseconds=chrome_ts)
except (OverflowError, OSError):
return None
def analizar_historial_chrome(ruta_perfil: str, dir_salida: str) -> dict:
"""Analiza la base de datos de Historial de Chrome en busca de evidencia forense."""
db_historial = os.path.join(ruta_perfil, "History")
if not os.path.exists(db_historial):
return {"error": "Base de datos de Historial no encontrada"}
os.makedirs(dir_salida, exist_ok=True)
conn = sqlite3.connect(f"file:{db_historial}?mode=ro", uri=True)
cursor = conn.cursor()
cursor.execute("""
SELECT u.url, u.title, v.visit_time, u.visit_count,
v.transition & 0xFF as transition_type
FROM visits v JOIN urls u ON v.url = u.id
ORDER BY v.visit_time DESC LIMIT 5000
""")
visitas = [{
"url": r[0], "title": r[1],
"visit_time": str(chrome_time_a_datetime(r[2])),
"total_visitas": r[3], "transicion": r[4]
} for r in cursor.fetchall()]
cursor.execute("""
SELECT target_path, tab_url, start_time, end_time,
received_bytes, total_bytes, mime_type, state
FROM downloads ORDER BY start_time DESC LIMIT 1000
""")
descargas = [{
"ruta": r[0], "url_origen": r[1],
"hora_inicio": str(chrome_time_a_datetime(r[2])),
"hora_fin": str(chrome_time_a_datetime(r[3])),
"bytes_recibidos": r[4], "bytes_totales": r[5],
"tipo_mime": r[6], "estado": r[7]
} for r in cursor.fetchall()]
cursor.execute("""
SELECT k.term, u.url, k.url_id
FROM keyword_search_terms k JOIN urls u ON k.url_id = u.id
ORDER BY u.last_visit_time DESC LIMIT 1000
""")
busquedas = [{"termino": r[0], "url": r[1]} for r in cursor.fetchall()]
conn.close()
reporte = {
"timestamp_analisis": datetime.now().isoformat(),
"ruta_perfil": ruta_perfil,
"total_visitas": len(visitas),
"total_descargas": len(descargas),
"total_busquedas": len(busquedas),
"visitas": visitas,
"descargas": descargas,
"busquedas": busquedas
}
ruta_reporte = os.path.join(dir_salida, "browser_forensics.json")
with open(ruta_reporte, "w") as f:
json.dump(reporte, f, indent=2)
return reporte
def main():
if len(sys.argv) < 3:
print("Uso: python process.py <ruta_perfil_chrome> <dir_salida>")
sys.exit(1)
analizar_historial_chrome(sys.argv[1], sys.argv[2])
if __name__ == "__main__":
main()
Referencias
Ejemplo de Salida
$ python hindsight.py -i /evidence/chrome-profile -o /analysis/hindsight_output
Hindsight v2024.01 - Análisis Forense de Navegadores Chrome/Chromium
================================================================
Perfil: /evidence/chrome-profile (Chrome 120.0.6099.130)
SO: Windows 10
[+] Analizando base de datos de Historial...
Registros de URL: 12,456
Registros de descargas: 234
Términos de búsqueda: 567
[+] Analizando base de datos de Cookies...
Registros de cookies: 8,923
Cookies cifradas: 6,712
[+] Analizando Datos Web (Autocompletado)...
Entradas de autocompletado: 1,234
Entradas de tarjetas: 2 (cifradas)
[+] Analizando Datos de Inicio de Sesión...
Credenciales guardadas: 45 (cifradas)
[+] Analizando Marcadores...
Entradas de marcadores: 189
--- Historial de Navegación (Últimas 10 Entradas) ---
Marca de tiempo (UTC) | URL | Título | Conteo de Visitas
2024-01-15 14:32:05.123 | https://mail.corporate.com/inbox | Correo Corporativo | 45
2024-01-15 14:33:12.456 | https://drive.google.com/file/d/1aBcDe... | Q4_Financial_Report.xlsx | 1
2024-01-15 14:35:44.789 | https://mega.nz/folder/xYz123 | MEGA - Nube Segura | 3
2024-01-15 14:36:01.234 | https://mega.nz/folder/xYz123#upload | MEGA - Subir | 8
2024-01-15 14:42:15.567 | https://pastebin.com/raw/kL9mN2pQ | Pastebin (crudo) | 1
2024-01-15 15:01:33.890 | https://192.168.1.50:8443/admin | Panel de Administración | 12
2024-01-15 15:15:22.111 | https://transfer.sh/upload | transfer.sh | 2
2024-01-15 15:30:45.222 | https://vpn-gateway.corporate.com | Inicio de Sesión VPN | 5
2024-01-15 16:00:00.333 | https://whatismyipaddress.com | Cuál es mi IP | 1
2024-01-15 16:05:12.444 | https://protonmail.com/inbox | ProtonMail | 3
--- Descargas (Sospechosas) ---
Marca de tiempo (UTC) | Nombre de Archivo | URL Origen | Tamaño
2024-01-15 14:33:15.000 | Q4_Financial_Report.xlsm | https://phish-domain.com/docs/report | 245 KB
2024-01-15 14:34:02.000 | update_client.exe | https://cdn.evil-updates.com/client.exe | 1.2 MB
--- Cookies (Tokens de Sesión) ---
Dominio | Nombre | Expira | Segura | HttpOnly
.corporate.com | SESSION_ID | 2024-01-16 14:32 | Sí | Sí
.mega.nz | session | Sesión | Sí | Sí
.protonmail.com | AUTH-TOKEN | 2024-02-15 00:00 | Sí | Sí
Informe guardado en: /analysis/hindsight_output/Hindsight_Report.xlsx