认识Windows Hash
早期SMB协议在网络上传输明文口令。后来出现LAN Manager 挑战/响应验证机制(LM),其很容易破解,因此微软提出了WindowsNT挑战/响应验证机制(NTLM)
现在已经诞生NTLMv2以及Kerberos验证体系。Windows的系统密码hash默认情况下一般由两部分组成:第一部分是LM Hash,第二部分是NT Hash
NT Hash与LM Hash算法相比,明文口令大小写敏感,但无法根据NT Hash判断原始明文口令是否小于8字节,摆脱了魔术字符串KGS!@#$%
,MD4是真正的单向哈希函数,穷举做为数据源出现的明文,难度较大
问题在于,微软一味强调NT Hash的强度高,却避而不谈一个事实,为了保持向后兼容性,NT Hash总是与LM Hash一起使用。这意味着NT Hash强度再高也是无助于安全,相反存在潜在危害
认识LM Hash、NTLM Hash、Net-NTLM Hash
LM Hash
LM Hash是Windows使用的最古老的密码存储,其历史可追溯到1980年代的OS / 2。在LAN Manager协议中使用,由于允许的字符集有限,因此它们很容易破解。如果仍然可用,则可以从Windows系统上的SAM数据库或域控制器上的NTDS数据库中获取它们
从Windows Vista / Server 2008开始,默认情况下已关闭LM,但某些工具的参数需要填写固定格式LM hash:NT hash
,可以将LM Hash填0(LM hash可以为任意值),即00000000000000000000000000000000:NT hash
NT Hash(aka NTLM Hash) new technology
通常人们称其为NTLM Hash,这具有误导性,因为Microsoft将其称为NT Hash(至少在某些地方)。建议称其为NT Hash,以免造成混淆
Vista之后现代Windows系统使用的Hash,它的前身是LM Hash,两者相差不大,只是使用的加密算法不同。通常意义上的NT Hash指存储在SAM数据库及NTDS数据库中对密码进行摘要计算后的结果,NT Hash可以通过转储SAM数据库或使用Mimikatz来获得,可直接用于PtH,并且通常存在于lsass进程中,便于SSP使用
NT Hash是支持Net NTLM认证协议及本地认证过程中的一个重要参数。其长度为32位,由数字与字母组成
本地认证
Windows不存储用户的明文密码,它会将用户的明文密码经过加密后存储在SAM数据库中。SAM文件的路径是%SystemRoot%\system32\config\sam
。在进行本地认证的过程中,当用户登录时,系统将用户输入的明文密码加密成NTLM Hash,与SAM数据库中的NTLM Hash进行比较,从而实现认证
在域环境下,域控制器中也存在这样的数据库AD (Account Database),位于ntds.dit
winlogon.exe -> 接收用户输入 -> lsass.exe -> (认证)
用户注销、重启、锁屏后,操作系统会让winlogon显示登录界面,也就是输入框,接收输入后,将密码交给lsass进程,这个进程中会存一份明文密码,将明文密码加密成NTLM Hash,对比SAM数据库中的hash进行验证
NT Hash生成算法
- 明文转换为16进制ASCII码
- 使用little-endian(小端)序将其在转换为Unicode格式。0x80之前的标准ASCII码转换成Unicode码,就是简单地从0x??变成 0×00??。此类标准ASCII串按little-endian序转换成Unicode串,就是简单地在原有每个字节之后添加0×00
- 对所获取的 Unicode串进行标准MD4单向哈希,无论数据源有多少字节,MD4固定产生128-bit的哈希值
plain 123456
-> 313233343536
-> 16字节 310032003300340035003600
-> MD4 Hash 32ED87BDB5FDC5E9CBA88547376818D4
NT Hash 32ED87BDB5FDC5E9CBA88547376818D4
Net-NTLM Hash
Net-NTLM Hash用于网络身份认证(例如NTLM认证),目前分为两个版本:
- Net-NTLMv1
- Net-NTLMv2
通常使用Responder等工具获取到的就是Net-NTLM,Het-Hash并不能直接用来PtH,但有可能通过暴力破解来获取明文密码
NTLMv1 (aka Net-NTLMv1)
NTLM协议在服务器和客户端之间的质询/响应中使用NT Hash。协议v1同时使用NT Hash和LM Hash
NTLMv2 (aka Net-NTLMv2)
NTLM协议的新版本和改进版本,这使其很难破解。该概念与NTLMv1相同,只是发送到服务器的算法和响应不同,也可以通过Responder或类似对象捕获。从Windows 2000开始,在Windows中为默认值
联系&总结
LM和NT哈希是Windows存储密码的方式。NT令人困惑,也称为NTLM。可以破解以获取密码,或用于传递哈希值。
NTLMv1 / v2是用于Windows环境中身份验证的质询响应协议。它们在算法中使用NT哈希,这意味着可以通过Brute Force/Dictionary攻击将其还原成明文密码,也可以用于中继攻击
NTML网络认证机制
NTLM 协议
NTLM是除Kerberos之外的一种网络认证协议,只支持Windows。它是一种基于质询/应答 (Challenge/Response)消息交换模式的认证机制, 常用于工作组和域环境下登录场景的身份认证
NTLM验证(Windows Challenge/Response)
NTLM凭据包括域名,用户名和用户密码的单向Hash。用户的密码不会在网络链路中传输,加密之后的Challenge值取代原本密码的作用进行对比验证,与传统传输密码的方式相比,具有较高的安全性
NTML的认证方式分为Interactive(交互式)和Noninteractive(非交互式)
-
通过网络进行的交互式NTLM身份验证通常涉及两个系统:客户端系统,用户用于请求身份验证;域控制器,其中保留与用户密码有关的信息;交互式提供必要凭据,应用场景通常为用户要登录某台客户端
-
HTLM非交互式身份验证通常涉及三个系统:客户端,服务器和代表服务器进行身份验证计算的域控制器;无需交互式提供凭据,实际应用更多为已登录某客户端的用户去请求另一台服务器的资源 ,即用户只需要登录一次即可访问所有相互信任的应用系统及共享资源
域和工作组
工作组和域宏观上都是一群计算机的集合,域中计算机的数量规模通常大于工作组内的计算机。
工作组内的机器名义上虽然是属于一个集合,但是内部各计算机还是各自管理各自的,没有一个相对成熟的信任机制,工作组内各个计算机的关系依旧是点对点。因此,在工作组环境下进行访问认证,仅涉及Client和Server。我们使用的个人计算机,默认便处于WORKGROUP工作组环境下
域是一个有安全边界的计算机集合,同一个域中的计算机通过共同的第三方信任机构建立信任关系,这个第三方信任机构角色由DC(域控制器)担当。通俗来讲,域中的机器都信任域控制器,那么只要域控制器信任我们,我们就可以在域内获得对其他服务器的访问权限。在这种认证体系中涉及三方:Client、Server、DC
工作组环境NTML认证流程
- (仅交互式身份验证存在此步骤)用户访问客户机并提供域名,用户名,密码。客户端计算密码的Hash,并丢弃实际密码
- 客户端将用户名发送到服务器
- 服务器生成一个16字节的随机数Challenge并发送给客户端
- 客户端使用用户密码的Hash对Challenge进行加密,然后将结果response(Net-NTLM hash)返回给服务器
- 服务器使用用户名从SAM数据库中检索用户密码Hash,使用此密码Hash对Challenge进行加密
- 服务器将其加密的Challenge(在步骤5中)与客户端计算的response(在步骤4中)进行比较。如果它们相同则身份验证成功
域环境NTML认证流程
- (仅交互式身份验证存在此步骤)用户访问客户机并提供域名,用户名,密码。客户端计算密码的Hash,并丢弃实际密码
- 客户端将用户名发送到服务器
- 服务器生成一个16字节的随机数Challenge并发送给客户端
- 客户端使用用户密码的Hash对Challenge进行加密,然后将结果response(Net-NTLM hash)返回给服务器
- 服务器将三个信息发送到域控制器:用户名,发送给客户机的Challenge,返回给服务器的response
- 域控制器使用用户名从SAM数据库中检索用户密码Hash。使用此密码Hash对Challenge进行加密
- 域控制器将其加密的Challenge(在步骤6中)与客户端计算的response(在步骤4中)进行比较。如果它们相同则身份验证成功
工作组环境和域环境NTLM验证区别
域环境Server会将认证信息使用netlogon协议发送给域控制器,由域控制器完成检验并返回认证结果
本地抓取Hash
在渗透测试中,通常可从Windows系统中的SAM文件和域控的NTDS.dit文件中获得用户hash,通过读取lsass.exe(注意 l为小写的L)进程能获得已登录用户的NTLM hash。但需要注意的是大部分本地抓取hash工具都需要管理员权限
-
Mimikatz
Mimikatz可以抓到本机的明文密码和其他用户的Hash密码,原因是因为其抓取本地lsass文件,lsass中有经过其它非Hash加密后的密码,此加密算法可逆因而得到明文密码;而得到其它用户Hash加密后的密码是因为ntds.dit中存储本来就是用户Hash加密后的密码
privilege::debug sekurlsa::logonpasswords
-
Procdump
procdump是微软提供的一个命令行实用程序,用于监视应用程序并生成故障转储。可以用其先dump对方主机的lsass内存文件,然后用mimikatz等工具进行处理。这种方式的好处是可以避免被查杀
转储lsass内存文件 procdump.exe -accepteula -ma lsass.exe lsass.dmp Mimikatz破解lsass sekurlsa::minidump lsass.dmp sekurlsa::logonpasswords
Reference
https://medium.com/@petergombos/lm-ntlm-net-ntlmv2-oh-my-a9b235c58ed4
https://docs.microsoft.com/en-us/windows/win32/secauthn/microsoft-ntlm
https://ssooking.github.io/yu-shen-tou-zhi-ntml-hash/
http://blog.sycsec.com/2018/10/02/What-is-Pass-the-Hash-and-the-Limitations-of-mitigation-methods/
右下角还有打赏功能呦~要不测试一下打赏功能能否正常运行?