Как восстановить утерянный пароль к архиву с помощью видеокарты

    image

    Добрый день, Хабрасообщество!


    Случилось так, что мне потребовалось подобрать утерянный пароль к архиву 7zip, который содержал резервную копию нескольких файлов со старого диска. Пароль я давно потерял, а процесс его восстановления потребовал определенных усилий и оказался довольно занятным делом. Подробнее об этом и расскажу в статье.

    Что представляет собой пароль


    С тех пор как разработчики поняли, что хранить пароль в тексте небезопасно, мы видим только хеш — набор значений, которые генерируются на основе пароля. Такое преобразование выполняется хеш-функцией по заданному алгоритму и является односторонним.

    Существуют разные алгоритмы хеширования: MD5, SHA-1, SHA-2 и прочие. Чтобы восстановить пароль из хеша, можно использовать метод перебора. Нам достаточно создавать хеш для каждого возможного пароля и сравнивать его с тем хешем, который нужно расшифровать. Фактически нам нужно взять файл, вытащить из него хеш и расшифровать его программой-взломщиком. Методика извлечения хеша для каждого алгоритма разная, и сложность перебора каждого из них варьируется.

    Как рассчитать сложность перебора? Не вдаваясь глубоко в заковыристый матан, можно сказать, что это зависит как от длины пароля, так и от набора используемых в нем символов:
    например, числовой пароль 0-9 содержит 10 символов. Пятизначный пароль содержит m=5 знаков. Число комбинаций будет P=m^n или 5 в степени 10 — 9765625.

    Если же учитывать латинские символы — большие и маленькие, то это 26*2+10=62 и наше P равно уже 5 в степени 62!

    Я видел, как в течение недели с помощью двух 22-ядерных Xeon восстанавливают пароль к zip. Ни такими ресурсами, ни стольким временем для подбора пароля я не располагал и задумался об использовании в своих целях графического чипа. Вычислительная мощь этих устройств сейчас у всех на слуху. Производители графических ускорителей — AMD и Nvidia. Nvidia обладает CUDA — собственным закрытым API для вычислений на GPU, который по синтетическим тестам на 20% быстрее открытого аналога OpenCL, но не каждая программа обладает SDK к нему. Кроме того, карты Nvidia уступают картам AMD в вычислениях, реализованных на OpenCL. Эта проблема частично лечится свежими драйверами, но разрыв все равно остается. В конечном итоге мы также упремся в количество вычислительных блоков видеокарты.

    Ниже я рассмотрю решение Hashchat, которое работает на OpenCL и позволяет подключить до 128 видеокарт одновременно. Хотя такой возможности для этого теста нет, предположительно имеет смысл отдать предпочтение среднему ценовому сегменту, поскольку карт можно поставить больше, а разница в производительности непропорциональна цене.

    Инструменты для восстановления пароля


    Hashcat — преемник ранее используемых утилит oclHashcat/cudaHashcat. Заявлен как самый быстрый инструмент для подбора утерянного пароля. Начиная с версии 3.0, поддерживает использование как CPU, так и GPU, но не для всех алгоритмов. Например, с помощью GPU нельзя подобрать пароль к Bcrypt. Зато к MD5 и SHA-1 пароли подбираются довольно быстро. Работает с более чем 200 хешами. По сути, является универсальным кроссплатформенным решением.

    Для получения некоторых из них понадобится утилита ниже:

    John The Ripper — инструмент администратора по восстановлению утерянных паролей — легендарная утилита хак-софта. Популярна из-за поддержки большого количества хешей и их автораспознавания. Поддерживает множество модулей, включая сторонние. John The Ripper даже включен в Kali Linux, но в урезанном виде. Только у этой программы я нашел совершенно необходимые расширения для извлечения хешей из других форматов: zip2john, rar2john, pdf2john.py, pfx2john.exe и много еще чего интересного.

    Cain & Abel — тоже в представлении не нуждается. Программа имеет даже собственный сниффер.

    Существуют и другие инструменты, однако они либо плохо документированы и не имеют GUI, либо уступают в скорости. Поддержка разных типов хешей также важна. Таким образом, останавливаемся на Hashcat.

    В качестве примера мы используем произвольный архив 7zip. Генерируем архив самостоятельно. 7zip использует алгоритм AES256

    Для восстановления хеша пользуемся утилитой 7z2hashcat. Фактически это скрипт на Perl. Качаем его по ссылке и распаковываем.

    7z2hashcat64-1.2  7z.7z > hash.txt

    В результате в текстовом файлике увидим искомый хеш. Далее настроим наш Hashcat:

    • Ставим сам продукт
    • Ставим GUI по желанию и для знакомства с программой.
    • Идем на хешкиллер — и забираем оттуда HashcatGUI.
    • Заходим в папку с HashcatGUI, запускаем App.HashcatGUI.exe.
    • При запуске указываем исполняемый файл программы hashcat64.exe или hashcat32.exe в зависимости от разрядности системы

    image

    GUI иногда выдает ошибки и вылетает при завершении поиска. Тем не менее, чекпоинт предусмотрен, мы можем вернуться к последней запущенной сессии и продолжить начатый поиск на вкладке Custom commands & Services.

    Hashcat сам определит все устройства GPU / CPU в компьютере и начнет расшифровку.

    image

    Тестируем возможности программы


    Запускаем Hashchat. Указываем тип хеша как m 11600 (7zip), обновление статуса поиска каждые 60 секунд, выходной файл и маску для поиска.

    Поиск по маске позиционируется улучшенным вариантом брутфорса. Зная что-то о паттерне пароля, мы можем значительно ускорить перебор. Предположим, это дата, имя или год или любые предполагаемые символы, например, ?R ?R ?R — любые три символа русского алфавита.
    В данном случае это любые семь цифр. Стоит учитывать, что если длина пароля составляет шесть цифр, то мы его не найдем и нужно повторить попытку. Для автоматизации процесса предусмотрена галочка «инкремент».

    hashcat64.exe -a 3 --session=2018-01-24 -m 11600 -w 3 --status --status-timer=60 --potfile-disable -p : --gpu-temp-disable -o "E:\asus\result.txt" --outfile-format=3 "E:\asus\hash.txt" ?d?d?d?d?d?d?d

    Итог: в файле E:\asus\result.txt. Пароль 3332221 подобран примерно за 10 секунд.

    Пробуем увеличить длину пароля. Скорость перебора заметно упала — до 635 паролей в секунду.
    Результат: пароль 3334566611 — 10 знаков. Для его восстановления потребовалось около трех минут.

    image

    Усложним задачу. Пароль теперь состоит из букв латинского алфавита и цифр. Длина пароля выросла до 11 знаков. В программе есть ряд опций еще более ускоряющих подбор. Очевидный вариант — подобрать с помощью базы стандартных паролей.

    Ставим словарь HashKiller Passwords. В папке программы уже есть пример — слов так на 1000. Добавляем наш словарик во вкладке «Wordlists & Markov». Скачиваем словарик HashKiller Passwords, а затем извлекаем его, к примеру, в папку Dict.

    Пример запуска:

    hashcat64.exe -a 0 --session=2018-01-24 -m 11600 -w 3 --status --status-timer=60 --potfile-disable -p : --gpu-temp-disable -o "E:\asus\result.txt" --outfile-format=3 "E:\asus\hash.txt" "E:\asus\hashkiller-dict.txt"

    image

    Markov является еще одним вариантом комбинированного подбора и имеет отдельный исполняемый файл. https://ru.wikipedia.org/wiki/Цепь_Маркова
    Опция плохо документирована. В справке к GUI для набора символом ?d?l?u (Латинские буквы и цифры) рекомендуется значение 40.

    Также мы используем гибридную атаку. Это поиск слова из словаря с добавлением окончания маски, к примеру, Password113, Qwe1235.

    Также в программе существуют готовые маски в формате .hcmask, которые позволяют перебрать известные паттерны строчка за строчкой. Лишние строки можно комментировать, открыв этот файл Блокнотом. Их также можно использовать как с опцией «инкремент», так и комбинировать со списком слов.

    Помимо гибридных атак программа поддерживает правила подбора по определенным алгоритмам, выявленным опытным путем, которые дают хорошие результаты.

    image

    Так называемый перебор по правилам является самой технически сложной атакой и представляет собой язык программирования. По словам разработчиков, такой подход работает быстрее, чем регулярные выражения. Готовые правила уже можно использовать, загрузив их в GUI из каталога rules в Hashchat. С учетом указанных опций за 2,5 часа программа выдала результат.
    Пароль Property123

    Радужные таблицы


    В примере у нас довольно сложный алгоритм шифрования. Если вы подбираете, например, хеш к MD5 за разумное время, и ваш пароль так и не подобран, имеет смысл обратить внимание на последний аргумент — радужные таблицы. Это расчетные значения хешей для всех распространённых паролей, которые были посчитаны и сохранены в условной таблице. Зная алгоритм хеширования, можно загрузить таблицу в память и провести поиск нужного хеша. Обычно они используются для подбора большого количества паролей в кратчайшие сроки, например, всех утекших паролей к веб-приложению, но это другая история.

    На сегодняшний день есть два проекта, поддерживающие различные типы хешей:

    • Rainbowcrack — поддерживает четыре алгоритма хеширования: LN/NTLM, MD5 и SHA-1
    • rcracki_mt или rcracki для Linux -MD4, MD5, DoubleMD5, SHA1, RIPEMD160, MSCACHE, MySQL323, MySQLSHA1, PIX, LMCHALL, HALFLMCHALL, NTLMCHALL, ORACLE

    Заключение


    Не обладая большими вычислительными ресурсами, сегодня все же можно расшифровать даже очень стойкие типы хешей. Учитывая их широкое распространение в качестве стандарта, на данный момент, многие приложения являются уязвимыми априори. Возможно, в ближайшем будущем нас ожидает переход на такие стандарты, как SHA-2 или ГОСТ_Р_34.11-2012. Пока же остается лишь пользоваться общими рекомендациями по генерации паролей:

    • Не использовать общие слова из ежедневного употребления. Их всего-то несколько тысяч.
    • Не использовать слова, после которых стоят цифры или буквенные ряды на клавиатуре. Добавив 1231231 к Qwerty, вы не сделаете пароль более защищенным. Весь словарь и маски можно перебрать за полдня.
    • Стандартные комбинации удваивания слов и т.д. легко разбираются правилами подбора, которые ориентированы на такие приемы.
    • Не использовать личную информацию. В нашем мире слишком много информации в общем публичном доступе.
    InfoWatch
    Company

    Comments 38

      +2
      А если число комбинаций было P=n^m считать было бы значительно проще ;)
        0
        Все так как вы говорите — поправим, спасибо за комментарий!
          +1
          числовой пароль 0-9 содержит 10 символов. Пятизначный пароль содержит m=5 знаков. Число комбинаций будет P=m^n или 5 в степени 10 — 9765625.

          Все еще не поправили… Правильное число комбинаций тут 10^5. Для каждой из пяти позиций независимо выбирается любой из 10 символов алфавита.


          Ну и дальше то же.

      • UFO just landed and posted this here
          0
          635 паролей в секунду на 1050ti — это не мало?
            +5
            В 7zip пароль проходит через 256k итераций хеширования.
            +3

            Число комбинаций для 5-символьного числового пароля 10^5, а не 5^10, разве нет? И со вторым примером та же история.

              0
              Был бы пароль не словарным словом, сложилось бы все иначе…
                0
                Как тут не вспомнить классику
                image
                Длинна пароля сейчас, при соблюдении некой минимальной сложности, важнее алфавита.
                  +3
                  Кто бы еще это растолковал разнообразным интернет-сервисам со своими требованиями к паролям.
                  Скрытый текст

                    0
                    Когда я был клиентом Альфа Банка у них был лимит на 16 символов пароля для интернет банкинга :(
                      0
                      Нет никакого смысла в максимальной длине вводимого пароля. Все равно в базе только хеш фиксированной длины. А хеш можно посчитать для любой длины.
                        +1
                        Это понятно, но кто-то в Альфе решил, что больше 16 уже нельзя.
                          0
                          Смысла нет, а максимальная длина есть.

                          Точно так же как нет смысла ограничивать какие символы могут использоваться, не в смысле «должен включать псевдосимволы», а «только буквы, цифры и дефис»

                          Все идет или к отказу от запоминаемых паролей (пассворд менеджеры) или к отказу от пароля, как основного фактора вообще (уже начались пины и т.д.)
                            0
                            Вот только чем длиннее пароль — тем больше вариантов нужно будет проверить при подборе, соответственно подбор займет больше времени и не факт что закончится успехом
                              0
                              Хорошо если они хэш сохраняют. А если plaintext пишут и поэтому ограничились в 16 символов?
                              0
                              Нижний или верхний?
                                +1
                                Верхний. Не даёт не давало сделать пароль длиннее 16 символов.
                                +1
                                РЖД боится спецсимволов, Сбербанк тоже. Вопрос: почему? Чего они боятся и зачем искусственно сокращают сложность пароля? А не хранят ли они его часом в открытом виде?
                                  0
                                  Ой, парольная политика отдельных ресурсов это вообще больная тема. Может луна в козероге была, когда сайт делали, поэтому нельзя спецсимволы? Ну, по крайней мере это лучшая версия, что у меня есть.
                                    0
                                    Боятся кривого экранирования спецсимволов или действительно не осилили его нормально реализовать.
                                    0

                                    У ВТБ последний раз, когда я смотрел (несколько месяцев назад) было ограничение на 20 цифр, при этом цифры ещё не должны повторяться. Посмотрел ещё раз сегодня:

                                    Новый пароль должен быть от 6 до 20 цифр, не менее 3-х различных цифр, не допускается введение подряд одной и той же цифры. Пароль не должен совпадать с УНК или логином.
                                    У Банка Москвы такой лютой ереси нет, но не думаю, что их личный кабинет долго проживёт после слияния.
                                      0
                                      О, сразу проще писать переборщик, отсекаем сразу кучу вариантов паролей, молодцы, люблю.
                                  0
                                  Спорно. Количество вариантов этого пароля 5 000 (общеупотребительный словарь) ^ 4 или 2 ^ 49. А буквы-цифры-псевдосимволы (пусть 4) да 10 символов пароль — это 40 ^ 10 или 2 ^ 53.

                                  Да и проблемы те же, люди будут использовать готовые фразы.

                                  Проблема в пароле, как таковом, как в основном средстве аутентификации.
                                  0
                                  Вам ещё повезло, что пароль был словарный. Если бы он был честным рандомом, никогда бы не смогли подобрать.
                                    0
                                    Я видел, как в течение недели с помощью двух 22-ядерных Xeon восстанавливают пароль к zip.
                                    а какой пароль там был? Сколько символов, были ли спец символы и т.п.? Мне кажется, что сложный 16+ символьный пароль будет очень сложно подобрать
                                      +1
                                      Я ведь правильно понимаю, что всегда есть крошечный шанс, что запущенный на удачу брутфорс угадает пароль за очень короткий срок, просто потому, что повезло, хотя полный перебор занял бы столетия?
                                        0
                                        Тут всё зависит от того насколько продвинутый брутфорс. Есть брутфоресеры, позволяющие ломать в несколько потоков, где возможный диапазон значений пароля разбивается на несколько сегментов и перебираются они параллельно. В таком случае да — правильно понимаете.

                                        Если же это совершенно тупой перебор «в лоб», с нуля, а пароль пусть и какое-нибудь простое, но относительно длинное слово (например «абракадабра» и цифра в конце), тогда шанс подобрать его за короткий срок нулевой. Разве что есть словарь.
                                          0
                                          То есть брутфорсер всегда начинает, условно, с пароля десять нулей, потом на один больше и так далее? Мне казалось точка старта должна быть более-менее случайной среди всех возможных вариантов.
                                            0
                                            Дак в этом и суть брутфорса — тупой перебор. Точка старта, во всех брутфорсерах, которые мне довелось видеть, либо вообще не задаётся (читай с нуля), либо может быть выбрана, например если ты знаешь что искомый пароль строго 6 символов.

                                            Самые продвинутые могут делить область подбора на диапазоны и подбирать в параллель, особенно если брутится файл и есть возможность открыть копию.
                                              0
                                              Получается, что пароль с первым символом, условно, «a», более уязвим к перебору, чем пароль с первым символом «z»?
                                                0
                                                Условно да. Но длина и набор символов гораздо важнее. Да и на практике, нормальные люди для подбора словари используют.

                                                По факту пароль aA011111aaaaa гораздо сильнее zzx99, по очевидным, вполне причинам. Или, к примеру, «a_^kf2» сильнее «122suwqwd9887qqq1» хоть последний и длиннее.

                                                Там есть же формула — количество комбинаций в зависимости от набора символов и длины. Если ничё не путаю — например для латинского алфавита из 26-ти букв, при длине 6 знаков и без капса это всего 26^6, т.е. 308915776 комбинаций.

                                                Могу конкретные цифры путать, но математика там в целом не сложная, суть очевидна.
                                                  0
                                                  Не, это я понимаю. Просто никогда не задумывался об алгоритмах, который используют брутфорсы, вот и стало интересно.
                                                  В вашем примере получается, что пароль zA011111aaaaa гораздо надежнее перед лицом брутфорса, чем пароль aA011111aaaaa.
                                                    0
                                                    На самом деле, если учесть общее количество вариантов и скорость перебора, окажется что разница хоть и есть, но исчезающе мала.
                                                    0
                                                    Коллеги, CAPS символы тоже считается — будет (26*2)^6
                                                    Предполагаю, что пароль в русской раскладке будет надежнее — как минимум не у каждого она есть )
                                        +1
                                        Интересно, а сколько реально будет угадываться Tr0ub4dor&3 для 7зипа, без шаблонов и словарей, перебором.
                                          0
                                          Долго. Это относительно надёжный пароль, просто его очень сложно запомнить и высоки шансы найти такой пароль на стикере на мониторе у одного из пользователей (или под клавиатурой, если пользователь подкован в ИБ).
                                          0
                                          Эх… а я архивы закрываю 255 знаками чистого рандома.
                                          Можно спать спокойно :)

                                          Only users with full accounts can post comments. Log in, please.