Статья Работа с запароленными архивами с помощью Python

Распаковка zip-архивов с помощью Python и встроенной библиотеки zipfile довольно простое занятие. И, может быть я и не столкнулся с некоторыми трудностями, если бы не стал распаковывать с помощью этой библиотеки запароленный архив. Вот тут-то архиватор и не захотел с ним работать. Хотя, распаковка архивов с паролем в нем предусмотрена уже по умолчанию. Тогда я решил немного разобраться, почему же так происходит и как с этим быть. Таким образом, получилась небольшая заметка по поводу того, как распаковать запароленные архивы разными типами архиваторов с помощью Python.

000.jpg



Дисклеймер: данная статья служит для ознакомления и не призывает к действию.

На оригинальность вовсе не претендую. Я просто хочу поделиться с другими тем, на что было потрачено пару часов моего времени. Чтобы человек, который решил распаковать архив питоном, не столкнулся с теми же трудностями, что и я. Если, конечно же, он прочтет эту заметку.


Пара слов про архивы с паролем

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

Библиотека zipfile для шифрования и расшифровки файлов использует алгоритм ZIP-шифрования. Однако, файлы с паролем, созданные с помощью стандартного архиватора Linux используют уже другой алгоритм шифрования AES. И соответственно, распаковать архив созданный таким способом с помощью библиотеки zipfile не получается. Это же касается и формата архивов 7zip.

Про формат RAR вообще отдельный разговор. Так как он является проприетарным, а значит закрытым форматом, то инструменты для распаковки доступны для данного формата только те, что поставляются разработчиками данного архиватора. И хоть они и предоставляются бесплатно, все равно, без помощи данных инструментов распаковка зашифрованных архивов будет недоступной. Да и вообще распаковка, как таковая. Для python, в данный момент, доступны лишь оболочки, которые являются лишь интерфейсами для инструментов rar.

А теперь хочу поделиться с вами теми способами, что я нашел для распаковки зашифрованных архивов, то есть архивов с паролем.


Что потребуется?

Для распаковки зашифрованного zip-архива нужно установить библиотеку pyzipper. В терминале выполняем команду:

pip install pyzipper

После чего импортируем загруженную библиотеку в скрипт:

import pyzipper

Ну и можно распаковывать архивы. Я не стал писать какие-то специальные скрипты для распаковки. Вместо этого будут просто обозначены функции, с помощью которых можно это сделать.


Расшифровка и распаковка zip-архива

Ну и раз мы начали с zip-архивов, то ниже приведен код для расшифровки и распаковки:

Python:
# pip install pyzipper
import pyzipper


def decrypt(file_path, word):
    with pyzipper.AESZipFile(file_path, 'r', compression=pyzipper.ZIP_LZMA, encryption=pyzipper.WZ_AES) \
            as extracted_zip:
        try:
            extracted_zip.extractall(pwd=word)
        except RuntimeError as ex:
            print(ex)


decrypt('test.txt.zip', b'123')

pyzipper является контекстным, потому открываем его с помощью with. Используем класс AESZipFile, в который передаем необходимые аргументы. Здесь file_path – путь к запароленному архиву. compression – метод сжатия. encryption – алгоритм шифрования, который будет использован для расшифровки. А далее в extracted_zip.extractall(pwd=word) вызывается функция extractall для распаковки всего содержимого архива. Здесь также можно указать путь для распаковки в параметре path, а в параметре pwd указывается пароль или ключ к зашифрованному архиву. Если путь для распаковки не указан, архив распаковывается в ту же папку, где он и располагается. Ключ должен быть в байтовом формате. Поэтому, нужно его перед тем, как передавать его в функцию, в него перевести. Либо как в примере, либо, использовав функцию encode().


Распаковка и расшифровка 7zip-архива

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

Для распаковки 7zip я использовал библиотеку py7zr, которая устанавливается в терминале с помощью команды:

pip install py7zr

Далее она импортируется в скрипт. Вот небольшой код для расшифровки и распаковки:

Python:
# pip install py7zr

import py7zr

try:
    with py7zr.SevenZipFile('test.txt.7z', mode='r', password='123') as z:
        z.extractall()
except py7zr.exceptions.Bad7zFile as ex:
    if str(ex) == 'not a 7z file':
        print('Файл не является 7zip')

Параметры для распаковки, это путь к файлу архива, метод, который используется для открытия зашифрованного файла. Так как файл расшифровывается и распаковывается, то здесь нужно использовать read. И пароль к зашифрованному файлу. Я пробовал указать для распаковки с помощью данной библиотеки zip-архив. И если оригинальный архиватор 7zip справляется с этим на ура, то в данном случае возникает исключение, текст которого так и гласит, что файл не является 7zip.


Расшифровка и распаковка RAR

С данным типом архивов возникли довольно большие трудности. Не в том плане, что его невозможно распаковать без установленного архиватора, а в том плане, что он является проприетарным, следовательно, компоненты для его работы нужно качать с . В данном случае скачивается исполняемый файл unrar.exe, который нужно положить либо в папку с расшифровываемым архивом, либо в папку WinRAR, которую нужно создать в Program Files. Для того чтобы библиотека, то есть интерфейс к данному экзешнику, корректно находил к ней путь. Ну и так как exe используется в ОС Windows, то, как вы поняли, речь пока идет о ней. Или, если у вас уже установлен архиватор WinRAR, качать ничего не надо. Библиотека использует для распаковки Rar.exe находящийся в папке с программой. Его, при отсутствии архиватора и большом желании можно найти в интернете и положить в папку с архивом для распаковки. Данная конструкция тоже будет работать.

А теперь о том, что понадобиться. А понадобиться установить библиотеку patoolib с помощью команды в терминале:

pip install patoolib.

Используется в коде она очень просто. Для начала импортируется в скрипт, а затем указывается в качестве опций путь для распаковки. И на этом все. Библиотека сама ищет Rar или Unrar.exe по заданным в ней путям и использует их в работе.

Python:
# pip install patoolib

import patoolib

patoolib.extract_archive("test.rar")

Здесь пароль для распаковки в коде не указывается, а вводиться в терминале. А значит, в автоматическом режиме данную конструкцию использовать не получиться. Есть еще библиотеки, которые выполняют похожие функции. Но, все они, в той или иной степени, используют инструменты Rar.

Если вы решите распаковать данный вид архива с помощью python в Linux, то вам нужно будет установить библиотеку unrar. Ну и rar, в придачу, чтобы была возможность эти архивы создавать. Мало ли, вдруг для чего-то может, потребуется.

sudo apt-get install -y rar unrar

Вот такая вот небольшая заметка. Надеюсь, что она кому-то поможет при работе с запароленными архивами. Хотя это и не секретная информация, но искать ее в куче статей о работе с архивами с помощью zipfile довольно нудно ))


Ну и небольшой код, который пытается работать с запароленными zip-архивами. А началось все с того, что у меня в архиве лежала нужная информация, а вот пароль на него я подзабыл. Потому и попробовал написать код для работы с запароленными архивами с помощью стандартной библиотеки и столкнулся с трудностями по расшифровке. Ну и соответственно, начал искать информацию:

Python:
# pip install pyzipper
# pip install tqdm

import pyzipper
from tqdm import tqdm


def decrypt(extracted_zip, word):
    try:
        extracted_zip.extractall(pwd=word)
    except RuntimeError:
        pass
    except pyzipper.zipfile.BadZipFile:
        pass
    else:
        print(f'\n[+] Пароль найден: {word.decode()}')
        exit(0)


def open_pass_list(wordlist, file_path):
    len_zip = len(list(open(wordlist, 'rb')))

    with open(wordlist, 'r', errors='ignore') as wordlist:
        with pyzipper.AESZipFile(file_path, 'r', compression=pyzipper.ZIP_LZMA,
                                 encryption=pyzipper.WZ_AES) as extracted_zip:
            for word in tqdm(wordlist, total=len_zip, unit=' word'):
                decrypt(extracted_zip, word.strip().encode())


def main():
    wordlist = input('[+] Введите путь к словарю: ')
    file_path = input('[+] Введите путь к архиву: ')
    print(" ")
    open_pass_list(wordlist, file_path)


if __name__ == "__main__":
    main()

Работа с архивом идет по словарю. А потому, его надо где-то скачать. Впрочем, в интернете словарей великое множество. Но я использовал rockyou.txt. Это, наверно, один из самых больших словарей с паролями, которые я видел. Попадались мне и на 10 миллионов. Но тут, больше 14-ти. К слову, пароль я так и не нашел. Пришлось вспоминать самостоятельно ))


Спасибо за внимание. Надеюсь, что данная информация будет вам полезна
 
Последнее редактирование:

xaxaxaxa

New member
09.11.2023
3
0
BIT
14
Спасибо! Очень полезная статья. Сам пытался написать скрипт для подбора пароля, но не знал что будут такие грабли
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!