域控安全-EventID 4662&Powershell將Schema下Objects的schemaIDGUID屬性離線儲存

大姐姐救救我發表於2020-04-16

首先看一下EventID 4662的樣子

 0x01  什麼情況下會產生該日誌呢?

該日誌出現在對Active Directory Object設定SACL時會出現

0x02  為什麼要監控該日誌呢?

1、非法人員入侵後的異常提權(更多安全稽核監控建議詳見https://docs.microsoft.com/en-us/windows/security/threat-protection/auditing/appendix-a-security-monitoring-recommendations-for-many-audit-events

2、運維過程中的錯誤操作溯源

0x03  該日誌中每一項的含義是什麼?

詳細的日誌含義請參考微軟官網(https://docs.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4662

0x04  需要重點關注哪些欄位?

Account Name:具體操作物件是誰? 個人認為高低許可權帳號均應被監控,萬一是低許可權帳號被提權呢?

Access Mask:具體的操作型別是什麼?

Note  GUID:具體操作的物件是什麼?這裡我們打算展開說一下

0x05  GUID

UUID的二進位制編碼因系統而異。許多系統完全以大端序(big-endian)編碼UUID。Microsoft在其COM/OLE庫中對UUID進行編組,使用混合端格式,其中UUID的前三組是小端序/小尾序(little-endian),後兩組是大端序/大尾許(big-enaian),這也是為什麼日誌中顯示出來的GUID要通過ldap filter是需要進行轉換(前三組每個部分都需要更改(反轉)位元組順序,而後兩組不需要),例如日誌中的“bf967a86-0de6-11d0-a285-00aa003049e2”放到ldap 搜尋裡要轉換成“\ 86 \ 7a \ 96 \ bf \ e6 \ 0d \ d0 \ 11 \ a2 \ 85 \ 00 \ aa \ 00 \ 30 \ 49 \ e2”。

但是這裡存在一個問題,我們一般會將日誌集中(具體工具看個人習慣),然後通過例如storm此類工具進行日誌分析,分析的過程中我們肯定不能一邊分析一邊去轉換日誌中的guid,然後再去查詢每個guid的含義,這樣會大大降低日誌檢索的時效性,於是我們想到了去離線這些GUID的含義,於是翻遍微軟所有文件,沒有一個地方有統一的彙總,看來只能自己搞了。

0x06  如何離線儲存所有GUID以及對應的Object

首先,該GUID對應AD中的屬性名稱是schemaIDGUID,我們從AD的圖形介面看到的也是八進位制的格式。

我們嘗試通過Powershell去檢索該屬性對應的值,發現出來的結果也是10進位制的

這裡我們需要的GUID相差甚遠,所以我們需要想辦法轉譯他們,進行人工翻譯:

#將架構資訊全部儲存

$Schema = [ADSI]("LDAP://CN=Schema,CN=Configuration,DC=xxx,DC=xxx")

$CNs = $Schema.Children

#迴圈遍歷所有物件的schemaIDGUID

foreach($CN in $CNs){
    $name = $CN.adminDisplayName
    $guidstring = $null
    $a = $CN.schemaIDGUID -split " "
    $b = $a.Length
    for ($i = 0; $i -lt $b; $i++) {
        $c = $a[$i]
#轉成十進位制
$number = [Convert]::ToInt32("$c", 10)
   #轉成十六進位制 
$number = $number.ToString('X')
#這塊有個比較噁心的地方,Powershell輸出的十六進位制如果開頭是0,則會去掉該0,直接顯示下一個數字,下面的判斷其實可以優化,可以去掉第一個if,只要不足2位直接新增0即可
if ($number -eq "0") { $number = "00" } if ($number.Length -lt "2") { $number = "0" + $number }
#將每組10進位制轉換16進位制後的字元進行拼接
$guidstring += $number }
#將拼接的字元轉為16進位制,然後再轉成guid的形式 [System.Byte[]]
$byte = ($guidstring -split '(..)' | ? {$_} | % { [System.Convert]::ToInt64($_, 16)}) [System.Guid]$guid = new-object System.Guid(, $byte)
#在螢幕中輸出guid以及該object對應的名稱,當然也可以直接輸入到文字中進行儲存 Write
-Host $guid,$name

通過以上方式,我們就可以得到全部架構物件的schemaIDGUID屬性了,我們可以將其組成一個List,方便我們寫日誌監控時對日誌中的guid進行快速匹配,從而清楚的瞭解“到底修改了什麼?”

 

 

 

 

相關文章