Как извлечь файл .zip с помощью брутфорсинга с помощью Python - PullRequest
1 голос
/ 04 апреля 2019

Мне дали решение проблемы с использованием python, которое гласило:

Мы начали организовывать файлы, чтобы попытаться разобраться в них, но все они заблокированы цифровым трехзначным паролем.

Посмотрите, можете ли вы написать скрипт для входа в этот файл примера alien-zip-2092.zip и прочитать текстовый файл, внутри которого, как мы думаем, назван, каким бы ни был почтовый индекс (так в данном случае alien-zip-2092.txt).

Файлы должны быть извлечены в каталог /tmp/.

Я только дошел до своего кода. Он получает zip-файл и извлекает его, используя все числа от 0 до 999, но каждый раз, когда запускаю код, я получаю в результате 999. Невозможно проверить, правильно ли была извлечена папка, поэтому я добавил Print (password) для проверки.

Вот мой код:

import zipfile
zf = zipfile.ZipFile("/tmp/alien-zip-2092.zip")
for password in range(0,1000):
    try:
        zf.extract(member="/tmp", pwd = str(i).encode()         
        password = 'Password found: %s' % password
    except:
        pass
print(password)

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

Было бы неплохо распечатать содержимое txt-файла, который предположительно находится в заархивированной папке, но это невозможно сделать без работы остальной части кода.

Почему не печатается правильный пароль? У кого-нибудь есть другие идеи для решения главной проблемы?

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Несколько предложений:

  • не перезаписывайте переменную password, это ваша переменная цикла. Кроме того, i, похоже, не определен, так что вы, вероятно, хотите изменить это.
  • Я предлагаю форматировать наименьшие числа с ведущими нулями, чтобы соответствовать формулировке проблемы (возможно, используйте '{:03d}'.format())
  • Не рекомендуется использовать пробел, за исключением случаев, когда он может скрывать другие ошибки, которые могут произойти.
  • Я предлагаю использовать .extractall() или хотя бы указывать правильные member и path в .extract().

Вот модифицированная версия кода:

import zipfile

filename = 'alien-zip-2092'
zf = zipfile.ZipFile('{}.zip'.format(filename))

password = None
for i in range(1000):
    try:
        temp_password = '{:03d}'.format(i)
        zf.extract(
            member='{}.txt'.format(filename),
            path='/tmp/',
            pwd=temp_password.encode())

        # extraction was successful
        password = temp_password
        break          # exit the for loop
    except zipfile.BadZipFile as err:
        # print(err)
        pass

if password is None:
    print('No valid password found.')
else:
    print('Password found: {}'.format(password))
1 голос
/ 04 апреля 2019

Вы называете переменную, в которой хранится сообщение «Пароль найден», так же, как переменная итерации для вашего цикла for, поэтому, как только начинается следующая итерация, она перезаписывает сохраненное сообщение.

Вместо этого вы должны напечатать правильный пароль и break цикл, как только он будет найден, и использовать блок else для цикла for, чтобы обработать случай, когда правильный пароль не найден, что происходит, еслицикл заканчивается без break:

import zipfile
zf = zipfile.ZipFile("/tmp/alien-zip-2092.zip")
for password in range(0,1000):
    try:
        zf.extract(member="/tmp", pwd = str(i).encode())
        print('Password found: %s' % password)
        break
    except:
        pass
else:
    print('No valid password found.')
...