SUNBURST
Shannonエントロピーを使用したSUNBURST C2 Stage-1の検出
概要:
Shannonエントロピーを使用してドメイン生成アルゴリズム(DGA)を検出します。
関数にはFQDNのみを入力するか、CSVファイルから読み取る必要があります。
構文: Prefix_or_subdomain.Domain.TLD
APTがキルチェーンC2のために長文字列DGAを利用することを受けて作成されました。
高いエントロピー(標準偏差の2倍超)を持つ長い文字列のURLを識別します。
長いプレフィックス/サブドメインを持つURLの上位2.5%を対象とします。
CNDアナリストが必要な場合に備え、追加のメタデータ(例:プレフィックス長)を保存します。
必要条件:
- Python 3.9+
- PythonがPATH変数に存在すること
- 記載されているすべてのインポート(必要に応じてpip install)
- 入力DNSログには1行に1つのFQDNがあること(他の句読点は不可)
- Cisco Top-1M (CSV、ZIP) または Majestic (CSV) Top-1M がスクリプトと同じフォルダに存在すること。
実行方法 (対話モードON、VARIABLESを参照):
- Python 3.9.xをインストールします。
- すべての入力ファイルを正しいフォーマットで準備します(ドメインをテキストファイルに1行1つ、句読点なし)。
- 入力ファイルがこのスクリプトと同じディレクトリ/フォルダにあることを確認します。
4a) (Windows) このスクリプトをPython IDLEまたはVisual Studio Codeで開きます。
4b) (Linux) $~: python3 shannon.py
- 調査する入力DNSログファイルを入力します。
- 活用するCisco Umbrella (CSV/ZIP) または Majestic Top-1Mファイル (CSV) を入力します。
- FrequencyおよびShannonエントロピーの値が生成されるのを待ちます。
- 出力ファイルを確認します。
実行方法 (対話モードOFF、VARIABLESを参照):
- Python 3.9.xをインストールします。
- すべての入力ファイルを正しいフォーマットで準備します(ドメインをテキストファイルに1行1つ、句読点なし)。
- 入力ファイルがこのスクリプトと同じディレクトリ/フォルダにあることを確認します。
4a) (Windows) このスクリプトをPython IDLEまたはVisual Studio Codeで開きます。
4b) (Linux) $~: python3 shannon.py
- 分析する入力ログは "domains.txt" です。VARIABLESを参照してください。
- 辞書の確率を構築するためのTop-Nファイルを選択します。VARIABLESを参照してください。
- FrequencyおよびShannonエントロピーの値が生成されるのを待ちます。
- 出力ファイルを確認します。
前提条件:
- 大文字と小文字の出現確率は等しいと仮定します。
a) TORノードがDNSクエリおよび0x20エンコーディングにおいて大文字小文字の感度を変えることは考慮しません。
- ETOAN文字頻度表は、0-9、"-"、""が欠けているため不十分です。
a) ドメインにはハイフン(-)、アンダースコア()、数字を含めることができます。
- ExploderBot DGAに対抗するようには設計されていません。
- 入力:シンプルなテキストファイルで、各URLは各行に1つのみ - それ以外はありません。
- 入力は、禁止文字を含まない厳密にURL文字列のみで構成されます。
- 入力ファイルと出力ファイルは、このスクリプトと同じフォルダにある必要があります。
- Python3がPATH変数に存在すること。
データセット(ドメイン):
使用したデータセットは、SQLiteから抽出したPi-Holeクエリログ(12時間のウィンドウ)から派生したものです。
BASH:
$~: sqlite3 /etc/pihole/pihole-FTL.db "SELECT domain FROM queries WHERE timestamp >='$(($(date +%s) - 43200))'" > domains.txt
データはExcel > データ > 重複の削除を使用して重複排除されました。
リバースルックアップ(PTR)のin-addr.arpaデータも削除されました。
データセット(確率):
RedCanaryのDGA分析結果を活用し、このスクリプトはURLを受け取り、Shannonエントロピーを計算します。
DevOpsテストフェーズ:
- shannon.py (1.0) - 静的RedCanary辞書で計算が機能するようにする。
- shannon.py (1.1) - 軽微なテストを1.0にマージ。
- dictionary.py (1.0) - Cisco + Majestic Top-1Mのオープン/クローズをテスト。
- shannon.py (2.0) - 1.0とdictionary.pyのテスト済み関数を組み合わせる。
参照:
Splunk Shannon Entropy - アイデアの出典*
https://www.splunk.com/en_us/blog/tips-and-tricks/when-entropy-meets-shannon.html
SANS Mark Baggett - RedCanaryがAlexa Top 1Mの分析に使用したツール
https://github.com/markbaggett/freq
RedCanary - 確率スコアの由来となるブログ
https://redcanary.com/blog/threat-hunting-entropy/
AlexaのTop 1Mドメイン - RedCanaryが使用したデータコーパス
https://www.alexa.com/topsites
DGA Detector
https://github.com/exp0se/dga_detector
Shannonエントロピー - 公式
https://towardsdatascience.com/the-intuition-behind-shannons-entropy-e74820fe9800