我有一个学校作业,要求我破解一个unix密码文件,密码是用SHA-512创建的
我使用python3编写密码破解脚本,该脚本通过一个密码文件,添加salt并比较每个密码,直到找到散列。在
这是我的代码:
#!/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,salt和hash,我稍后会处理(教授声称文件中的一些密码可能会被破解,另一位同学证实他能够破解SHA-512的两个密码,因此为了速度,我将MD5注释掉)
我很好奇我应该用什么类型的编码来读取密码文件,到目前为止,我已经尝试过“mac_roman”来遍历字典文件,现在我只是没有设置编码,我假设默认值应该是UTF-8,但我真的不知道如何检查以确认。在
如果有人对我能做些什么来让这个工作有什么建议的话,我会非常感激的!在
(我现在正在尝试默认编码,不初始化一个
^{pr2}$)
如果那样的话,我会让你知道的!在
附加问题:
有人能告诉我这个密码文件的编码是什么吗
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,我将收到一个与拉丁语-1不同的哈希值
所以linux密码文件默认使用什么编码。在
如果我通过终端创建一个新的linux帐户并设置一个密码,然后回到我的密码文件中,我将为这个新的用户名密码生成一个新的哈希值,并且在哈希算法中使用的编码就是我需要的,或者至少这是我想破解密码所需要的。在
希望这不会太令人困惑
使用
iconv
。当试图转换包含错误字符的文件时,它将失败。在以下是一些测试文件:
以下是一些示例:
^{pr2}$您可以尝试ASCII、UTF-8和Latin1(按该顺序),并使用
iconv
首先接受的编码。在即使这不是学校的作业,你可以实际地期望大多数密码是ASCII码。在
您应该使用文件编码的编码方式。在
不幸的是,一般情况下不可能仅从文件中分辨出文件的编码,您需要一些额外的带外信息,例如文件中的标头告诉您编码,传输格式告诉您编码……或者只是询问文件的作者。在
但是,由于加密数据库中的密码最有可能被视为八位字节流,因此以同样的方式处理密码字典可能是有意义的。在
对我来说解决办法,我不能破解密码的原因是因为我没能从字典中删除新行
只是做一个
解决了我的问题,我不需要做任何类型的编码或任何事情让文件工作。在
相关问题 更多 >
编程相关推荐