是否可以将NetMTLMv2哈希转换为NTLM哈希?

4
有没有办法将NetNTLMv2转换为ntlm哈希值? 例如,123的ntlm值为
3DBDE697D71690A769204BEB12283678

“try”用户在计算机“PC”上使用相同的密码,该计算机具有私有IP地址192.168.73.130,NetNTLMv2值为

try::PC:d158262017948de9:91642a8388d64d40f6c31b694e79363e:010100000000000058b2da67cbe0d001c575cfa48d38bec50000000002001600450047004900540049004d002d00500043003100340001001600450047004900540049004d002d00500043003100340004001600650067006900740069006d002d00500043003100340003001600650067006900740069006d002d0050004300310034000700080058b2da67cbe0d0010600040002000000080030003000000000000000000000000030000065d85a4000a167cdbbf6eff657941f52bc9ee2745e11f10c61bb24db541165800a001000000000000000000000000000000000000900240063006900660073002f003100390032002e003100360038002e0031002e00310030003700000000000000000000000000  

我们能否在不知道任何凭证的情况下将NetNTLMv2转换为NTLM (3DBDE697D71690A769204BEB12283678)?
1个回答

8

没有答案 :) 但是没关系,因为我做了一些研究并找到了答案。目前还没有办法将NetNTLMv2转换为NTLM。实际上,NTLM哈希是生成NetNTLMv2的第一个密钥。我决定解释一下它是如何工作的。

NetNTLMv2响应的简单机制

要计算和比较NTLMv2,您首先应该计算密码的NTLM值,在这种情况下为123。为了演示它,我将使用python 2.7。在开始之前,您应该导入这些模块hashlib、binascii、hmac

使用python计算123的NTLM值如下:

_ntlm = hashlib.new("md4", "123".encode("utf-16-le")).digest()
ntlm = binascii.hexlify(_ntlm)

结果是3dbde697d71690a769204beb12283678,此值将用作第一个HMAC_MD5计算的密钥。
为了做到这一点,我们应该连接用户名和域名。如果您不在域上工作,则将使用计算机名称。在这种情况下,我的用户名是try,计算机名称是PC。 当我们连接它时,它将变成tryPC。然后将此值转换为小端格式的Unicode大写字母。我们将使用NTLM的123作为密钥生成此值的HMAC_MD5哈希。
"tryPC"==> "TRYPC" ==> '54005200590050004300' (UTF-16-le in hexadecimal) 

我们可以用 Python 来计算,如下所示:
"tryPC".upper().encode("utf-16-le").encode("hex") 

我们需要使用密钥3dbde697d71690a769204beb12283678计算HMAC_MD5(54005200590050004300)

在Python中,计算方法如下:

firstHMAC = hmac.new("3dbde697d71690a769204beb12283678".decode("hex"),"54005200590050004300".decode("hex"),hashlib.md5).hexdigest()
firstHMAC ==> 2381ca3f5e9c4534722cd511f6a4c983

接下来我们将使用firstHMAC作为密钥,计算Type2 challenge的HMAC_MD5值。

Type2 challenge与服务器挑战和Blob组合在一起。

NetNTLMv2的网络响应如下:

try::PC:d158262017948de9:91642a8388d64d40f6c31b694e79363e:010100000000000058b2da67cbe0d001c575cfa48d38bec50000000002001600450047004900540049004d002d00500043003100340001001600450047004900540049004d002d00500043003100340004001600650067006900740069006d002d00500043003100340003001600650067006900740069006d002d0050004300310034000700080058b2da67cbe0d0010600040002000000080030003000000000000000000000000030000065d85a4000a167cdbbf6eff657941f52bc9ee2745e11f10c61bb24db541165800a001000000000000000000000000000000000000900240063006900660073002f003100390032002e003100360038002e0031002e00310030003700000000000000000000000000 

当我们根据:索引拆分此响应时,索引3是服务器挑战,其值为d158262017948de9。索引5以"01010000..."开头,表示blob值。Blob值还包括blob签名、保留字段、时间戳、随机客户端随机数和目标信息。我不会详细说明blob。
要计算NTLMv2,我们应该将服务器挑战和blob串联起来,然后使用firstHMAC作为密钥,计算其HMAC_MD5值。
在Python中,我们可以这样做:
firstHMAC = "2381ca3f5e9c4534722cd511f6a4c983"
type2Challange = "d158262017948de9010100000000000058b2da67cbe0d001c575cfa48d38bec50000000002001600450047004900540049004d002d00500043003100340001001600450047004900540049004d002d00500043003100340004001600650067006900740069006d002d00500043003100340003001600650067006900740069006d002d0050004300310034000700080058b2da67cbe0d0010600040002000000080030003000000000000000000000000030000065d85a4000a167cdbbf6eff657941f52bc9ee2745e11f10c61bb24db541165800a001000000000000000000000000000000000000900240063006900660073002f003100390032002e003100360038002e0031002e00310030003700000000000000000000000000"
ntlmv2 = hmac.new(firstHMAC.decode("hex"),type2Challange.decode("hex"),hashlib.md5).hexdigest()
ntlmv2 ==> 91642a8388d64d40f6c31b694e79363e

如果该值等于NetNTLMv2响应的第4个索引,您将通过验证。在这种情况下,第4个索引等于91642a8388d64d40f6c31b694e79363e,这意味着您输入了正确的密码。
根据服务器挑战和Blob值,您将始终获得不同的NTLMv2值,只有在您输入正确密码的情况下才能计算出此值。
换句话说,我们可以使用NTLM生成NetNTLMv2。但是,我们无法将NetNTLMv2转换回NTLM,因为[加密]哈希函数是单向函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接