无法在 Linux 上使用 Python 破解 Crypt3 SHA-512 获得正确的基础

信息安全 哈希 密码破解 Python
2021-09-08 00:07:02

我正在读一本书,它给了我一个简单的 Python 脚本来破解/etc/shadow使用该crypt()函数加密的密码。然后它会挑战您修改 Python 程序以使用现代 Linux 中使用的较新的 Crypt3 SHA-512 算法。

我被困在输出存储在/etc/shadow. 我有一个用户test1使用的密码password/etc/shadow如下所示:

cat /etc/shadow | grep test1
test1:$6$sRgBNCzw$A3IHWJz./hdhPa1FHuN.Kn.P/2InPqGjZxxGnNUxY2I2b0t4xpogCKWkq9.Ra.XDaFSpNOb5UYhwjQMzBWrtp.:16792:0:99999:7:::

我的脚本的最简单形式如下所示:

import hashlib
dk = hashlib.pbkdf2_hmac('sha512',b'password',b'sRgBNCzw',5000)

检查dk看起来像这样:

>>> dk
'.YQ\xf0\xf1\x1f\x08\x0e\x9c\xa9-E\x90\x89\xebZ\xb1\x04ao:\x00;\x9a\xcb?\xaa\x04H\x14\xb6&\x9c\x0e}#\xbd\xf5\xe6\xa5\xd6\xda|xu\x1e\xa1\xd1\x95D\x94\x15\x19 \xccEX\\\xf0g\x97|\\\xee'

我猜这是 Python 将二进制 blob 表示为文本的最大努力。但是,我需要将其与 Crypt3 函数的散列值进行比较,即:

A3IHWJz./hdhPa1FHuN.Kn.P/2InPqGjZxxGnNUxY2I2b0t4xpogCKWkq9.Ra.XDaFSpNOb5UYhwjQMzBWrtp.

现在只看影子文件中的散列值,我可以看到它看起来像 base64,所以我使用它:

binascii.b2a_base64(binascii.hexlify(dk))

得到这个:

'MmU1OTUxZjBmMTFmMDgwZTljYTkyZDQ1OTA4OWViNWFiMTA0NjE2ZjNhMDAzYjlhY2IzZmFhMDQ0ODE0YjYyNjljMGU3ZDIzYmRmNWU2YTVkNmRhN2M3ODc1MWVhMWQxOTU0NDk0MTUxOTIwY2M0NTU4NWNmMDY3OTc3YzVjZWU=\n'

进一步阅读告诉我,Crypt3 函数使用了 base64 的略微修改版本,它取消了填充和“=”。

任何人都可以帮助我如何让我的哈希与/etc/shadow使用 Python 的哈希相匹配吗?

1个回答

根据这个问题中的信息,我能够成功地重现一个哈希。

将密码设置为 后password,我执行了这些命令

$ sudo grep neil /etc/shadow
neil:$6$GpNiWKnm$aToSshPrg45wXFuP/Hmkkpf8/GUYg0d/C4eU/BH7iG2QwM.C59NIVr/izGUGXzf7HjqQNmpFXhxtIxGtXNrmj0:16793:0:99999:7:::
$ python -c 'import crypt; print crypt.crypt("password", "$6$GpNiWKnm$")'
$6$GpNiWKnm$aToSshPrg45wXFuP/Hmkkpf8/GUYg0d/C4eU/BH7iG2QwM.C59NIVr/izGUGXzf7HjqQNmpFXhxtIxGtXNrmj0
$ python --version
Python 2.7.10

需要注意的是,正在使用的哈希算法可以由第一对美元符号之间的值来确定。在这种情况下,这$6$意味着它是 sha-512(参考)。