昨天講完告警的結構跟等級。今天想講我自己寫的那批自訂規則——為什麼要自己寫、內容大概涵蓋什麼,以及中間一個讓我卡了一陣子、後來才想通的設計問題。
為什麼要自己寫規則?
Wazuh 內建的規則集涵蓋範圍很廣,但並沒有針對這個環境想觀察的行為(帳號建立、群組異動、下載落地、bind shell 跡象這類)做得很細,尤其是「這幾件事發生在同一個人身上、時間又接近」這種跨事件的關聯判斷,內建規則本來就不是為了我的情境設計的。所以自己寫了一批,目前是 32 條,編號範圍是我自己保留的一段區間,不跟內建規則衝突。
大致涵蓋幾類:可疑下載與 payload 落地、bind shell 跡象、帳號建立與群組異動(成功與嘗試分開)、常見防禦削弱動作(清 log、關防火牆、Defender 排除項)、暴力破解與破解成功,以及三條專門處理「跨事件關聯」的攻擊鏈規則——也就是 Day 4 那筆 110160 用到的那條。
下圖為Invoke-CELL-WazuhAttackSimulation.ps1 這支腳本的執行畫面:
這是我寫的一支測試腳本,可以在受監控主機上一次產生多條規則需要的遙測,不對外連線、不下載任何東西,TCP listener 只綁 loopback,而且跑完會自動把建立的測試帳號、群組成員資格、服務通通清掉。
下面舉兩條實際的規則,看一下寫法大概長什麼樣子:
<!-- 帳號建立成功:Security 4720 -->
<rule id="110121" level="8">
<if_group>adduser</if_group>
<field name="win.system.eventID">^4720$</field>
<description>使用者帳號建立成功:$(win.eventdata.targetUserName)</description>
<mitre><id>T1136</id></mitre>
<group>windows,account_created_success,</group>
</rule>
<!-- 攻擊鏈:同操作者短時間內新建帳號後加入特權群組 -->
<rule id="110160" level="14">
<if_sid>110131,110132,110133</if_sid>
<same_field>win.eventdata.subjectUserName</same_field>
<description>同一操作者短時間內新建帳號後將其加入特權群組</description>
<mitre><id>T1098</id><id>T1136</id></mitre>
<group>attack_chain,</group>
</rule>
第一條是單點規則,單獨看只代表「有人新增了一個帳號」。第二條是關聯規則,靠 if_sid 接住前面幾條規則的命中結果,再用 same_field 確認是同一個操作者做的——這條就是 Day 4 那則等級被拉高的告警的真正來源。
卡住的地方:規則有覆蓋,但關聯鏈收不到訊號
第一版寫完、部署上去之後,我原本以為告警有出現就代表沒問題。後來想認真測一次關聯規則到底能不能串起來,才發現不對勁。
問題出在:我原本讓這些自訂規則的父規則掛在一個很籠統的內建規則上。但實際的 Windows 事件進來的時候,會先命中內建規則集裡更具體的「手足規則」——例如 4720 這個事件,其實會先被一條專門處理帳號建立的內建規則接住,而不是我掛的那條籠統父規則。
這件事的後果是:告警表面上看起來完全沒問題,因為那條更具體的內建規則本來就會產生告警,系統看起來運作正常。但我自訂規則裡靠 if_matched_sid 去接前一條規則訊號的關聯鏈,因為訊號來源根本不是它預期的那條,永遠等不到觸發條件——覆蓋是有的,但關聯鏈是死的,而且從告警畫面上完全看不出來。
我後來把幾條自訂規則改成掛在對應的內建群組上(用 if_group 而不是死綁一個籠統的 if_sid),讓它們接的是實際命中的那條規則,關聯鏈才真的通了。這件事教我一個道理:「規則有涵蓋」跟「規則真的接得上關聯鏈」是兩回事,前者從告警表面看得出來,後者要實際測過整條鏈才知道。
目前驗證到哪裡:
32 條規則裡,我目前用真實事件實機驗證過的,是 Day 4 提到的那條鏈:新增帳號命中 110121,加入 Administrators 之後命中關聯規則 110160,而且從 110160 的命中結果可以反推,中間那條 110131(加入 Administrators 成功)也確實被接住了。
其他規則呢,目前多數還停在「語法正確、邏輯上該接得上」的階段,沒有走過真實事件驗證,尤其是暴力破解那幾條跟 bind shell 那幾條——這些如果要測,得真的模擬一次攻擊行為,我還沒排到(留給以後的我啦)。所以如果你問我這 32 條規則現在能不能全部信賴,答案是不能,目前只有一條鏈是我真的看著它從頭到尾走過。
明天
接下來想講一個我自己量化過的數字:在我的環境裡,高等級告警裡有多少比例根本不是攻擊。
明天見。