iT邦幫忙

2026 iThome 鐵人賽

DAY 8
0
AI Security

把 AI 接進 SOC系列 第 8

【Day 8】自己寫偵測規則

  • 分享至 

  • xImage
  •  

昨天講完告警的結構跟等級。今天想講我自己寫的那批自訂規則——為什麼要自己寫、內容大概涵蓋什麼,以及中間一個讓我卡了一陣子、後來才想通的設計問題。


為什麼要自己寫規則?
Wazuh 內建的規則集涵蓋範圍很廣,但並沒有針對這個環境想觀察的行為(帳號建立、群組異動、下載落地、bind shell 跡象這類)做得很細,尤其是「這幾件事發生在同一個人身上、時間又接近」這種跨事件的關聯判斷,內建規則本來就不是為了我的情境設計的。所以自己寫了一批,目前是 32 條,編號範圍是我自己保留的一段區間,不跟內建規則衝突。

大致涵蓋幾類:可疑下載與 payload 落地、bind shell 跡象、帳號建立與群組異動(成功與嘗試分開)、常見防禦削弱動作(清 log、關防火牆、Defender 排除項)、暴力破解與破解成功,以及三條專門處理「跨事件關聯」的攻擊鏈規則——也就是 Day 4 那筆 110160 用到的那條。

下圖為Invoke-CELL-WazuhAttackSimulation.ps1 這支腳本的執行畫面:
https://ithelp.ithome.com.tw/upload/images/20260904/20178898jtjkZN1fQh.png
這是我寫的一支測試腳本,可以在受監控主機上一次產生多條規則需要的遙測,不對外連線、不下載任何東西,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 條規則現在能不能全部信賴,答案是不能,目前只有一條鏈是我真的看著它從頭到尾走過。


明天
接下來想講一個我自己量化過的數字:在我的環境裡,高等級告警裡有多少比例根本不是攻擊。

明天見。


上一篇
【Day 7】Wazuh告警長什麼樣子、等級怎麼定?
下一篇
【Day 9】高等級告警,不一定是攻擊
系列文
把 AI 接進 SOC9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言