我有一个学校作业,其中包括我必须破解一个 unix 密码文件,密码是使用 SHA-512 创建的,
我正在使用 python3 编写我的密码破解脚本,该脚本通过密码文件,添加盐并比较每个密码,直到找到哈希。
这是我的代码:
#!/usr/bin/env python3
import crypt
passFile = open('passwords.txt', 'r')
salt_MD5 = []
hash_MD5 = []
salt_SHA512 = []
hash_SHA512 = []
for line in passFile:
if "$6$" in line:
temp1 = line.split(":")
temp1 = temp1[1]
salt_SHA512.append(temp1[:11])
hash_SHA512.append(temp1)
if "$1$" in line:
temp1 = line.split(":")
temp1 = temp1[1]
salt_MD5.append(temp1[:11])
hash_MD5.append(temp1)
print(salt_MD5, hash_MD5)
print(salt_SHA512, hash_SHA512)
crackStation = open('1000000passwords.txt', 'r')
print("Searching for the password...")
counter = 0
for index in crackStation:
counter += 1
hashed_value_1 = crypt.crypt(index, salt_MD5[0])
hashed_value_2 = crypt.crypt(index, salt_MD5[1])
hashed_value512_1 = crypt.crypt(index, salt_SHA512[0])
hashed_value512_2 = crypt.crypt(index, salt_SHA512[1])
if counter % 50000 == 0:
print("Counter is at: " + str(counter) + " Left to iterate = " + str(1000000-counter))
# if hashed_value_1 == hash_MD5[0]:
# password_1 = index
# print("User one has been cracked password is: " + password_1)
# if hashed_value_2 == hash_MD5[1]:
# password_2 = index
# print("User two has been cracked password is: " + password_2)
if hashed_value512_1 == hash_SHA512[0]:
password_3 = index
print("User one has been cracked using password: " + password_3)
if hashed_value512_2 == hash_SHA512[1]:
password_4 = index
print("User one has been cracked using password: " + password_4)
print("Search Complete.")
try:
print(password_1, password_2, password_3, password_4)
except Exception as e:
print("Oh shit something went wrong :s" + e)
请忽略 MD5、盐和哈希,因为我稍后会处理(教授声称文件中的某些密码是可破解的,一位同学证实他能够破解两个 SHA-512 密码,因此我评论了为了速度,MD5出来了)
我很想知道我应该使用什么类型的编码来读取密码文件,到目前为止我已经尝试过“mac_roman”来遍历字典文件,现在我只是没有设置编码,我'我假设默认应该是 UTF-8,但老实说我不知道如何检查确认。
如果有人对我可以做些什么来完成这项工作有任何建议,我将不胜感激!
(我现在正在尝试默认编码,不初始化一个
crackStation = open('1000000passwords.txt', 'r')
)
如果在这种情况下,那确实有效,我会告诉你的!
附加问题:
有人能告诉我这个密码文件的编码是什么吗?
adamkaplan:$6$S4Y0gQuy$QRkLo5t/6KONMAiQY9DIAPojv0Q8CBvDtNqe02sfR7rnEdw.QgSm0LU/JRcIc/Arn/PpK3lxroc19bVQDwUGQ/:17786:0:99999:7:::
cardib:$6$t84.Fvbo$8lKHpxBDnjoHhnFS3.A4ezNZmKfy5MLbe7UGZoOnWgz55j0g5TBx5LOQAujDiqkUuE50EACOZsydlBZgy5jkw/:17786:0:99999:7:::
密码哈希不是BASE64,我问的原因是因为当我在字典文件中使用不同的编码时,每种编码都会给出不同的哈希,所以这就是让我失望的事实,如果我使用 UTF-8 , 我会收到一个不同的哈希 latin-1
那么linux密码文件默认使用什么编码。
如果我通过终端创建一个新的 linux 帐户并设置密码并返回到我的密码文件中,我将为该新用户名密码创建一个新的哈希,并且在该哈希算法中使用的编码就是我需要的,或者至少这是我破解密码所需的图像。
希望这不会太令人困惑:s