Try   HackMD

Правильный брутфорс

Один из самых популярных способов аутентификации - это использования имени пользователя (логина) и пароля. Он самый простой с точки зрения реализации, самый старый и поэтому до сих пор является самом популярным. Делов то, написать проверку на соответствие введенных данных на записи в БД.

Однако, несмотря на свою простоту, данный способ является самым уязвимым. Для взлома аккаунта нужно иметь логин (который не является секретом) и пароль, который можно получить различными способами.

В данной статье мы рассмотрим получение пароля через брутфорс хешей.

Небольшое введение

С какого-то момента люди решили, что хранение в памяти паролей в открытом виде - это не самая лучшая идея, ведь если злоумышленник получит доступ к базе данных, все учетные записи попадут в его руки. Вот яркий пример, в котором 30 миллионов паролей превратились в самый популярный словарь, используемый в CTF-соревнованиях и при реальных атаках (особенно в то время). На данный момент подавляющее большинство баз данных хранят пароли в закрытом виде - через алгоритмы шифрования или хеш-функции.

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

  • Односторонняя функция - легко получить хеш и практически невозможно вычислить пароль по нему;
  • Коллизии - очень редкий шанс получить одинаковый хеш от разных входных данных;
  • Высокая энтропия - хеши похожих входных данных абсолютно разные, например:
md5('qwerty')  = d8578edf8458ce06fbc5bb76a58c5ca4
md5('qwerty1') = 6dbd0fe19c9a301c4708287780df41a2

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

Немного математики

Существует простая формула для определения количества всех комбинаций:

p=nm

Где m - длина пароля, n - все применяемые символы

К примеру, если при использовании букв английского алфавита в любом регистре, цифр и некоторых знаков длина пароля составляет 93:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!"#$%&'()*+,-./:;<=>?@[\]^_{|}~

Тогда, при генерации 6-ти последовательностей их получится ровно 646990183449.

Попробуем сгенерировать md5 хеш от пароля j2A!lc и взломать его. Из-за огромного числа комбинаций, а еще из-за высокой энтропии самого пароля, полный перебор займёт достаточно много времени.

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

Время перебора короткого пароля

А нет, не займёт

Существует ПО, которое специализируется на "восстановлении пароля при утере" путем перебора хешей (и не только). Вместо центрального процессора оно использует графический (видеокарту), так как он специализируется на вычислении однотипных задач, что сильно ускоряет производительность.

hashcat взломал пароль за 20 секунд. Так получилось из-за того, что хеш-функция md5 очень быстрая (так и задумывалось при её проектировании) и перебор на видеокарте rtx 3060 составляет примерно 10000000000 хешей в секунду.

Всем известно, что чем длиннее пароль, тем больше его криптостойкость. Популярные хеши коротких (рассматриваем до 7 символов) паролей быстро ломаются по нескольким причинам:

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

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

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

Зависимость количества комбинаций от количества символов

Если брут до шести символов занимает до 1 минуты, то 7 символов займут уже 100 минут, а 8 символов - 6 дней и так по геометрической прогрессии.

В чём соль?

С основами разобрались, теперь интересное.

Конечно, в реальной среде всё не так просто. Рассмотрим основные факторы, повышающие защиту от брутфорс-атак:

  1. Тип хеша. Времена, когда пароли хранились в md5 давно прошли. Сейчас используют специализированные криптографические функции (yescrypt, bcrypt), понижающие скорость перебора за счёт повышенной сложности вычисления хешей. Даже хеш-функция sha2 уже в 10 раз понижает скорость перебора, по сравнению с md5.
  2. Использование соли. До получения хеша к любому паролю прибавляется небольшой кусочек случайных данных, которые будут храниться в записи вместе с хешем. Этот кусочек называется солью. Он необходим для исключения атаки по перебору через радужные таблицы.
  3. Сложность паролей. Специальные парольные политики не дают использовать простые пароли из-за минимального числа символов, добавления специальных символов и цифр и их проверки в списках популярных паролей. Также применяется практика генерации случайных паролей, что даёт им сильную энтропию. Всё это сильно повышает минимальное количество комбинаций, а следовательно, время перебора.

Представим ситуацию. В некой ООО "example" пентестер получил доступ к компьютеру сотрудника и его текущей сессии. Используя специальные хакерские инструменты он получил NTLM-хеш E3B40F1F696E45891A6927C92CCFA0C6. Также он узнал, что в организации установлена жесткая парольная политика (мин. 11 символов + спецсимволы и цифры). Да и пароли сотрудникам выдаются уже сгенерированные.

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

Вывод парольной политики

Но пентестер был из RedTalk, поэтому то, что представлялось нереальным, он смог выполнить за несколько секунд:

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

Брутфорс по кастомному словарю

Вот он, пароль: M0sc0w2011!. Почему он оказался не случайным и так быстро был найдён? Давайте разберемся, почему все вышеперечисленные факторы не смогли помешать брутфорс-атаке:

  1. Windows NTLM. Это специально разработанный алгоритм аутентификации в экосистеме Windows. NTLM-хеш пришел на замену давно устаревшего LM, хотя последний иногда может использоваться для корректной работы старых систем. Однако, скорость перебора NTLM примерно равна скорости перебора md5 (то-есть очень высокая). Механизм проверки пароля на популярные комбинации применяется редко.
  2. Слабая энтропия. В Windows при создании аккаунта пароль и правда генерируется администратором и обычно его невозможно взломать. Однако, всё та же парольная политика имеет максимальный срок использования пароля, после чего его необходимо менять, а меняет его уже пользователь, который использует осмысленный набор символов, чтобы легче его запомнить.
  3. Мутации и маски для паролей. Для генерации собственных словарей для брутфорса используются такая методика, как мутация паролей. Собственно, она и сыграла ключевую роль при взломе. Далее она будет описана подробнее.

P. S. Стоит учесть, что атака проводилась офлайн, так как у пентестера был доступ к компьютеру сотрудника и была возможность вытащить хеш. Не стоит путать его брутфорс с брутфорсом NTLMv2 или Kerberos, когда производятся попытки аутентификации непосредственно через сервер Active Directory.

P. P. S. Помимо брута есть еще один вид атаки, называемой "Pass The Hash". В этом случае задействуется сам хеш, без пароля. Например, реализация популярного протокола Kerberos в среде Active Directory использует хеши в качестве ключа для шифрования/расшифрования тикетов, но это в другой раз.

Виды атак

Существует несколько видов атак: Полный перебор и перебор по словарю. В первом случае хеш перебирают по всем возможным комбинациям символов, постепенно увеличиваю их длину. Количество всех комбинаций и, соответственно, время перебора напрямую зависит от количества символов.

Во случае с перебором по словарю перебирают все комбинации из заранее заготовленного списка паролей. Это могут быть отсортированные по популярности пароли, слитые базы данных (например, популярный словарь rockyou.txt) или некоторые комбинации символов на клавиатуре, типа "Qwe123", "Qwerty", "!qaz@wsx#edc".

Перебор по списку сильно сокращает количество паролей, что повышает скорость полного перебора, но он будет не всегда успешным.

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

Маска

Маска - это особая строка символов, имеющая свой синтаксис и определяющая комбинации символов (или слов) для перебора. Она применяется для повышения эффективности за счёт уменьшения комбинаций. Правильно подобранная маска может уменьшить время с бесконечности до приемлемого.

Например (опыт из реального кейса), администратор генерирует пароли через специальную программу и указывает к ней с. Вот только эта утилита старая и не совсем корректно работает и может сгенерировать пароль без символа из указанного алфавита. И если указать маску, исключающую спецсимволы в пароле, то время перебора 7-ми символьных комбинаций можно сократить с 6-ти дней до 5-ти часов.

PS C:\hashcat-6.2.6> .\hashcat.exe .\hashes.ntds -a 3 ?1?1?1?1?1?1?1?1 -1='?l?u?d'

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

Полный перебор

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

Перебор по маске

На втором скриншоте указана маска, в которой используется 8 символов и каждый символ имеет алфавит из латинских букв верхнего/нижнего регистров и цифры. Без спецсимволов.

Помимо данного примера, где каждый символ имеет один и тот же алфавит, можно использовать несколько масок и инкрементирование при переборе.

Также стоит отметить, что если при запуске hashcat указать ключ -a 3, то он будет подставлять свои заранее заготовленные маски вместо обычного перебора
Более подробно можно почитать тут.

Мутация

Если маски используются при bruteforce-атаках, то мутации паролей применяются при составлении словарей для перебора. Именно данные способ применялся для получения пароля в примере с пентестом.

Мутация - это изменение строки по определенным правилам. Также, как и маски, правила мутаций имеют свой синтаксис, причём он совместим как с hashcat, так и с John The Ripper. Для понимания рассмотрим следующий пример:

Возьмем список топ 200 популярных паролей из репозитория SecLists и попробуем перебрать им хеш. Понятно, что все 200 паролей в случае с офлайн-перебором переберутся моментально, однако существует высокая вероятность, что ни один из них не подойдет. Но, также есть вероятность, что используется пароль, похожий на один из списка. Для его поиска сгенерируем расширенный словарь с использованием правил мутаций:

my.rule:

: c $! $. u c sa4 so0 se3

Каждая строка в данном файле содержит правило для преобразования пароля. К примеру, буква c на строке 2 устанавливает первый символ в верхний регистр, sa4 на строке 7 проводит замену буквы 'a' на цифру 4. Двоеточие на первой строке оставляет пароль в прежнем виде.

Таким образом каждое из 9 правил применяется на каждую строку, следовательно, количество строк нового словаря будет в 8 раз больше оригинального (с учетом неизменённых паролей). Следующая команда генерирует такой словарь и удаляет возможные дублирующиеся строки:

PS C:\hashcat-6.2.6> .\hashcat.exe --force .\200_used_passwords.txt -r .\my.rule --stdout | Group-Object | SELECT Name >.\mutate_200_passwords.txt


Применение правил мутации

и если и правда используется пароль с одним измененным символом, такой метод будет очень эффективным при его поиске:

PS C:\hashcat-6.2.6> ./hashcat -m 0 'fb6ef95e28842ccff7ef9a0c6b3a9f63' .\mutate_200_passwords.txt


Использование кастомного словаря

Что касается примера с пентестом. Там использовался такой же метод генерации словарей, но с более сложными правилами мутации и словарём с миллионом строк.


Пример реальных правил мутации

После его применения оригинальный файл, который весил 20 мегабайт стал весить 1 гигабайт. Но даже при таком количестве комбинаций такой подход намного эффективнее по сравнению с простой bruteforce атакой.

Также стоит отметить, что чтобы не придумывать велосипед, существуют наборы уже готовых правил. Подробнее можно почитать тут.

Заключение

В данной статейке мы познакомились с основными методами проведения брутфорс-атак. Напоследок расскажу, как от них защищаться:

Не используйте пароли.

Вот так всё просто. Как я упомянул в самом начале, аутентификация по паролю одна из самых уязвимых, хоть и самая простая. Использование токенов доступа, биометрии, qr-кодов как минимум полностью исключит перебор.

Понятно, что далеко не везде доступны иные виды аутентификации, кроме парольной, поэтому вот ещё несколько правил для повышения безопасности:

  1. Используйте длинные и сложные пароли с высокой энтропией. Существует методика фразовых паролей, суть которой заключается в использовании 3-4 идущих подряд слов, например SunsetBeachVacation2023 . Однако, тут тоже есть свои подводные камни, но это уже отдельная тема;
  2. Не допускайте дублирование. Если один из сервисов с вашим аккаунтом был скомпрометирован, то появляется риск компросетации остальных ресурсов с таким же паролем;
  3. Используйте парольные менеджеры. Они позволяют генерировать и сохранять сложные пароли. Тут остаётся надеяться на сложность вашего мастер-пароля и надёжную приптографию самого менеджера;
  4. Не используйте парольные карты. Они практически идентичны записи пароля на листочке. Количество всех комбинаций на ней настолько мало, что При её компрометации (например, банальная кража) весь автоматический перебор займёт секунду. Это конечно, на расчет офлайн брутфорса, но даже в случае с попыткой перебора в web-приложении это даст злоумышленнику высокий шанс подбора;
  5. На стороне сервера необходимо выбрать криптостойкий алгоритм хеширования, правильно выдать доступ к базе данных с хешами. Обязательно применять соль при хешировании, без неё возможна атака через радужные таблицы (rainbow tables).

Автор: @pyfffe
https://t.me/REDTalk_base