多年来,内部渗透测试团队通过一种称为 NTLM 中继的技术成功地获得了立足点,甚至损害了整个域。我能找到的最早、最具描述性的中继博客文章可以追溯到 2017 年,由 Marcello 撰写,更为人所知的是 byt3bl33d3r:https ://byt3bl33d3r.github.io/practical-guide-to-ntlm-relaying-in-2017 -aka-getting-a-foothold-in-under-5-minutes.html
在 2022 年撰写这篇博文时,(不)令人惊讶的是,中继仍然非常活跃。这篇博文旨在成为一个全面的资源,将介绍今天继续有效的攻击原语。虽然大多数是众所周知的技术,但涉及 Active Directory 证书服务的一些技术可能鲜为人知。
对于这篇博文,我在 Snap Labs 中创建了一个迷你实验室,任何拥有帐户的人都可以在这篇博文中使用它。不幸的是,AWS 在他们的后端做了一些奇怪的魔法来阻止多播流量到达 Responder。结果,我被迫离线创建实验室.eq
实验室架构如下所示:
我们的实验室在一 (1) 个域 (bravoteam.local) 中包含三 (3) 个服务器:
域控制器 - 具有 Active Directory 域服务(需要成为域控制器)和安装了 Active Directory 证书服务的服务器 2019 实例(用于此博客文章中的 AD CS 滥用途径)
服务器 1 – 开箱即用的 Windows Server 2019,未进行特殊配置
Server 2 – 也是一个没有任何特殊配置的 Windows Server 2019
我们的域有四 (4) 个用户:
所有这些用户的密码都是相同的Qwerty123,因为这是一个实验室环境,他们的属性没有进行任何特殊的修改。
我们还需要一个 Linux 系统形式的攻击者控制的机器。在这篇博文中,我们将使用 Kali 机器。无论您选择什么发行版,都需要以下工具来遵循此博客文章:
为了评估中继攻击的有效性,我们需要更多地了解我们的网络环境。为了成功使用“经典”中继攻击,必须满足一些先决条件:
稍后在这篇博文中,我们还将看看其他一些攻击,但让我们先关注基础知识。
为了检查是否满足第一个先决条件,我们可以在分析模式下使用 Responder,如下所示。
图 1 – 分析模式下的响应者
A 标志确保我们只是在听,但我们实际上并没有毒害任何东西。如果存在广播流量,那么在您的控制台窗口中出现一些噪音之前应该不会花费太长时间。
图 2 – 广播流量
我们看到一些 NBT-NS 流量飞入,这对攻击者来说是个好消息,但对组织来说却不是这样。
下一步是验证我们是否存在禁用 SMB 签名的服务器。这通常是这种情况,因为 SMB 签名默认情况下仅在域控制器上强制执行,并且由于影响性能而通常不会被组织启用。
为了验证我们的假设是否正确,我们可以利用带有 –gen-relay-list 标志的 CrackMapExec 的 SMB 模块来编译所有禁用 SMB 签名的服务器的列表。
**注意:**这是一个包含三 (3) 台机器的实验室环境——在现实生活中的组织中,这个列表会长得多。
图 3 - 启用 SMB 签名的域控制器
正如预期的那样,域控制器启用了 SMB 签名,但域中的其他两 (2) 个服务器启用了 SMB 签名,这使它们成为主要中继目标。现在我们进行了侦察,让我们来看看我们可以在这里进行的所有恶作剧。但在我们开始之前,我想指出一些关于 Responder 在分析模式下的有趣行为。
虽然在分析模式下的响应程序确实不会毒害任何东西,但它仍然会捕获哈希(假设 SMB 或任何其他可以接收连接的类似服务器的 HTTP 已打开)。
当您正在参与并且您的客户有某种网络蜘蛛或执行补丁管理的软件时,这很有用,因为您将能够捕获该帐户的哈希,而无需毒害任何东西。
图 4 – Juicy NTLM 哈希
请记住,NetNTLMv1 和 NetNTLMv2 哈希不是可用于传递哈希类型攻击的实际 NTLM 哈希。NetNTLM 哈希是质询和响应协议的结果。例如,NetNTLM 哈希只能用于中继攻击或使用 Hashcat 进行潜在的暴力破解。
另一个专业提示是,NTLMv2 哈希比 NTLMv1 更难破解,但对于用户帐户来说并非不可能!另一方面,计算机帐户不值得您的计算能力,因为您不会以NetNTLMv2 格式破解它们。(注意:这对以后很重要。)
可能最著名的攻击场景是同时使用 Responder 和 NTLM 中继。这种方法依赖于网络中的广播协议,例如 LLMNR 或 NBT-NS。为了让 Responder 和 NTLM 中继能够很好地协同工作,我们必须修改 Responder.conf 文件并禁用 HTTP 和 SMB 服务器(因为 NTLM 中继将是我们的 SMB 和 HTTP 服务器)。
图 5 – 在 Responder.conf 中关闭 SMB 和 HTTP 服务器
如果攻击者能够将用户的身份验证中继到已关闭 SMB 签名(默认)的系统,并且该用户恰好是该系统上的本地管理员,则 NTLM 中继的默认行为是转储安全帐户管理器数据库并显示本地帐户的密码哈希。
为了执行攻击,我们将使用 Impacket 套件中的 NTLM 中继脚本进行中继。我们可以使用前面生成的目标文件轻松设置继电器,如下所示。
图 6 – 设置 NTLM 中继
我喜欢运行 Responder 的方式是使用 -rdwF 或 -rdP(感谢 RDP,这很容易记住,哈哈)。如今,rdP 标志可能会比 wF 标志更成功,正如 Laurent Gaffié 在这篇博文中所解释的那样:https ://g-laurent.blogspot.com/2021/08/responders-dhcp-poisoner.html
为什么是-P 而不是-F?现在,WPAD NTLM 身份验证不太可能成功,因此不建议在 wpad.dat 检索时强制 NTLM 身份验证。这个概念是在没有用户身份验证的情况下提供 wpad.dat 文件,一旦客户端开始使用我们的代理,我们就会强制使用 Proxy-Auth 模块进行身份验证🙂
更新: *在较新版本的 Responder 中,-r 和 -f 标志已消失。此外,-d 标志现在已从“启用 NETBIOS 域后缀查询的答案”更改。回答域后缀可能会破坏网络上的内容。默认值:False”到“启用 DHCP 广播请求的应答。此选项将在 DHCP 响应中注入 WPAD 服务器。默认值:假”。还应该注意的是 -d 现在可以对您的客户端网络产生影响,因为您通过 DHCP 有效地毒化了 WPAD 文件,一旦您停止攻击,它并不总是立即恢复。它可能需要重新启动。*
图 7- rdP 模式下的响应程序(不过要小心新的 d 标志!)
现在我们看到了一些奇怪的东西。
我们获得了 Spenser 的成功身份验证,但似乎我们无法中继到 Spenser 是本地管理员的服务器——这是为什么呢?
图 8 – 认证失败
图 9 – Spenser 是此服务器上的管理员
这是因为计算机无法向自身中继,而微软很久以前就修复了这个问题。让我们再试一次,但这次我们将作为 Spenser 触发从 srv01 到 srv02 的中继:
图 10 – 好多了!我们得到一个倾销的 SAM
这次我们的 SAM 转储工作了,因为原始请求来自另一个 IP 地址 (srv01),而不是我们中继到的 IP 地址 (srv02)。
这种方法的一个转折是在 NTLM 中继中使用 SOCKS 选项。
这是迄今为止我最喜欢的方法,因为即使用户不是被中继机器的本地管理员,它也会为您提供成功中继尝试的一个很好的概述。与尝试在 NTLM 中继日志发生时筛选它们相比,这为您提供了更清晰的操作视图,因为即使我喜欢 NTLM 中继,日志记录也非常嘈杂。
图 11 – 使用 SOCKS 一切都会变得更好
这一次,我在域控制器上修改了我的 GPO,以便允许 Spenser 登录。这样,您可以看到 SOCKS 代理的完整效果,因为现在 Spenser 将在 srv01 和 srv02 上成功进行身份验证。
图 12 – 我们有一些会话!
如您所见,SOCKS 命令将很好地概述哪些中继是成功的,而 SOCKS 选项将使 SMB 连接无限期地为您打开。在此示例中,我们可以看到 Spenser 在 srv02 (10.10.10.55) 上具有管理员权限,但在 srv01 (10.10.10.69) 上没有管理员权限。
您现在可以使用 secretsdump.py 转储 SAM 数据库,甚至可以使用 lsassy 或其他工具开始转储 LSASS。
不要忘记在全力以赴之前更改您的 SOCKS 代理配置。
图 13 – 编辑我们的 SOCKS 配置
图 14 – ntlmrelayx.py 的默认 SOCKS 配置位于端口 1080
将代理链设置为 NTLM 中继 SOCKS 代理后,我们现在可以代理链任何我们想要的工具,它将忽略密码值并使用中继凭据。
图 15 – 在 SOCKS 上转储哈希
我在这里要强调的是,即使您不是系统上的本地管理员,如果您有时间寻找它们,您仍然可以掌握机密文件。在此示例中,Spenser 在 srv01 上没有本地管理员权限,但能够访问包含机密客户数据的财务共享。
图 16 – 我们还可以访问文件共享!
这种攻击设置与我们在之前的攻击中已经使用的非常相似。
图 17- 这次为 LDAP 设置 ntlmrelayx.py
但是,域控制器默认启用 SMB 签名,因此您可以猜测接下来会发生什么……
图 18 – 请签名?
正如我们预期的那样,我们得到一个很好的详细错误,说明客户端请求签名,因此不可能像这样调用中继。这是否意味着我们被困住了?嗯,没有😊
我们在这里有两 (2) 个选项:
SMB 到 LDAP 不是一个选项,因为我们存在 SMB 签名问题,但是如果我们使用其他协议(例如 HTTP)会发生什么?为了使这种攻击起作用,我们需要确定 webclient 服务是否在环境中运行。
通过使用 hackanddo 的 webclientservicescanner(需要有效的域凭据),我们可以确定是否是这种情况**。**webclientservicescanner 非常易于使用——您基本上为该工具提供了有效凭据,它会通过 RPC 访问域中的所有计算机以查找 \pipe\DAV RPC SERVICE。
不幸的是,默认情况下通常不启用此服务。
图 19 – webclient 正面没有运气
枚举这个很好,但并不是真正必要的。如果需要,我们可以暴力破解 Web 客户端连接,我们很快就会看到。** **
这些技术只有在系统上实际安装了 webclient 服务时才有效——它们不会通过运行上述程序或浏览特殊文件来神奇地安装。
感谢 James Foreshaw,我们有一种方法可以通过一些低级 ETW 恶作剧来自动启用 Web 客户端(这后来也被 Alessandro Magnosi 移植到了 C# 版本)。
我们还可以采用另一种方法,即使用特殊文件,例如 Documents.searchConnector-ms 文件,正如 MDSec 的几位研究人员所描述的那样。
此类文档的内容如下所示:
<?xml version="1.0" encoding="UTF-8"?> <searchConnectorDescription xmlns="http://schemas.microsoft.com/windows/2009/searchConnector"> <iconReference>imageres.dll,-1002</ iconReference> <description>Microsoft Outlook</description> <isSearchOnlyItem>false</isSearchOnlyItem> <includeInStartMenuScope>true</includeInStartMenuScope> <iconReference>https://10.10.10.137 /0001.ico </iconReference> <templateInfo> <folderType >{91475FE5-586B-4EBA-8D75-D17434B8CDF6}</folderType> </templateInfo> <simpleLocation> <url>https://www.trustedsec.com/ </url> </simpleLocation> </searchConnectorDescription >
如果我们可以将该文件放到某处并将其命名为 Documents.searchConnector-ms,我们就可以强制启动一个 webclient 连接。我们能够从非特权的角度获得的财务份额现在看起来相当不错,不是吗?😉
让我们将文件放在财务共享上并在我们的服务器上浏览到它。看看它对 webclient 服务的作用。
图 20 – 在我们的非特权共享中删除搜索连接器
图 21 – srv02 的 web 客户端在浏览共享时突然启动
魔法!webclient 服务已在我们的服务器 (srv02) 上启动。
对于下一步,我们如何强制通过 HTTP 进行身份验证?
Lee Christensen 早在 2018 年就发布了一种强制通过 MS-RPRN RPC 进行身份验证的方法。这后来被称为 spoolsample 或 printerbug,因为这依赖于在系统上运行的 spooler 服务。
2021 年,Lionel Gilles 发现了一种类似的强制身份验证方法,这次是通过 MS-EFSRPC(文件加密协议),这种攻击被称为 PetitPotam。
PetitPotam 的疯狂之处在于它从未经身份验证的角度工作。此后已对此进行了修补,但不时遇到未修补的漏洞并不少见。
使用这些强制方法,可以使用我们的[email protected] /something 作为目标,通过 HTTP 向我们的攻击者控制的机器触发身份验证。
图 22 – 使用 printerbug 强制验证
图 23 – 使用 PetitPotam 强制认证
出于说明目的,我关闭了 NTLM 中继一分钟并再次启用了 Responder 的 HTTP 服务器,这样我们就可以清楚地看到发生了什么。
图 24 – 淹没在哈希中
我们看到散列飞了进来!这意味着我们可能可以中继到 LDAP,所以让我们试一试,好吗?
图 25 – 借助 Dirk-jan Mollema 枚举域
我们成功枚举了域信息!但是,由于printerbug 和PetitPotam 都需要身份验证才能工作,我们本可以使用ldapdomaindump 之类的工具自己直接绑定到LDAP 并直接转储数据。有没有更简单的方法来实现相同的结果,最好是未经身份验证的?让我们来了解一下……
2018 年对于攻击性社区来说是非常美好的一年,因为 Dirk-jan Mollema 发表了有关基于 IPv6 的中间人攻击的研究。在现代 Windows 操作系统中,默认情况下启用 IPv6。这意味着系统会定期轮询 IPv6 租约,因为 IPv6 是比 IPv4 更新的协议,并且 Microsoft 认为让 IPv6 优先于 IPv4 是一个好主意。
然而,在绝大多数组织中,IPv6 未被使用,这意味着攻击者可以劫持对 IPv6 地址的 DHCP 请求,并强制对攻击者控制的系统进行身份验证。我们通过将系统设置为主 DNS 服务器来做到这一点。
https://dirkjanm.io/worst-of-both-worlds-ntlm-relaying-and-kerberos-delegation/
首先,我们启动 mitm6 并欺骗任何对内部资源的请求。
图 26 – 让我们做一些 IPv6 恶作剧
当用户尝试浏览内部资源时,他们将看到登录提示。
图 27 – 只是一个无辜的登录提示
如果用户填写了他们的凭据,请拍拍自己的后背并喝杯啤酒,因为您从未经身份验证的角度成功中继到了 LDAP。
图 28 – 从未认证到认证的域枚举
在上一个攻击场景中,我们使用 LDAP 协议转储 Active Directory 对象,但我们仍然没有真正的立足点,是吗?让我们通过中继到 LDAPS 来改变这一点。
使用 LDAP 的“安全”双胞胎,我们可以通过滥用默认情况下允许用户加入多达 10 个新计算机对象的事实来添加新的计算机帐户。这可以改变,但通常情况并非如此
让我们将 NTLM 中继设置为以 LDAPS 为目标,看看我们是否能找到足够帮助的人来为我们将trustedcomputer01 添加到域中。
注意:如果可能,请使用 FQDN 而不是 IP 地址。IP 地址大部分时间都有效,但 FQDN 看起来更干净,避免了 SNI 证书冲突。
图 29 – LDAP 很有趣,但 LDAPS 更酷
与之前的攻击一样,使用 mitm6 或 PetitPotam/printerbug 瞄准运行 webclient 服务的系统。或者,如果您足够大胆,只需向所有域计算机喷洒并祈祷 PetitPotam/printerbug。
让 mitm6 运行一段时间后,我们得到一个成功的中继
图 30 – 添加的新计算机
感谢我们亲爱的朋友 srv02 😊,我们增加了一台新电脑!现在我们可以使用这台计算机在域中执行经过身份验证的操作,例如使用 PetitPotam/printerbug 甚至 BloodHound/kerberoasting……
对于那些不知道什么是基于资源的约束委派的人,我建议在这里阅读 SpecterOps 的优秀博客文章:
https://posts.specterops.io/kerberosity-killed-the-domain-an-offensive-kerberos-overview-eb04b1402c61
它基本上归结为将 Active Directory 中的某些系统配置为允许代表其他用户请求 Kerberos 票证。通过设置 msDS-AllowedToActOnBehalfOfOtherIdentity 属性,我们表明我们信任源自该属性值的任何身份验证。例如,如果 SRV02 将 msDS-AllowedToActOnBehalfOfOtherIdentity 设置为 srv01,这意味着 srv02 信任来自 srv01 的身份验证。您可能会发现有趣的是计算机帐户能够自行设置此属性。
本质上,这意味着如果我们能够让 NTLM 中继从计算机帐户工作并将其委托给 LDAPS,我们可以将 msDS-AllowedToActOnBehalfOfOtherIdentity 属性设置为任意值。如果我们将其设置为我们创建的计算机的值,我们可以将新创建的计算机设置为常规约束委派。这将使我们的新计算机能够代表域中的任何用户 (S4U2Self) 为自己请求服务票证,然后将其转发到中继计算机 (S4U2Proxy),因为由于 msDS-AllowedToActOnBehalfOfOtherIdentity 中继计算机明确信任我们的新计算机属性。
TL;博士如果我们可以将计算机帐户中继到允许将其他计算机添加到域的 LDAPS,我们可以通过在中继计算机上模拟域管理员来破坏中继计算机。
让我们看看这个在行动。
我们将设置 ntlmrelayx.py 到 LDAPS,但这次我们将使用 –delegate-access 标志。
图 31 – 基于资源的约束委派,带有一点中继
这一次,我们将使用 PetitPotam 和我们之前创建的计算机帐户只是为了好玩。
图 32 – 另一个 PetitPotam 身份验证
如果我们现在查看 NTLM 中继,我们可以看到我们添加了一台新计算机并授予它对 SRV01$ 的委托权限
图 33 – 多好的杀戮链!基于资源的约束委派成功!
我们现在可以使用 getST.py 获取 SRV01$ 的 CIFS 服务的服务票证,这将允许我们将票证与 secretsdump 结合使用来转储 SAM。
图 34 – 使用基于资源的约束委派破坏服务器
攻击 5:LDAP 很有趣,尤其是影子凭证
到目前为止,这篇博文已经涵盖了相当知名的攻击途径。让我们深入研究更新颖的东西,作为阅读这篇庞大帖子的奖励
这是一个比较新颖的攻击途径,因为我之前没有看到很多人讨论过这个攻击向量。最近,Impacket 收到了一个拉取请求(https://github.com/ShutdownRepo/impacket/tree/shadowcredentials)来自 shutdownrepo 和 nodauf,他们发现我们可以使用 NTLM 中继获取影子凭据,从而使我们能够危害计算机或用户。如果您不熟悉什么影子证书是,我强烈建议阅读 Elad Shamir 的博客文章,因为他是这个美丽“功能”的发现者:
https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab
从上面的帖子:
Tl;dr可以将“密钥凭据”添加到目标用户/计算机对象的属性 msDS-KeyCredentialLink,然后使用 PKINIT 作为该帐户执行 Kerberos 身份验证。“
这次攻击我们需要什么?
域的功能级别需要是 Server 2016 或更高版本(我希望您的绝大多数客户都是这种情况,否则他们可能会遇到更大的问题)。
需要在域中启用 Active Directory 证书服务 (ADCS),并且域控制器需要安装用于服务身份验证的数字证书。
我们可以枚举是否有使用 Certipy 的证书颁发机构:
图 35 – 枚举模板
我们可以看到域中存在一个证书颁发机构,它实际上是我们的域控制器。由于我们之前的 CrackMapExec 侦察,我们还知道域控制器是最新的。这意味着我们的影子凭证攻击很有可能会正常工作。
现在是时候测试影子凭证中继攻击了。我建议设置一个 virtualenv 并在 venv 中安装修补的 Impacket,而不是覆盖生产 Impacket。
图 36 – 借助 nodauf 使用影子凭证进行中继
让我们疯狂并在启用 webclient 的情况下从我们亲爱的服务器触发身份验证。
图 37 – 我们喜欢 PetitPotam,但 mitm6 和 spoolsample 也可以
注意:我们还可以使用 mitm6 或任何其他触发 HTTP 连接的强制身份验证机制。
让我们检查一下我们的 NTLM 继电器。
图 38 – 通过 shdadow 凭据破坏服务器
我们现在可以按照指示使用 PKINIT 工具来获取服务器的 TGT,我们甚至可以进一步使用 UnPAC-the-hash 来检索 NTLM 密码。
图 39 - 一些 Dirk-jan Mollema 魔术来揭示 NT 哈希
当域中存在启用了 Web 注册功能的证书颁发机构时,可以执行 NTLM 中继到 HTTP 端点以获取证书。
由于我们已经知道存在证书颁发机构,让我们尝试转发给它。
图 40 – 证书滥用时间
证书颁发机构在普通 HTTP 上可用的有趣之处在于,使用哪种协议进行中继并不重要,它总是可以工作的。在这一点上,SMB 或 HTTP 无关紧要。
这次我只使用 Responder 进行中继,但printerbug、PetitPotam 或 mitm6 都会做得很好
图 41 – 如果你看到这个巨大的 base64 Blob,是时候参加聚会了,因为我们可以危及用户/计算机
获得证书后,我们可以使用 Dirk-jan Mollema 的 pkinittools 通过 UnPAC-the-hash 获取 TGT 甚至 NT 哈希:
图 42 – 获得带有证书的 TGT
图 43 – 使用 AS-REP 密钥从 TGT 中提取 NT 哈希
这个故事的寓意是广播协议和强制认证可能导致灾难性的后果。如果可能,请在您的环境中禁用它们,并确保使用最新的补丁程序使您的第 0 层(或任何其他层)保持最新。
我希望这篇博文让全世界的进攻性和防御性安全从业者都大开眼界,这样他们就能意识到 NTLM 中继提供的不仅仅是简单地中继转储 SAM 数据库。
在结束这篇博文之前,我想向那些为使这些攻击原语易于执行的工具做出贡献的优秀研究人员致以崇高的敬意:
特别感谢Justin Bollinger审阅这份庞大的文件!
可能还有无数我忘记提及的其他人。
NTLM 中继博客文章到此结束,希望这些信息对您有用!😊
https://gist.github.com/gladiatx0r/1ffe59031d42c08603a3bde0ff678feb https://www.tiraniddo.dev/2015/03/starting-webclient-service.html https://gist.github.com/klezVirus/af004842a73779e1d03d47e041115797 https://www.tiraniddo.dev/2015/03/starting-webclient-service.html