
VirusTotalやその他のサービスのオンラインハッシュチェッカー
_________ _ _ ______ _____ ______
| | | | | \ | | | | | | \ \ | | | | \ \ /.)
| | | | | | | | | | | | | | | | | | | | /)\|
|_| |_| |_| \_|__|_| |_| |_| _|_|_ |_| |_| // /
/'" "
Online Hash Checker for Virustotal and Other Services
Florian Roth
Munin は、さまざまなオンラインソースから有益な情報を取得するオンラインハッシュチェッカーユーティリティです。
現在のバージョンの Munin は以下のサービスを照会します。
デフォルトモード - ファイルからハッシュを読み取り

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
optional arguments:
-h, --help このヘルプメッセージを表示して終了
-f path 処理するファイル(ハッシュを一行ずつ、または各行にハッシュを含むCSV - 位置とコメントを自動検出)
--vh search-string キーワード、タグ、YARAルール名、Mitre ATT&CKソフトウェア(例:S0154)、テクニック(例:T1023)、脅威グループ(例:G0049)でValhallaのハッシュを検索
--vhrule search-string
キーワード、タグ、YARAルール名、Mitre ATT&CKソフトウェア(例:S0154)、テクニック(例:T1023)、脅威グループ(例:G0049)でValhallaのルールによるハッシュを検索
-o output 結果の出力ファイル(CSV)
--vtwaitquota VTのクォータを超えた場合、終了せずに翌日まで待機
--vtminav min-matches VTからハッシュ情報を取得するための最低AV一致数
--limit hash-limit バッチモードでこれだけの新しいハッシュを処理したら終了(キャッシュは無視)
--vhmaxage days Valhallaで処理するサンプルの最大経過日数
-c cache-db キャッシュデータベースファイルの名前(デフォルト:vt-hash-db.json)
-i ini-file APIキーを保持するiniファイルの名前
-s sample-folder 処理するサンプルを含むフォルダ
--comment 分析されたハッシュに対して、ログ行のコメントを含むコメントを投稿
-p vt-comment-prefix VirusTotalコメントのプレフィックス
--download Hybrid Analysisからのサンプルダウンロードを有効にする。サンプルのSHA256が必要
-d download_path Hybrid Analysisからのサンプルダウンロードの出力パス。フォルダは存在している必要がある
--nocache キャッシュデータベースファイルを使用しない
--nocsv 結果のCSVを書き出さない
--verifycert SSL/TLS証明書を検証
--sort 入力行をソート
--web MuninをWebサービスとして実行
-w port Webサービスポート
--cli Muninをコマンドラインインターフェースモードで実行
--rescan 分析された各ファイルの再スキャンをトリガー
--debug デバッグ出力
pip3 install -r requirements.txt(macOSの場合は --user を追加)cp munin.ini my.ini(ヘルプとして「APIキーの取得」セクションを参照)python munin.py -i my.ini -f munin-demo.txtVirusTotal Retrohuntの結果を処理し、チェック前に行をソートして、一致したシグネチャがブロック単位でチェックされるようにする
python3 munin.py -i my.ini -f ~/Downloads/retro_hunt
サンプルを含むディレクトリを処理し、そのハッシュをオンラインでチェック
python3 munin.py -i my.ini -s ~/malware/case34
コマンドラインインターフェースモードを使用(v0.14 の新機能)
python3 munin.py -i my.ini
こちらで登録: https://malshare.com/register.php
こちらで登録: https://bazaar.abuse.ch/。その後、アカウント概要でAPIキーを確認できます。
現在は顧客または招待された研究者のみ対象
https://valhalla.nextron-systems.com/
Hashlookup CIRCLのインスタンスは無料で提供され、ベストエフォートベースで運用されています。
--cli を指定してmuninを起動し、指示に従ってください。
例:
python3 munin.py -i my.ini --cli
ハッシュ値を含むコンテンツを貼り付け、CTRL+D で入力を確定します。最終行の末尾には改行が必要です。
デフォルトでは、現在の日付を含むファイル名でCSVファイルが作成されます。

--web を指定してmuninを起動し、オプションでポート -w port を選択します。
例:
python3 munin.py -i my.ini --web -w 8080
Webサービスは以下のURLスキームで文字列を待ち受けます。
http://server:port/<string>
文字列は改行を含まない任意の文字列です。例:
Emotet:1585ad28f7d1e0ca696e6c6c2f1d008a
ed01ebfbc9eb5bbea545af4d01bf5f1071661840480439c6e5babe8e080e41aa;IOC1
dc9b5e8aa6ec86db8af0a7aa897ca61db3e5f3d2e0942e319074db1aaccfdc83
結果は次のようになります:
{
"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"
}
VirusTotalへのクエリはスロットル制御が必要です。そのため、Webサービスにはクールダウン時間が適用され、これは15秒の待機時間から他のすべてのプラットフォームの処理にかかった時間を差し引くことで最小化されます。
cooldown_time = vt_wait_time - process_time
クールダウン中、リクエストは次の応答を返します:
{"status": "VT cooldown active"}
クールダウンは、ルックアップキャッシュに既に存在するハッシュを要求する場合には関係ありません。
MuninホストおよびIPチェッカースクリプト (munin-host.py) は、IOCリスト内のIPアドレスとホスト/ドメイン名に関する追加情報を取得します。
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)
optional arguments:
-h, --help このヘルプメッセージを表示して終了
-f path 処理するファイル(ハッシュを一行ずつ、または各行にハッシュを含むCSV - 位置とコメントを自動検出)
-o output 結果の出力ファイル(CSV)
-m max-items 表示する最大アイテム数(URL、ホスト、サンプル)
-c cache-db キャッシュデータベースファイルの名前(デフォルト:vt-hosts-db.json)
-i ini-file APIキーを保持するiniファイルの名前
--nocache キャッシュDB(vt-check-cache.pkl)を読み込まない
--nocsv 結果のCSVを書き出さない
--recursive 解決されたIPも処理
--download URL(ホスト/IP名のディレクトリ)をダウンロード試行
-d download_path ダウンロードを指定されたディレクトリに保存
--dups 重複ハッシュをスキップしない
--noresolve 見つかったドメイン名に対してDNS解決テストを実行しない
--ping IPに対してpingチェックを実行(テキストファイルにパブリックだが内部ルーティングされているIPが多い場合に処理を高速化)
--debug デバッグ出力

デモファイルを解析し、IPとホストを抽出し、解決可能なドメインのみをチェックし、リモートシステムから直接サンプルをダウンロードします。
python3 munin-host.py -i your-key.ini -f ./munin-hosts-demo.txt --noresolve --download
IDS監視ネットワークで munin-host.py を使用すると、munin-host.pyが悪意のあるドメインに対してDNSルックアップを実行し、悪意のあるサンプルをダウンロードするオプションがあるため、多数のアラートが発生します。
スクリプト munin-host.py はモジュール pycurl を必要とします。macOSで動作させるのは時々トリッキーで、opensslをインストールし、それをビルドプロセスで使用する必要があります。
エラーが発生した場合は、以下を試してください(一部の環境では 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"
Hugin スクリプト (hugin.py) は、Retrohuntで返されたすべてのサンプルに関する情報を取得して表示します。大きな利点は、各サンプル要求の間に15秒待つ必要がなく、VirusTotal API v3を介して完全なJSON結果ファイルをプルできることです。これにより、結果を即座に取得できます。欠点は、Any.run、Hybrid-Analysis、MISP、Valhallaなどの他のサービスはHuginでは照会されないことです。
usage: hugin.py [-h] [-r retrohunt-name] [-i ini-file]
[--csv-path CSV_PATH] [--debug] [--no-comments]
Retrohunt Checker
optional arguments:
-h, --help このヘルプメッセージを表示して終了
-r retrohunt-name 照会するRetrohuntの名前
-i ini-file VT APIキーを保持するiniファイルの名前
--csv-path CSV_PATH 結果をCSVに書き出す
--debug デバッグ出力
--no-comments VirusTotalのコメントをスキップ
Retrohuntを解析し、結果をCSVファイルにエクスポートします。
python3 hugin.py -i config-with-your-key.ini -r retrohunt-123456789