
Взлом устаревшего шифрования zip с помощью атаки по известному открытому тексту Бихама и Кохера.
Взлом устаревшего шифрования zip с помощью атаки с известным открытым текстом Бихама и Кохера.
ZIP-архив может содержать множество записей, содержимое которых может быть сжато и/или зашифровано. В частности, записи могут быть зашифрованы с помощью симметричного алгоритма шифрования на основе пароля, называемого традиционным шифрованием PKWARE, устаревшим шифрованием или ZipCrypto. Этот алгоритм генерирует псевдослучайный поток байтов (ключевой поток), который XOR-ится с содержимым записи (открытым текстом) для получения зашифрованных данных (шифротекста). Состояние генератора, состоящее из трех 32-битных целых чисел, инициализируется с помощью пароля и затем непрерывно обновляется открытым текстом по мере шифрования. Этот алгоритм шифрования уязвим для атак с известным открытым текстом, как показали Эли Бихам и Пол К. Кохер в исследовательской статье A known plaintext attack on the PKZIP stream cipher. При наличии шифротекста и 12 или более байтов соответствующего открытого текста можно восстановить внутреннее состояние генератора ключевого потока. Этого внутреннего состояния достаточно, чтобы полностью расшифровать шифротекст, а также другие записи, зашифрованные тем же паролем. Его также можно использовать для перебора пароля со сложностью nl-6, где n — размер набора символов, а l — длина пароля.
bkcrack — это инструмент командной строки, реализующий эту атаку с известным открытым текстом. Основные возможности:
Вы можете получить последний официальный релиз на GitHub.
Предварительно скомпилированные пакеты для Ubuntu, MacOS и Windows доступны для загрузки. Распакуйте загруженный архив туда, куда вам удобно.
В Windows для работы bkcrack необходимы библиотеки времени выполнения Microsoft. Если они еще не установлены в вашей системе, загрузите и установите последний пакет Microsoft Visual C++ Redistributable.
Кроме того, вы можете скомпилировать проект с помощью CMake.
Сначала загрузите исходные файлы или клонируйте git-репозиторий.
Затем выполните следующие команды в дереве исходных файлов, чтобы создать установку в папке install.
cmake -S . -B build -DCMAKE_INSTALL_PREFIX=install
cmake --build build --config Release
cmake --build build --config Release --target install
bkcrack доступен в репозиториях пакетов, перечисленных ниже. Эти пакеты предоставляются внешними сопровождающими.
Вы можете просмотреть список имен записей и метаданных в архиве с именем archive.zip следующим образом:
bkcrack -L archive.zip
Записи, использующие шифрование ZipCrypto, уязвимы для атаки с известным открытым текстом.
Для атаки требуется не менее 12 байт известного открытого текста. По крайней мере 8 из них должны быть непрерывными. Чем больше непрерывного известного открытого текста, тем быстрее атака.
Имея ZIP-архив encrypted.zip с записью cipher в качестве шифротекста и plain.zip с записью plain в качестве известного открытого текста, bkcrack можно запустить следующим образом:
bkcrack -C encrypted.zip -c cipher -P plain.zip -p plain
Имея файл cipherfile с шифротекстом (начинающимся с 12 байт, соответствующих заголовку шифрования) и файл plainfile с известным открытым текстом, bkcrack можно запустить следующим образом:
bkcrack -c cipherfile -p plainfile
Если открытый текст соответствует части, отличной от начала шифротекста, вы можете указать смещение. Оно может быть отрицательным, если открытый текст включает часть заголовка шифрования.
bkcrack -c cipherfile -p plainfile -o offset
Если вы знаете небольшой непрерывный открытый текст (от 8 до 11 байт), но знаете некоторые байты в некоторых других известных смещениях, вы можете предоставить эту информацию, чтобы достичь требования в 12 известных байт в общей сложности.
Для этого используйте флаг -x, за которым следует смещение и байты в шестнадцатеричном формате.
bkcrack -c cipherfile -p plainfile -x 25 4b4f -x 30 21
Если атака успешна, расшифрованные данные, связанные с шифротекстом, использованным для атаки, могут быть сохранены:
bkcrack -c cipherfile -p plainfile -d decipheredfile
Если ключи известны из предыдущей атаки, можно использовать bkcrack для расшифровки данных:
bkcrack -c cipherfile -k 12345678 23456789 34567890 -d decipheredfile
Расшифрованные данные могут быть сжаты в зависимости от того, использовалось ли сжатие при создании zip-файла.
Если использовалось сжатие deflate, можно использовать скрипт Python 3, предоставленный в папке tools, для декомпрессии данных.
python3 tools/inflate.py < decipheredfile > decompressedfile
Чтобы получить доступ ко всем записям зашифрованного архива за один шаг, вы можете создать новый архив с тем же содержимым, но без шифрования. Предполагается, что все записи изначально были зашифрованы одним и тем же паролем.
bkcrack -C encrypted.zip -k 12345678 23456789 34567890 -D decrypted.zip
Также можно создать новый зашифрованный архив с паролем по вашему выбору:
bkcrack -C encrypted.zip -k 12345678 23456789 34567890 -U unlocked.zip new_password
Вы также можете задать новый пароль через его внутреннее представление.
bkcrack -C encrypted.zip -k 12345678 23456789 34567890 --change-keys unlocked.zip 581da44e 8e40167f 50c009a0
Эти две команды можно использовать вместе для изменения содержимого зашифрованного архива, не зная пароля, но зная только внутренние ключи: вы можете сделать копию, зашифрованную выбранным вами паролем, затем отредактировать копию с помощью архиватора, введя выбранный пароль при запросе, и, наконец, сделать копию измененного архива обратно с исходными ключами шифрования.
Зная внутренние ключи, bkcrack может попытаться найти исходный пароль.
Вы можете искать пароль, используя символы в заданном наборе символов:
bkcrack -k 1ded830c 24454157 7213b8c5 -b ?p
Вы можете ограничить поиск паролями заданной длины или диапазона длин:
bkcrack -k 1ded830c 24454157 7213b8c5 -b ?p -l 9
bkcrack -k 1ded830c 24454157 7213b8c5 -b ?p -l 8..10
Опция -r <длина> <набор_символов> является сокращением для -l 0..<length> -b <charset>:
bkcrack -k 1ded830c 24454157 7213b8c5 -r 10 ?p
Если вы имеете некоторое представление о том, как формируется пароль, вы можете указать маску, чтобы ограничить пространство поиска и сделать восстановление намного быстрее. Это актуально для длинных паролей (например, из 12 и более символов), для которых перебор становится очень затратным по времени.
Например, предположим, вы смутно помните, что ваш пароль состоит из 8 строчных букв, дефиса и 6 десятичных цифр. Вы можете использовать эту команду:
bkcrack -k 1940e266 d3fd3d89 71ce9871 -m ?l?l?l?l?l?l?l?l-?d?d?d?d?d?d
Это выполняется за миллисекунды, тогда как альтернатива перебора занимает часы.
Пространство поиска как для перебора, так и для восстановления пароля по маске определяется наборами символов. Набор символов — это последовательность символов или сокращений для существующих наборов. Предопределенные наборы перечислены ниже.
В дополнение к предопределенным наборам символов вы можете задать пользовательские наборы с помощью опции -s.
Пользовательские наборы могут ссылаться на предопределенные наборы или на другие пользовательские наборы.
Пользовательские наборы особенно полезны для точного указания пространства поиска при восстановлении по маске.
Например, если вы знаете, что ваш пароль состоит из 10 букв (прописных или строчных) и 5 двоичных цифр, вы можете использовать эту команду:
bkcrack -k b8c377a6 f603160f 1832a78b -m ?x?x?x?x?x?x?x?x?x?x?y?y?y?y?y -s x ?u?l -s y 01
Учебное пособие находится в папке example.
Для получения дополнительной информации ознакомьтесь с документацией и исходным кодом.
Не стесняйтесь предлагать улучшения или отправлять запросы на слияние на GitHub.
Если вы хотите выразить поддержку проекту, вы можете сделать пожертвование или стать спонсором проекта через GitHub Sponsors.
Этот проект предоставляется на условиях лицензии zlib/png.
| Сокращение | Описание | Значение |
|---|
?l | строчные буквы | abcdefghijklmnopqrstuvwxyz |
?u | прописные буквы | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
?d | десятичные цифры | 0123456789 |
?s | специальные символы | !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ |
?a | буквенно-цифровые символы | то же, что ?l?u?d |
?p | печатные символы ASCII | то же, что ?l?u?d?s |
?b | все байты | 0x00 .. 0xff |