Как создать словари, соответствующие определённым политикам надёжности паролей (с помощью Атаки на основе правил)


Смотрите также альтернативный подход: Как генерировать кандидаты в пароли, соответствующих политикам надёжности паролей (фильтрация слов с помощью grep)

Словари, в которых есть все группы символов

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

По этой причине для аудита безопасности обычные словари становятся неэффективными. Как будет показано ниже, в типичных словарях около 99,65% кандидатов в пароли не соответствуют политике надёжных паролей. То есть их использование означает, что практически всё время брут-форса тратится впустую. Атака по маске хотя и позволяет довольно гибко настроить кандидаты в пароли, но также будет не очень эффективной при переборе паролей созданных по требованиям политики надёжности.

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

Но Атака на основе правил не предназначена для генерации новых словарей (или кандидатов в пароли) с нуля — она создаёт новые слова меняя уже существующие используя набор правил. Можно ли что-то придумать? Да, можно сделать следующим образом: с помощью Маски создать словарь в котором будут все возможные варианты и с помощью Правил отфильтровать только те, которые соответствуют политике сложных паролей.

Настоятельно рекомендуется прочитать об этой атаке:

Начнём с примера из статьи John the Ripper. Вначале мы научимся создавать словарь сложных паролей из уже существующих словарей.

Отбор паролей, соответствующих определённой политике

К примеру, известно, что в организации установлена следующая политика требований к паролям: в пароле должны быть как минимум одна большая буква; как минимум одна маленькая буква; как минимум одна цифра и как минимум один специальный символ. Длина пароля не может быть меньше 8 символов.

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

Для этого нам понадобится два правила:

  • /?C — означает отклонить слово, если оно не содержит символа в классе C.
  • >N — означает отклонить слово, если оно не превышает N символов

Обратимся к таблице «Классы символов».

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

/?l /?u /?d /?p

Поскольку в паролях могут быть другие специальные символы, то нужно составить ещё один набор правил:

/?l /?u /?d /?s

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

Внутри одной строки действует логическое «И», то есть будут отбросаны все пароли, в которых отсутствует хотя бы один класс символов.

Но между строками действует логическое «ИЛИ», то есть будут пропущены все пароли, которые соответствует критериям первой строки или критериям второй строки.

Также добавим правило, удаляющее слова, короче восьми символов, получаем:

/?l /?u /?d /?p >7
/?l /?u /?d /?s >7

В файл /usr/share/john/john.conf добавим следующие строки (набор правил назван StrongPass):

[List.Rules:StrongPass]
/?l /?u /?d /?p >7
/?l /?u /?d /?s >7

Для проверки их работоспособности, скачаем словарь:

wget -U 'Chrome' https://kali.tools/files/passwords/leaked_passwords/rockyou.txt.bz2
7z e rockyou.txt.bz2

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


cat rockyou.txt | wc -l
14344391

То есть в файле 14.344.391 (четырнадцать миллионов) паролей.

А теперь проверим, сколько паролей будет отфильтровано:

john --rules=StrongPass --wordlist=rockyou.txt --stdout | wc -l

Вывод:

Using default input encoding: UTF-8
Press 'q' or Ctrl-C to abort, almost any other key for status
50785p 0:00:00:01 100,00% (2020-11-29 17:08) 35764p/s *7¡Vamos!
50785

Осталось всего 50785 кандидатов в пароли, подходящие под указанные условия! Это 50785÷14344391×100 = 0,35% от всего словаря!!! То есть если бы мы не использовали эту оптимизацию, 99,65% вычислений во время брут-форса были бы бессмысленными, поскольку проверяли бы заведомо неподходящие пароли.


Но есть ли в этом смысл?

Теперь, когда мы знаем как извлекать пароли соответствующие требованиям сложности, мы можем начать создавать наши собственные словари. Но есть нюанс…

Давайте чуть отвлечёмся и поговорим про размер словарей и количество кандидатов в пароли.

Обратимся к формуле количества возможных комбинаций:

количество символов(длина пароля)

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

Давайте посчитаем, сколько паролей сгенерирует следующая команда (большие и маленькие буквы, цифры — специальных символов нет!):

maskprocessor -1 ?l?u?d ?1?1?1?1?1?1?1?1

628 = 2,183401056×1014

Это… это ну очень много паролей.

К примеру, словарь с паролями из больших и маленьких букв плюс цифры в три символа занимает 0.931 Мб, из четырёх символов словарь будет занимать 70.5 Мб, а при длине пять символов словарь будет размером 5.1 Гб. То есть при добавлении каждого нового символа размер словаря будет увеличиваться примерно в 76 раз. То есть словарь на 8 символов будет размером примерно 2238 Терабайт…

Словарь с паролями в которых хотя бы одна большая и маленькая буква и цифра

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

Обычно в разных сервисах требуется установить пароли не менее 8 символов, но по рассмотренным выше причинам я буду работать с паролями длинной в 5 символов.


Для ускорения создания словарей я буду использовать «Файловую систему в оперативной памяти» - вы тоже можете так делать, если у вас достаточно оперативной памяти, или же можете работать со словарями на обычных дисках.

Создадим точку монтирования:

mkdir /tmp/mytmpfs

Создадим виртуальную файловую систему размером 20 Гигабайт в оперативной памяти:

sudo mount -t tmpfs -o size=20g tmpfs /tmp/mytmpfs

Переходим в неё

cd /tmp/mytmpfs

Создаём словарь на 5 символов (большие и маленькие буквы, цифры):

maskprocessor -1 ?l?u?d ?1?1?1?1?1 > dic.txt

Для тех, у кого после предыдущей команды всё зависло — это не баг, это так и должно быть если вы создаёте словарь на обычном или даже на твердотельном диске — просто ждите, когда данные запишутся на диск. Это займёт примерно минуту. У меня словарь в оперативной памяти создался за 7 секунд и ничего не подвисало.

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

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

cat dic.txt | wc -l

Получилось: 916132832

В файл /usr/share/john/john.conf добавим следующую строку (набор правил назван lud5):

[List.Rules:lud5]
/?l /?u /?d

Создадим новый словарь и сохраним его в файл lud5.txt:

john --rules=lud5 --wordlist=dic.txt --stdout > lud5.txt

В этом файле получилось 438859200 паролей, то есть примерно в 2 раза меньше, размер словаря тоже сократился примерно в 2 раза (стало 2.5 Гб, а было 5.1 Гб).

Посмотрим на пример содержимого в файле:


tail lud5.txt

Словарь с паролями в которых хотя бы две большие и маленькие буквы и цифры

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

Для этого есть специальное правило «%N?C»: оно отклоняет слово, если оно не содержит хотя бы N символов класса C.

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

  • большие буквы
  • маленькие буквы
  • цифры
  • специальные символы

Набор назван SuperStrongPass:

[List.Rules:SuperStrongPass]
%2?l %2?u %2?d %2?p >7
%2?l %2?u %2?d %2?s >7

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

[List.Rules:llud5]
%2?l /?u /?d

Запускаем фильтрацию паролей:

john --rules=llud5 --wordlist=dic.txt --stdout > llud5.txt

Получилось 281216000 паролей на 1.6 Гигабайт.

Заключение

Итак, грамотные политики к сложности пароля приводят к тому, что количество кандидатов в пароли становится огромным и при достаточной длине пароля брут-форс становится невозможным из-за того, что для окончания атаки нужно слишком много времени.

Продолжение: Как генерировать кандидаты в пароли, соответствующих политикам надёжности паролей (фильтрация слов с помощью grep)


Рекомендуется Вам:

2 комментария to Как создать словари, соответствующие определённым политикам надёжности паролей (с помощью Атаки на основе правил)

  1. Станислав:

    Здравствуйте! А можно ли объединить две команды из вашего примера в одну? С целью избежать создания промежуточного словаря dic.txt.

    maskprocessor -1 ?l?u?d ?1?1?1?1?1 > dic.txt

    и

    john --rules=llud5 --wordlist=dic.txt --stdout > llud5.txt

    Ну а в идеале - избежать вообще создания и записи на диск даже конечного словаря, а сразу запускать hashcat!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *