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

首先看一下EventID 4662的樣子shell

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

該日誌出如今對Active Directory Object設置SACL時會出現安全

0x02  爲何要監控該日誌呢?架構

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

二、運維過程當中的錯誤操做溯源運維

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

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

0x04  須要重點關注哪些字段?ui

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進行快速匹配,從而清楚的瞭解「到底修改了什麼?」

相關文章
相關標籤/搜索