PowerShell+计划任务:当管理组成员变化时通知管理员 - 嘶吼 RoarTalk – 网络安全行业综合服务平台,4hou.com

PowerShell+计划任务:当管理组成员变化时通知管理员

ang010ela 技术 2017-12-12 15:13:15
207599
收藏

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

当组成员发生变化时,你会收到通知吗?组成员的变化是很重要的,尤其是域管理员组。本文介绍了如果识别这些变化,并进行检查。当组成员发生变化时,应该通知管理员——因为这可能是恶意用户发起了提权攻击。通知的形式可以是消息或者邮件。采用的方法是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 SecurityAlert@domain.com -To p.gruenauer@domain.com -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

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

  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论

 
本站4hou.com,所使用的字体和图片文字等素材部分来源于原作者或互联网共享平台。如使用任何字体和图片文字有侵犯其版权所有方的,嘶吼将配合联系原作者核实,并做出删除处理。
©2022 北京嘶吼文化传媒有限公司 京ICP备16063439号-1 本站由 提供云计算服务