首页 > 解决方案 > 暴力破解 unix 密码文件中的 SHA-512 密码

问题描述

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

标签: pythonlinuxpython-3.xubuntudictionary-attack

解决方案


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

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

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

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


推荐阅读