0

我有一个学校作业,其中包括我必须破解一个 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

4

3 回答 3

0

我很想知道我应该使用什么类型的编码来读取密码文件

您应该使用文件编码的编码。

不幸的是,通常不可能从文件中分辨出文件的编码,您需要一些额外的带外信息,例如文件中的标头告诉您编码,传输格式告诉您编码……或只是询问文件的作者。

但是,由于加密数据库中的密码很可能被视为八位字节流,因此以同样的方式处理密码字典可能是有意义的。

于 2018-09-20T19:17:35.593 回答
0

老实说,我不知道如何检查以确认。

使用iconv. 尝试转换包含格式错误的字符的文件时会失败。

以下是一些测试文件:

printf 'ascii only\n' > ascii_only.txt
printf 'utf-8 \342\230\272\n' > utf8.txt
printf 'latin1. pi\361ata.\n' > latin1.txt

这里有些例子:

$ iconv -f utf-8 -t utf-8 < utf8.txt > /dev/null && echo "ok"
ok

$ iconv -f ascii -t utf-8 < utf8.txt > /dev/null && echo "ok"
iconv: illegal input sequence at position 6

$ iconv -f utf-8 -t utf-8 < latin1.txt > /dev/null && echo "ok"
iconv: illegal input sequence at position 10

您可以尝试 ASCII、UTF-8 和 Latin1(按此顺序),并使用iconv最先接受的编码。

即使这不是学校作业,您也可以实际期望大多数密码是 ASCII。

于 2018-09-20T20:25:10.747 回答
0

为我解决的解决方案,我无法破解密码的原因是因为我未能从字典单词中删除新行,

只是做一个

line = line.rstrip()

解决了我的问题,我不需要做任何类型的编码或任何事情来让文件工作。

于 2018-09-26T17:25:31.690 回答