导语:当组成员发生变化时,你会收到通知吗?组成员的变化是很重要的,尤其是域管理员组。本文介绍了如果识别这些变化,并进行检查。当组成员发生变化时,应该通知管理员——因为这可能是恶意用户发起了提权攻击。

当组成员发生变化时,你会收到通知吗?组成员的变化是很重要的,尤其是域管理员组。本文介绍了如果识别这些变化,并进行检查。当组成员发生变化时,应该通知管理员——因为这可能是恶意用户发起了提权攻击。通知的形式可以是消息或者邮件。采用的方法是Powershell编程,然后把脚本放入计划任务中。

目标

想达到的目标是:

unbenannt7.jpg

当Domain Admins Group成员发生变化时,通过邮件、消息或其他形式通知管理员。

62.png

或者:

12.jpg

简介

首先,要提取所有的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

看一下两个文件的内容:

34.png

下一步是比较两个文件的内容,本文使用的是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

45.png

另一种办法是把组成员保存在一个变量中,这种方法更好一些。

$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组中。

52.png

是的,弹窗显示,检测到了这个添加用户的行为。

保存脚本为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"}

unbenannt53.png

把脚本加入计划任务并运行。

源链接

Hacking more

...