Was macht Browser-Forensik mit Hindsight analysieren?
Überblick
Hindsight ist ein Open-Source-Browser-Forensik-Tool, das speziell für die Analyse von Google Chrome und anderen Chromium-basierten Browsern (Microsoft Edge, Brave, Opera, Vivaldi) entwickelt wurde. Es extrahiert und korreliert Daten aus mehreren Browser-Datenbankdateien und erstellt eine einheitliche Timeline der Webaktivität. Mit Hindsight können URLs, Download-Verlauf, Cache-Einträge, Lesezeichen, Autofill-Datensätze, gespeicherte Passwörter, Einstellungen, Browsererweiterungen, HTTP-Cookies, Local Storage (HTML5-Cookies), Anmeldedaten sowie Sitzungs-/Tab-Informationen analysiert werden. Das Tool erzeugt chronologische Timelines in verschiedenen Ausgabeformaten (XLSX, JSON, SQLite), die es Ermittlern ermöglichen, die Webaktivität eines Benutzers für Incident Response, Insider-Bedrohungsanalysen und strafrechtliche Ermittlungen zu rekonstruieren.
Wann verwenden
- Bei der Untersuchung von Sicherheitsvorfällen, bei denen eine Browser-Forensik mit Hindsight erforderlich ist
- Beim Erstellen von Erkennungsregeln oder Threat-Hunting-Abfragen für diesen Bereich
- Wenn SOC-Analysten strukturierte Verfahren für diesen Analysetyp benötigen
- Bei der Validierung der Sicherheitsüberwachungsabdeckung für verwandte Angriffstechniken
Voraussetzungen
- Python 3.8+ mit installiertem Hindsight (
pip install pyhindsight)
- Zugriff auf die Browser-Profilverzeichnisse aus einem forensischen Image
- Browser-Profildaten (nicht mit Betriebssystem-Verschlüsselung verschlüsselt)
- Timeline Explorer oder eine Tabellenkalkulation zur Analyse
Speicherorte der Browser-Profile
| Browser | Windows-Profilpfad |
|---|
| 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/ |
Wichtige Artefakt-Dateien
| Datei | Inhalt |
|---|
| History | URL-Besuche, Downloads, Suchbegriffe |
| Cookies | HTTP-Cookies mit Domain, Ablaufdatum, Werten |
| Web Data | Autofill-Einträge, gespeicherte Kreditkarten |
| Login Data | Gespeicherte Benutzernamen/Passwörter (verschlüsselt) |
| Bookmarks | JSON-Lesezeichenstruktur |
| Preferences | Browsereinstellungen und Erweiterungen |
| Local Storage/ | HTML5 Local Storage pro Domain |
| Session Storage/ | Sitzungsspezifischer Storage pro Domain |
| Network Action Predictor | Zuvor eingegebene URLs |
| Shortcuts | Omnibox-Verknüpfungen und Vorhersagen |
| Top Sites | Häufig besuchte Seiten |
Hindsight ausführen
Befehlszeile
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
Weboberfläche
hindsight_gui.exe
Details zur Artefaktanalyse
URL-Verlauf und Besuche
Download-Verlauf
Cookie-Analyse
Python-Analyse-Skript
import sqlite3
import os
import json
import sys
from datetime import datetime, timedelta
CHROME_EPOCH = datetime(1601, 1, 1)
def chrome_time_to_datetime(chrome_ts: int):
"""Konvertiert einen Chrome-Zeitstempel in ein datetime-Objekt."""
if chrome_ts == 0:
return None
try:
return CHROME_EPOCH + timedelta(microseconds=chrome_ts)
except (OverflowError, OSError):
return None
def analyze_chrome_history(profile_path: str, output_dir: str) -> dict:
"""Analysiert die Chrome-Verlaufsdatenbank für forensische Beweise."""
history_db = os.path.join(profile_path, "History")
if not os.path.exists(history_db):
return {"error": "History-Datenbank nicht gefunden"}
os.makedirs(output_dir, exist_ok=True)
conn = sqlite3.connect(f"file:{history_db}?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
""")
visits = [{
"url": r[0], "title": r[1],
"visit_time": str(chrome_time_to_datetime(r[2])),
"total_visits": r[3], "transition": 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
""")
downloads = [{
"path": r[0], "source_url": r[1],
"start_time": str(chrome_time_to_datetime(r[2])),
"end_time": str(chrome_time_to_datetime(r[3])),
"received_bytes": r[4], "total_bytes": r[5],
"mime_type": r[6], "state": 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
""")
searches = [{"term": r[0], "url": r[1]} for r in cursor.fetchall()]
conn.close()
report = {
"analysis_timestamp": datetime.now().isoformat(),
"profile_path": profile_path,
"total_visits": len(visits),
"total_downloads": len(downloads),
"total_searches": len(searches),
"visits": visits,
"downloads": downloads,
"searches": searches
}
report_path = os.path.join(output_dir, "browser_forensics.json")
with open(report_path, "w") as f:
json.dump(report, f, indent=2)
return report
def main():
if len(sys.argv) < 3:
print("Verwendung: python process.py <chrome_profile_path> <output_dir>")
sys.exit(1)
analyze_chrome_history(sys.argv[1], sys.argv[2])
if __name__ == "__main__":
main()
Referenzen
Beispielausgabe
$ python hindsight.py -i /evidence/chrome-profile -o /analysis/hindsight_output
Hindsight v2024.01 - Chrome/Chromium Browser Forensische Analyse
================================================================
Profil: /evidence/chrome-profile (Chrome 120.0.6099.130)
Betriebssystem: Windows 10
[+] Parst History-Datenbank...
URL-Einträge: 12.456
Download-Einträge: 234
Suchbegriffe: 567
[+] Parst Cookies-Datenbank...
Cookie-Einträge: 8.923
Verschlüsselte Cookies: 6.712
[+] Parst Web Data (Autofill)...
Autofill-Einträge: 1.234
Kreditkarten-Einträge: 2 (verschlüsselt)
[+] Parst Login Data...
Gespeicherte Anmeldedaten: 45 (verschlüsselt)
[+] Parst Lesezeichen...
Lesezeichen-Einträge: 189
--- Browserverlauf (Letzte 10 Einträge) ---
Zeitstempel (UTC) | URL | Titel | Besuche
2024-01-15 14:32:05.123 | https://mail.corporate.com/inbox | Firmen-E-Mail | 45
2024-01-15 14:33:12.456 | https://drive.google.com/file/d/1aBcDe... | Q4_Finanzbericht.xlsx | 1
2024-01-15 14:35:44.789 | https://mega.nz/folder/xYz123 | MEGA - Sichere Cloud | 3
2024-01-15 14:36:01.234 | https://mega.nz/folder/xYz123#upload | MEGA - Hochladen | 8
2024-01-15 14:42:15.567 | https://pastebin.com/raw/kL9mN2pQ | Pastebin (roh) | 1
2024-01-15 15:01:33.890 | https://192.168.1.50:8443/admin | Admin-Panel | 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 | VPN-Anmeldung | 5
2024-01-15 16:00:00.333 | https://whatismyipaddress.com | Was ist meine IP | 1
2024-01-15 16:05:12.444 | https://protonmail.com/inbox | ProtonMail | 3
--- Downloads (Verdächtig) ---
Zeitstempel (UTC) | Dateiname | URL-Quelle | Größe
2024-01-15 14:33:15.000 | Q4_Finanzbericht.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 (Sitzungstoken) ---
Domain | Name | Läuft ab | Secure | HttpOnly
.corporate.com | SESSION_ID | 2024-01-16 14:32 | Ja | Ja
.mega.nz | session | Sitzung | Ja | Ja
.protonmail.com | AUTH-TOKEN | 2024-02-15 00:00 | Ja | Ja
Bericht gespeichert unter: /analysis/hindsight_output/Hindsight_Report.xlsx