导语:当组成员发生变化时,你会收到通知吗?组成员的变化是很重要的,尤其是域管理员组。本文介绍了如果识别这些变化,并进行检查。当组成员发生变化时,应该通知管理员——因为这可能是恶意用户发起了提权攻击。
当组成员发生变化时,你会收到通知吗?组成员的变化是很重要的,尤其是域管理员组。本文介绍了如果识别这些变化,并进行检查。当组成员发生变化时,应该通知管理员——因为这可能是恶意用户发起了提权攻击。通知的形式可以是消息或者邮件。采用的方法是Powershell编程,然后把脚本放入计划任务中。
目标
想达到的目标是:
当Domain Admins Group成员发生变化时,通过邮件、消息或其他形式通知管理员。
或者:
简介
首先,要提取所有的Domain Admin 组成员。
Get-ADGroupMember-Identity "Domain Admins").Name
也可以在Admins.txt文件中查看:
(Get-ADGroupMember-Identity "Domain Admins").Name | Out-File C:TempAdmins.txt
现在向组中添加一个新的用户,名字是Arnold Schwarzenberg。
(Get-ADGroupMember -Identity "Domain Admins").Name | Out-File C:TempAdmins2.txt
然后保存在另一个文件Admins2.txt中
(Get-ADGroupMember -Identity "Domain Admins").Name | Out-File C:TempAdmins2.txt
看一下两个文件的内容:
下一步是比较两个文件的内容,本文使用的是Compare-Object。
$a=Get-Content C:TempAdmins.txt $b=Get-Content C:TempAdmins2.txt $differ=Compare-Object -ReferenceObject $a -DifferenceObject $b | Select-Object -ExpandProperty InputObject
另一种办法是把组成员保存在一个变量中,这种方法更好一些。
$ref=(Get-ADGroupMember -Identity "Domain Admins").Name $diff=(Get-ADGroupMember -Identity "Domain Admins").Name
创建脚本进行比较
打开PowerShell ISE,将上面的代码都放入脚本中。第一个脚本是模拟管理员桌面的消息。检查成员然后等待1小时,然后再次检查并比对结果。文中我们使用SideIndicator。如果要查询值的变化,那么Indicator很有用。有效值是 => and <=
$ref=(Get-ADGroupMember -Identity "Domain Admins").Name Start-Sleep -Seconds 86398 $diff=(Get-ADGroupMember -Identity "Domain Admins").Name $result=(Compare-Object -ReferenceObject $ref -DifferenceObject $diff | Where-Object {$_.SideIndicator -eq "=>"} | Select-Object -ExpandProperty InputObject) -join ", " If ($result) {msg * "The following user was added to the Domain Admins Group: $result"}
第二个脚本是发送告警邮件:
$ref=(Get-ADGroupMember -Identity "Domain Admins").Name Start-Sleep -Seconds 86398 $diff=(Get-ADGroupMember -Identity "Domain Admins").Name $date=Get-Date -Format F $result=(Compare-Object -ReferenceObject $ref -DifferenceObject $diff | Where-Object {$_.SideIndicator -eq "=>"} | Select-Object -ExpandProperty InputObject) -join ", " If ($result) {Send-MailMessage -From [email protected] -To [email protected] -SmtpServer EX01 -Subject "Domain Admin Membership Changes | $result was added to the Group" -Body "This alert was generated at $date" -Priority High}
注意最后1行,你必须填充这些值。还要确保你的邮件服务器接收来自你电脑的邮件。
测试
为了测试,我们简化了脚本,并设定PowerShell休眠20秒。在这段时间,快速创建了一个用户并加入到domain admins组中。
是的,弹窗显示,检测到了这个添加用户的行为。
保存脚本为PowerShell文件。
加入计划任务
不论你优先选择什么形式的通知,都要加入到计划任务中,比如每60分钟执行一次。注意代码第一行的Argument,第二行的RepititionInterval和第4行的UserId。必须要手动修改这些值。
$Action=New-ScheduledTaskAction -Execute "powershell" -Argument "C:Alertsdomain_admins.ps1" $Trigger=New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Seconds 86400) -RepetitionDuration ([timespan]::MaxValue) $Set=New-ScheduledTaskSettingsSet $Principal=New-ScheduledTaskPrincipal -UserId "sid-500administrator" -LogonType S4U $Task=New-ScheduledTask -Action $Action -Trigger $Trigger -Settings $Set -Principal $Principal Register-ScheduledTask -TaskName "Domain Admins Check" -InputObject $Task -Force
创建基于基准的脚本
如果管理组的成员很少变化,那么我建议创建一个基准。首先把基准保存为文件。
(Get-ADGroupMember -Identity "Domain Admins").Name | Out-File C:TempAdmins.txt
创建比较组成员与基准的脚本。
$base=Get-Content C:TempAdmins.txt $diff=(Get-ADGroupMember -Identity "Domain Admins").Name $result=(Compare-Object -ReferenceObject $base -DifferenceObject $diff | Where-Object {$_.SideIndicator -eq "=>"} | Select-Object -ExpandProperty InputObject) -join ", " If ($result) {msg * "The following user was added to the Domain Admins Group: $result"}
把脚本加入计划任务并运行。