Взлом паролей SHA-512 методом перебора в файле паролей Unix - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть школьное задание, которое состоит из того, что мне нужно взломать файл паролей 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 голосов
/ 20 сентября 2018

Честно говоря, я не знаю, как проверить, чтобы подтвердить.

Использовать 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.

0 голосов
/ 26 сентября 2018

Решение, которое сработало для меня, причина, по которой я не смог взломать пароли, заключалась в том, что я не смог убрать новые строки из словарных слов,

просто выполняя

line = line.rstrip()

решил мою проблему, мне не нужно было ни кодировать, ни что-либо другое, чтобы файл работал.

0 голосов
/ 20 сентября 2018

Мне любопытно узнать, КАКОЙ тип кодировки я должен использовать для чтения из файла паролей

Вы должны использовать кодировку, в которую закодирован файл.

К сожалению, вообще невозможно определить кодировку файла только из файла, вам нужна дополнительная внеполосная информация, такая как заголовок в файле, сообщающий вам кодировку, формат передачи, сообщающий вамкодировка ... или просто запрос автора файла.

Однако, поскольку пароли в зашифрованной базе данных, скорее всего, рассматриваются как потоки октетов, возможно, имеет смысл обращаться со словарем паролей таким же образом.

...