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 += "\n請嚴格返回符合 JSON 格式的內容,不要包含其他說明文字,只返回 JSON 串。" print(f"構造的 DeepSeek API 輸入內容: {prompt}") return prompt
-
最終根據技戰術或者
attack_type
對相應文件進行分類操作
未來方向#
- 規則庫優化: 因規則庫的不同類型、版本,很多已知惡意 pcap 並沒有被 Snort 檢測出來,這會導致很多漏報或者誤報
- 檢測機制改進: 在包檢測與流檢測的對應方法需要進一步完善,查看是否有更好的辦法
- 性能優化: 調用 gpt api 進行映射的時間成本較高,嘗試過 deepseek-v3 模型 (較快,但存在亂說的情況), deepseek-r1 模型 (很慢,但是較為準確), 看後續用不用添加部分知識庫,使用其他較快模型進行映射