Hashcat вашим паролям…

Posted: 2017-09-27 in IT, Security
Метки:,

Всем привет ! Какое-то время назад я пообещал читателям, что обязательно поиграюсь с тулзой hashcat и поделюсь впечатлениями. С тех пор произошла одна очень интересная парольная утечка, показавшая, что даже очень длинные пароли могут быть не столь безопасны, как это кажется на первый взгляд. Итак, сегодня в нашей избе-читальне — утилита HashCat. Просим под кат.

Исторически самые первые программы для брутфорса использовали CPU — это было самое простое, универсальное, но и самое медленное решение. По мере развития видеокарт стали появляться возможности задействовать их мощности для брутфорса — задачи, превосходно заточенной под параллельные вычисления. Изначально hashcat существовал в виде трёх утилит — для CPU, для OpenCL и для CUDA, но потом все они были объединены в одну программу. Вычисления на проце нам неинтересны, отдельных FPGA у меня нет, поэтому буду пробовать дивную тулзу на видеокартах, тем более, что это режим по-умолчанию.

Для тестов я использовал Fedora 25 x64 и карточки NVidia актуальной на сегодня десятой серии. Тип процессора и материнской платы никакого значения не имеют, главное, чтобы там были PCI-Express слоты в нужном количестве, и для запуска некоторых задач нужно 8 Гб оперативки. Системный диск — любой исправный от 16 Гб, на который надо поставить федору-25, проприетарный драйвер от Nvidia, ряд приблуд к OpenCL:

# dnf install opencl-filesystem opencl-headers opencl-utils opencl-utils-devel clinfo

и ряд вспомогательных утилит типа screen / mc / htop. Потом качаем HashCat актуальной версии и можно сразу hashcat-utils (там всякий вспомогательный софт для работы с хэшами/словарями и прочим).

Чтобы оценить всю мощь hashcat, имеет смысл скачать готовые словарики паролей от добрых людей.

Основная логика работы утилиты такая: приняв на вход через параметры исходные хэши и настройки параматров перебора, утилита начинает на всех доступных видеокартах параллельно перебирать варианты, и при совпадении паролей писать их в файл hashcat.potfile. Если процесс прервать, то при возобновлении расчёта ранее найденные решения из potfile будут исключены и не будут считаться заново.

В комплекте идут три тестовых скрипта — example0.sh, example400.sh и example500.sh, пробующие перебор MD5, phpass и пароли от циски.

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

Задача запускается таким образом:

./hashcat64.bin -m ТИП_ХЭША -a ТИП_АТАКИ файл_исходных_хэшей файл_словаря/маска/прочие-опции-атаки [-r файл правил]

Попробуем сперва сгенерить исходные тестовые данные:

echo -n '000000' | sha512sum | cut -d ' ' -f 1 >> _amin.sha512
echo -n '111111' | sha512sum | cut -d ' ' -f 1 >> _amin.sha512
echo -n '555555' | sha512sum | cut -d ' ' -f 1 >> _amin.sha512
echo -n '123456' | sha512sum | cut -d ' ' -f 1 >> _amin.sha512
echo -n '654321' | sha512sum | cut -d ' ' -f 1 >> _amin.sha512

echo -n '000000' | md5sum | cut -d ' ' -f 1 >> _amin.md5
echo -n '111111' | md5sum | cut -d ' ' -f 1 >> _amin.md5
echo -n '555555' | md5sum | cut -d ' ' -f 1 >> _amin.md5
echo -n '123456' | md5sum | cut -d ' ' -f 1 >> _amin.md5
echo -n '654321' | md5sum | cut -d ' ' -f 1 >> _amin.md5

Параметр -n в этом случае важен — без него перенос строки попадёт на вход хэша, а символ переноса строки в паролях не встречается, да и «000000» и «000000\n» — это разные строчки с разными хэшами.

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

./hashcat64.bin -m 0 -a 3 _amin.md5

Через пару секунд увидим вот такой вывод:


Session..........: hashcat
Status...........: Cracked
Hash.Type........: MD5
Hash.Target......: _amin.md5
Time.Started.....: Wed Sep 27 12:58:39 2017 (0 secs)
Time.Estimated...: Wed Sep 27 12:58:39 2017 (0 secs)
Guess.Mask.......: ?1?2?2?2?2?2 [6]
Guess.Charset....: -1 ?l?d?u, -2 ?l?d, -3 ?l?d*!$@_, -4 Undefined
Guess.Queue......: 6/15 (40.00%)
Speed.Dev.#1.....: 261.8 MH/s (9.68ms)
Recovered........: 5/5 (100.00%) Digests, 1/1 (100.00%) Salts
Progress.........: 117440512/3748902912 (3.13%)
Rejected.........: 0/117440512 (0.00%)
Restore.Point....: 0/1679616 (0.00%)
Candidates.#1....: sander -> am0x8e
HWMon.Dev.#1.....: Temp: 59c Fan: 49% Util:100% Core:1923MHz Mem:5005MHz Bus:16

Started: Wed Sep 27 12:58:36 2017
Stopped: Wed Sep 27 12:58:40 2017

Как видим, по умолчанию hashcat при брутфорсе как раз и перебирает 6-и символьные пароли из больших/малых букв и цифр, и у которых первая буква моджет быть заглавной. Всего 3.7 млрд паролей перебираются мгновенно, задание дольше подготавливается, чем реально вычисляется.

Что тут важно ? Guess.Mask и Guess.Charset задают шаблоны перебираемых паролей. От них нпарямую зависит перебираемое пространство ключей и требуемое время. Speed.Dev.#1 показывает скорость перебора. У нас была простая задача, дрына не успел разогнаться толком.

Recovered — количество и процент успешно подобранных хэшей.

Progress — показывает, сколько было перебрано паролей. В нашем тесте было перебрано ~ 117 млн паролей из ~ 3.7 млрд, что составляет 3.13%, и все 5 паролей из 6 цифр были моментально вскрыты.

Повторный запуск будет выдавать вот такое:

INFO: All hashes found in potfile! Use --show to display them.

В файле potfile будут записи вида ИСХОДНЫЙ_ХЭШ:ПАРОЛЬ

Для SHA-512 просто укажем другой файл и метод:

./hashcat64.bin -m 1700 -a 3 _amin.sha512

Чтобы узнать, что для перебора SHA-512 номер метода — 1700, применим простейшую магию:

$ ./hashcat64.bin --help | grep SHA-512
1700 | SHA-512 | Raw Hash
1711 | SSHA-512(Base64), LDAP {SSHA512} | HTTP, SMTP, LDAP Server

Помимо -a 3 (брутфорса), также поддерживаются атаки по словарям (-a 0), комбинаторные атаки по паре словарей (-a 1 , когда берется слово из первого словаря + перебираются все слова из второго), атаки по паре словарь + маска (-a 6 / -a 7 , это когда берется слово из словаря и в начало/конец дописываются перебираемые брутфорсом короткие префиксы).

Например, те же хэши по пробному словарю перебираются так:


./hashcat64.bin -m 0 -a 0 _amin.md5 example.dict
./hashcat64.bin -m 1700 -a 0 _amin.sha512 example.dict

Комбинаторная атака:

./hashcat64.bin -m 0 -a 1 _amin.md5 example.dict example.dict
./hashcat64.bin -m 1700 -a 1 _amin.md5 example.dict example.dict

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

Также есть вариант при брутфорсе перебрать пароли разной длины с помощью параметра -i:

./hashcat64.bin -m 1700 -a 3 _amin.sha512 -i --increment-min 1 --increment-max 8 ?d?d?d?d?d?d?d?d

Эта команда позволяет перебрать все числовые пароли длиной от 1 од 8 символов.

Но это всё ещё абсолютно гуманно!

Негуманно — это метод -a 0 в связке с параметром -r, то есть когда к каждому словарному слову применяются наборы правил модификации. Правила модификации пишутся на особом скриптовом языке, и в комплекте идут сразу несколько наборов таких правил. Сейчас существуют словари на миллиарды паролей, и скрипты модификации размером во многие килобайты.

Чтобы вам было понятно, насколько это суровое решение, я приведу некоторые значения параметра Candidates — это варианты предлагаемых к проверке паролей в этом режиме. Добавим какой-нить заведомо сложный хэш (иначе брутфорсер слишком быстро завершится) и запустим такое, используя более мощный словарь размером в 133 Мб:

./hashcat64.bin -m 1700 -a 0 _amin.sha512 rockyou.txt -r rules/Incisive-leetspeak.rule

и нажимая периодически кнопку [s] для обновления статуса, приценим варианты паролей:

lara{u3n+3 -> 5mili315
746460wm -> 1430200190509
sup3rvid30 -> 50nl4512
mc0st4s -> m4n4sx3v3r
fa3zah1234 -> 3lla70ia

Не ожидали, что десятисимвольные пароли fa3zah1234 или m4n4sx3v3r — оказывается, легко подбираемы ?

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

Hashcat умеет перебирать разные типы хэшей, версия 3.6.0 поддерживает 154 различных системы. Некоторые хэши перебираются крайне быстро, некоторые — нет. Чтобы оценить, как та или иная карта сможет перебирать хэши, я прогнал бенчмарки команодй hashcat -b на разных системах и замутил небольшой файлик со сводной табличкой:

Скорость брутфорса HashCat на NVidia 1060-1070-1080Ti [PDF]

Ну а если вам вдруг покажется, что десятки гигахэшей на одной карте — это не так страшно, то я напомню, что в некоторые материнки можно включить аж 13 графических карт (при небольшом разгоне 13-и 1080-ти на MD4 можно получить 1 терахэш без всяких асиков), да и ряд решений типа hashcat-agent / hashtopus позволяют перебирать хэши на нескольких вычислительных фермах сразу.

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

Рекомендую всем читателям пересмотреть свои подходы к созданию паролей.

- комментарии
  1. […] Hashcat вашим пароля… на Пароли опасносте… […]

  2. […] есть ряд других веселых приложений, на которых видеокарты раскрывают свой […]