Создание и нормализация словарей. Выбираем лучшее, убираем лишнее



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

    Инструменты


    crunch

    Пожалуй, один из самых известных инструментов для быстрого создания словарей. Он по умолчанию входит в популярный дистрибутив для проведения пентеста Kali Linux.

    Инструмент работает в нескольких режимах:

    Создание словаря, состоящего из перечисленных символов, например чисел

    crunch 4 5 1234567890 -o all_numbers_from_4_to_5.txt



    Создается словарь длиной от четырех до пяти цифр.

    Создание словаря по шаблону

    crunch 10 10 qwe RTY 123 \#\@ -t P^@@,ord%% -o Password_template.txt
    



    Сперва указывается длина пароля — 10 символов. Затем перечисляются наборы символов: буквы в нижнем регистре, буквы в верхнем регистре, цифры и спецсимволы. Ключ -t задает шаблон, где

    • ^ — спецсимволы
    • @ — буквы в нижнем регистре
    • , — буквы в верхнем регистре
    • % — цифры

    И третий режим работы crunch — перестановки.

    crunch 1 1 -p Alex Company Position



    Словарь состоит из всех возможных комбинаций слов Alex, Company и Position.

    Подробнее изучить инструмент можно через стандартные man страницы, они достаточно подробные.

    maskprocessor

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

    Вы можете задать до четырех собственных наборов символов и использовать готовые наборы

    ?l = abcdefghijklmnopqrstuvwxyz
    ?u = ABCDEFGHIJKLMNOPQRSTUVWXYZ
    ?d = 0123456789
    ?s =  !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
    ?a = ?l?u?d?s
    ?b = 0x00 - 0xff

    Пример использования

    mp64.bin -1 Pp -2 \@\#\$ ?1assw?2r?d



    Или можно задать набор из цифр, но добавить к нему еще несколько спецсимволов так

    mp64.bin -1 Qq -2 ?d\@\#\$ ?1werty_12?2

    Получаем такой результат



    John the Ripper

    Популярный брутфорсер John the Ripper (JTR) тоже позволяет генерировать словари на основе правил. Делается это при помощи ключа --rules, а сами правила описываются в файле john.conf

    Вот так выглядит стандартное правило, используемое для взлома NTLM хэша

    [List.Rules:NT]
    :
    -c T0Q
    -c T1QT[z0]
    -c T2QT[z0]T[z1]
    -c T3QT[z0]T[z1]T[z2]
    -c T4QT[z0]T[z1]T[z2]T[z3]
    -c T5QT[z0]T[z1]T[z2]T[z3]T[z4]
    -c T6QT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]
    -c T7QT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6]
    -c T8QT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6]T[z7]
    -c T9QT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6]T[z7]T[z8]
    -c TAQT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6]T[z7]T[z8]T[z9]
    -c TBQT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6]T[z7]T[z8]T[z9]T[zA]
    -c TCQT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6]T[z7]T[z8]T[z9]T[zA]T[zB]
    -c TDQT[z0]T[z1]T[z2]T[z3]T[z4]T[z5]T[z6]T[z7]T[z8]T[z9]T[zA]T[zB]T[zC]

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

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

    john -w:QWERTY123.dict --stdout --rules:NT
    



    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 нет возможности, а нужно срочно создать словарь или нормализовать его. Некоторые алгоритмы довольно сложны в реализации, но базовые операции можно выполнить просто в командной строке.

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

    echo 0{1..9}0{1..9}19{60..99} | tr ' ' '\n' >> dates
    



    Если нужно разбить словарь на части для параллельной обработки, можно воспользоваться командой split

    split -d -l 1000 password.lst splitted_



    Быстро объединить два словаря можно так

    cat dict1 dict2 > combined_dict



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

    sed 's/^./\u&/' dict_file
    sed 's/.$/\u&/' dict_file

    Для перевода регистра в нижний нужно заметить «u» на «l»

    Дописать что-то в начало каждого слова из словаря можно так

    sed 's/^./word/' dict_file

    А так можно дописать слово в конец

    sed 's/.$/word/' dict_file
    

    Следующей командой можно добавить в начало число от 0 до 99 к каждому слову в словаре

    for i in $(cat dict_file) ; do seq -f %02.0f$i 0 99 ; done > numbers_dict_file
    

    Можно очистить словарь от значений, в которых не присутствует хотя бы 2 числа так

    nawk 'gsub("[0-9]","&",$0)==2' password.lst

    Получаем



    Это лишь некоторые примеры. Можно писать более сложные обработки на Python и других скриптовых языках. Но всегда нужно помнить, что создание качественного словаря и его нормализация под целевой протокол — важный этап при проведении тестирования на проникновение.
    Метки:
    • +27
    • 3,4k
    • 3
    Pentestit 880,06
    Информационная безопасность
    Поделиться публикацией
    Похожие публикации
    Комментарии 3
    • 0
      Спасибо. Очень интересная статья. Особенно финал понравился про «без утилит». Не могли бы вы ещё пример работ rli.bin показать?
      • 0

        Добрый день,
        Примеры работы всех можно найти на официальном сайте по ссылке выше.
        Пример по rli:


        cat dict1


        qwerty123
        Qwerty_123
        Qwerty123
        123
        12345


        cat dict2


        123
        1234


        ./rli.bin dict1 new_dict dict2


        Caching dict1…
        Cached 5 lines


        Sorting...


        Checking dict2 against cache
        Lines compared 2
        Removed 1 lines from cache


        Sorting back to original positions...


        Finished!
        Removed 1 lines from cache
        Writing 4 lines to new_dict


        cat new_dict


        qwerty123
        Qwerty_123
        Qwerty123
        12345


        Пароль 123 был удален из результирующего словаря, так как он изначально был в dict1 и присутствовал в dict2.

        • 0
          Спасибо. Именно то, что я хотел увидеть в отсутствие под рукой rli.

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

      Самое читаемое