
Online-Hash-Prüfer für Virustotal und andere Dienste
_________ _ _ ______ _____ ______
| | | | | \ | | | | | | \ \ | | | | \ \ /.)
| | | | | | | | | | | | | | | | | | | | /)\|
|_| |_| |_| \_|__|_| |_| |_| _|_|_ |_| |_| // /
/'" "
Online-Hash-Checker für Virustotal und andere Dienste
Florian Roth
Munin ist ein Online-Hash-Checker, der wertvolle Informationen aus verschiedenen Online-Quellen abruft.
Die aktuelle Version von Munin fragt die folgenden Dienste ab:
Standardmodus – Hashes aus Datei lesen

usage: munin.py [-h] [-f path] [--vh search-string]
[--vhrule search-string] [-o output] [--vtwaitquota]
[--vtminav min-matches] [--limit hash-limit]
[--vhmaxage days] [-c cache-db] [-i ini-file]
[-s sample-folder] [--comment] [-p vt-comment-prefix]
[--download] [-d download_path] [--nocache] [--nocsv]
[--verifycert] [--sort] [--web] [-w port] [--cli]
[--rescan] [--debug]
Online-Hash-Checker
optionale Argumente:
-h, --help Zeigt diese Hilfemeldung an und beendet das Programm
-f path Zu verarbeitende Datei (Hash zeilenweise ODER CSV mit Hash
in jeder Zeile – erkennt Position und Kommentar automatisch)
--vh search-string Valhalla nach Hashes durchsuchen nach Schlüsselwort, Tags,
YARA-Regelname, Mitre ATT&CK-Software (z. B. S0154),
Technik (z. B. T1023) oder Bedrohungsgruppe (z. B. G0049)
--vhrule search-string
Valhalla nach Hashes über Regeln durchsuchen nach Schlüsselwort,
Tags, YARA-Regelname, Mitre ATT&CK-Software (z. B.
S0154), Technik (z. B. T1023) oder Bedrohungsgruppe
(z. B. G0049)
-o output Ausgabedatei für Ergebnisse (CSV)
--vtwaitquota Nicht fortsetzen, wenn VT-Kontingent überschritten ist, sondern
auf den nächsten Tag warten
--vtminav min-matches
Minimale Anzahl von AV-Treffern, um Hash-Info von VT abzufragen
--limit hash-limit Beenden nach Verarbeitung dieser vielen neuen Hashes im Batch-
Modus (Cache ignoriert).
--vhmaxage days Maximales Alter des Samples auf Valhalla, das verarbeitet werden soll
-c cache-db Name der Cache-Datenbankdatei (Standard: vt-hash-
db.json)
-i ini-file Name der INI-Datei, die die API-Schlüssel enthält
-s sample-folder Ordner mit zu verarbeitenden Samples
--comment Postet einen Kommentar für den analysierten Hash, der den
Kommentar aus der Log-Zeile enthält
-p vt-comment-prefix Virustotal-Kommentar-Präfix
--download Aktiviert Sample-Download von Hybrid Analysis.
SHA256 des Samples erforderlich.
-d download_path Ausgabepfad für Sample-Download von Hybrid
Analysis. Ordner muss existieren
--nocache Cache-Datenbankdatei nicht verwenden
--nocsv Keine CSV mit den Ergebnissen schreiben
--verifycert SSL/TLS-Zertifikate überprüfen
--sort Die Eingabezeilen sortieren
--web Munin als Webdienst ausführen
-w port Webdienst-Port
--cli Munin im Kommandozeilen-Interface-Modus ausführen
--rescan Ein erneutes Scannen jeder analysierten Datei auslösen
--debug Debug-Ausgabe
pip3 install -r requirements.txt (unter macOS --user hinzufügen)cp munin.ini my.ini (siehe Abschnitt API-Schlüssel abrufen für Hilfe)python munin.py -i my.ini -f munin-demo.txtEin Virustotal Retrohunt-Ergebnis verarbeiten und die Zeilen vor der Prüfung sortieren, sodass übereinstimmende Signaturen in Blöcken geprüft werden
python3 munin.py -i my.ini -f ~/Downloads/retro_hunt
Ein Verzeichnis mit Samples verarbeiten und deren Hashes online prüfen
python3 munin.py -i my.ini -s ~/malware/case34
Den Kommandozeilen-Interface-Modus verwenden (neu in v0.14)
python3 munin.py -i my.ini
Profil > Mein API-Schlüssel Ihren öffentlichen API-Schlüssel prüfenHier registrieren: https://malshare.com/register.php
Hier registrieren: https://bazaar.abuse.ch/. Ihren API-Schlüssel finden Sie dann in Ihrer Kontoübersicht.
Profil > API-Schlüssel prüfenAuthkey wird als API-Schlüssel verwendetDerzeit nur für Kunden oder eingeladene Forscher
https://valhalla.nextron-systems.com/
Hashlookup Die CIRCL-Instanz wird kostenlos zur Verfügung gestellt und nach bestem Gewissen betrieben.
Munin mit --cli starten und den Anweisungen folgen.
Z. B.
python3 munin.py -i my.ini --cli
Inhalt mit Hash-Werten einfügen und dann CTRL+D drücken, um die Eingabe abzuschließen. Die letzte Zeile benötigt am Ende einen Zeilenumbruch.
Im Standardmodus wird eine CSV-Datei mit dem aktuellen Datum im Dateinamen erstellt.

Munin mit --web und optional einem Port -w port starten.
Z. B.
python3 munin.py -i my.ini --web -w 8080
Der Webdienst wartet auf Zeichenfolgen im folgenden URL-Schema.
http://server:port/<string>
Der String kann ein beliebiger String ohne Zeilenumbrüche sein, z. B.
Emotet:1585ad28f7d1e0ca696e6c6c2f1d008a
ed01ebfbc9eb5bbea545af4d01bf5f1071661840480439c6e5babe8e080e41aa;IOC1
dc9b5e8aa6ec86db8af0a7aa897ca61db3e5f3d2e0942e319074db1aaccfdc83
Das Ergebnis sieht dann wie folgt aus:
{
"comment": "Emotet",
"commenter": "-",
"comments": "0",
"copyright": "Copyright (C) America Online, Inc. 1999 - 2004",
"description": "Utilities",
"expired": false,
"filenames": "sourcedev.exe, MISCUTIL, x8ykNnr_9WofXq7Nh_xuEzSPW.exe, jwuKBLWN681ztj6Zks.exe",
"filetype": "Win32 EXE",
"first_submitted": "2019-01-19 13:46:21 UTC ( 2 months, 2 weeks ago )",
"firstsubmission": "2019-01-19 13:46:21 UTC ( 2 months, 2 weeks ago )",
"harmless": false,
"hash": "1585ad28f7d1e0ca696e6c6c2f1d008a",
"hybrid_available": false,
"hybrid_compromised": "-",
"hybrid_date": "-",
"hybrid_score": "-",
"imphash": "2820d9bdc397f88a8a1e957e1a824482",
"last_submitted": "2019-02-27 09:44:03",
"malshare_available": false,
"md5": "1585ad28f7d1e0ca696e6c6c2f1d008a",
"misp_available": true,
"misp_events": "",
"misp_info": [],
"mssoft": false,
"origname": "-",
"positives": 48,
"rating": "malicious",
"res_color": "\u001b[41m",
"result": "48 / 64",
"revoked": false,
"sha1": "4561d0ad575d5f02fb06e062a37de15861c3bd89",
"sha256": "35e304d10d53834e3e41035d12122773c9a4d183a24e03f980ad3e6b2ecde7fa",
"signed": false,
"signer": "-",
"total": 64,
"urlhaus_available": true,
"vendor_results": {
"CrowdStrike": "win/malicious_confidence_100% (W)",
"ESET-NOD32": "a variant of Win32/Kryptik.GOUY",
"F-Secure": "Trojan.TR/AD.Emotet.pdiuu",
"GData": "Trojan.GenericKD.40960256",
"Kaspersky": "HEUR:Trojan.Win32.Generic",
"McAfee": "Emotet-FLL!1585AD28F7D1",
"Microsoft": "Trojan:Win32/Emotet.DN",
"Sophos": "Mal/Emotet-Q",
"Symantec": "Trojan.Gen.2",
"TrendMicro": "-"
},
"virus": "Microsoft: Trojan:Win32/Emotet.DN / Kaspersky: HEUR:Trojan.Win32.Generic / McAfee: Emotet-FLL!1585AD28F7D1 / CrowdStrike: win/malicious_confidence_100% (W) / ESET-NOD32: a variant of Win32/Kryptik.GOUY / Symantec: Trojan.Gen.2 / F-Secure: Trojan.TR/AD.Emotet.pdiuu / Sophos: Mal/Emotet-Q / GData: Trojan.GenericKD.40960256",
"virusbay_available": false,
"vt_positives": 48,
"vt_queried": false,
"vt_total": 64,
"vt_verbose_msg": "Scan finished, information embedded"
}
Die Abfragen an Virustotal müssen gedrosselt werden. Daher wendet der Webdienst eine Abkühlzeit an, die minimiert wird, indem die Zeit, die für die Verarbeitung aller anderen Plattformen benötigt wurde, von der Wartezeit von 15 Sekunden abgezogen wird.
cooldown_time = vt_wait_time - process_time
Während der Abkühlzeit geben Anfragen diese Antwort zurück:
{"status": "VT cooldown active"}
Die Abkühlzeit ist nicht relevant, wenn Hashes abgefragt werden, die sich bereits im Lookup-Cache befinden.
Das Munin-Host- und IP-Prüf-Skript (munin-host.py) ruft weitere Informationen zu IP-Adressen und Host-/Domainnamen in IOC-Listen ab.
usage: munin-host.py [-h] [-f path] [-o output] [-m max-items] [-c cache-db]
[-i ini-file] [--nocache] [--nocsv] [--recursive]
[--download] [-d download_path] [--dups] [--noresolve]
[--ping] [--debug]
Virustotal Online Checker (IP/Domain)
optionale Argumente:
-h, --help Zeigt diese Hilfemeldung an und beendet das Programm
-f path Zu verarbeitende Datei (Hash zeilenweise ODER CSV mit Hash in
jeder Zeile – erkennt Position und Kommentar automatisch)
-o output Ausgabedatei für Ergebnisse (CSV)
-m max-items Maximale Anzahl von Elementen (URLs, Hosts, Samples) zum Anzeigen
-c cache-db Name der Cache-Datenbankdatei (Standard: vt-hosts-
db.json)
-i ini-file Name der INI-Datei, die die API-Schlüssel enthält
--nocache Die Cache-Datenbank nicht laden (vt-check-cache.pkl)
--nocsv Keine CSV mit den Ergebnissen schreiben
--recursive Die aufgelösten IPs ebenfalls verarbeiten
--download Versuchen, die URLs herunterzuladen (Verzeichnisse mit Host/IP-Namen)
-d download_path Die Downloads im angegebenen Verzeichnis speichern
--dups Doppelte Hashes nicht überspringen
--noresolve Keinen DNS-Resolver-Test für gefundene Domainnamen durchführen
--ping Ping-Check für IPs durchführen (beschleunigt den Vorgang, wenn viele
öffentliche, aber intern geroutete IPs in der Textdatei erscheinen)
--debug Debug-Ausgabe

Die Demodatei parsen, IPs und Hosts extrahieren, nur die Domains prüfen, die noch auflösbar sind, und Samples direkt von den entfernten Systemen herunterladen.
python3 munin-host.py -i your-key.ini -f ./munin-hosts-demo.txt --noresolve --download
Die Verwendung von munin-host.py in einem IDS-überwachten Netzwerk wird zahlreiche Alarme auslösen, da munin-host.py DNS-Lookups für bösartige Domains durchführt und die Option bietet, bösartige Samples herunterzuladen.
Das Skript munin-host.py benötigt das Modul pycurl. Es kann unter macOS manchmal schwierig sein, es zum Laufen zu bringen, da ein installiertes OpenSSL erforderlich ist, das dann im Build-Prozess verwendet wird.
Wenn Fehler auftreten, versuchen Sie Folgendes (manche Umgebungen erfordern pip3):
pip uninstall pycurl
brew update
brew reinstall openssl
export PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig"
export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"
export PYCURL_SSL_LIBRARY=openssl
pip install pycurl --global-option="--with-openssl"
Das Hugin-Skript (hugin.py) ruft Informationen zu allen Samples ab, die in einem Retrohunt zurückgegeben werden, und zeigt sie an. Der große Vorteil ist, dass Sie nicht 15 Sekunden zwischen jeder Sample-Anfrage warten müssen, sondern die vollständige JSON-Ergebnisdatei über v3 der Virustotal-API abrufen. Auf diese Weise erhalten Sie Ihre Ergebnisse sofort. Der Nachteil ist, dass andere Dienste wie Any.run, Hybrid-Analysis, MISP oder Valhalla mit Hugin nicht abgefragt werden.
usage: hugin.py [-h] [-r retrohunt-name] [-i ini-file]
[--csv-path CSV_PATH] [--debug] [--no-comments]
Retrohunt-Checker
optionale Argumente:
-h, --help Zeigt diese Hilfemeldung an und beendet das Programm
-r retrohunt-name Name für den abgefragten Retrohunt
-i ini-file Name der INI-Datei, die den VT-API-Schlüssel enthält
--csv-path CSV_PATH Eine CSV mit den Ergebnissen schreiben
--debug Debug-Ausgabe
--no-comments VirusTotal-Kommentare überspringen
Einen Retrohunt analysieren und eine CSV-Datei mit den Ergebnissen exportieren.
python3 hugin.py -i config-with-your-key.ini -r retrohunt-123456789