NetAttackClassifier#
Snort ルールと ATT&CK フレームワークに基づくネットワークトラフィック分析と脅威分類ツール
- 🕵️♂️ Snort に基づく異常トラフィック検出
- 🎯 ATT&CK 技戦術マッピング
- 🧬 高細粒度トラフィック分類
住所: https://github.com/w0s1np/NetAttackClassifier
プロジェクト概要#
トラフィック分類モデルのトレーニング時に、ほとんどがネット上の公開データセットを使用していますが、共通の欠点があります。それは、トラフィックの分類の細粒度が不十分であることです。トラフィック中で使用される脆弱性番号や脆弱性の詳細を区別できれば、実戦での使用に役立ちますが、ほとんどのデータセットの構造は、既知の脆弱性やマルウェアの種類に基づいて対応するトラフィックを生成するか(例えばhttps://github.com/yungshenglu/USTC-TFC2016
、https://github.com/safest-place/ExploitPcapCollection
)、大量の手作業で検索エンジンや脆弱性番号ライブラリなどを使用して人工分類を行っています(私が知っているいくつかのセキュリティ会社)。
そのため、Snort に基づいてトラフィックを検出し、大規模モデルがログを分析し、ATT&CK 技戦術とマッピングすることで、トラフィックを高細粒度で分類できるようにしました。
プロジェクト機能#
- pcap ファイル検出:Snort ルールを使用して大量の pcap ファイルを検出し、ルールに一致する疑わしいデータパケットとそれに対応するネットワークトラフィックを迅速に特定します。
- ATTCK 技戦術マッピング:DeepSeek API を呼び出すことで、検出された疑わしいデータパケットがトリガーした Snort ルールを MITRE ATTCK フレームワークの技戦術とマッピングし、攻撃者が採用する可能性のある攻撃手法と段階を明確にします。
- 高細粒度多分類:検出された疑わしい pcap トラフィックをさらに細分化し、攻撃タイプ、ターゲットシステム、攻撃ツールなどの複数の次元から詳細にラベル付けし、分類して、後続のセキュリティ分析と対応により正確な情報を提供します。
環境構築#
-
Snort をインストールし、対応するルールライブラリを設定します (
https://www.snort.org/downloads#rules
)。私の構築設定:Snort 3 依存関係のインストール#
# システムの更新 sudo apt update && sudo apt upgrade -y # コンパイル依存関係のインストール sudo apt install -y build-essential autotools-dev libdumbnet-dev \ libluajit-5.1-dev libpcap-dev libpcre3-dev zlib1g-dev pkg-config \ libhwloc-dev libcmocka-dev liblzma-dev openssl libssl-dev cpputest \ libsqlite3-dev uuid-dev libtool git autoconf bison flex libnetfilter-queue-dev \ libmnl-dev libunwind-dev libfl-dev libsafec-dev # オプション:Hyperscan(高性能正規表現ライブラリ)のインストール sudo apt install -y libhyperscan-dev # CMakeのインストール(依存関係の構築に使用) sudo apt install -y cmake
DAQ 3.x 依存関係のインストール#
# DAQ 3.xのコンパイルに必要な依存関係をインストール sudo apt install -y libpcap-dev libdumbnet-dev libssl-dev liblzma-dev \ libcurl4-openssl-dev libhwloc-dev libcmocka-dev libpcre3-dev bison flex
DAQ 3.x のダウンロードとコンパイル#
# DAQ 3.xソースコードのダウンロード cd ~/snort3_build git clone https://github.com/snort3/libdaq.git cd libdaq # 設定、コンパイル、インストール ./bootstrap ./configure --prefix=/usr/local make -j$(nproc) sudo make install # 動的ライブラリリンクの更新 sudo ldconfig
Snort 3 のダウンロードとコンパイル#
# コンパイルディレクトリの作成 mkdir ~/snort3_build && cd ~/snort3_build # Snort 3ソースコードのダウンロード git clone https://github.com/snort3/snort3.git cd snort3 # コンパイルオプションの設定 ./configure_cmake.sh --prefix=/usr/local --enable-tcmalloc cd build # コンパイルとインストール make -j$(nproc) && sudo make install
ステップ 4:環境変数の設定#
# Snort 3をPATHに追加 echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bashrc source ~/.bashrc # インストールの確認 snort -V
-
pip install openai
使用方法#
-
pcap ファイルを指定の入力ディレクトリに置きます。
-
run_snort.py
を実行し、pcap をバッチ検出し、ログ内容を解析して、脅威情報を指定の json ファイルに抽出します。 -
extract_tcp_streams.py
を実行し、最初にSplitCap.exe
(https://www.netresec.com/?page=SplitCap
) を使用して pcap を TCP 双方向ストリームに分流し、次に json ファイルに存在する警告のパケットを検索し、全ストリーム内の各パケットのルール優先度
、トリガー頻度
、プロトコルの一貫性
を計算し、同じストリーム内の各パケットの加重平均スコア
を取得し、得点が最も高いパケットの警告をそのストリームの警告として選択します。これは、Snort のパケット検出メカニズムとほとんどのモデルのストリーム検出メカニズムを対応させるためであり、分流された pcap データパケットとそれに対応する json ファイルを得るためです。例えば:{ "timestamp": "09/06-01:18:41.206357", "gid": 1, "sid": 45015, "rev": 3, "description": "FILE-OTHER Jackson databind deserialization remote code execution attempt", "classification": "Attempted User Privilege Gain", "priority": 1, "protocol": "TCP", "src_ip": "192.168.56.1", "dst_ip": "192.168.56.11", "src_port": 1056, "dst_port": 8090, "pcap_path": "/Users/lnhsec/Desktop/NetAttackClassifier/extracted_streams/fastjson1224ldap/192.168.56.1_1056_to_192.168.56.11_8090.pcap", "weight_score": 0.8031363764158987, "priority_score": 1.0, "frequency_score": 0.47712125471966244, "protocol_score": 0.8, "alert_count": 2 }
-
gpt_analysis.py
を実行し、上記の json ファイルから重要なトラフィック情報を抽出し、対応するプロンプトを構築し、gpt に MITRE ATTCK フレームワークの技戦術とのマッピングを提出し、対応する json 結果を得ます。例えば:{ "attack_tactics": { "TA0006": "T1110" }, "rule_trigger_reason": "An attempted Oracle login with a suspicious username triggered a misparsed login response alert", "attack_type": "Credential Brute Force Attempt", "behavior_pattern": "Suspicious username used in login attempt to Oracle server via TCP/1521", "threat_level": "medium", "suggested_action": "1. Investigate source IP 192.168.1.20 for compromise 2. Review Oracle account activity 3. Enforce strong authentication policies", "confidence": 0.9, "dynamic_behavior": { "network": { "ip": "192.168.1.20", "dns": "" } }, "pcap_path": "/Users/lnhsec/Desktop/NetAttackClassifier/extracted_streams/msf_oracle_sid_brute/192.168.1.20_1521_to_192.168.1.14_34055.pcap" }
プロンプトは以下の通りです:
def construct_prompt(key_info): prompt = """Snortの警告に基づいてネットワークセキュリティイベント分析を行うことを要求します: 1. MITRE ATT&CK技戦術フレームワークの分類に厳密に従うこと 2. attack_tacticsフィールドには関連するTAとT番号を含めること 3. 各TA番号は具体的かつ正確なT技術番号に対応する必要があります """ prompt += "以下のSnort警告情報に基づいて分析を行い、JSON形式で返してください:\n" for entry in key_info: prompt += ( f"時間: {entry['timestamp']}, 警告ID: {entry['sid']}:{entry['gid']}:{entry['rev']}, " f"説明: {entry['description']}, 分類: {entry['classification']}, " f"優先度: {entry['priority']}, プロトコル: {entry['protocol']}, " f"源IP: {entry['src_ip']}:{entry['src_port']}, 目的IP: {entry['dst_ip']}:{entry['dst_port']}\n" ) prompt += '''\n以下の質問に回答し、JSON形式で返してください: { "attack_tactics": {"TAxxxx": "Txxxx"}, "rule_trigger_reason": "xxx", "attack_type": "xxx", "behavior_pattern": "xxx", "threat_level": "low/medium/high/critical", "suggested_action": "xxx", "confidence": 0.9, "dynamic_behavior": { "network": {"ip": "xxx", "dns": "xxx"} } }''' prompt += "\nJSON形式の内容のみを厳密に返し、他の説明文を含めず、JSON文字列のみを返してください。" print(f"構築したDeepSeek API入力内容: {prompt}") return prompt
-
最終的に技戦術または
attack_type
に基づいて対応するファイルを分類します。
未来の方向性#
- ルールライブラリの最適化: ルールライブラリの異なるタイプやバージョンにより、多くの既知の悪意ある pcap が Snort によって検出されていないため、多くの漏れ報告や誤報が発生します。
- 検出メカニズムの改善: パケット検出とストリーム検出の対応方法をさらに改善し、より良い方法があるかどうかを確認します。
- パフォーマンスの最適化: gpt api を呼び出してマッピングする時間コストが高いため、deepseek-v3 モデル(速いが、誤った情報を提供することがある)、deepseek-r1 モデル(非常に遅いが、比較的正確)を試しました。今後、知識ベースの一部を追加するか、他のより速いモデルを使用してマッピングするかを検討します。