域控安全-EventID 4662&Powershell将Schema下Objects的schemaIDGUID属性离线保存

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

域控安全-EventID 4662&Powershell将Schema下Objects的schemaIDGUID属性离线保存

大姐姐救救我   2020-04-17 我要评论

首先看一下EventID 4662的样子

 0x01  什么情况下会产生该日志呢?

该日志出现在对Active Directory Object设置SACL时会出现

0x02  为什么要监控该日志呢?

1、非法人员入侵后的异常提权(更多安全审核监控建议详见https:/https://img.qb5200.com/download-x/docs.microsoft.com/en-us/windows/security/threat-protection/auditing/appendix-a-security-monitoring-recommendations-for-many-audit-events)

2、运维过程中的错误操作溯源

0x03  该日志中每一项的含义是什么?

详细的日志含义请参考微软官网(https:/https://img.qb5200.com/download-x/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进行快速匹配,从而清楚的了解“到底修改了什么?”

 

 

 

 

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们