有没有办法将NetNTLMv2转换为ntlm哈希? 例如,123的ntlm值是
3DBDE697D71690A769204BEB12283678
用户的相同密码"尝试"在计算机" PC"其私有IP地址为192.168.73.130,NetNTLMv2值为
try::PC:d158262017948de9:91642a8388d64d40f6c31b694e79363e:010100000000000058b2da67cbe0d001c575cfa48d38bec50000000002001600450047004900540049004d002d00500043003100340001001600450047004900540049004d002d00500043003100340004001600650067006900740069006d002d00500043003100340003001600650067006900740069006d002d0050004300310034000700080058b2da67cbe0d0010600040002000000080030003000000000000000000000000030000065d85a4000a167cdbbf6eff657941f52bc9ee2745e11f10c61bb24db541165800a001000000000000000000000000000000000000900240063006900660073002f003100390032002e003100360038002e0031002e00310030003700000000000000000000000000
我们可以在不知道任何凭据的情况下将此NetNTLMv2转换为NTLM(3DBDE697D71690A769204BEB12283678
)吗?
答案 0 :(得分:4)
没有答案:)但是没关系,因为我做了一点研究并找到答案。目前无法将NetNTLMv2转换为NTLM。实际上NTLM哈希是生成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大写。我们使用 123
的NTLM作为密钥生成此值的HMAC_MD5哈希。
"tryPC"==> "TRYPC" ==> '54005200590050004300' (UTF-16-le in hexadecimal)
我们在pyhton计算这个:
"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挑战的HMAC_MD5值。
Type2 challange与服务器challange和blob结合使用。
NetNTLMv2的网络响应如下:
try::PC:d158262017948de9:91642a8388d64d40f6c31b694e79363e:010100000000000058b2da67cbe0d001c575cfa48d38bec50000000002001600450047004900540049004d002d00500043003100340001001600450047004900540049004d002d00500043003100340004001600650067006900740069006d002d00500043003100340003001600650067006900740069006d002d0050004300310034000700080058b2da67cbe0d0010600040002000000080030003000000000000000000000000030000065d85a4000a167cdbbf6eff657941f52bc9ee2745e11f10c61bb24db541165800a001000000000000000000000000000000000000900240063006900660073002f003100390032002e003100360038002e0031002e00310030003700000000000000000000000000
当我们根据 :
分割此响应时,索引3是服务器挑战, d158262017948de9
以 "01010000..."
开头的索引5表示blob值。 Blob值还包括blob siganture,保留字段,时间戳,随机客户端nonce和目标信息。我不详细说明这个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个索引,则您需要进行验证。在这种情况下,第四个索引等于 91642a8388d64d40f6c31b694e79363e
,这意味着您拥有正确的密码。
根据服务器挑战和blob值,您将始终获得不同的NTLMv2值,只有拥有正确的密码才能计算出来。
换句话说,我们可以使用NTLM生成NetNTLMv2。但是我们无法将NetNTLMv2转换回NTLM,因为[加密]哈希函数是单向函数。