本文從 Suricata 的 JA3 規則分析入手,闡述其在不解密流量的情況下識別應用程式和伺服器的能力,並以實際案例說明如何透過 EveBox 分析 JSON 規則、處理誤報以及編輯 SID 規則。接著,文章介紹了 EveBox 的 Hunting 和 Management 顯示模式,以及如何利用這些模式分析網路流量和警示,並提供時間軸顯示和規則詳情分析等進階功能的應使用案例項。此外,文章還探討瞭如何建構自定義 IPS 規則,以偵測 Telnet 流量為例,詳細說明瞭規則的語法、組成部分以及組態方法。最後,文章介紹了被動流量監控工具 P0F 和 Zeek,展示瞭如何利用 P0F 識別作業系統和應用程式,以及如何使用 Zeek 蒐集網路後設資料,例如 SSL 憑證資訊和地理位置等,以提升網路安全監控能力。
Linux 上的入侵防禦系統(Intrusion Prevention Systems)實務操作
Suricata IPS 範例解析與進階操作
在 EveBox 的警示頁面中,進一步滾動可以檢視到規則的 JSON 表示。回顧規則名稱時,我們注意到它參照了 JA3。JA3 簽名是加密流量初始握手封包中所交換的各種值的雜湊。使用 JA3 值,我們可以在不解密流量的情況下識別來源和目標應用程式,甚至通常也能識別伺服器名稱(在此案例中,使用 SNI 值)。這種方法為我們提供了一種觀察加密流量的有效手段,通常能夠區分正常流量和攻擊或 C2 流量。JA3 簽名的概念由 Salesforce 的 John Althouse、Jeff Atkinson 和 Josh Atkins 提出(JA3 即由此三人名字首字母組成)。更多關於此方法的資訊可參考本章末尾的內容。HASSH 框架對 SSH 流量執行類別似的功能。
JSON 規則詳情解析
檢視 JSON 規則顯示中的 JA3 部分,我們可以看到觸發 IPS 警示的網路事件的詳細資訊: 此 JSON 顯示混合了「我們正在尋找的內容」和「我們觀察到的內容」。需要檢視規則本身才能瞭解觸發規則的具體條件(儘管在這個案例中,是 JA3 雜湊值觸發了規則)。
處理誤報警示
現在我們已經檢視完這個警示並認為它是誤報,有兩種可能的處理方式:
- 停用此警示。通常,在新的 IPS 系統上,你會經常需要這樣做,直到系統穩定下來。
- 編輯警示規則,或許可以讓它在預期的情況下觸發,但排除某些 SNI(例如,以
Microsoft.com結尾的 SNI)。值得注意的是,攻擊者經常會尋找定義中的錯誤。例如,foo.microsoft.com.maliciousdomain.com符合「包含microsoft.com」的條件,但self.events.data.microsoft.com只符合「以microsoft.com結尾」的條件。如果你記得第 11 章《Linux 中的封包擷取與分析》中關於正規表示式的討論,「以Microsoft.com結尾」的正規表示式應該寫成*.microsoft.com$(一個或多個字元,後面跟著Microsoft.com,並且Microsoft.com後面緊接著字串的結尾)。
停用警示的具體步驟
在這個案例中,我們選擇停用該警示。首先,編輯 /etc/suricata/disable.conf 檔案並新增該規則的 SID。在該檔案中新增註解是一個好習慣,這樣你可以追蹤不同簽名被停用的原因、時間和人員:
$ cat /etc/suricata/disable.conf
2028371 # firefox font attack false positive - disabled 7/5/2021 robv
若要新增被忽略的規則,只需將其 SID 新增到 /etc/suricata/enable.conf 檔案中即可。
最後,再次執行 suricata-update 以更新 IPS 的執行設定。你會看到 disable.conf 檔案已被處理:
$ sudo suricata-update | grep disa
5/7/2021 -- 09:38:47 - <Info> -- Loading /etc/suricata/disable.conf
編輯 SID 規則
第二種選擇是編輯 SID,使其在特定的 SNI 上不會觸發。不過,你不能直接編輯 SID,因為下次更新會覆寫你的修改。要編輯 SID,需要將其複製為「自定義」或「本地」範圍內的 SID,然後對該副本進行編輯。接著,將新的 SID 新增到 enable.conf 檔案中。
EveBox 的進階功能與使用
回到 EveBox 的主顯示頁面,開啟任意事件並進行探索。你可以點選任意連結的值以取得更多關於它的資訊。例如,如果你懷疑內部主機已被入侵,可以點選該主機的 IP 位址,以取得有關該主機所有流量往返的詳細資訊:
此頁面頂部的搜尋欄允許你手動輸入查詢條件,隨著你對介面的熟悉度增加,你可以更靈活地使用這些功能。在這個案例中,我們可以看到一堆積「無意義」的 DNS 請求(顯示中的第 4、5、6 行,以及第 8、9、10 行)。這種無意義的查詢通常出現在使用快速通量 DNS 的攻擊中,其中 C2 伺服器的 DNS 名稱每天會變更多次。通常,使用者端會根據日期和時間計算 DNS 名稱,或定期檢索它們。不幸的是,廣告業界使用的許多技術與惡意軟體使用的技術相似,因此這種跡象並不像以前那樣明確。
切換顯示模式
點選右上角的使用者 ID 旁的圖示,可以切換到「Hunting」顯示模式。
Hunting 顯示模式詳解
在 Hunting 顯示模式下,你會看到相同的警示,但它們是被彙總顯示,而不是按時間戳記順序列出。這種顯示方式可以幫助你找出最頻繁出現的警示或最不常見的警示(後者可能指示更不尋常的情況)。
Firefox 字型警示分析
再次檢視我們的 Firefox 字型警示,開啟該行以檢視更多詳細資訊。特別是,你會看到一個時間軸顯示:
JA3 簽名規則詳情
這裡顯示了實際觸發警示的規則:
alert tls $HOME_NET any -> $EXTERNAL_NET any (msg:"ET JA3 Hash - Possible Malware - Fake Firefox Font Update"; ja3_hash; content:"a0e9f5d64349fb13191bc781f81f42e1"; metadata:former_category JA3; reference:url,github.com/trisulnsm/trisul-scripts/blob/master/lua/frontend_scripts/reassembly/ja3/prints/ja3fingerprint.json; reference:url,www.malware-traffic-analysis.net; classtype:unknown; sid:2028371; rev:2; metadata:created_at 2019_09_10, updated_at 2019_10_29;)
本質上,這條規則比對的是「符合此 JA3 雜湊值的外發流量」。在 https://ja3er.com 上查詢這個雜湊值,我們發現它對應的是基本的 Windows 10 TLS 談判,報告來自以下使用者代理:
- Excel/16.0(計數:375,最後一次出現:2021-02-26 07:26:44)
- WebexTeams(計數:38,最後一次出現:2021-06-30 16:17:14)
- Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1(計數:31,最後一次出現:2020-06-04 09:58:02)
這進一步證實了這個簽名的價值有限;我們當初決定直接停用它是正確的。如前所述,你可能會考慮將其編輯為不同的規則,但在這個特定的案例中,要找到合適的 SNI 字串或 CA 組合將是一場永無止境的「打地鼠」遊戲。
管理顯示模式
另一個值得探索的顯示模式是「Management」顯示模式:
這個頁面以另一種格式顯示相同的資料。點選同一個 Firefox 字型警示(2028371),我們可以獲得關於該警示背後的活動更全面的檢視:
透過這些不同的顯示模式和功能,Suricata IPS 和 EveBox 為網路安全監控和管理提供了強大的工具。
建構入侵防禦系統(IPS)規則的深度解析
在前面的章節中,我們已經探討了 Suricata IPS 的基本操作與管理,現在讓我們深入瞭解如何建構一個 IPS 規則。IPS 規則的建構是根據 Snort 規則的語法,這使得 Suricata 能夠與 Snort 規則相容,並且能夠有效地偵測和防禦網路中的潛在威脅。
IPS 規則的基本結構
一個典型的 IPS 規則由幾個部分組成,包括規則標頭(Rule Header)、訊息(Message)、偵測(Detection)、參考(References)、簽名 ID(Signature ID)以及後設資料(Metadata)。以下是一個具體的範例:
alert dns $HOME_NET any -> any (msg:"ET INFO Observed DNS Query to .cloud TLD";
dns.query; content:".cloud"; nocase; endswith;
reference:url,www.spamhaus.org/statistics/tlds/; classtype:bad-unknown;
sid:2027865; rev:4; metadata:affected_product Any, attack_target Client_Endpoint,
created_at 2019_08_13, deployment Perimeter, former_category INFO,
signature_severity Major, updated_at 2020_09_17;)
內容解密:
alert dns $HOME_NET any -> any:這是規則標頭,指定了規則的動作(alert)、協定(dns)、來源網路($HOME_NET)、來源埠(any)以及目的網路和埠(any -> any)。msg:"ET INFO Observed DNS Query to .cloud TLD":定義了當規則觸發時顯示的訊息,描述了觸發規則的事件。dns.query; content:".cloud"; nocase; endswith;:這部分定義了偵測的條件,檢查 DNS 查詢中是否包含 “.cloud” 字尾,不區分大小寫。reference:url,www.spamhaus.org/statistics/tlds/:提供了與該規則相關的參考資訊,通常是 URL 或 CVE 編號。classtype:bad-unknown; sid:2027865; rev:4;:指定了規則的分類別、簽名 ID 和修訂版本。metadata:affected_product Any, attack_target Client_Endpoint, ...:包含了規則的後設資料,如受影響的產品、攻擊目標、建立日期等。
自定義 IPS 規則
為了滿足特定組織的安全需求,自定義 IPS 規則是必要的。例如,我們可以建立一條規則來偵測 Telnet 流量,因為 Telnet 使用明文傳輸憑證和資料,存在嚴重的安全風險。
範例:偵測 Telnet 流量的規則
alert tcp any -> $HOME_NET [23,2323,3323,4323] (msg:"LOCAL TELNET SUSPICIOUS CLEAR TEXT PROTOCOL";
flow:to_server; classtype:suspicious-login; sid:1000100; rev:1;)
alert tcp $HOME_NET any -> any [23,2323,3323,4323] (msg:"LOCAL TELNET SUSPICIOUS CLEAR TEXT PROTOCOL";
flow:to_server; classtype:suspicious-login; sid:1000101; rev:1;)
內容解密:
alert tcp any -> $HOME_NET [23,2323,3323,4323]:偵測從任何來源到 $HOME_NET 網路的 TCP 連線,目標埠為 23 或其他常見的 Telnet 埠。msg:"LOCAL TELNET SUSPICIOUS CLEAR TEXT PROTOCOL":當規則觸發時顯示的訊息,指出偵測到可疑的明文 Telnet 協定。flow:to_server; classtype:suspicious-login;:指定了流的方向和規則的分類別,表示這是一個可疑的登入嘗試。sid:1000100; rev:1;:自定義規則的簽名 ID 和修訂版本,SID 範圍在 1000000-1999999 之間是保留給本地自定義規則使用的。
更新與載入自定義規則
- 將自定義規則加入
/etc/suricata/rules/local.rules檔案中。 - 更新
/etc/suricata/suricata.yaml組態檔案,確保包含local.rules檔案。 - 執行
sudo selks-update和sudo suricata-update --local /etc/suricata/rules/local.rules更新規則集。 - 使用
suricatasc -c reload-rules或suricatasc -c ruleset-reload-nonblocking重新載入規則集。
入侵防禦系統(IPS)規則建構與被動流量監控
自定義IPS規則的觸發與最佳化
在前面的章節中,我們已經討論瞭如何建構一個自定義的IPS規則,接下來我們將探討當這個規則被觸發時會發生什麼。假設我們已經建立了一個規則,並且在EveBox中觀察到相關的警示。
警示觸發例項分析
當自定義IPS規則被觸發時,EveBox中的警示會顯示相關的事件資訊,如下圖所示: 此圖示顯示了多個警示事件,其中包括內部主機之間的通訊以及對外網的連線。值得注意的是,第一個規則被觸發了兩次,原因可以透過回顧規則定義來理解。這表明最佳化自定義規則以確保每個條件只觸發一次警示或阻擋是非常重要的。
事件詳細資訊分析
進一步展開第一個警示事件(注意SID編號),我們可以看到詳細的事件資訊: 在這個事件詳情中,我們觀察到完整的封包捕捉記錄。需要注意的是,在瀏覽這些PCAP檔案時可能會看到有效的憑證資訊,因此需要格外小心。
被動流量監控
除了主動檢測攻擊流量外,入侵防禦系統還可以透過被動流量監控來增強安全性。被動漏洞掃描器(PVS)透過收集網路封包和握手資料(如JA3、SSH指紋等)來識別作業系統和應用程式。這種方法可以用於發現其他方法可能遺漏的問題應用程式或主機。
被動流量監控的優勢
- 識別過時應用程式:例如,PVS可以檢測到過時的瀏覽器或SSH客戶端。
- 發現未登記主機:即使這些主機沒有被其他庫存方法記錄下來,只要它們與網際網路或其他內部主機進行通訊,PVS工具就可以收集到相關資料。
使用P0F進行被動流量監控
P0F是一種常見的開源PVS解決方案。要執行P0F,首先需要將所使用的網路介面設為混雜模式,以便讀取和處理所有封包,而不僅僅是發往當前主機的封包。
P0F使用範例
$ sudo ifconfig eth0 promisc
$ sudo p0f –i eth0
輸出結果分析
P0F的輸出結果包含了客戶端的詳細資訊,例如作業系統型別、距離等:
.-[ 192.168.122.121/63049 -> 52.96.88.162/443 (syn) ]-
|
| client = 192.168.122.121/63049
| os = Mac OS X
| dist = 0
| params = generic fuzzy
| raw_sig = 4:64+0:0:1250:65535,6:mss,nop,ws,nop,nop,ts,sok,eol+1:df:0
|
`
---
-
將P0F輸出重定向到檔案並進行分析
您可以將P0F的輸出結果重定向到一個檔案中,然後使用grep等工具篩選出有用的資訊,例如識別出的作業系統:
$ sudo p0f -i eth0 -o pvsout.txt
$ sudo cat pvsout.txt | grep os= | grep -v ???
解析結果以取得庫存清單
透過進一步處理P0F的輸出結果,可以生成一個簡潔的主機清單:
$ sudo cat pvsout.txt | grep os= | grep -v ??? | sed -e 's#/#\|#g' | cut -d "|" -f 4,9 | sort | uniq
cli=192.168.122.113|os=Linux 2.2.x-3.x
cli=192.168.122.121|os=Mac OS X
cli=192.168.122.129|os=Linux 2.2.x-3.x
內容解密:
- 混雜模式:將網路介面設為混雜模式,使其能夠讀取和處理所有經過的封包,而不僅限於發往本機的封包。
p0f命令引數:-i eth0指定使用的網路介面,-o pvsout.txt將輸出結果儲存到pvsout.txt檔案中。- 篩選作業系統資訊:使用
grep os=篩選包含作業系統資訊的行,並進一步使用grep -v ???排除不確定的結果。 - 結果解析:透過
sed、cut、sort和uniq命令組合,解析出主機的IP和對應的作業系統資訊,形成簡潔的庫存清單。
使用 Zeek 蒐集網路後設資料的實務範例
Zeek(前身為 Bro)並非傳統意義上的入侵防禦系統(IPS),但它能作為 IPS 的輔助工具,用於日誌記錄平台和網路管理。讓我們進一步探討如何利用 Zeek 蒐集有價值的網路後設資料。
安裝 Zeek 的選項
首先,有兩種主要的安裝方式可供選擇:
- 在現有的 Linux 主機上安裝 Zeek,請參考官方安裝:https://docs.zeek.org/en/master/install.html
- 安裝 Security Onion 發行版,並在安裝過程中選擇 Zeek:https://download.securityonion.net 和 https://docs.securityonion.net/en/2.3/installation.html
Security Onion 預設會與 Suricata 一起安裝 Zeek。在較小的環境中,這樣的整合相當有意義,因為它能將多個工具的資訊集中在同一台主機上,方便管理和分析。
蒐集網路後設資料
Zeek 的一大特色是能夠蒐集豐富的網路後設資料。讓我們透過一個實際範例來展示其功能。
測試 SSL 錯誤偵測
首先,在 Security Onion 環境中執行一段時間後,我們可以透過瀏覽器造訪 https://badssl.com 來測試各種 SSL 錯誤條件,模擬真實的網路活動。
檢視 Zeek 蒐集的 SSL 後設資料
接著,透過 Security Onion 的主介面進入 Kibana,並在 Dataset 窗格中選擇 SSL 協定,即可檢視 Zeek 蒐集到的 SSL 相關資料。這些資料包括了目的埠(Destination Ports)等重要資訊。
篩選和深入分析
我們可以進一步篩選資料,例如移除目的埠 443 以外的流量。點選「-」號即可將該埠的流量從報表中移除。隨後,在日誌窗格中展開特定事件,便能看到該次連線的詳細後設資料,包括地理位置資訊和 SSL 憑證詳情。
利用儀錶板進行分析
在 Kibana 中,我們可以利用預先組態好的數百個儀錶板來快速檢視和分析資料。例如,輸入「ssl」關鍵字,即可找到與 SSL 相關的儀錶板。「Security Onion - SSL」儀錶板提供了豐富的 SSL/TLS 連線資訊,包括伺服器名稱、驗證狀態等。
深入探索 Discover Analytics 頁面
在 Kibana 的 Discover Analytics 頁面,我們可以進一步探索和分析網路流量資料。透過搜尋欄輸入關鍵字(如「ssl」),並新增特定的欄位(如 ssl.version 和 ssl.certificate.issuer),即可構建出所需的查詢結果。
結合地理資訊進行分析
我們還可以結合地理資訊來過濾和分析資料。例如,建立一個顯示 TLS 版本、來源 IP、目的 IP、國家和城市的列表,並進一步篩選出非美國的目的地。這種靈活的篩選方式能夠幫助我們快速找出可疑的網路活動。