UNIX密码文件中的蛮力破解SHA-512密码

时间:2018-09-20 19:08:25

标签: python linux python-3.x ubuntu dictionary-attack

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

3 个答案:

答案 0 :(得分:0)

  

我很好奇,我应该使用哪种编码类型来读取密码文件

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

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

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

答案 1 :(得分: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。

答案 2 :(得分:0)

对我来说可行的解决方案,之所以我无法破解密码,是因为我未能从字典单词中删除新行,

只需做一个

line = line.rstrip()

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