昨天講完帳號身上會發生的幾件事。今天想講 PowerShell——這是攻擊者很愛用、也是我自己覺得最難單憑「看到就抓」判斷的一塊,因為合法的系統管理工作也大量用它。
兩種不同的紀錄方式,看到的東西不一樣,PowerShell 相關的可疑活動,理論上有兩種資料來源可以看:
第一種是程序建立事件(4688),看得到命令列。 這需要另外開啟命令列稽核,不是預設就有。它記錄的是「這個程序被啟動時,打的完整指令是什麼」。
第二種是 PowerShell 自己的操作記錄通道,裡面有 Script Block Logging(4104)跟 Module Logging(4103)。這個更進一步,如果啟用,可以看到實際被執行的腳本內容,不只是啟動時的那行命令。
這兩者的差別很重要:如果攻擊者把要執行的內容編碼過(例如用 -EncodedCommand 帶一段 Base64),單看命令列只會看到一串看不懂的亂碼,不知道實際做了什麼;但如果 Script Block Logging 有開,PowerShell 引擎在真正執行前會把解碼後的內容記下來,這時候才看得到「這段程式碼實際上在做什麼」。命令列告訴你「怎麼啟動的」,Script Block 告訴你「啟動之後做了什麼」——兩者互補,少一個都會少看到一部分事實。
值得留意的線索,但不是黑名單
一些常見的可疑旗標組合:-EncodedCommand、-ExecutionPolicy Bypass、-WindowStyle Hidden、IEX 或 Invoke-Expression、DownloadString、FromBase64String。如果父程序是 Office 應用程式(例如 WINWORD)而不是使用者手動開的終端機,可疑程度又更高一層。
這裡想強調一件事,免得這篇讀起來像是「看到這些關鍵字就抓」:這些是線索,不是黑名單。 系統管理的自動化腳本、軟體安裝程式、CI/CD 部署工具,一樣會大量用到這些旗標——-ExecutionPolicy Bypass 在很多合法的部署腳本裡也很常見。
真正該問的問題是:誰啟動的? 父程序是什麼? 有沒有下載外部內容? 有沒有寫入檔案或建立持久化? 這個行為符不符合這台主機平常的使用模式? 單一旗標命中,只代表「值得多看一眼」,不代表「已經確認是惡意」。
老實說,這一塊我目前接得還不完整...
寫到這裡,得回頭老實交代一件事。Day 6 提過,我用 GPO 把 Script Block Logging 開起來了,登錄機碼也確認寫進去了——但 Wazuh 這邊的採集設定,當時還沒有把 PowerShell 那個操作記錄通道加進去。這個缺口我在 Day 6 說會先放著,目前還沒有處理。也就是說,即使 Windows 端已經在產生 4104 事件,我現在如果去查 Wazuh,還是看不到這些內容——只能直接在受監控主機上開 Event Viewer 才看得到。
(網上找的4104範例)
4688 這邊也還有一件我沒有確認過的事:命令列要出現在 4688 事件裡,需要另外開一個「在程序建立事件中包含命令列」的設定,這個我目前也還沒有確認在這個環境裡有沒有打開。所以嚴格來說,PowerShell 這兩種紀錄方式,我目前都還沒辦法保證在 Wazuh 上真的看得到完整內容——一個是採集通道沒加,一個是命令列稽核設定沒確認。這篇算是把「該看什麼」講清楚,但「看不看得到」還是兩個懸而未決的問題。
明天
接下來想開始講具體的攻擊情境,先從 RDP 暴力破解這個比較完整的鏈開始。
明天見。