
Взлом устаревшего шифрования 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