是否可以将 NetMTLMv2 哈希转换为 NTLM 哈希?
Is it possible to convert NetMTLMv2 hash to NTLM hash?
有没有办法将 NetNTLMv2 转换为 ntlm 哈希?
例如 123 的 ntlm 值是
3DBDE697D71690A769204BEB12283678
计算机 "PC" 中用户 "try" 的密码相同,其私有 IP 地址为 192.168.73.130 NetNTLMv2 值为
try::PC:d158262017948de9:91642a8388d64d40f6c31b694e79363e:010100000000000058b2da67cbe0d001c575cfa48d38bec50000000002001600450047004900540049004d002d00500043003100340001001600450047004900540049004d002d00500043003100340004001600650067006900740069006d002d00500043003100340003001600650067006900740069006d002d0050004300310034000700080058b2da67cbe0d0010600040002000000080030003000000000000000000000000030000065d85a4000a167cdbbf6eff657941f52bc9ee2745e11f10c61bb24db541165800a001000000000000000000000000000000000000900240063006900660073002f003100390032002e003100360038002e0031002e00310030003700000000000000000000000000
我们能否在不知道任何凭据的情况下将此 NetNTLMv2 转换为 NTLM (3DBDE697D71690A769204BEB12283678
)?
没有答案 :) 但没关系,因为我做了一些研究并找到了答案。目前无法将 NetNTLMv2 转换为 NTLM。实际上 NTLM 哈希是生成 NetNTLMv2 的第一个密钥。我决定解释它是如何工作的。
要计算和比较 NTLMv2,您应该首先计算密码的 NTLM 值,在本例中为 123
。为了演示它,我将使用 python 2.7。在开始之前你应该导入那些模块 hashlib, binascii, hmac
.
123
的 NTLM 值用 python 计算如下:
_ntlm = hashlib.new("md4", "123".encode("utf-16-le")).digest()
ntlm = binascii.hexlify(_ntlm)
结果为 3dbde697d71690a769204beb12283678
,此值将用作第一个 HMAC_MD5 计算的键。
为此,我们应该将用户名和域名连接起来。如果您不在域上工作,您将使用您的计算机名称。在这种情况下,我的用户名是 try
,我的计算机名称是 PC
。
当我们连接 is 时,它会变成 tryPC
。然后这个值被转换成little endian格式的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 挑战与服务器挑战和 blob 相结合。
NetNTLMv2 的网络响应如下:
try::PC:d158262017948de9:91642a8388d64d40f6c31b694e79363e:010100000000000058b2da67cbe0d001c575cfa48d38bec50000000002001600450047004900540049004d002d00500043003100340001001600450047004900540049004d002d00500043003100340004001600650067006900740069006d002d00500043003100340003001600650067006900740069006d002d0050004300310034000700080058b2da67cbe0d0010600040002000000080030003000000000000000000000000030000065d85a4000a167cdbbf6eff657941f52bc9ee2745e11f10c61bb24db541165800a001000000000000000000000000000000000000900240063006900660073002f003100390032002e003100360038002e0031002e00310030003700000000000000000000000000
当我们根据 :
拆分此响应时,索引 3 是服务器挑战,即 d158262017948de9
以 "01010000..."
开头的索引 5 表示 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
,这意味着您拥有正确的密码。
根据服务器challange和blob值,你总是会得到不同的NTLMv2值,只有你有正确的密码才能计算出来。
换句话说,我们可以用 NTLM 生成 NetNTLMv2。但是,我们无法将 NetNTLMv2 转换回 NTLM,因为 [加密] 哈希函数是单向函数。
有没有办法将 NetNTLMv2 转换为 ntlm 哈希? 例如 123 的 ntlm 值是
3DBDE697D71690A769204BEB12283678
计算机 "PC" 中用户 "try" 的密码相同,其私有 IP 地址为 192.168.73.130 NetNTLMv2 值为
try::PC:d158262017948de9:91642a8388d64d40f6c31b694e79363e:010100000000000058b2da67cbe0d001c575cfa48d38bec50000000002001600450047004900540049004d002d00500043003100340001001600450047004900540049004d002d00500043003100340004001600650067006900740069006d002d00500043003100340003001600650067006900740069006d002d0050004300310034000700080058b2da67cbe0d0010600040002000000080030003000000000000000000000000030000065d85a4000a167cdbbf6eff657941f52bc9ee2745e11f10c61bb24db541165800a001000000000000000000000000000000000000900240063006900660073002f003100390032002e003100360038002e0031002e00310030003700000000000000000000000000
我们能否在不知道任何凭据的情况下将此 NetNTLMv2 转换为 NTLM (3DBDE697D71690A769204BEB12283678
)?
没有答案 :) 但没关系,因为我做了一些研究并找到了答案。目前无法将 NetNTLMv2 转换为 NTLM。实际上 NTLM 哈希是生成 NetNTLMv2 的第一个密钥。我决定解释它是如何工作的。
要计算和比较 NTLMv2,您应该首先计算密码的 NTLM 值,在本例中为 123
。为了演示它,我将使用 python 2.7。在开始之前你应该导入那些模块 hashlib, binascii, hmac
.
123
的 NTLM 值用 python 计算如下:
_ntlm = hashlib.new("md4", "123".encode("utf-16-le")).digest()
ntlm = binascii.hexlify(_ntlm)
结果为 3dbde697d71690a769204beb12283678
,此值将用作第一个 HMAC_MD5 计算的键。
为此,我们应该将用户名和域名连接起来。如果您不在域上工作,您将使用您的计算机名称。在这种情况下,我的用户名是 try
,我的计算机名称是 PC
。
当我们连接 is 时,它会变成 tryPC
。然后这个值被转换成little endian格式的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 挑战与服务器挑战和 blob 相结合。
NetNTLMv2 的网络响应如下:
try::PC:d158262017948de9:91642a8388d64d40f6c31b694e79363e:010100000000000058b2da67cbe0d001c575cfa48d38bec50000000002001600450047004900540049004d002d00500043003100340001001600450047004900540049004d002d00500043003100340004001600650067006900740069006d002d00500043003100340003001600650067006900740069006d002d0050004300310034000700080058b2da67cbe0d0010600040002000000080030003000000000000000000000000030000065d85a4000a167cdbbf6eff657941f52bc9ee2745e11f10c61bb24db541165800a001000000000000000000000000000000000000900240063006900660073002f003100390032002e003100360038002e0031002e00310030003700000000000000000000000000
当我们根据 :
拆分此响应时,索引 3 是服务器挑战,即 d158262017948de9
以 "01010000..."
开头的索引 5 表示 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
,这意味着您拥有正确的密码。
根据服务器challange和blob值,你总是会得到不同的NTLMv2值,只有你有正确的密码才能计算出来。
换句话说,我们可以用 NTLM 生成 NetNTLMv2。但是,我们无法将 NetNTLMv2 转换回 NTLM,因为 [加密] 哈希函数是单向函数。