Эксперт Positive Technologies обратил внимание сообщества на интересную особенность в работе защищенных паролем архивов ZIP. Оказалось, у таких архивов может быть два правильных пароля, и оба дают одинаковый результат при извлечении файлов.
В минувшие выходные специалист Positive Technologies Арсений Шароглазов продемонстрировал в своем Twitter, что для защищенных паролем ZIP-архивов могут подойти сразу два пароля. В ходе эксперимента он создал архив с именем x.zip, паролем для которого была выбрана строчка из незабвенной мемной песни Рика Эстли «Never Gonna Give You Up»: «Nev1r-G0nna-G2ve-Y8u-Up-N5v1r-G1nna-Let-Y4u-D1wn-N8v4r-G5nna-D0sert-You».
Исследователь продемонстрировал, что успешно распаковать архив можно как с этим паролем, так и с паролем «pkH8a0AqNbHcdw8GrmSp».
Комментаторы начали интересоваться у Шароглазова, как он это сделал, но суть этого «фокуса» объяснил другой пользователь Twitter под ником Unblvr. Дело в том, что при создании защищенных паролем архивов с включенным режимом AES-256, ZIP использует стандарт PBKDF2 и хеширует пароль, созданный пользователем, если тот слишком длинный. Слишком длинными в данном случае считаются любые пароли более 64 байтов (символов).
В итоге полученный таким способом хеш фактически становится вторым подходящим для архива паролем: в данном случае «pkH8a0AqNbHcdw8GrmSp» вместо чересчур длинного «Nev1r-G0nna-G2ve-Y8u...».
Когда пользователь пытается распаковать файл и вводит пароль длиннее 64 байт, input снова хешируется приложением ZIP и сравнивается с правильным паролем (который уже и сам представляет собой хеш). Совпадение ведет к успешной распаковке архива.
Таким образом, второй «правильный пароль», показанный Шароглазовым, на самом деле представляет собой ASCII-версию хеша SHA-1 для чересчур длинного пароля. Так, контрольная сумма SHA-1 для пароля «Nev1r-G0nna-G2ve- Y8u...» — это 706b4838613041714e62486364773847726d5370. При преобразовании в ASCII на выходе получаем: pkH8a0AqNbHcdw8GrmSp.
Журналисты издания Bleeping Computer обратили внимание на еще один интересный аспект этого «трюка»: ASCII-представление для хеша SHA-1 вовсе не обязательно должно получиться буквенно-цифровой строкой, как это произошло с паролем «pkH8a0AqNbHcdw8GrmSp».
Для наглядности издание приводит следующий пример: если для ZIP-архива использовать пароль «Bl33pingC0mputer-Sh0w-M3-H0W-t0-pR0Duc3-an-eNcRyPT3D-ZIP-File-in-the-simplest-way», его контрольная сумма SHA-1 будет выглядеть так: bd0b8c7ab2bf5934574474fb403e3c0a7e789b61.
Однако ASCII-представление для этой контрольной суммы представляет собой бессвязный набор байтов, и это вовсе не такой элегантный «альтернативный пароль», как показан в примере Шароглазова.
Тогда журналисты поинтересовались у исследователя, как ему удалось подобрать пароль, контрольная сумма SHA-1 для которого представляет собой чистую буквенно-цифровую строку в ASCII. Шароглазов рассказал, что именно по этой причине использовал слегка модифицированную версию опенсорсного инструмента для восстановления паролей hashcat. Он генерировал различные варианты строки «Never Gonna Give You Up…», используя разные буквенно-цифровые комбинации, пока не получил идеальный для своего эксперимента пароль «pkH8a0AqNbHcdw8GrmSp».
«Я тестировал Nev0r, Nev1r, Nev2r и так далее… И в итоге подобрал нужный мне пароль», — объяснил Шароглазов.