Приложение как создать свой собственный словарь
Этичный хакинг и тестирование на проникновение, информационная безопасность
Crunch VS Hashcat
Crunch — это генератор списка слов, в котором вы можете указать один из стандартных наборов символов (цифры, большие и маленькие буквы) или набор символов по своему выбору. crunch может генерировать все возможные комбинации и перестановки в соответствии с заданными критериями.. Данные, которые выводит crunch, могут быть отображены на экране, сохранены в файл или переданы в другую программу.
Это очень гибкая программа по генерации словарей.
Hashcat — это самый быстрый в мире восстановитель (взломщик) паролей. Но нас интересует не эта функция. Hashcat также может генерировать словари. Для того, чтобы не взламывать пароли, а только показать кандидаты в Hashcat есть опция --stdout
Hashcat использует различные способы генерации паролей (по маске, комбинаторная, перестановочная, основанная на правиле атаки и другие). Самым востребованном способом является генерация паролей по маске.
Чтобы не запутаться в терминах, будем называть символ в определённом месте маски или паттерна (образца) «позицией». Например, первый символ в кандидатах в пароли – это первая позиция. Второй символ – это вторая позиция и т.д.
Используя маску, мы можем получить контроль над каждой позицией.
Например, одну из позиций мы хотим сделать статичным символом (всегда одинаковым во всех кандидатах в пароли) – так может и Crunch. Но мы также можем использовать для определённых позиций пользовательские наборы символов. Например, мы знаем, что во второй позиции встречаются только цифры от 1, 3, 5. В Hashcat мы можем создать пользовательский набор символов, включающий в себя цифры 1, 3, 5 и в маске поставить этот пользовательский набор во вторую позицию.
В Crunch нет понятия «маска», но есть понятие «паттерн», «образец». В сущности, он эквивалентен маске. Более того, в Crunch также можно создавать до четырёх пользовательских наборов символов. Т.е. по функционалу Crunch не уступает возможностям Hashcat.
В Crunch есть пара опций, аналоги которых отсутствуют в Hashcat. Например, -d – позволяет указывать максимальное количество повторяющихся символов. А опция -p создаёт словари без повторяющихся символов. Т.е. эта программа имеет свои уникальные возможности.
Генерация словарей с Crunch
Простой пример использования:
Опция -o позволяет вам указать файл для записи вывода, например:
Опция -t позволяет создавать образцы. В терминах Hashcat это «маски».
Для обозначения набора символов используются следующие сокращения:
- @ означает буквы в нижнем регистре
- , означает буквы в верхнем регистре
- % означает цифры
- ^ означает разные символы, общим количеством 33. Вы можете посмотреть их командой:
Все другие символы будут воспроизводиться как есть.
Например, образец 8905%%%%%%% - означает генерацию кандидатов в пароли, каждый из которых будет начинаться с 8905, а затем будут следовать семь цифр. Полная команда будет выглядеть так:
Пользовательские наборы символов Crunch
В Crunch используются следующие сокращения для набора символов (пронумеруем их):
Любой из них можно переназначить. Для этого после указания диапазона длины пароля нужно записать четыре группы пользовательских символов, если какую-то группу вы не хотите переназначать, что поставьте вместо своих символов знак + (плюс). Пример:
- VRb5 – является пользовательским набором символов, он переназначает @, т.е. вместо abcdefghijklmnopqrstuvwxyz, сокращение @ включает в себя набор из символов VRb5.
- Первый знак + означает, что набор символов, сокращённо указываемый как , (запятая) и который включает в себя ABCDEFGHIJKLMNOPQRSTUVWXYZ, не переназначен и используется набор по умолчанию.
- Далее 123 – является вторым пользовательским набором символов, включающим, соответственно, цифры 123, этот набор переназначает значение сокращения %
- Последний знак плюс говорит о том, что набор символов ^ не переназначен.
Рассмотрим ещё один пример:
знак плюс (+) - это заполнитель, таким образом вы можете указать пользовательский набор символов для наборов любого типа. Crunch будет использовать конкретный тип набора символов по умолчанию когда встречает знак плюс (+) в командной строке. Вы должны либо указать значения каждого типа наборов символов или использовать знак плюс. Т.е., если вы имеете два типа наборов символов вы ДОЛЖНЫ либо указать значения для каждого типа или использовать знак плюс. Т.е. в предыдущем примере будут использоваться следующие наборы символов:
на конце вышеприведённой строки есть пробел, вывод начнётся с 11a! и закончится за "33z ". Кавычки показывают пробел на конце строки.
Генерация паролей с Hashcat и maskprocessor
Если у вас не работает Hashcat (она требует установку драйверов видеокарты), то вы можете использовать программу maskprocessor.
Maskprocessor — это высокопроизводительный генератор слов (словарей), упакованный в отдельный исполняемый файл, в котором можно настроить символы для каждой позиции.
Маска составляется из встроенного набора символов и (или) пользовательского набора символов.
Встроенные наборы символов:
Все символы, кроме тех, которые означает набор (?l, ?u, ?d и т.д.) попадают в пароль без изменения.
Если вы хотите составить словарь, который содержит пароли из шести цифр:
Если вы хотите, чтобы в четырёх символьных паролях чередовались большие и маленькие буквы:
Пароль начинается со слова voro, затем идут четыре цифры, а затем два больших буквы:
Пользовательские наборы символов:
К примеру, в первой позиции должны быть цифры от 1 до 3, во второй позиции буквы AbCd, в третьей позиции любая цифра или маленькая буква, а последними двумя символами должны быть большие буквы:
- -1 123 – первый пользовательский набор символов, включающий символы 123
- -2 AbCd – второй пользовательский набор символов, включающий символы AbCd
- -3 ?l?d – третий пользовательский набор символов, включающий символы ?l?d, т.е. все маленькие буквы и цифры
- ?1?2?3?u?u – маска, составленная из пользовательских и стандартных наборов символов.
Дополнительные полезные опции:
Hashcat VS maskprocessor
Хотя, в целом, для генерации паролей maskprocessor и Hashcat являются взаимозаменяемыми, нужно помнить, что для выбора режима брутфорса/атаки по маске нужно указывать опцию -a 3 (поскольку Hashcat поддерживает различные режимы атаки, а не только по маске). Также нужно использовать опцию --stdout, которая означает показывать кандидаты в пароли (без взлома хеша).
Hashcat (при использовании маски) не позволяет задать максимальное число одинаковых повторяющиеся символов, максимальное число вхождения одного символа, начать или закончить на конкретной позиции. Но такой результат можно получить используя Атаку на основе правил.
С запуском Hashcat на Linux системах могут быть проблемы из-за необходимости иметь проприетарные драйвера.
Приращение длины пароля делается другими опциями:
Генерация словарей в John the Ripper
Программа John the Ripper также поддерживает генерацию словарей по маске. Причём синтаксис очень похож на синтаксис масок в Hashcat. Но есть и отличие: John the Ripper более гибок, он позволяет использовать диапазоны при записи масок, любые символы в шестнадцатеричной записи, имеет больше стандартных наборов символов.
Маска может включать:
Обычный режим маски создаёт слова из маски, например ?u?l?l будет генерировать все возможные трёхбуквенные слова, причём первый символ будет в верхнем регистре, а остальные — в нижнем.
Маски переменной длины
В john.conf также есть маска по умолчанию (по умолчанию такая же, как у hashcat). Её следует использовать с -max-len (и, возможно, -min-len), чтобы получилось что-то полезное.
Параметр -max-len=N усекает маску, поэтому слова длиннее N не выводятся.
Параметр -min-len=N пропустит создание слов короче N.
Если не в режиме «гибридной маски» и использовалась опция -min-len или -max-len, мы будем перебирать пароли с длиной (как в «инкрементной маске») от -min-len до -max-len (или пароли с минимальной и максимальной длинной для данного формата, если эти опции были указаны). Итак, чтобы создать все возможные слова от 3 до 5 букв, используйте -mask=?l -min-len=3 -max-len=5. В случае, если указанная маска короче, последняя её часть будет расширена, например, "-mask=?u?l -max-len=5" будет использовать эффективную маску ?u?l?l?l?l. Всякий раз, когда используется инкрементная маска, ETA (время до завершения перебора всех кандидатов в пароли) в любой момент времени показывает расчётное время для завершения проверки паролей по маске текущей длины, а не всего прогона со всеми масками разной длины.
Специальные символы в масках
Вы можете экранировать специальные символы с помощью \. Итак, чтобы создать буквальное «?l», вы можете сказать \?l или ?\l, и это не будет анализироваться как заполнитель. Точно так же вы можете экранировать дефисы или скобки, чтобы они не анализировались как специальные символы. Чтобы создать буквальную обратную косую черту, используйте \\.
Существует также специальная шестнадцатеричная запись \xHH для указания любого кода символа. Например, \x41 - это «A», а \x09 - это код для TAB.
У нас есть поддержка режима маски на устройстве для большинства быстрых типов хешей, для которых у нас вообще есть поддержка OpenCL. Кроме того, такая поддержка масок на устройстве может использоваться вместе с предоставленным хостом потоком частичных возможных паролей для формирования множества гибридных режимов. Например, все следующие примеры являются правильными:
- Протестировать любые 7-символьные печатаемые строки ASCII с разумным количеством позиций маски, обрабатываемых на устройстве (JtR решает как оптимально разделить маску между хостом и устройством):
То же, но для диапазона длин от 1 до 8:
- Также можно использовать диапазоны длин с более сложными масками, где последний компонент маски будет расширен до большей длины:
Другие, более сложные примеры использования маски, будут рассмотрены в отдельной части, полностью посвящённой режимам генерации, изменения и обработки паролей.
Как посмотреть генерируемые пароли. Как создать словарь
С помощью опции --stdout вы можете вместо запуска взлома показать создаваемые кандидаты в пароли. Это может быть полезно при проверке написанных масок и при генерации словарей.
Чтобы создать словарь, содержащий все цифры от 1 до 9999 и сохранить его в файл 1-4d.txt:
Чтобы создать файл с паролями телефонов, начинающихся на «8905143»:
Вы можете вывести кандидаты в пароли с обрезкой по ДЛИНЕ, для этого используйте опцию вида --stdout=ДЛИНА.
Заключение
Crunch – очень гибкая программа для генерации словарей. Из минусов можно отметить некоторую запутанность назначения пользовательского набора символов, а также то, что пользовательские наборы символов перезаписывают стандартные наборы.
Hashcat не имеет некоторых опций, связанных с регулированием количества повторяющихся символов в пароле.
maskprocessor является хорошей альтернативой Crunch. Программа полностью повторяет функционал Crunch, при этом позволяет назначать пользовательские наборы символов без перезаписи стандартных наборов. Сам синтаксис назначение представляется более наглядным. Программы Hashcat и maskprocessor работают и на Linux, и на Windows.
John the Ripper включает в себя все возможности генерации списков слов по маске которые есть у Hashcat, но также имеет дополнительные возможности, некоторые из которых могут быть интересны профессионалам.
Интернет, с одной стороны, открывает доступ к большому объёму информации, но с другой, тормозит развитие. Согласитесь, изучая что-то новое, допустим, язык программирования Python, поиск ценных ресурсов занимает много сил и времени.
Из-за этого новички часто сдаются, переходят к чему-то более простому. Прежде чем мы пойдём дальше, нужно понять, что это не очередная статья из разряда «Как научиться программированию на Python с нуля», а нечто более ценное. За этим материалом последует ещё несколько, в каждом из которых мы покажем, как создаются Python-приложения, параллельно разбираясь с полезными для разработки и анализа данных навыками и инструментами.
Первое приложение, которое мы сделаем − интерактивный словарь на Python. Кажется, что это просто, но не заблуждайтесь.
Что будет делать наш словарь на Python? Его задача состоит в том, чтобы выводить на экран определение слова, которое задаст пользователь. В дополнение к этому, если пользователь сделает опечатку при вводе слова, программа предложит наиболее близкое слово, как обычно делает Google − «Вы имели в виду это вместо этого?». Ну а если у слова будет несколько определений, то программа выдаст все. Уже не так просто, правда?
Важно! Помимо изучения процесса создания приложения, обратите особое внимание на структуру кода.
Чтобы понимать принцип работы словаря, нужно определить, какие данные он будет использовать для выполнения действий − они представлены в формате JSON. Если вы уже знаете, что такое JSON, не бойтесь пропустить следующие несколько строк. Если же вы впервые услышали это слово или не уверены в своих знаниях, сейчас всё быстро объясним. Рекомендуем взглянуть вот на эти данные, потом мы их и будем использовать − раз и два.
Интересный факт: Каждую секунду генерируется примерно 2 500 000 000 000 000 000 байт данных
JSON, или JavaScript Object Notation, − это формат обмена данными, удобный как компьютерам, так и людям. Обычно он состоит из двух вещей − key и value. Представим, что key − это заброшенная территория, некто вынес постановление о том, что его нельзя использовать для строительства, например, вот это постановление примем за value. Если хотите вникнуть более серьёзно, посмотрите этот материал.
Теперь перейдём к коду. Сначала мы импортируем библиотеку JSON, а затем используем метод загрузки этой библиотеки для работы с нашими данными в формате .json. Важно понимать, что мы загружаем данные из .json формата, но храниться они будут в переменной "data" в виде dict — словаря Python. Если вы незнакомы с dict, можете представить их как хранилище данных.
Как только данные будут загружены, создадим функцию, которая будет принимать слово и искать определение этого слова в данных. Достаточно просто.
Использование оператора if-else поможет вам проверить существует слово или нет. Если слово отсутствует в данных, просто сообщите об этом пользователю − в нашем случае, будет напечатано «Такого слова не существует, пожалуйста, проверьте, не ошиблись ли вы при вводе».
Каждый пользователь пишет по-своему. Одни пишут только строчными, другие используют ещё и заглавные. Для нас важно сделать так, чтобы результат для всех был одинаковым. Например, результаты по запросам «Rain» и «rain» будут идентичны. Чтобы сделать это, мы собираемся преобразовать слово, введенное пользователем, в строчную запись буквы, потому что наши данные имеют одинаковый формат. Сделать это можно с помощью метода lower() в Python.
Ситуация №1: Чтобы убедиться, что программа возвращает определение слов, начинающихся с заглавной буквы (например, Дели, Техас), мы также проверим наличие заглавных букв в условии else-if.
Ситуация №2: Чтобы убедиться, что программа возвращает определение аббревиатур (например, США, НАТО), мы также проверим прописные буквы.
Теперь словарь на Python может выполнять свою основную функцию − выдавать определение. Идём дальше, поможем пользователю найти слово, если он допустил ошибку при вводе.
Теперь, если пользователь сделал опечатку при вводе слова, вы можете предложить наиболее близкое слово и спросить, имел ли он его в виду. Мы можем сделать это с помощью библиотеки Python difflib. Для этого существует два метода, объясним, как работают оба, а чем пользоваться, выбирайте сами.
Метод 1 − Соответствие последовательности
Сначала мы импортируем библиотеку и извлекаем из нее метод. Функция SequenceMatcher() принимает всего 3 параметра. Первый − junk, что означает, что если в слове есть пробелы или пустые строки, в нашем случае это не так. Второй и третий параметры − это слова, между которыми вы хотите найти сходство. А последний метод выдаст вероятность того, что слово подобрано правильно.
Как видите, сходство между словами «rainn» и «rain» составляет 0,89 или 89%. Это один из способов найти нужное слово. Но в той же библиотеке есть другой метод, который выбирает точное совпадение со словом напрямую, без определения вероятности.
Метод 2 − Получение близких совпадений
Метод работает следующим образом: первый параметр − это слово, для которого вы хотите найти близкие совпадения. Второй параметр − это список слов для сравнения. Третий указывает, сколько совпадений вы хотите в качестве вывода. Вы помните, что мы получили вероятность 0,89 в предыдущем методе? Последний метод использует это число, чтобы узнать, когда прекратить рассматривать слово как близкое совпадение (0,99 - самое близкое к слову). Эту цифру, порог, можно установить самостоятельно.
Самое близкое слово из всех трех − rainy [rainy].
Для удобства чтения я просто добавил часть кода if-else. Вы знакомы с первыми двумя утверждениями else-if, теперь разберемся с третьим. Сначала проверяется длина полученных близких совпадений. Функция получения близких совпадений принимает слово, введенное пользователем, в качестве первого параметра, и весь наш набор данных сопоставляется с этим словом. Здесь key − это слова в наших данных, а value − это их определение. [0] в операторе указывает на самое близкое среди всех совпадений.
Да, об этом мы и говорили. Что теперь? Если это то слово, которое имел в виду пользователь, вы должны получить определение этого слова. Об этом далее
Ещё один if-else, и вот оно − определение нужного слова.
Конечно, это дает нам определение слова «rain», но есть квадратные скобки и выглядит это не очень хорошо. Давайте удалим их и сделаем вид более чистым. Слово «rain» имеет более одного определения, вы заметили? Мы будем повторять вывод таких слов, имеющих более одного определения.
Выглядит намного лучше, не так ли? Ниже прикрепили весь код для справки. Не стесняйтесь изменять и обновлять его по своему усмотрению.
Вот мы и закончили создавать словарь на Python. Изучая одно, вы параллельно изучаете другие вещи, о которых даже не думали. Этот материал научил работе с данными JSON, основными функциями Python, библиотекой difflib и тому, как писать чистый код. Теперь попробуйте создать собственное приложение, с опорой на информацию из этого текста. Как закончите, переходите к новому материалу из цикла.
Использование подходящих словарей во время проведения тестирования на проникновение во многом определяет успех подбора учетных данных. В данной публикации я расскажу, какие современные инструменты можно использовать для создания словарей, их оптимизации для конкретного случая и как не тратить время на перебор тысяч заведомо ложных комбинации.
Инструменты
Пожалуй, один из самых известных инструментов для быстрого создания словарей. Он по умолчанию входит в популярный дистрибутив для проведения пентеста Kali Linux.
Инструмент работает в нескольких режимах:
Создание словаря, состоящего из перечисленных символов, например чисел
Создается словарь длиной от четырех до пяти цифр.
Создание словаря по шаблону
Сперва указывается длина пароля — 10 символов. Затем перечисляются наборы символов: буквы в нижнем регистре, буквы в верхнем регистре, цифры и спецсимволы. Ключ -t задает шаблон, где
- ^ — спецсимволы
- @ — буквы в нижнем регистре
- , — буквы в верхнем регистре
- % — цифры
Словарь состоит из всех возможных комбинаций слов Alex, Company и Position.
Подробнее изучить инструмент можно через стандартные man страницы, они достаточно подробные.
maskprocessor
Вы можете задать до четырех собственных наборов символов и использовать готовые наборы
Или можно задать набор из цифр, но добавить к нему еще несколько спецсимволов так
Получаем такой результат
John the Ripper
Популярный брутфорсер John the Ripper (JTR) тоже позволяет генерировать словари на основе правил. Делается это при помощи ключа --rules, а сами правила описываются в файле john.conf
Вот так выглядит стандартное правило, используемое для взлома NTLM хэша
В первой строчке сказано, что нужно изменить регистр символа на нулевой позиции (T0), символ Q позволяет не допустить дубликатов в результирующем словаре. Во второй строке символ на первой позиции меняет свой регистр, затем скобки задают препроцессор, чтобы были сгенерированы пароли и с измененным нулевым символом и так далее.
Предположим, вы успешно провели брутфорс LM хэша и получили значение QWERTY123, так как для LM регистр не важен.
Но для авторизации вам нужно провести брутфорс NTLM хэша, где регистр имеет значение. Воспользовавшись правилом, описанным выше, можно получить следующий словарь
JTR по умолчанию содержит множество готовых правил, но можно написать и свои, либо взять за основу уже написанное и скорректировать под текущую ситуацию.
Подробно про синтаксис правил можно почитать здесь.
hashcat-tools
Еще одним полезным инструментом является набор утилит от популярного брутфорсера hashcat.
Рассмотрим некоторые их них. Описания всех утилит на английском языке можно найти тут.
combinanor.bin — позволяет генерировать словарь из слов, входящих в два других словаря.
combinanor3.bin делает то же самое, но на вход принимает три файла, вместо двух.
combipow.bin — создает все возможные комбинации из слов, перечисленных в файле (похоже на ключ -p в crunch)
cutb.bin — обрезает слова в словаре до указанной длины. Можно указывать смещение (offset)
expander.bin — получает на ввод слова, разбирает их на символы, комбинирует и отправляет в STDOUT
permute.bin — создает словарь, который используется hashcat при атаке типа Permutation attack. Перед использованием словарь нужно пропустить через утилиту prepare.
gate.bin — разбивает словарь на несколько частей для параллельной обработки несколькими ядрами или несколькими машинами. В примере ниже мы разбиваем стандартный словарь JTR на две части. В первую часть попадают слова под номером 0, 2, 4, 6,…. Во вторую 1, 3, 5, 7,…
len.bin — оставляет в словаре только слова определенной длины от min до max
mli2.bin — объединяет два словаря.
req-include.bin — крайне полезный инструмент, который убирает из словаря все, что не подходит под заданные правила. Например, вы знаете, что по парольной политике в пароле обязательно присутствует буква в верхнем регистре, цифра и спецсимвол.
Число выбрано исходя из таблицы
Если таким образом нормализовать известный словарь rockyou, то можно сократить его размер в 270 раз! и не тратить ресурсы на заведомо ложные комбинации.
req-exclude.bin делает то же самое, что req-include, но с точностью до наоборот.
rli.bin — эта утилита удаляет значения из первого словаря, если они встречаются во втором. Полезно использовать, если вы создаете один словарь из нескольких.
Когда под рукой нет утилит
Может оказаться так, что воспользоваться набором hashcat-utils или crunch нет возможности, а нужно срочно создать словарь или нормализовать его. Некоторые алгоритмы довольно сложны в реализации, но базовые операции можно выполнить просто в командной строке.
Простой словарь с датами можно создать серией подобных команд
Если нужно разбить словарь на части для параллельной обработки, можно воспользоваться командой split
Быстро объединить два словаря можно так
Чтобы сделать заглавной первую или последнюю буквы в каждом слове, нужно выполнить, соответственно, команды
Для перевода регистра в нижний нужно заметить «u» на «l»
Дописать что-то в начало каждого слова из словаря можно так
А так можно дописать слово в конец
Следующей командой можно добавить в начало число от 0 до 99 к каждому слову в словаре
Можно очистить словарь от значений, в которых не присутствует хотя бы 2 числа так
Это лишь некоторые примеры. Можно писать более сложные обработки на Python и других скриптовых языках. Но всегда нужно помнить, что создание качественного словаря и его нормализация под целевой протокол — важный этап при проведении тестирования на проникновение.
Основная идея сервиса - создание собственных подборок слов и возможность изучать их. Подборки слов мы называем словарями.
Сервис прежде всего адресован людям, изучающим языки. Вы создаете свои словари, добавляете в них слова и фразы и изучаете с помощью встроенного тренажера.
К словам, помимо перевода, можно добавить примеры и заметки, что значительно упрощает запоминание слов.
Помощь при добавлении слов
Когда вы добавляете слова или фразы в словарь, система автоматически создает перевод. Вы можете его скорректировать прямо во время добавления.
Тренажер для заучивания слов
Встроенный тренажер - удобный способ вспомнить уже выученные слова или начать изучать совершенно новые.
В него включено 6 упражнений, которые можно использовать на свое усмотрение.
Интервальное повторение слов
Это режим, необходимый для того, чтобы повторять уже выученные слова через определённые интервалы времени.
Функция интервального повторения автоматически отмечает даты в календаре, когда вы должны повторить слова, и отображает соответствующие уведомления в интерфейсе.
Кроме этого, режим интервального повторения следит за тем, чтобы все слова были повторены и ни одно из них не затерялось.
Ещё много возможностей для удобного создания словарей и изучения слов
Упорядочивание словарей по тегам
Каждому словарю можно присвоить несколько меток (тегов), для того чтобы по этим меткам можно было легко найти нужный словарь в списке.
Кроме этого, можно отметить словарь как "Избранный" - это дополнительно позволит выделить нужный словарь.
Возможность поделиться словарем
К созданным вами словарям можно предоставить доступ другим людям. Для этого нужно включить общий доступ в настройках словаря и передать ссылку.
Заучивание в таблице
В интерфейсе словаря предусмотрены функции, которые позволяют скрывать перевод или оригинал слова. С их помощью удобно заучивать слова прямо в списке слов.
Готовые подборки слов
Для удобства заполнения словарей, мы создали и продолжаем заполнять, специальную коллекцию слов, разделенную по темам.
Читайте также: