哈希传递对于大多数企业或组织来说仍然是一个非常棘手的问题,这种攻击手法经常被渗透测试人员和攻击者们使用。当谈及检测哈希传递攻击时,我首先开始研究的是先看看是否已经有其他人公布了一些通过网络来进行检测的可靠方法。我拜读了一些优秀的文章,但我没有发现可靠的方法,或者是这些方法产生了大量的误报。
我不会在本文深入剖析哈希传递的历史和工作原理,但如果你有兴趣,你可以阅读SANS发布的这篇优秀的文章——哈希攻击缓解措施。
总之,攻击者需要从系统中抓取哈希值,通常是通过有针对性的攻击(如鱼叉式钓鱼或通过其他方法直接入侵主机)来完成的(例如:TrustedSec 发布的 Responder 工具)。一旦获得了对远程系统的访问,攻击者将升级到系统级权限,并从那里尝试通过多种方法(注册表,进程注入,磁盘卷影复制等)提取哈希。对于哈希传递,攻击者通常是针对系统上的LM/NTLM哈希(更常见的是NTLM)来操作的。我们不能使用类似NetNTLMv2(通过响应者或其他方法)或缓存的证书来传递哈希。我们需要纯粹的和未经过滤的NTLM哈希。基本上只有两个地方才可以获得这些凭据;第一个是通过本地帐户(例如管理员RID 500帐户或其他本地帐户),第二个是域控制器。
哈希传递的主要成因是由于大多数企业或组织在一个系统上拥有共享本地帐户,因此我们可以从该系统中提取哈希并移动到网络上的其他系统。当然,现在已经有了针对这种攻击方式的缓解措施,但他们不是100%的可靠。例如,微软修补程序和较新版本的Windows(8.1和更高版本)“修复”了哈希传递,但这仅适用于“其他”帐户,而不适用于RID为 500(管理员)的帐户。
你可以禁止通过GPO传递哈希:
“拒绝从网络访问此计算机”
设置路径位于:
- Computer ConfigurationWindowsSettingsSecurity SettingsLocal PoliciesUser Rights Assignment
大多数企业或组织都没有能力实施GPO策略,而传递哈希可被利用的可能性却非常大。
接下来的问题是,你怎么检测哈希传递攻击?
检测哈希传递攻击是比较有挑战性的事情,因为它在网络中表现出的行为是正常。比如:当你关闭了RDP会话并且会话还没有关闭时会发生什么?当你去重新认证时,你之前的机器记录仍然还在。这种行为表现出了与在网络中传递哈希非常类似的行为。
通过对成千上万个系统上的日志进行广泛的测试和分析,我们已经能够识别出在大多数企业或组织中的非常具体的攻击行为并且具有非常低的误报率。有许多规则可以添加到以下检测功能中,例如,在整个网络中查看一些成功的结果会显示“哈希传递”,或者在多次失败的尝试后将显示凭证失败。
下面我们要查看所有登录类型是3(网络登录)和ID为4624的事件日志。我们正在寻找密钥长度设置为0的NtLmSsP帐户(这可以由多个事件触发)。这些是哈希传递(WMI,SMB等)通常会使用到的较低级别的协议。另外,由于抓取到哈希的两个唯一的位置我们都能够访问到(通过本地哈希或通过域控制器),所以我们可以只对本地帐户进行过滤,来检测网络中通过本地帐户发起的传递哈希攻击行为。这意味着如果你的域名是GOAT,你可以用GOAT来过滤任何东西,然后提醒相应的人员。不过,筛选的结果应该去掉一些类似安全扫描器,管理员使用的PSEXEC等的记录。
请注意,你可以(也可能应该)将域的日志也进行分析,但你很可能需要根据你的实际情况调整到符合基础结构的正常行为。比如,OWA的密钥长度为0,并且具有与基于其代理验证的哈希传递完全相同的特征。这是OWA的正常行为,显然不是哈希传递攻击行为。如果你只是在本地帐户进行过滤,那么这类记录不会被标记。
事件ID:4624
登录类型:3
登录过程:NtLmSsP
安全ID:空SID – 可选但不是必需的,目前还没有看到为Null的 SID未在哈希传递中使用。
主机名 :(注意,这不是100%有效;例如,Metasploit和其他类似的工具将随机生成主机名)。你可以导入所有的计算机列表,如果没有标记的计算机,那么这有助于减少误报。但请注意,这不是减少误报的可靠方法。并不是所有的工具都会这样做,并且使用主机名进行检测的能力是有限的。
帐户名称和域名:仅警告只有本地帐户(即不包括域用户名的账户)的帐户名称。这样可以减少网络中的误报,但是如果对所有这些账户进行警告,那么将检测例如:扫描仪,psexec等等这类东西,但是需要时间来调整这些东西。在所有帐户上标记并不一定是件坏事(跳过“COMPUTER$”帐户),调整已知模式的环境并调查未知的模式。
密钥长度:0 – 这是会话密钥长度。这是事件日志中最重要的检测特征之一。像RDP这样的东西,密钥长度的值是 128位。任何较低级别的会话都将是0,这是较低级别协议在没有会话密钥时的一个明显的特征,所在此特征可以在网络中更好的发现哈希传递攻击。
另外一个好处是这个事件日志包含了认证的源IP地址,所以你可以快速的识别网络中哈希传递的攻击来源。
为了检测到这一点,我们首先需要确保我们有适当的组策略设置。我们需要将帐户登录设置为“成功”,因为我们需要用事件日志4624作为检测的方法。
让我们分解日志并且模拟哈希传递攻击过程。在这种情况下,我们首先想象一下,攻击者通过网络钓鱼获取了受害者电脑的凭据,并将其提升为管理级别的权限。从系统中获取哈希值是非常简单的事情。假设内置的管理员帐户是在多个系统间共享的,攻击者希望通过哈希传递,从SystemA(已经被入侵)移动到SystemB(还没有被入侵但具有共享的管理员帐户)。
在这个例子中,我们将使用Metasploit psexec,尽管还有很多其他的方法和工具可以实现这个目标:
在这个例子中,攻击者通过传递哈希建立了到第二个系统的连接。接下来,让我们看看事件日志4624,包含了什么内容:
安全ID:NULL SID可以作为一个特征,但不要依赖于此,因为并非所有的工具都会用到SID。虽然我还没有亲眼见过哈希传递不会用到NULL SID,但这也是有可能的。
接下来,工作站名称肯定看起来很可疑; 但这并不是一个好的检测特征,因为并不是所有的工具都会将机器名随机化。你可以将此用作分析哈希传递攻击的额外指标,但我们不建议使用工作站名称作为检测指标。源网络IP地址可以用来跟踪是哪个IP执行了哈希传递攻击,可以用于进一步的攻击溯源调查。
接下来,我们看到登录过程是NtLmSsp,密钥长度为0.这些对于检测哈希传递非常的重要。
接下来我们看到登录类型是3(通过网络远程登录)。
最后,我们看到这是一个基于帐户域和名称的本地帐户。
总而言之,有许多方法可以检测环境中的哈希传递攻击行为。这个在小型和大型网络中都是有效的,并且基于不同的哈希传递的攻击方式都是非常可靠的。它可能需要根据你的网络环境进行调整,但在减少误报和攻击过程中溯源却是非常简单的。
哈希传递仍然广泛的用于网络攻击并且是大多数企业和组织的一个共同的安全问题。有许多方法可以禁止和降低哈希传递的危害,但是并不是所有的企业和组织都可以有效地实现这一点。所以,最好的选择就是如何去检测这种攻击行为。