Параметр -1 (а также -2, -3, -4) в hashcat задаёт custom charset — пользовательский набор символов, из которого инструмент будет перебирать позиции маски, и именно его отсутствие или неверное определение чаще всего приводит к ошибке вида «Custom-charset 1 is undefined» либо к бессмысленно долгому перебору. Если вы запускаете атаку по маске и видите подобное сообщение, первое действие — проверить, все ли кастомные наборы, на которые ссылается маска, реально объявлены в командной строке.
В этой статье разберём, что такое custom charset, чем он отличается от встроенных наборов символов, как правильно задавать его синтаксис и какие типичные ошибки допускают при составлении масок. Материал ориентирован на легальные сценарии: восстановление доступа к собственным паролям, аудит стойкости корпоративных хешей и тестирование в лабораторной среде.
Что такое custom charset простыми словами
Custom charset (пользовательский набор символов) — это явно перечисленный набор символов, который вы определяете сами и затем подставляете в маску перебора. В hashcat таких наборов может быть до четырёх: они задаются параметрами -1, -2, -3 и -4, а внутри маски обозначаются плейсхолдерами ?1, ?2, ?3 и ?4 соответственно.
Идея проста: вместо того чтобы перебирать все буквы и цифры подряд, вы говорите инструменту: «на этой позиции могут быть только символы из моего списка». Например, если вы точно помните, что пароль состоял только из строчных латинских букв и цифр 0–5, нет смысла перебирать заглавные буквы и спецсимволы — это сокращает объём работы на порядки.
Custom charset — это способ сузить пространство перебора до реально возможных символов. Чем точнее набор, тем быстрее завершится атака по маске.
Встроенные наборы символов и их отличие от пользовательских
Прежде чем создавать собственный набор, стоит проверить, не покрывает ли задачу один из встроенных. В hashcat предопределены стандартные плейсхолдеры, которые доступны без объявления:
- 🔤
?l— строчные латинские буквы (a–z); - 🔠
?u— заглавные латинские буквы (A–Z); - 🔢
?d— цифры (0–9); - ✳️
?s— специальные символы (пробел и знаки пунктуации); - 🔣
?a— объединение всех перечисленных выше наборов; - 🧩
?b— все байтовые значения (0x00–0xff), используется редко и осторожно.
Пользовательский набор нужен тогда, когда встроенные слишком широкие или, наоборот, не включают нужных символов. Типичный случай — кириллица: встроенные наборы ориентированы на латиницу, поэтому для паролей с русскими буквами custom charset практически неизбежен. Другой пример — пароли по известному шаблону, где допустимы лишь несколько конкретных спецсимволов, например только !, @ и #.
| Плейсхолдер | Что означает | Когда использовать |
|---|---|---|
?l | Строчные латинские буквы | Простые пароли в нижнем регистре |
?d | Цифры 0–9 | Даты, годы, числовые суффиксы |
?a | Все печатные ASCII-символы | Полное отсутствие информации о пароле |
?1–?4 | Пользовательские наборы | Точное знание допустимых символов, кириллица |
Синтаксис: как задать custom charset в командной строке
Набор объявляется отдельным параметром перед маской, а в маске на него ссылаются через ?1. Базовый пример — перебор восьмисимвольного пароля из строчных букв и цифр:
hashcat -m 0 -a 3 hash.txt -1 ?l?d ?1?1?1?1?1?1?1?1
Здесь -m 0 указывает тип хеша (в данном примере MD5), -a 3 — режим атаки по маске, а -1 ?l?d объявляет первый пользовательский набор как объединение строчных букв и цифр. Обратите внимание: внутри определения custom charset можно использовать встроенные плейсхолдеры — это удобный способ комбинировать готовые и собственные символы.
Несколько нюансов синтаксиса, о которых часто забывают:
- 📌 Символ
?внутри набора экранируется как??, иначе он будет воспринят как начало плейсхолдера; - 📌 Спецсимволы оболочки (например,
!в bash) могут требовать экранирования или одинарных кавычек; - 📌 Максимум четыре независимых набора:
-1,-2,-3,-4; - 📌 Если маска ссылается на
?2, а параметр-2не задан, hashcat завершится с ошибкой ещё до старта перебора.
⚠️ Внимание: в Windows (cmd и PowerShell) правила экранирования отличаются от bash. Один и тот же набор символов, скопированный из Linux-инструкции, может интерпретироваться иначе — проверяйте, какие символы оболочка считает служебными.
Практические примеры масок с пользовательскими наборами
Рассмотрим несколько реалистичных сценариев. Первый — вы помните, что пароль начинался с заглавной буквы, далее шли строчные, а в конце две цифры и один из трёх спецсимволов:
hashcat -m 0 -a 3 hash.txt -1 '!@#' ?u?l?l?l?l?d?d?1
Второй сценарий — пароль на кириллице. Здесь набор придётся перечислить явно, причём важна кодировка: hashcat работает с байтами, поэтому кириллические символы в UTF-8 занимают по два байта, что влияет на длину маски. Это тонкое место, и для кириллических паролей маска в символах не совпадает с маской в байтах — каждая русская буква в UTF-8 требует двух позиций ?1. На практике часто проще использовать словарную атаку с правилами, чем чистую маску по кириллице.
Почему кириллица в масках — сложный случай
В кодировке UTF-8 каждая кириллическая буква кодируется двумя байтами. Hashcat при масковой атаке оперирует байтами, а не символами, поэтому набор из русских букв нужно задавать с учётом их байтового представления, а длина маски удваивается относительно видимой длины пароля. Альтернативы: атака по словарю с правилами, режимы комбинирования или предварительная генерация кандидатов внешними инструментами.
Третий пример — гибридный набор из двух пользовательских: первый для буквенной части, второй для цифровой. Так можно задавать разные правила для разных позиций маски, что особенно полезно, когда о структуре пароля что-то известно.
Перед запуском длинного перебора проверьте маску на маленьком тестовом хеше с заведомо известным паролем. Если hashcat находит его за секунды — синтаксис набора корректен.
Типичные ошибки при работе с custom charset
Самая частая ошибка — ссылка на необъявленный набор. Маска содержит ?2, а в команде задан только -1. Инструмент честно сообщает об этом до начала перебора, поэтому внимательно читайте вывод: ошибки конфигурации видны сразу, а не через часы работы.
Вторая группа проблем — неэкранированные спецсимволы. Знаки !, $, ^, пробел и сам вопросительный знак интерпретируются либо оболочкой, либо парсером масок. Надёжное правило: заключайте определение набора в одинарные кавычки и помните про ?? для литерального вопросительного знака.
⚠️ Внимание: слишком широкий набор при длинной маске приводит к астрономическому числу комбинаций. Перед запуском оцените пространство перебора: hashcat показывает расчётное время в статусе, и если оно измеряется годами — маску нужно сужать, а не ждать.
Третья ошибка — попытка запихнуть в один набор всё подряд «на всякий случай». Это обнуляет сам смысл custom charset: вы получаете аналог ?a, но с ручными ошибками. Набор должен отражать реальные знания о пароле: раскладку, привычки владельца, требования политики паролей.
Как оценить эффективность и сократить время перебора
Пространство перебора при масковой атаке растёт экспоненциально: размер набора в степени длины позиции. Поэтому даже небольшое сокращение набора или длины даёт огромный выигрыш. Убрать из набора пять лишних символов на восьми позициях — значит сократить работу в разы, а иногда на порядки.
☑️ Проверка перед запуском атаки по маске
Если точная структура пароля неизвестна, разумнее идти от простого к сложному: сначала словарная атака с правилами, затем короткие маски, и только потом длинные комбинированные наборы. Также полезно изучить статистику уже найденных паролей из той же базы — часто они построены по одному шаблону, и custom charset под этот шаблон решает задачу быстрее любого «широкого» перебора.
Оптимальная стратегия — идти от узких наборов к широким: сначала проверяйте наиболее вероятные символы и короткие длины, расширяя пространство только при неудаче.
FAQ: частые вопросы о custom charset
Что означает ошибка «Custom-charset 1 is undefined»?
Маска содержит плейсхолдер ?1, но параметр -1 с набором символов не передан в командной строке. Добавьте определение набора, например -1 ?l?d, или уберите лишний плейсхолдер из маски.
Сколько пользовательских наборов можно задать одновременно?
Четыре: параметры -1, -2, -3 и -4. В маске им соответствуют плейсхолдеры ?1, ?2, ?3 и ?4. Этого достаточно для подавляющего большинства сценариев.
Можно ли использовать кириллицу в custom charset?
Технически да, но с оговорками: hashcat работает с байтами, а кириллица в UTF-8 занимает два байта на символ, поэтому длина маски удваивается. Часто эффективнее использовать словарную атаку с правилами для русскоязычных паролей.
Как включить сам вопросительный знак в набор символов?
Экранируйте его удвоением: ??. Например, набор из цифр и знака вопроса задаётся как -1 '?d??'.
Чем custom charset отличается от обычной маски ?a?
Плейсхолдер ?a включает все печатные ASCII-символы сразу, а custom charset — только те, которые вы указали явно. Узкий набор резко сокращает число комбинаций и время перебора, но требует знаний о структуре пароля.