密码喷射调查

本文介绍了如何识别和调查组织内部存在的密码喷射攻击,以及如何采取必要的补救措施来保护信息,并最大程度地降低未来的风险。

本文包含以下各节:

  • 先决条件:介绍在开始调查之前需要完成的特定要求。 例如,应启用的日志记录、所需的角色和权限,等等。
  • 工作流:显示执行此调查应遵循的逻辑流。
  • 清单:包含流程图中每个步骤的任务列表。 此清单有助于在高度管控的环境中验证你已完成的工作或仅用作自我质量检验的标准。
  • 调查步骤:包括用于此特定调查的详细分步指南。
  • 恢复:包含有关如何从密码喷射攻击中恢复/缓解的高级别步骤。
  • 参考:包含其他阅读和参考资料。

必备条件

在开始调查之前,请确保已完成日志和警报的设置以及其他系统需求的设置。

对于 Azure AD 监视,请按照 Azure AD SecOps 指南中的建议和指南进行操作。

设置 ADFS 日志记录

ADFS 2016 上的事件日志记录

默认情况下,Windows Server 2016 中的 Microsoft Active Directory 联合身份验证服务 (ADFS) 启用了基本的审核级别。 在基本审核级别下,对于单个请求,管理员最多可看到五个事件。 将日志记录设置为最高级别,并将 AD FS (& 安全) 日志发送到 SIEM,以与 AD 身份验证和 Azure AD 相关联。

若要查看当前审核级别,可使用以下 PowerShell 命令:

Get-AdfsProperties

adfs

此表包含了可用的审核级别。

审核级别 PowerShell 语法 说明
Set-AdfsProperties -AuditLevel - None 审核已禁用,不会记录任何事件
基本(默认) Set-AdfsProperties -AuditLevel - Basic 对于单个请求,会最多记录 5 个事件
详细 Set-AdfsProperties -AuditLevel - Verbose 记录所有事件。 这会记录每个请求的大量数据。

若要提高或降低审核级别,请使用以下 PowerShell 命令:

Set-AdfsProperties -AuditLevel

设置 ADFS 2012 R2/2016/2019 安全日志记录

  1. 单击“开始”,导航到“程序”>“管理工具”,然后单击“本地安全策略”。

  2. 导航到“安全设置\本地策略\用户权限管理”文件夹,然后双击“生成安全审核”

  3. 在“本地安全设置”选项卡中,验证是否已列出 ADFS 服务帐户。 如果该帐户不存在,请单击“添加用户或组” ,并将帐户添加到列表中,然后单击“确定”。

  4. 若要启用审核,请使用提升的权限打开命令提示符,并运行以下命令:

    auditpol.exe /set /subcategory:"Application Generated" /failure:enable /success:enable
    
  5. 关闭“本地安全策略”

  6. 接下来,打开 ADFS 管理管理单元,单击“ 开始”,导航到 “程序 > 管理工具”,然后单击 “ADFS 管理”。

  7. 在“操作”窗格中,单击“编辑联合身份验证服务属性”

  8. “联合身份验证服务属性”对话框中,单击“事件”选项卡。

  9. 选中“成功审核”“失败审核”复选框。

  10. 单击“确定”以完成并保存配置。

安装用于 ADFS 的 Azure AD Connect Health

用于 ADFS 的 Azure Active Directory (Azure AD) Connect Health 代理可帮助用户更清楚地了解联合身份验证环境。 该应用提供了多个预配置的仪表板,例如使用情况、性能监视和风险 IP 报告。

若要安装 ADFS Connect Health,请仔细阅读 Azure AD Connect Health 使用要求,然后安装 Azure ADFS Connect Health 代理

使用 ADFS 风险 IP 报告工作簿设置有风险的 IP 警报

配置 ADFS 的 Azure AD Connect Health 后,应使用 ADFS 风险 IP 报告工作簿和 Azure Monitor 监视和设置警报。 使用此报表的好处是:

  • 检测超过基于密码的登录失败阈值的 IP 地址。
  • 支持由于密码错误或 Extranet 锁定状态而导致登录失败。
  • 支持通过 Azure 警报启用警报。
  • 与组织的安全策略匹配的可自定义阈值设置。
  • 可自定义的查询和扩展的可视化效果以供进一步分析。
  • 扩展了以前的风险 IP 报表中的功能,而以前的风险 IP 报表将在 2022 年 1 月 24 日之后弃用。

在 Microsoft Sentinel 上设置 SIEM 工具警报

若要设置 SIEM 工具警报,请详细阅读有关现成警报的教程。

SIEM 与 Microsoft Defender for Cloud Apps 的集成

将安全信息和事件管理 (SIEM) 工具连接到 Microsoft Defender for Cloud Apps,后者目前支持 Micro Focus ArcSight 和通用常见事件格式 (CEF) 。

有关详细信息,请参阅通用 SIEM 集成

SIEM 与 图形 API 的集成

可使用以下任一选项将 SIEM 连接到 Microsoft Graph 安全性 API:

  • 直接使用受支持的集成选项 – 请参阅受支持的集成选项列表,例如编写代码直接连接应用程序以获得丰富的见解。 利用示例开始使用。
  • 使用本机集成和 Microsoft 合作伙伴构建的连接器 – 请参阅 Microsoft Graph 安全性 API 合作伙伴解决方案来使用这些集成。
  • 使用 Microsoft 构建的连接器 – 请参阅可用于连接 API 的连接器列表,通过各种解决方案实现安全事件和事件管理 (SIEM)、安全响应和业务流程 (SOAR)、事件跟踪和服务管理 (ITSM) 以及报告,等等。

有关详细信息,请参阅使用 Microsoft Graph 安全性 API 实现安全解决方案集成

使用 Splunk

还可以使用 Splunk 平台来设置警报。

工作流

Password spray investigation workflow

还可执行以下操作:

  • PDF 格式下载密码喷射和其他事件响应 playbook 工作流。
  • Visio 文件格式下载密码喷射和其他事件响应 playbook 工作流。

清单

调查触发器

  • 从 SIEM、防火墙日志或 Azure AD 接收触发器
  • Azure AD 标识保护密码喷射特征或有风险 IP
  • 登录失败次数过多(事件 ID 411)
  • 用于 ADFS 的 Azure AD Connect Health 中存在峰值
  • 另一安全事件(例如钓鱼)
  • 未解释的活动,例如从不熟悉的位置登录,用户收到意外的 MFA 提示

调查

  • 哪些内容会被警告?
  • 是否能够确认这是密码喷射?
  • 确定攻击的时间线。
  • 确定攻击的 IP 地址。
  • 筛选此时间段的成功登录和 IP 地址,包括密码登录成功但 MFA 失败的情况
  • 检查 MFA 报告
  • 帐户是否有非常规活动,例如使用新设备、新操作系统或新 IP 地址? 使用 Defender for Cloud Apps 或 Azure 信息保护检测可疑活动。
  • 通知本地机构/第三方寻求帮助。
  • 如果怀疑遭到入侵,请检查数据外泄。
  • 检查关联帐户是否出现可疑行为,查找其是否与其他可能的帐户、服务及其他恶意 IP 地址相关联。
  • 检查所有同一办公室成员/委托访问权限的帐户 - 密码安全机制(确保他们没有使用与已泄露帐户相同的密码)
  • 运行 ADFS 帮助

缓解措施

请查看参考部分,了解有关如何启用功能的指南。

恢复

  • 在 Defender for Cloud Apps、SIEM、ADFS 和 Azure AD 中标记错误的 IP 地址
  • 检查是否有其他形式的邮箱持久化,例如转发规则或添加的其他委派
  • MFA 作为主要身份验证
  • 配置 SIEM 与云的集成
  • 配置警报 - 标识保护、ADFS Health Connect、SIEM 和 Defender for Cloud Apps
  • 总结经验(包括关键利益干系人、第三方和沟通团队)
  • 安全状态审查/改进
  • 计划运行定期攻击模拟器

还可以 Excel 文件格式下载密码喷射和其他事件 playbook 清单。

调查步骤

密码喷射事件响应

在继续调查之前,让我们先了解一些密码喷射攻击技术。

密码泄露:攻击者成功猜中了用户密码,但由于多重身份验证 (MFA) 等其他控制而无法访问该帐户。

帐户泄露:攻击者成功猜中了用户密码,并成功获取了该帐户的访问权限。

环境发现

识别身份验证类型

第一步,检查要调查的租户/已验证域使用的身份验证类型。

若要获取特定域名的身份验证状态,请使用 Get-MsolDomain PowerShell 命令。 下面是一个示例:

Connect-MsolService
Get-MsolDomain -DomainName "contoso.com"

身份验证类型是联合还是托管?

如果身份验证类型为联合,则成功的登录将存储在 Azure AD 中。 失败的登录将存储在它们的标识提供者 (IDP) 处。 有关详细信息,请参阅 ADFS 故障排除和事件日志记录

如果身份验证类型为托管(仅限云、密码哈希同步 (PHS) 或直通身份验证 (PTA)),则成功和失败的登录都将存储在 Azure AD 登录日志中。

注意

分阶段推出功能允许租户域名为联合类型,但特定用户为托管类型。 请确定是否有用户是此组的成员。

是否已为 ADFS 启用 Azure AD Connect Health?

ADFS 中是否已启用高级日志记录?

日志是否存储在 SIEM 中?

若要确定是否在安全信息和事件管理 (SIEM) 或任何其他系统中存储和关联日志,请检查以下各项:

  • 日志分析 - 预建查询
  • Sentinel - 预建查询
  • Splunk – 预建查询
  • 防火墙日志
  • UAL(如果 > 30 天)

理解 Azure AD 和 MFA 报告

理解所查看的日志对于确定泄露非常重要。 下面的快速指南可帮助理解 Azure AD 登录和 MFA 报告。 请参考以下文章:

事件触发器

事件触发器是一种或一系列导致触发预定义警报的事件。 例如,错误密码的尝试次数超出了预定义的阈值。 以下是在密码喷射攻击中发出警报的触发器的更多示例,以及这些警报出现的位置。 事件触发器包括:

  • 用户

  • IP

  • 用户代理字符串

  • 日期/时间

  • 异常

  • 错误密码尝试次数

    pwdattempts描述错误密码尝试次数的图形

通过 Azure AD Health Connect(假设该应用已安装)发现的活动中的异常峰值是关键指标。 其他指标如下:

  • 整理日志时,通过 SIEM 发出的警报显示了峰值。
  • ADFS 失败登录日志超过正常大小(这可能是 SIEM 工具中的警报)。
  • 342/411 事件 ID 的数量增加 – 户名或密码不正确。 或者代表 extranet 锁定的 516 事件 ID 数量增加。
  • 命中身份验证请求失败阈值 – Azure AD 或 SIEM 工具中的风险 IP 警报/同时出现 342 和 411 错误(若要查看此信息,则应打开高级日志记录。)

Azure AD Health Connect 门户中存在风险 IP

如果一小时内的错误密码计数、一天内的错误密码计数以及 extranet 锁定达到自定义阈值,则风险 IP 将触发警报。

Example of risky IP report data

风险 IP 报告数据

有关失败尝试的详细信息可在“IP 地址”和“extranet 锁定”选项卡中找到。

ipaddresstable

风险 IP 报告中的 IP 地址和 Extranet 锁定

在 Azure 标识保护中检测密码喷射

Azure 标识保护是 Azure AD Premium P2 的一项功能,可对密码喷射检测风险发出警报并搜索,利用此功能可获取其他信息或设置自动修正。

Example of password spray attack

密码喷射攻击的详细信息

低级和慢速攻击指标

低级和慢速攻击指标是未命中帐户锁定阈值或错误密码的指标。 可通过以下方式检测这些指标:

  • GAL 顺序中的尝试失败
  • 具有重复属性(UA、目标 AppID、IP 阻止/位置)的尝试失败
  • 计时 - 自动喷射在两次尝试之间往往具有更规律的时间间隔。

调查和缓解措施

注意

可在攻击持续/进行期间同时执行调查和缓解措施。

  1. 请在 ADFS 上打开高级日志记录(如果尚未打开)。

  2. 确定攻击的开始日期和时间。

  3. 从防火墙、ADFS、SIEM 或 Azure AD 确定攻击者的 IP 地址(可能有多个来源和多个 IP 地址)。

  4. 一旦确认为密码喷射,可能需要通知本地机构(警方、第三方和其他机构)。

  5. 整理和监视 ADFS 的以下事件 ID:

    ADFS 2012 R2

    • 审核事件 403 – 用户代理发出请求
    • 审核事件 411 – 身份验证请求失败
    • 审核事件 516 – extranet 锁定
    • 审核事件 342 – 身份验证请求失败
    • 审核事件 412 - 成功登录
  6. 若要收集审核事件 411 - 身份验证请求失败,请使用以下脚本

    PARAM ($PastDays = 1, $PastHours) 
    #************************************************ 
    #ADFSBadCredsSearch.ps1 
    #Version 1.0 
    #Date: 6-20-2016 
    #Author: Tim Springston [MSFT] 
    #Description: This script will parse the ADFS server's (not proxy) security ADFS 
    #for events which indicate an incorrectly entered username or password. The script can specify a 
    #past period to search the log for and it defaults to the past 24 hours. Results >#will be placed into a CSV for  
    #review of UPN, IP address of submitter, and timestamp.  
    #************************************************ 
    cls 
    if ($PastHours -gt 0) 
    {$PastPeriod = (Get-Date).AddHours(-($PastHours))} 
    else 
    {$PastPeriod = (Get-Date).AddDays(-($PastDays))    } 
    $Outputfile = $Pwd.path + "\BadCredAttempts.csv" 
    $CS = get-wmiobject -class win32_computersystem 
    $Hostname = $CS.Name + '.' + $CS.Domain 
    $Instances = @{} 
    $OSVersion = gwmi win32_operatingsystem 
    [int]$BN = $OSVersion.Buildnumber  
    if ($BN -lt 9200){$ADFSLogName = "AD FS 2.0/Admin"} 
    else {$ADFSLogName = "AD FS/Admin"} 
    $Users = @() 
    $IPAddresses = @() 
    $Times = @() 
    $AllInstances = @() 
    Write-Host "Searching event log for bad credential events..." 
    if ($BN -ge 9200) {Get-Winevent  -FilterHashTable @{LogName= "Security"; >StartTime=$PastPeriod; ID=411} -ErrorAction SilentlyContinue | Where-Object{$_.Message -match "The user name or password is incorrect"} |  % { 
    $Instance = New-Object PSObject 
    $UPN = $_.Properties[2].Value 
    $UPN = $UPN.Split("-")[0] 
    $IPAddress = $_.Properties[4].Value 
    $Users += $UPN 
    $IPAddresses += $IPAddress 
    $Times += $_.TimeCreated 
    add-member -inputobject $Instance -membertype noteproperty -name >"UserPrincipalName" -value $UPN 
    add-member -inputobject $Instance -membertype noteproperty -name "IP Address" ->value $IPAddress 
    add-member -inputobject $Instance -membertype noteproperty -name "Time" -value >($_.TimeCreated).ToString() 
    $AllInstances += $Instance 
    $Instance = $null 
    } 
    } 
    $AllInstances | select * | Export-Csv -Path $Outputfile -append -force ->NoTypeInformation  
    Write-Host "Data collection finished. The output file can be found at >$outputfile`." 
    $AllInstances = $null
    

ADFS 2016/2019

除了上述事件 ID,还请整理审核事件 1203 - 新凭据验证错误。

  1. 如果为联合方案,请整理此时间段内在 ADFS 上所有成功的登录。 快速登录和注销(在同一秒)可能是攻击者猜中密码并尝试登录的指标。
  2. 对于同时使用联合和托管的方案,请整理此时间段内的所有 Azure AD 成功或中断事件。

监视和整理 Azure AD 中的事件 ID

请参阅如何查找错误日志的含义

Azure AD 中的以下事件 ID 是相关的:

  • 50057 - 用户帐户已禁用
  • 50055 - 密码已过期
  • 50072 - 提示用户提供 MFA
  • 50074 - 需要 MFA
  • 50079 - 用户需要注册安全信息
  • 53003 - 用户被条件访问阻止
  • 53004 - 由于可疑活动,无法配置 MFA
  • 530032 - 被安全策略中的条件访问阻止
  • 登录状态:成功、失败、中断

整理 Sentinel 剧本中的事件 ID

可从 GitHub 上提供的 Sentinel 剧本获取所有事件 ID。

隔离并确认攻击

隔离 ADFS 和 Azure AD 上成功和中断的登录事件。 这些是你需要关注的帐户。

阻止 IP 地址在 ADFS 2012R2 及以上版本进行联合身份验证。 下面是一个示例:

Set-AdfsProperties -AddBannedIps "1.2.3.4", "::3", "1.2.3.4/16"

收集 ADFS 日志

在一个时间期限内收集多个事件 ID。 下面是一个示例:

Get-WinEvent -ProviderName 'ADFS' | Where-Object { $_.ID -eq '412' -or $_.ID -eq '411' -or $_.ID -eq '342' -or $_.ID -eq '516' -and $_.TimeCreated -gt ((Get-Date).AddHours(-"8")) }

在 Azure AD 中整理 ADFS 日志

Azure AD 登录报告包括了使用 Azure AD Connect Health 时的 ADFS 登录活动。 请选择令牌颁发者类型为“联合”来筛选登录日志。

下面的示例是一条 PowerShell 命令,用于检索特定 IP 地址的登录日志:

Get-AzureADIRSignInDetail -TenantId b446a536-cb76-4360-a8bb-6593cf4d9c7f -IpAddress 131.107.128.76

此外,按照如下这些图像所示,可在 Azure 门户搜索时间期限、IP 地址以及成功和中断的登录。

timeframe

搜索特定时间期限内的登录

ipaddress

搜索特定 IP 地址上的登录

status

搜索基于状态的登录

然后,你可以下载这些数据并保存为 .csv 文件用于分析。 有关详细信息,请参阅 Azure Active Directory 门户中的登录活动报告

设置发现优先级

有能力应对最严重的威胁是至关重要的。 这类威胁可能包括以下情况:攻击者成功获取了帐户的访问权限,因此可以访问/盗取数据。 攻击者获取了密码,但可能无法访问该帐户,例如其获取了密码但未能通过 MFA 质询。 或者,攻击者未能猜中密码,但会继续尝试。 在分析过程中,请设置这些发现的优先级:

  • 使用已知攻击者 IP 地址登录成功
  • 使用已知攻击者 IP 地址登录中断
  • 使用已知攻击者 IP 地址登录失败
  • 使用其他未知 IP 地址登录成功

检查旧式身份验证

大多数攻击使用旧式身份验证。 有多种方法可以确定攻击的协议。

  1. 在 Azure AD 中,导航到“登录”并筛选“客户端应用”。

  2. 选中列出的所有旧式身份验证协议。

    authenticationcheck

    旧式协议列表

  3. 或者,如果你有 Azure 工作区,则可在“监视和工作簿”下的 Azure Active Directory 门户中使用预建的旧版身份验证工作簿。

    workbook

    旧式身份验证工作簿

阻止 IP 地址,托管方案下的 Azure AD(PHS 包括暂存)

  1. 导航到“新建命名位置”。

    Example of a new named location

  2. 创建一项针对所有应用程序且仅阻止此命名位置的 CA 策略。

用户此前是否使用过此操作系统、IP、ISP、设备或浏览器?

如果用户此前未使用过它们而此活动异常,则标记该用户并调查其所有活动。

IP 是否被标记为“有风险”?

请确保记录密码登陆成功但多重身份验证 (MFA) 失败的响应,因为此活动表明攻击者正在获取密码,但未能通过 MFA。
搁置任何看似正常登录的帐户,例如 MFA 通过、位置和 IP 不是非普通帐户。

MFA 报告

检查 MFA 日志非常重要,因为攻击者可能成功猜中密码,但未能通过 MFA 提示。 Azure AD MFA 日志显示了当系统提示用户进行多重身份验证时各事件的身份验证详细信息。 请检查并确保 Azure AD 中没有大量可疑的 MFA 日志。 有关详细信息,请参阅如何使用登录报告查看 Azure AD 的多重身份验证事件

其他检查

在 Defender for Cloud Apps 中,调查已泄露帐户的活动和文件访问。 有关详细信息,请参阅:

检查用户是否有权访问其他资源,例如虚拟机 (VM)、域帐户权限、存储等。
如果数据已泄露,则应通知警方等其他机构。

即时修正操作

  1. 请更改任何怀疑泄露或已经泄露的帐户密码。 此外,阻止该用户。 请确保遵循撤销紧急访问的指导原则。
  2. 在 Azure 标识保护中,将任何已被泄露的帐户标记为“已泄露”。
  3. 阻止攻击者的 IP 地址。 执行此操作时要格外小心,因为攻击者可以使用合法的 VPN,他们也会改变 IP 地址,从而会造成更多风险。 如果使用云身份验证,请阻止 Defender for Cloud Apps 或 Azure AD 中的 IP 地址。 如果使用的是联合身份验证,则须在 ADFS 服务前方的防火墙级别阻止该 IP 地址。
  4. 阻止旧式身份验证(如果正在使用该验证,此操作可能会影响业务)。
  5. 启用 MFA(如果尚未启用)。
  6. 为用户风险和登录风险启用标识保护
  7. 查看已泄露的数据(电子邮件、SharePoint、OneDrive 和应用等)。 了解如何 在 Defender for Cloud Apps 中使用活动筛选器
  8. 维护密码安全机制。 有关详细信息,请参阅 Azure AD 密码保护
  9. 还可参阅 ADFS 帮助

恢复

密码保护

通过启用自定义禁止密码列表,在 Azure AD 和本地实现密码保护。 此配置将阻止用户设置弱密码或与组织有关联的密码:

pwdprotection

启用密码保护

有关详细信息,请参阅如何防御密码喷射攻击

标记 IP 地址

标记 Defender for Cloud Apps 中的 IP 地址,以接收与将来使用的警报相关的警报:

Example of tagging an IP address

标记 IP 地址

在 Defender for Cloud Apps 中,IP 范围的“标记”IP 地址,并为此 IP 范围设置警报,供将来参考和加速响应。

Example of setting up an IP address alert

为特定 IP 地址设置警报

配置警报

根据组织需求,可以配置警报。

在 SIEM 工具中设置警报 ,并查看改进日志记录差距。 集成 ADFS、Azure AD、Office 365 和 Defender for Cloud Apps 日志记录。

在 ADFS 运行状况连接和风险 IP 门户中配置阈值和警报。

Example of configuring threshold settings

配置阈值设置

Example of configuring notifications

配置通知

请参阅如何在标识保护门户中配置警报

使用条件访问或标识保护设置登录风险策略

  • 培训最终用户、关键利益干系人、一线运营、技术团队、网络安全和通信团队
  • 评审安全控制并做出必要的更改,从而改进或增强组织内部的安全控制
  • 建议进行 Azure AD 配置评估
  • 运行常规攻击模拟器练习

参考

必备条件

缓解措施

恢复

其他事件响应剧本

请检查用于识别和调查这些其他类型攻击的指南:

事件响应资源