Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
pack — PACK (Набор для анализа и взлома паролей) | Kitploit
Инструменты/GitHubGitHub/iphelix/pack
Взлом паролейАтаки на ПаролиАнализ хэшейУтилиты и фреймворки
GitHubiphelix/pack

pack

PACK (Набор для анализа и взлома паролей)

РепозиторийСайт
890174157 лет назадПроверено Kitploit

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Password Analysis and Cracking Kit от Peter Kacherginsky (iphelix)

PACK (Password Analysis and Cracking Toolkit) — это набор утилит, разработанных для анализа списков паролей с целью повышения эффективности их взлома за счёт обнаружения закономерностей в масках, правилах, наборах символов и других характеристиках паролей. Инструментарий генерирует корректные входные файлы для семейства программ для взлома паролей Hashcat.

ПРИМЕЧАНИЕ: Сам инструментарий не умеет взламывать пароли, а предназначен для повышения эффективности работы программ взлома.

Выбор списков паролей для анализа

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

StatsGen

Самый простой анализ, который вы можете выполнить — это просто получение наиболее распространённой длины, набора символов и других характеристик паролей в предоставленном списке. В примере ниже мы будем использовать 'rockyou.txt', содержащий около 14 миллионов паролей. Запустите statsgen.py со следующей командой:

root@kitploit:~
$ python statsgen.py rockyou.txt

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

root@kitploit:~
                       _
     StatsGen #.#.#   | |
      _ __   __ _  ___| | _
     | '_ \ / _` |/ __| |/ /
     | |_) | (_| | (__|   < 
     | .__/ \__,_|\___|_|\_\
     | |                    
     |_| [email protected]


[*] Анализ паролей в [rockyou.txt]
[+] Проанализировано 100% (14344390/14344390) паролей
    ПРИМЕЧАНИЕ: Статистика ниже приведена относительно количества проанализированных паролей, а не общего количества паролей

[*] Длина:
[+]                         8: 20% (2966037)
[+]                         7: 17% (2506271)
[+]                         9: 15% (2191039)
[+]                        10: 14% (2013695)
[+]                         6: 13% (1947798)
...

[*] Набор символов:
[+]             loweralphanum: 42% (6074867)
[+]                loweralpha: 25% (3726129)
[+]                   numeric: 16% (2346744)
[+]      loweralphaspecialnum: 02% (426353)
[+]             upperalphanum: 02% (407431)
...

[*] Сложность пароля:
[+]                     digit: min(0) max(255)
[+]                     lower: min(0) max(255)
[+]                     upper: min(0) max(187)
[+]                   special: min(0) max(255)

[*] Простые маски:
[+]               stringdigit: 37% (5339556)
[+]                    string: 28% (4115314)
[+]                     digit: 16% (2346744)
[+]               digitstring: 04% (663951)
[+]                 othermask: 04% (576324)
...

[*] Расширенные маски:
[+]          ?l?l?l?l?l?l?l?l: 04% (687991)
[+]              ?l?l?l?l?l?l: 04% (601152)
[+]            ?l?l?l?l?l?l?l: 04% (585013)
[+]        ?l?l?l?l?l?l?l?l?l: 03% (516830)
[+]            ?d?d?d?d?d?d?d: 03% (487429)
...

ПРИМЕЧАНИЕ: Вы можете уменьшить количество отображаемых выбросов, включив флаг --hiderare, который не будет показывать элементы с частотой встречаемости менее 1%.

Вот что мы можем сразу узнать из приведённого списка:

  • Большинство паролей имеют длину от 6 до 10 символов.
  • Большинство паролей имеют набор символов loweralphanumeric.
  • Не существует очевидной минимальной или максимальной сложности пароля.
  • Проанализированные пароли, как правило, следуют простой маске "строка, за которой следуют цифры".

Последний раздел, "Расширенные маски", содержит наиболее часто встречающиеся маски в формате Hashcat. Отдельные символы можно интерпретировать следующим образом:

root@kitploit:~
?l - один символ в нижнем регистре
?u - один символ в верхнем регистре
?d - одна цифра
?s - один специальный символ

Например, самая первая маска, "?l?l?l?l?l?l?l?l", будет соответствовать всем паролям из строчных букв. Учитывая размер выборки, вы сможете взломать примерно 4% паролей. Однако после генерации первоначального вывода вам может быть интересно использовать фильтры для сужения данных о паролях.

Использование фильтров

Давайте посмотрим, как пользователи RockYou склонны выбирать свои пароли, используя простую маску "stringdigit" (строка, за которой следуют цифры):

root@kitploit:~
$ python statsgen.py ../PACK-0.0.3/archive/rockyou.txt --simplemask stringdigit -q --hiderare

[*] Анализ паролей в [rockyou.txt]
[+] Проанализировано 37% (5339556/14344390) паролей
    ПРИМЕЧАНИЕ: Статистика ниже приведена относительно количества проанализированных паролей, а не общего количества паролей

[*] Длина:
[+]                         8: 23% (1267260)
[+]                         7: 18% (981432)
[+]                         9: 17% (939971)
[+]                        10: 14% (750938)
[+]                         6: 11% (618983)
[+]                        11: 05% (294869)
[+]                        12: 03% (175875)
[+]                        13: 01% (103047)
[+]                        14: 01% (65958)

[*] Набор символов:
[+]             loweralphanum: 88% (4720184)
[+]             upperalphanum: 06% (325941)
[+]             mixedalphanum: 05% (293431)

[*] Сложность пароля:
[+]                     digit: min(1) max(252)
[+]                     lower: min(0) max(46)
[+]                     upper: min(0) max(31)
[+]                   special: min(0) max(0)

[*] Простые маски:
[+]               stringdigit: 100% (5339556)

[*] Расширенные маски:
[+]          ?l?l?l?l?l?l?d?d: 07% (420318)
[+]            ?l?l?l?l?l?d?d: 05% (292306)
[+]        ?l?l?l?l?l?l?l?d?d: 05% (273624)
[+]          ?l?l?l?l?d?d?d?d: 04% (235360)
[+]              ?l?l?l?l?d?d: 04% (215074)
...

В самом верху вывода указано, какой процент от общего числа паролей был проанализирован. В данном случае, взламывая только пароли, соответствующие маске "stringdigit", можно восстановить лишь около 37% от общего набора, как и было показано в первоначальном выводе. Далее видно, что только 11% паролей этого типа содержат символы, отличные от строчных. Поэтому было бы разумно сосредоточиться только на строках из строчных букв, соответствующих этой маске. Наконец, в разделе "Расширенные маски" мы видим, что большинство паролей "stringdigit" состоят из строки, после которой следуют две или четыре цифры. Используя информацию, полученную из приведённого вывода, мы можем начать создавать мысленный образ шаблонов генерации паролей целевых пользователей.

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

Length: --minlength и/или --maxlength

Simple Mask: --simplemask [numeric, loweralpha, upperalpha, mixedalpha, loweralphanum и т.д.]

Character sets: --charset [digit, string, stringdigit, digitstring, digitstringdigit и т.д.]

ПРИМЕЧАНИЕ: Можно указать более одного фильтра одного класса, перечислив их через запятую:

root@kitploit:~
--simplemask="stringdigit,digitstring"

Сохранение расширенных масок

Хотя раздел "Расширенные маски" отображает только шаблоны, соответствующие более чем 1% всех паролей, вы можете получить и сохранить полный список масок паролей, соответствующих заданному словарю, с помощью следующей команды:

root@kitploit:~
$ python statsgen.py rockyou.txt -o rockyou.masks

Все маски паролей и их частоты будут сохранены в указанный файл в формате CSV. Разумеется, вы можете указать фильтры для генерации файла масок только с заданными параметрами. Полученный файл может быть использован как входные данные для инструмента MaskGen, который рассматривается в следующем разделе.

MaskGen

MaskGen позволяет создавать маскированные атаки на основе шаблонов для ввода в семейство программ для взлома паролей Hashcat. Инструмент использует выходные данные, полученные с помощью statsgen выше с флагом '-o', для создания наиболее оптимальной маскированной атаки, отсортированной по сложности маски, частоте встречаемости или соотношению этих двух параметров (оптимальный индекс).

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

root@kitploit:~
$ python maskgen.py rockyou.masks

                       _ 
     MaskGen #.#.#    | |
      _ __   __ _  ___| | _
     | '_ \ / _` |/ __| |/ /
     | |_) | (_| | (__|   < 
     | .__/ \__,_|\___|_|\_\
     | |                    
     |_| [email protected]


[*] Анализ масок в [rockyou.masks]
[*] Используется 1,000,000,000 ключей/сек для расчётов.
[*] Сортировка масок по их [optindex].
[*] Генерация масок завершена:
    Сгенерировано масок: 146578
    Покрытие масок:  100% (14344390/14344390)
    Время выполнения масок:   >1 года

Здесь следует обратить внимание на несколько моментов:

  • Скорость взлома по умолчанию, используемая для расчётов, составляет 1,000,000,000 ключей/сек
  • Режим сортировки по умолчанию — [optindex], эквивалентный флагу --optindex.
  • Сгенерировано 146,578 уникальных масок с 100% покрытием
  • Общее время выполнения всех сгенерированных масок превышает 1 год.

Указание целевого времени

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

root@kitploit:~
$ python maskgen.py rockyou.masks --targettime 600 --optindex -q
[*] Анализ масок в [rockyou.masks]
[*] Используется 1,000,000,000 ключей/сек для расчётов.
[*] Сортировка масок по их [optindex].
[!] Целевое время превышено.
[*] Генерация масок завершена:
    Сгенерировано масок: 779
    Покрытие масок:  56% (8116195/14344390)
    Время выполнения масок:   0:11:36


$ python maskgen.py rockyou.masks --targettime 600 --complexity -q
[*] Анализ масок в [rockyou.masks]
[*] Используется 1,000,000,000 ключей/сек для расчётов.
[*] Сортировка масок по их [complexity].
[!] Целевое время превышено.
[*] Генерация масок завершена:
    Сгенерировано масок: 5163
    Покрытие масок:  31% (4572346/14344390)
    Время выполнения масок:   0:10:01


$ python maskgen.py rockyou.masks --targettime 600 --occurrence -q
[*] Анализ масок в [rockyou.masks]
[*] Используется 1,000,000,000 ключей/сек для расчётов.
[*] Сортировка масок по их [occurrence].
[!] Целевое время превышено.
[*] Генерация масок завершена:
    Сгенерировано масок: 4
    Покрытие масок:  16% (2390986/14344390)
    Время выполнения масок:   1:34:05

Все указанные выше запуски имеют целевое время 600 секунд (или 10 минут) с разными режимами сортировки. По результатам наших экспериментов маски, сгенерированные с использованием режима сортировки OptIndex, могут взломать 56% паролей RockYou примерно за 10 минут. В то же время маски, сгенерированные с использованием режима сортировки Occurrence, не только имеют довольно слабое покрытие (всего 16%), но и превышают заданное целевое время более чем на час.

ПРИМЕЧАНИЕ: Маски, отсортированные по сложности, могут быть очень эффективны при атаке на политики паролей.

Давайте посмотрим на некоторые маски, сгенерированные maskgen в режиме optindex, с помощью флага --showmasks:

root@kitploit:~
$ python maskgen.py rockyou.masks --targettime 43200 --optindex -q --showmasks
[*] Анализ масок в [rockyou.masks]
[*] Используется 1,000,000,000 ключей/сек для расчётов.
[*] Сортировка масок по их [optindex].
[L:] Mask:                          [ Occ:  ] [ Time:  ]
...
[ 7] ?l?d?s?l?l?d?d                 [6      ] [ 0:00:00]  
[ 8] ?s?l?l?l?l?l?l?s               [3480   ] [ 0:05:36]  
[ 9] ?l?l?l?l?d?d?d?d?s             [1553   ] [ 0:02:30]  
[ 8] ?d?l?d?d?d?l?l?l               [47     ] [ 0:00:04]  
[ 8] ?d?l?l?d?l?d?d?l               [47     ] [ 0:00:04]  
[ 8] ?d?l?l?d?d?l?d?l               [47     ] [ 0:00:04]  
[ 8] ?d?l?d?l?d?d?l?l               [47     ] [ 0:00:04]  
[ 8] ?d?d?l?l?d?l?d?l               [47     ] [ 0:00:04]  
[ 8] ?d?l?d?d?l?l?l?l               [122    ] [ 0:00:11]  
[ 8] ?u?u?d?u?d?d?d?d               [18     ] [ 0:00:01]  
[ 6] ?d?s?s?s?s?s                   [4      ] [ 0:00:00]  
[10] ?l?l?l?l?l?l?l?l?d?d           [213109 ] [ 5:48:02]  
[!] Целевое время превышено.
[*] Генерация масок завершена:
    Сгенерировано масок: 3970
    Покрытие масок:  74% (10620959/14344390)
    Время выполнения масок:   16:10:38

Отображаемые маски имеют довольно интуитивный формат:

[ 9] ?l?l?l?l?d?d?d?d?s [1553 ] [ 0:02:30] \ \ \
\ _ сгенерированная маска \ _ время выполнения маски \
_ длина маски _ частота встречаемости маски

В приведённом примере можно увидеть логику, заложенную в генерацию масок. Например, хотя маска '?s?l?l?l?l?l?l?s' имеет одно из самых долгих времён выполнения в примере (5 минут), она всё равно имеет более высокий приоритет из-за своей относительно более высокой частоты встречаемости по сравнению с '?l?l?l?l?d?d?d?d?s'. В то же время, хотя '?l?d?s?l?l?d?d' имеет довольно низкое покрытие, она всё равно получает более высокий приоритет, чем другие маски, поскольку, будучи маской длиной всего в шесть символов, выполняется очень быстро.

Указание фильтров масок

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

root@kitploit:~
$ python maskgen.py rockyou.masks --targettime 43200 --optindex -q --minlength 8
[*] Анализ масок в [rockyou.masks]
[*] Используется 1,000,000,000 ключей/сек для расчётов.
[*] Сортировка масок по их [optindex].
[!] Целевое время превышено.
[*] Генерация масок завершена:
    Сгенерировано масок: 585
    Покрытие масок:  41% (5905182/14344390)
    Время выполнения масок:   15:50:36

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

Ниже приведён список дополнительных фильтров, которые можно использовать:

root@kitploit:~
  Параметры фильтрации отдельных масок:
    --minlength=8       Минимальная длина пароля
    --maxlength=8       Максимальная длина пароля
    --mintime=3600      Минимальное время выполнения маски (секунды)
    --maxtime=3600      Максимальное время выполнения маски (секунды)
    --mincomplexity=1   Минимальная сложность
    --maxcomplexity=100
                        Максимальная сложность
    --minoccurrence=1   Минимальная частота встречаемости
    --maxoccurrence=100
                        Максимальная частота встречаемости

Флаги occurrence и complexity могут быть особенно эффективны для точной настройки сгенерированных масок с использованием различных режимов сортировки.

Сохранение сгенерированных масок

Когда полученные маски вас устраивают, вы можете сохранить их с помощью флага -o:

root@kitploit:~
$ python maskgen.py rockyou.masks --targettime 43200 --optindex -q -o rockyou.hcmask
[*] Анализ масок в [rockyou.masks]
[*] Сохранение сгенерированных масок в [rockyou.hcmask]
[*] Используется 1,000,000,000 ключей/сек для расчётов.
[*] Сортировка масок по их [optindex].
[!] Целевое время превышено.
[*] Генерация масок завершена:
    Сгенерировано масок: 3970
    Покрытие масок:  74% (10620959/14344390)
    Время выполнения масок:   16:10:38

Это создаст файл 'rockyou.hcmask', который можно напрямую использовать с набором инструментов Hashcat или в составе пользовательского скрипта, перебирающего их.

Проверка покрытия маски

Часто бывает полезно увидеть, насколько хорошо сгенерированные маски работают против уже взломанных списков. Maskgen может сравнить набор масок с другими, чтобы увидеть, насколько хорошо они будут работать, если маски из одного списка паролей будут применены к другому. Давайте сравним, насколько хорошо маски, сгенерированные из списка RockYou, будут работать против другого скомпрометированного списка, такого как Gawker:

root@kitploit:~
$ python statsgen.py ../PACK-0.0.3/archive/gawker.dic -o gawker.masks

$ python maskgen.py gawker.masks --checkmasksfile rockyou.hcmask -q
[*] Анализ масок в [gawker.masks]
[*] Используется 1,000,000,000 ключей/сек для расчётов.
[*] Проверка покрытия масок из [rockyou.hcmask]
[*] Сопоставление масок завершено:
    Совпадений масок: 1775
    Покрытие масок:  96% (1048889/1084394)
    Время выполнения масок:   16:25:44

Используя параметр '--checkmasksfile', мы попытались выполнить маски из файла 'rockyou.hcmask', созданного ранее, против масок из образца утёкшего списка 'gawker.masks'. Это даёт хорошее покрытие в 96%, при этом 1775 из 3970 сгенерированных масок на основе RockYou совпали с масками в списке Gawker.

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

root@kitploit:~
$ python maskgen.py gawker.masks --checkmasks="?u?l?l?l?l?l?d,?l?l?l?l?l?d?d" -q
[*] Анализ масок в [gawker.masks]
[*] Используется 1,000,000,000 ключей/сек для расчётов.
[*] Проверка покрытия следующих масок [?u?l?l?l?l?l?d, ?l?l?l?l?l?d?d]
[*] Сопоставление масок завершено:
    Совпадений масок: 2
    Покрытие масок:  1% (18144/1084394)
    Время выполнения масок:   0:00:04

Обе указанные маски совпали с покрытием всего 1%.

Указание скорости

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

root@kitploit:~
$ python maskgen.py rockyou.masks --targettime 43200 --pps 50000000 -q
[*] Анализ масок в [rockyou.masks]
[*] Используется 50,000,000 ключей/сек для расчётов.
[*] Сортировка масок по их [optindex].
[!] Целевое время превышено.
[*] Генерация масок завершена:
    Сгенерировано масок: 1192
    Покрытие масок:  61% (8754548/14344390)
    Время выполнения масок:   12:17:31

Использование параметра '--pps' для соответствия вашей реальной производительности делает целевое время более осмысленным.

PolicyGen

Многие атаки с использованием масок и словарей терпят неудачу в корпоративной среде с минимальными требованиями к сложности паролей. Вместо того чтобы прибегать к атаке полным перебором, мы можем использовать известные или предполагаемые правила сложности паролей, чтобы избегать перебора кандидатов паролей, не соответствующих политике, или, наоборот, проверять только несоответствующие пароли. С помощью PolicyGen вы сможете сгенерировать набор масок, соответствующих требованиям сложности паролей, что значительно сократит время взлома.

Ниже приведён пример сеанса, в котором мы генерируем все допустимые маски паролей для среды, требующей как минимум одну цифру, один символ верхнего регистра и один специальный символ.

root@kitploit:~
$ python policygen.py --minlength 8 --maxlength 8 --minlower 1 --minupper 1 --mindigit 1 --minspecial 1 -o complexity.hcmask
                       _ 
     PolicyGen #.#.#  | |
      _ __   __ _  ___| | _
     | '_ \ / _` |/ __| |/ /
     | |_) | (_| | (__|   < 
     | .__/ \__,_|\___|_|\_\
     | |                    
     |_| [email protected][*] Saving generated masks to [complexity.hcmask]
[*] Using 1,000,000,000 keys/sec for calculations.
[*] Password policy:
    Pass Lengths: min:8 max:8
    Min strength: l:1 u:1 d:1 s:1
    Max strength: l:None u:None d:None s:None
[*] Generating [compliant] masks.
[*] Generating 8 character password masks.
[*] Total Masks:  65536 Time: 76 days, 18:50:04
[*] Policy Masks: 40824 Time: 35 days, 0:33:09

Из приведённого вывода видно, что мы сгенерировали 40824 масок, соответствующих указанной сложности, которые займут около 35 дней при скорости 1 000 000 000 ключей/сек.

Если вы просто проводите аудит паролей и ваша задача — найти только несоответствующие политике пароли, вы можете указать флаг --noncompliant, чтобы инвертировать сгенерированные маски:

root@kitploit:~
$ python policygen.py --minlength 8 --maxlength 8 --minlower 1 --minupper 1 --mindigit 1 --minspecial 1 -o noncompliant.hcmask -q --noncompliant
[*] Saving generated masks to [noncompliant.hcmask]
[*] Using 1,000,000,000 keys/sec for calculations.
[*] Password policy:
    Pass Lengths: min:8 max:8
    Min strength: l:1 u:1 d:1 s:1
    Max strength: l:None u:None d:None s:None
[*] Generating [non-compliant] masks.
[*] Generating 8 character password masks.
[*] Total Masks:  65536 Time: 76 days, 18:50:04
[*] Policy Masks: 24712 Time: 41 days, 18:16:55

Давайте посмотрим на некоторые несоответствующие маски, сгенерированные выше, с помощью флага --showmasks:

root@kitploit:~
$ python policygen.py --minlength 8 --maxlength 8 --minlower 1 --minupper 1 --mindigit 1 --minspecial 1 -o noncompliant.hcmask -q --noncompliant --showmasks
[*] Saving generated masks to [noncompliant.hcmask]
[*] Using 1,000,000,000 keys/sec for calculations.
[*] Password policy:
    Pass Lengths: min:8 max:8
    Min strength: l:1 u:1 d:1 s:1
    Max strength: l:None u:None d:None s:None
[*] Generating [non-compliant] masks.
[*] Generating 8 character password masks.
[ 8] ?d?d?d?d?d?d?d?d               [l: 0 u: 0 d: 8 s: 0] [ 0:00:00]  
[ 8] ?d?d?d?d?d?d?d?l               [l: 1 u: 0 d: 7 s: 0] [ 0:00:00]  
[ 8] ?d?d?d?d?d?d?d?u               [l: 0 u: 1 d: 7 s: 0] [ 0:00:00]  
[ 8] ?d?d?d?d?d?d?d?s               [l: 0 u: 0 d: 7 s: 1] [ 0:00:00]  
... 
[ 8] ?s?s?s?s?s?s?s?d               [l: 0 u: 0 d: 1 s: 7] [ 0:07:06]  
[ 8] ?s?s?s?s?s?s?s?l               [l: 1 u: 0 d: 0 s: 7] [ 0:18:28]  
[ 8] ?s?s?s?s?s?s?s?u               [l: 0 u: 1 d: 0 s: 7] [ 0:18:28]  
[ 8] ?s?s?s?s?s?s?s?s               [l: 0 u: 0 d: 0 s: 8] [ 0:23:26]  
[*] Total Masks:  65536 Time: 76 days, 18:50:04
[*] Policy Masks: 24712 Time: 41 days, 18:16:55

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

Указание максимальной сложности

Также можно указать максимальную сложность пароля с помощью флагов --maxlower, --maxupper, --maxdigit и --maxspecial, чтобы точнее настроить атаку. Например, ниже приведен пример сайта, который требует соблюдения политики паролей, но не допускает специальных символов:

root@kitploit:~
$ python policygen.py --minlength 8 --maxlength 8 --minlower 1 --minupper 1 --mindigit 1 --maxspecial 0 -o maxcomplexity.hcmask -q
[*] Saving generated masks to [maxcomplexity.hcmask]
[*] Using 1,000,000,000 keys/sec for calculations.
[*] Password policy:
    Pass Lengths: min:8 max:8
    Min strength: l:1 u:1 d:1 s:None
    Max strength: l:None u:None d:None s:0
[*] Generating [compliant] masks.
[*] Generating 8 character password masks.
[*] Total Masks:  65536 Time: 76 days, 18:50:04
[*] Policy Masks: 5796 Time: 1 day, 20:20:55

Анализ правил

rulegen.py реализует анализ паролей и генерацию правил для инструмента взлома паролей Hashcat, как описано в статье Automatic Password Rule Analysis and Generation. Пожалуйста, ознакомьтесь с этим документом для подробного обсуждения теории анализа и генерации правил.

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

Предварительные требования

Для эффективного использования rulegen.py необходимо выполнить несколько предварительных условий. Инструмент использует библиотеку проверки орфографии Enchant для взаимодействия с рядом механизмов проверки орфографии, таких как Aspell, MySpell и т.д. Вы должны установить эти инструменты перед использованием. Также крайне важно установить словари для того механизма проверки орфографии, который вы в итоге будете использовать (альтернативно можно использовать собственный список слов). Наконец, для удобства я приложил PyEnchant, который должен напрямую взаимодействовать с общими библиотеками Enchant; однако, если возникнут проблемы, просто удалите вложенную директорию 'enchant' и установите PyEnchant для вашего дистрибутива.

Дополнительные сведения о синтаксисе правил Hashcat см. в Hashcat Rule Based Attack.

Анализ одного пароля

Самое базовое использование rulegen.py включает анализ одного пароля для автоматического обнаружения правил. Давайте определим правила и потенциальное исходное слово, использованное для генерации тестового пароля P@55w0rd123:

root@kitploit:~
$ python rulegen.py --verbose --password P@55w0rd123
                       _ 
     RuleGen #.#.#    | |
      _ __   __ _  ___| | _
     | '_ \ / _` |/ __| |/ /
     | |_) | (_| | (__|   < 
     | .__/ \__,_|\___|_|\_\
     | |                    
     |_| [email protected]


[*] Using Enchant 'aspell' module. For best results please install
    'aspell' module language dictionaries.
[*] Analyzing password: P@55w0rd123
[-] Pas sword => {edit distance suboptimal: 8 (7)} => P@55w0rd123
[+] Password => sa@ ss5 so0 $1 $2 $3 => P@55w0rd123
[+] Passwords => sa@ ss5 so0 o81 $2 $3 => P@55w0rd123
[+] Passwords => sa@ ss5 so0 i81 o92 $3 => P@55w0rd123
[+] Passwords => sa@ ss5 so0 i81 i92 oA3 => P@55w0rd123
[+] Password's => sa@ ss5 so0 o81 o92 $3 => P@55w0rd123
[+] Password's => sa@ ss5 so0 o81 i92 oA3 => P@55w0rd123
[+] Password's => sa@ ss5 so0 i81 o92 oA3 => P@55w0rd123

В этом примере мы использовали несколько флагов:

  • --password - задаёт один пароль для анализа.
  • --verbose - выводит подробную информацию, такую как сгенерированные правила и статистику производительности.

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

Провайдер проверки орфографии

Обратите внимание, что мы используем модуль Enchant aspell для обнаружения исходного слова. Точный механизм проверки орфографии можно изменить с помощью флага --provider следующим образом:

root@kitploit:~
$ python rulegen.py --verbose --provider myspell --password P@55w0rd123 -q
[*] Using Enchant 'myspell' module. For best results please install
    'myspell' module language dictionaries.
...

ПРИМЕЧАНИЕ: Приоритет движка-провайдера можно задать с помощью списка, разделённого запятыми (например, --provider aspell,myspell).

Принудительное указание исходного слова

Использование механизма обнаружения исходного слова можно полностью отключить, указав исходное слово с помощью флага --word:

root@kitploit:~
$ python rulegen.py -q --verbose --word word --password P@55w0rd123
[*] Analyzing password: P@55w0rd123
[+] word => ^5 ^5 ^@ ^P so0 $1 $2 $3 => P@55w0rd123

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

Определение собственного словаря

Рано или поздно вы столкнётесь с ситуацией, когда генерация правил с использованием стандартного списка слов орфографического движка станет недостаточной. Вы можете указать собственный список слов с помощью флага --wordlist. Это особенно полезно при повторном использовании исходных слов из предыдущего сеанса анализа:

root@kitploit:~
$ python rulegen.py -q --verbose --wordlist rockyou.txt --password 1pa55w0rd1
[*] Using Enchant 'Personal Wordlist' module. For best results please install
    'Personal Wordlist' module language dictionaries.
[*] Analyzing password: 1pa55w0rd1
[+] password => ^1 ss5 so0 $1 => 1pa55w0rd1

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

Генерация неоптимальных правил и слов

Хотя rulegen.py пытается генерировать и записывать только наилучшие исходные слова и пароли, могут быть случаи, когда вас интересует больше результатов. Используйте флаги --morewords и --morerules, чтобы генерировать слова и правила, которые могут превышать оптимальное расстояние редактирования:

root@kitploit:~
$ python rulegen.py -q --verbose --password '$m0n3y$' --morerules --morewords
[*] Using Enchant 'aspell' module. For best results please install
    'aspell' module language dictionaries.
[*] Analyzing password: $m0n3y$
[+] money => ^$ so0 se3 $$ => $m0n3y$
[+] moneys => ^$ so0 se3 o6$ => $m0n3y$
[+] mingy => ^$ si0 sg3 $$ => $m0n3y$
[+] many => ^$ sa0 i43 $$ => $m0n3y$
[+] Mooney => sM$ o1m so0 se3 $$ => $m0n3y$

Можно ещё больше расширить сгенерированные слова с помощью флагов --maxworddist и --maxwords. Аналогично, можно получить больше правил с помощью флагов --maxrulelen и --maxrules.

Отключение расширенных движков

rulegen.py включает ряд расширенных движков для генерации более качественных слов и правил. Их можно отключить, чтобы увидеть разницу (или если они вызывают проблемы), используя флаги --simplewords и --simplerules. Давайте посмотрим, как изменятся как исходные слова, так и правила при включении этих флагов:

root@kitploit:~
$ python rulegen.py -q --verbose --password '$m0n3y$' --simplewords --simplerules
[*] Using Enchant 'aspell' module. For best results please install
    'aspell' module language dictionaries.
[*] Analyzing password: $m0n3y$
[-] Meany => {edit distance suboptimal: 5 (4)} => $m0n3y$
[+] many => i0$ o20 i43 i6$ => $m0n3y$
[+] mingy => i0$ o20 o43 i6$ => $m0n3y$
[+] money => i0$ o20 o43 i6$ => $m0n3y$
[+] mangy => i0$ o20 o43 i6$ => $m0n3y$
[+] manky => i0$ o20 o43 i6$ => $m0n3y$

Обратите внимание, что качество сгенерированных слов и правил значительно снизилось: такие слова, как 'manky', имеют меньше отношения к исходному слову 'money'. В то же время сгенерированные правила свелись к простым вставкам, удалениям и заменам.

Обработка списков паролей

Теперь, когда вы освоили все различные флаги и переключатели, мы можем попытаться сгенерировать слова и правила для набора паролей. Давайте сгенерируем текстовый файл korelogic.txt, содержащий следующие достаточно сложные тестовые пароли:

root@kitploit:~
&~defcon
'#(4)\
August19681
'&a123456
10-D'Ann
~|Bailey
Krist0f3r
f@cebOOK
Nuclear$(
zxcvbn2010!
13Hark's
NjB3qqm
Sydney93?
antalya%]
Annl05de
;-Fluffy

Теперь давайте посмотрим на анализ rulegen.py, просто указав файл паролей в качестве первого аргумента:

root@kitploit:~
$ python rulegen.py korelogic.txt -q
[*] Using Enchant 'aspell' module. For best results please install
    'aspell' module language dictionaries.
[*] Analyzing passwords file: korelogic.txt:
[*] Press Ctrl-C to end execution and generate statistical analysis.
[*] Saving rules to analysis.rule
[*] Saving words to analysis.word
[*] Finished processing 16 passwords in 1.00 seconds at the rate of 15.94 p/sec
[*] Generating statistics for [analysis] rules and words.
[-] Skipped 0 all numeric passwords (0.00%)
[-] Skipped 2 passwords with less than 25% alpha characters (12.50%)
[-] Skipped 0 passwords with non ascii characters (0.00%)

[*] Top 10 rules
[+] ^3 ^1 o4r - 3 (2.00%)
[+] i61 i79 i86 i98 oA1 - 2 (1.00%)
[+] ^- ^0 ^1 i4' o5A - 2 (1.00%)
[+] sS1 i13 T2 - 1 (0.00%)
[+] i61 se9 i86 i98 oA1 - 1 (0.00%)
[+] o61 i79 i86 i98 oA1 - 1 (0.00%)
[+] ^- ^0 ^1 so' i5A - 1 (0.00%)
[+] D3 si0 i55 $e - 1 (0.00%)
[+] i61 i79 se6 i98 oA1 - 1 (0.00%)
[+] i3a o5y o6a i7% o8] - 1 (0.00%)

[*] Top 10 words
[+] Analyze - 1 (0.00%)
[+] defcon - 1 (0.00%)
[+] Kristen - 1 (0.00%)
[+] Bailey - 1 (0.00%)
[+] Augusts - 1 (0.00%)
[+] Annelid - 1 (0.00%)
[+] Hack's - 1 (0.00%)
[+] antlers - 1 (0.00%)
[+] antelope - 1 (0.00%)
[+] xxxv - 1 (0.00%)

Используя все настройки по умолчанию, мы смогли получить несколько высококачественных правил. Приложение отображает базовую статистику по топ-10 правил и слов. Все сгенерированные правила и слова сохраняются с базовым именем 'analysis' по умолчанию:

  • analysis.word - несортированные и неуникальные исходные слова
  • analysis-sorted.word - отсортированные по частоте и уникальные исходные слова
  • analysis.rule - несортированные и неуникальные правила
  • analysis-sorted.rule - отсортированные по частоте и уникальные правила

Обратите внимание, что несколько паролей, такие как '#(4)\ и '&a123456, были пропущены, поскольку они не обладают достаточными характеристиками для обработки. Помимо количества буквенных символов, программа пропускает все числовые пароли и пароли, содержащие не-ASCII символы. Последнее связано с ошибкой в движке Enchant, которую я надеюсь исправить в будущем, чтобы обеспечить обработку слов на многих языках.

Указание выходного базового имени

Как упоминалось ранее, rulegen.py сохраняет выходные файлы с базовым именем 'analysis' по умолчанию. Вы можете изменить базовое имя файла с помощью флага --basename или -b следующим образом:

root@kitploit:~
$ python rulegen.py korelogic.txt -q -b korelogic
[*] Using Enchant 'aspell' module. For best results please install
    'aspell' module language dictionaries.
[*] Analyzing passwords file: korelogic.txt:
[*] Press Ctrl-C to end execution and generate statistical analysis.
[*] Saving rules to korelogic.rule
[*] Saving words to korelogic.word

Отладка правил

Могут возникнуть ситуации, когда у вас возникают проблемы с генерацией правил для инструмента взлома паролей Hashcat. rulegen.py включает флаг --hashcat для проверки сгенерированных слов и правил с помощью самого hashcat, работающего в режиме --stdout. Чтобы этот режим работал правильно, необходимо загрузить последнюю версию hashcat-cli и отредактировать переменную HASHCAT_PATH в исходном коде. Например, на момент написания этого руководства я поместил папку hashcat-0.## в каталог PACK и определил HASHCAT_PATH как 'hashcat-0.##/'.

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

Заключение

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

Удачного взлома!

-Питер

Скачать инструмент