暴力破解unix密码文件中的SHA-512密码

Brute-force cracking SHA-512 passwords in unix password file

我有一项学校作业,其中包括我必须破解一个 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 "$" in line:
        temp1 = line.split(":")
        temp1 = temp1[1]
        salt_SHA512.append(temp1[:11])
        hash_SHA512.append(temp1)
    if "$" 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,但老实说我不知道​​如何检查以确认。

如果有人对我可以做些什么来使这项工作有任何建议,我将不胜感激!

(我现在正在尝试默认编码,不初始化一个

crackStation = open('1000000passwords.txt', 'r')

)

如果确实如此,我会通知您!

补充问题:

谁能告诉我这个密码文件的编码是什么,

adamkaplan:$S4Y0gQuy$QRkLo5t/6KONMAiQY9DIAPojv0Q8CBvDtNqe02sfR7rnEdw.QgSm0LU/JRcIc/Arn/PpK3lxroc19bVQDwUGQ/:17786:0:99999:7:::
cardib:$t84.FvbolKHpxBDnjoHhnFS3.A4ezNZmKfy5MLbe7UGZoOnWgz55j0g5TBx5LOQAujDiqkUuE50EACOZsydlBZgy5jkw/:17786:0:99999:7:::

密码散列不是 BASE64,我问的原因是因为当我在字典文件中使用不同的编码时,每个编码都会给出不同的散列,所以这就是让我失望的原因,如果我使用 UTF-8,我会收到一个不同的哈希经文 latin-1

那么 linux 密码文件默认使用什么编码。

如果我通过终端创建一个新的 linux 帐户并设置密码并返回到我的密码文件中,我将为新用户名密码以及其中使用的编码创建新的哈希值该哈希算法是我需要的,或者至少是我想象的破解密码所需的算法。

希望不会太混乱:s

I'm curious to see WHAT type of encoding I should be using to read from the password file

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

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

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

I honestly don't know how to check to confirm.

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

以下是一些测试文件:

printf 'ascii only\n' > ascii_only.txt
printf 'utf-8 202\n' > utf8.txt
printf 'latin1. pi1ata.\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。

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

只是做一个

line = line.rstrip()

解决了我的问题,我不需要进行任何类型的编码或任何操作即可使文件正常工作。