CredDefense工具包
Derek Banks, Beau Bullock, & Brian Fehrman //
我们的客户经常询问如何检测和防止我们在其环境中使用的提权并最终访问敏感数据的后利用活动。大多数情况下,这是通过凭证滥用实现的。
作为渗透测试人员,我们在凭证滥用中利用的主要条件是弱密码。在任何拥有数百名最终用户的环境中,几乎可以保证有人选择了季节和年份(例如Summer2017)作为密码。这使得使用称为密码喷洒的技术很容易猜测。
解决此问题的一种方法是更改帐户的最小密码长度,但由于技术和政治原因,并非每个环境都能做到这一点。
还有许多其他凭证滥用攻击利用协议实现或默认环境配置中的缺陷,例如Kerberoasting和LLMNR投毒。
如果有一个免费工具集可以保护您的凭证,即使无法更改密码长度,并警告网络中正在进行的其他凭证攻击,那不是很好吗?这就是我们创建CredDefense工具包的原因——提供一种免费的方式来检测和防止凭证滥用攻击。
密码过滤器
Windows域对用户密码强制执行一组标准的复杂性要求。当用户尝试设置新密码时,新密码会根据要求进行检查。默认情况下,以下要求生效:
- 最少八个字符
- 必须包含以下四项中的三项:
- 大写字母
- 小写字母
- 特殊字符
- 数字
此外,用户需要每90天设置一个新密码。那么……什么符合这些要求但用户仍然容易选择并记住?只能说大多数渗透测试人员非常了解当前季节和年份。例如,Fall2017。
如何防止用户选择这些类型的密码?当然,您可以增加最小字符数并强制执行额外的复杂性。在需要15个或更多字符的环境中,我们密码喷洒的成功率确实低得多。然而,我们仍然会遇到用户选择类似SummerSummmer2017的情况。此外,我们理解要求这么多字符可能带来的政治反弹。必须有另一种方式……而且有!欢迎:Windows密码过滤。
Windows密码过滤功能允许您在用户尝试选择新密码时添加额外的检查。密码首先通过域的密码复杂性检查。通过复杂性检查后,它然后通过您的自定义检查。如果您愿意,可以有多个检查。下图显示了该过程。
这是如何实现的?整个过程在此处描述:https://msdn.microsoft.com/en-us/library/windows/desktop/ms721766(v=vs.85).aspx
手动操作可能有些繁琐和 overwhelming……这就是为什么我们将其纳入Cred Defense界面!我们的工作基于这个开源项目: https://github.com/jephthai/OpenPasswordFilter
如果您打开Cred Defense工具,选择密码过滤器选项。然后您将被询问是否要安装/卸载该功能或仅更新使用的密码列表。
对于安装/卸载,您将看到两列。程序将获取环境中所有域控制器的列表。然后它将检查每个域控制器(DC)以查看HKLM\System\CurrentControlSet\Control\Lsa\Notifications注册表项中是否有EasyPasswordFilter值。如果该键不存在,则表示DC可能未运行密码过滤器,这些DC的名称将放置在未配置的DC列中。从未配置的DC列表中选择DC名称并单击安装将:
- 将EasyPasswordFilter DLL部署到目标DC的%SystemRoot%\Windows\System32目录
- 将密码列表部署到目标DC的%SystemRoot%\epf文件夹
- 将EasyPasswordFilter值添加到目标DC的HKLM\System\CurrentControlSet\Control\Lsa\Notifications注册表项
- 询问您是否要重新启动DC,如果您选择这样做,则指示DC重新启动
对于卸载,程序只需从目标DC的注册表中删除EasyPasswordFilter值,并询问是否要重新启动计算机。
很简单,对吧?点击几下,您就可以开始了!
如何更新密码列表?如果您选择此选项,将显示已安装密码过滤器的所有DC的列表。单击编辑密码按钮,密码列表将在Notepad.exe中打开供您编辑。请注意,密码过滤器设置为不区分大小写。此外,它将执行子字符串匹配,因此您不必键入Winter2017、Winter2018、WinterWinter2017等,而可以只键入winter。还有一个安全检查,不允许您指定少于四个字符的单词。编辑完密码列表后,保存列表并单击部署更新按钮。然后密码列表将部署到DC运行密码过滤器列表中显示的所有DC。这不需要您重新启动域控制器。
密码审计
密码过滤对于防止用户选择弱密码非常有效。环境中的当前密码呢?域管理员为其普通用户帐户重用相同密码怎么办?您是否有不过期的密码?不需要密码的用户帐户呢?多个管理帐户使用相同的密码吗?所有这些都是非常重要的问题,应在威胁行为者找到这些答案之前回答。
Cred Defense工具包的密码审计功能可以使此过程变得轻松!该工作基于DSInternals工具包:https://github.com/MichaelGrafnetter/DSInternals
首先,从主菜单中选择密码审计选项。然后您将看到当前林中的域列表。
选择域后,您将看到该域内的域控制器列表。
选择域控制器后,您将被要求选择一个密码列表用于审计的密码破解部分。您还将被要求指定希望结果保存的位置。
选择选项后,单击运行审计按钮,过程将启动。程序将利用AD复制同步功能从目标DC获取Active Directory信息。信息保存在内存中,不写入磁盘。程序将执行多项检查并将结果输出到指定文件。一些检查包括:
- 密码重用
- LanMan哈希
- 管理员委派
- 无密码
- 不需要密码
- 密码不过期
那么这需要多长时间?我们从分配了8 GB RAM和2个核心的VM运行此程序。它利用了人类可读的Crackstation密码列表。环境包含3个域控制器和超过30,000个唯一用户哈希。整个过程在大约90秒内完成!
事件日志聚合
在我们的 engagements 中,当涉及到日志记录时,我们通常遇到两类环境。第一类是没有任何日志记录,并且真的没有可见性来帮助检测恶意活动正在发生的信息。第二类是每个日志事件都进入SIEM,但没有人能有效地使用它来发现或警告任何有用的信息。
如果您处于任一场景,请设置更有针对性的方法来聚合来自Windows端点的事件。作为CredDefense工具包的一部分,我们编写了本指南来设置将事件日志转发到中央Windows事件转发服务器。
Kerberoasting
当我们在环境中获得立足点时,我们尝试的首批攻击之一称为Kerberoasting。Microsoft的Kerberos实现很复杂,但攻击的要点是它利用了旧版Active Directory对旧Windows客户端的支持以及用于加密和签名Kerberos票证的加密类型和密钥材料。本质上,当域帐户配置为在环境中运行服务(例如MS SQL)时,域中使用服务主体名称(SPN)将服务与登录帐户关联。当用户希望使用特定资源时,他们会收到使用运行服务的帐户的NTLM哈希签名的Kerberos票证。这有效地允许任何域用户获取网络上服务帐户的可破解哈希——而且通常服务帐户至少在其运行的本地服务器上具有管理员权限。
对Kerberos票证的请求在环境中的域控制器上生成事件4769。配置了Windows事件转发器以聚合事件日志后,Kerberos票证请求位于一个位置进行分析。
一种检测方法是创建一个HoneyAccount,该帐户将具有注册的服务主体名称,并且通常不会被最终用户请求。Set-ADUser命令let可用于此目的,只需注意不要在环境中复制有效的SPN。 Set-ADUser honeytoken -ServicePrincipalNames @{Add=”MSSQLSvc/server161:1433″}
创建HoneyAccount后,可以使用CredDefenseEventParser PowerShell脚本解析转发的日志以检测事件ID 4769,当服务帐户匹配HoneyToken值时。这将表明可能有人在环境中进行Kerberoasting。
ResponderGuard
我们作为渗透测试人员执行的常见攻击之一是尝试在网络上的NBNS或LLMNR欺骗攻击,希望获得用户的哈希凭证。执行此攻击的一个流行工具是Laurent Gaffie编写的“Responder”。另一个执行此攻击的伟大工具是Kevin Robertson的“Inveigh”。这些工具可以做很多很棒的事情,但主要功能之一是有效地充当NBNS或LLMNR欺骗器。
我们使用这些工具成功获取哈希用户凭证是很常见的。那么防御者如何在大规模网络上检测类似Responder的活动?已经有少数工具可以检测LAN上的Responder。但是,据我所知,由于它们广播使用的NBNS数据包的方式,大多数只能检查单个子网。另一种选择是通过SMB向网络上的每个系统发送蜜令牌,但此方法需要攻击者主动破解NTLMv2哈希并尝试登录,然后才能收到Responder在网络上的警报。
ResponderGuard是一个PowerShell工具,应该允许跨网络大规模检测类似Responder的活动。它能够通过向CIDR范围列表中的每个主机发送有针对性的NBNS请求来定位外部子网上的Responder侦听器。每个NBNS请求为每个IP地址请求一个随机主机名。如果主机响应它是正确的主机,那么该主机很可能是一个NBNS欺骗器。
为了协助警告此活动,ResponderGuard在检测到网络上的类似Responder侦听器时立即写入Windows事件日志。这可以与CredDefense或您选择的任何SIEM结合使用,以便在发现类似Responder系统时向您发出警报。只需查找事件ID 8415。
除了立即警告Responder活动外,ResponderGuard还能够向Responder侦听器提供蜜凭证。如果攻击者尝试登录到指定帐户,这提供了额外的检测机制。在下面的屏幕截图中,防御者启动了ResponderGuard,并且当前正在扫描提供的CIDR范围。它检测到来自IP地址192.168.0.18的NBNS响应,响应一个随机主机名。一个事件被写入事件日志,然后一组蜜凭证(HoneyDomain\HoneyUser : Summer2017)通过SMB提交给侦听器。
下面的屏幕截图显示了攻击者在其Responder输出中会看到的内容。首先,Responder报告一个中毒答案已发送到192.168.0.12(我们的运行ResponderGuard的Windows服务器,实际上位于完全不同的子网上,经过NAT)。接下来,Responder收到了一个SMB身份验证请求以及我们蜜用户的NTLMv2哈希用户凭证。如何设置这些蜜令牌可以通过多种方式完成。一些选项将在本文后面讨论。
要作为独立脚本运行ResponderGuard,首先从此处下载。然后,以管理员身份启动新的PowerShell进程。 C:> powershell.exe -exec bypass
接下来,导入ResponderGuard PowerShell脚本。 PS C:> Import-Module ResponderGuard.ps1
ResponderGuard可以在生成事件日志或不生成事件日志的情况下运行。要在每次检测到Responder时写入Windows事件日志,请将-LoggingEnabled标志添加到Invoke-ResponderGuard。可以使用-CidrList选项将CIDR范围列表传递给Invoke-ReponderGuard。如果您还想向Responder提交HoneyToken,请添加-HoneyTokenSeed选项。确保手动更改脚本中的蜜令牌凭证,否则HoneyDomain\HoneyToken将提交给Responder。 PS C:> Invoke-ResponderGuard -CidrList C:\temp\cidr-list.txt -LoggingEnabled -HoneyTokenSeed
此工具仍在开发中,正在开发更多功能。如果您想帮忙,请查看CredDefense存储库上的开放问题。
密码喷洒
密码喷洒是我们在几乎每次渗透测试中使用的攻击,因为它在收集凭证方面非常有效。我们已经多次写过关于它的文章。密码喷洒是一种攻击,攻击者基本上生成一个大的用户名列表,并为每个用户提交一次身份验证尝试以避免帐户锁定。选择的密码通常是用户常用的东西,如“SeasonYear”(例如:“Fall2017”)或“Companyname123”。
密码喷洒可以针对几乎任何身份验证机制执行,但我们通常针对Active Directory相关服务。由于外部暴露的与Active Directory关联的Web门户,它可以在大多数网络的内部和外部执行。我们通常外部密码喷洒的一些示例是Outlook Web Access(OWA)、ADFS、Exchange Web Services(EWS)、Office 365,甚至VPN门户。
在内部,我们在Black Hills InfoSec编写的名为DomainPasswordSpray的PowerShell工具对于密码喷洒效果很好。它从域生成用户帐户列表,并尝试删除任何接近锁定的人。此外,它枚举细粒度密码策略,以避免对不同密码策略限制下的帐户进行锁定。
无论密码喷洒如何执行,它都会生成大量失败的登录事件。许多SIEM和产品警告网络上的帐户凭证暴力破解,但大多数只是查看单个用户帐户的失败登录尝试,并由于每个帐户一次尝试而错过密码喷洒。为了帮助警告密码喷洒,CredDefense解析事件日志,查找任何在一小时内生成超过十次失败登录尝试的单个IP地址。
存储库中包含的CredDefenseEventParser.ps1脚本可以独立运行或从CredDefense运行。除了在循环中查看给定的Windows事件日志文件外,它还可以针对特定事件文件(evtx)执行分析以“狩猎”密码喷洒事件。在循环中运行时,它将持续评估给定日志文件的事件。这可能是您转发的