Определение типа хеша. Основные виды.

Как определить тип хэша.
1) Если хэш начинается с сигнатуры $1$, то обычно это MD5(Unix) хэш.
Если хэш начинается с сигнатуры $apr1$, то обычно это MD5(APR) хэш.
Хэши длиной 8 байт (16 символов), могут быть: MySQL-хэш или любой более длинный хэш, "урезанный" до длины 8 байт.
Длину 16 байт (32 символа) обычно имеют следующие типы хэшей: MD5, его salt’овые и составные производные (например, md5(md5($pass).$salt), md5(md5($pass))), MD4 а также другие хэши.
Если хэш имеет длину 20 байт (40 символов), то это может быть SHA-1 или MySQL5-хэш.
DES(Unix) хэш имеет длину 13 символов.
Хэши паролей игры Lineage II C4 начинаются с 0x и имеет длину 34 символа.
2) Если тип хэша неизвестен, то нужно узнать — какой алгоритм применяется в программе, из которой хэш был извлечен. Например, можно проанализировать исходные тексты PHP-скрипта, в котором используется этот хэш.
3) В распространенных скриптах и программах по умолчанию используються следующие типы хэшей (так же указаны названия таблиц и длина соли):
IPB 2.x.x — md5(md5($salt).md5($pass)), префикс — whb_, таблица — members_converge, salt — 5 символов
IPB 1.x — md5($pass), префикс — whb_, таблица — members
vBulletin 3.x.x — md5(md5($pass).$salt), префикс — нет, таблица — user, salt — 3 символа
SMF 1.1.x — sha1($username.$pass), префикс — smf_, таблица — members
phpBB 2.0.1 — 2.0.21 — md5($pass), префикс — phpbb_, таблица — users
phpBB 3.x — MD5(phpBB3)
YaBB — MD5(HMAC)
PunBB 1.2.x — SHA-1, префикс — нет, таблица — users
e107 — md5(md5($pass))
Beehive — md5($pass), префикс — нет, таблица — USER
Intellect Board — md5($pass), префикс — нет, таблица — User
MercuryBoard— md5($pass), префикс — mb_, таблица — users
MiniBB— md5($pass), префикс — minibbtable_, таблица — users
myBB 1.2.x — md5(md5($salt).md5($pass)), префикс — mybb_, таблица — users
PBLang — md5($pass), в файле /db/members/имя_юзера
PhpMyForum — md5($pass), префикс — pmf_, таблица — user
QuickSilver Forum — md5($pass), префикс — qsf_, таблица — users
UseBB — md5($pass), префикс — usebb_ , таблица — members
Vanilla — md5($pass), префикс — LUM_, таблица — User
VikingBoard — md5($pass), префикс — vboard_, таблица — member
W-Agora — md5($pass), префикс — [название]_. таблица — users
Liberty Reserve API/SCI — SHA256
TBDev v2.0 — md5($salt.$pass.$salt)
TorrentStrike v0.4 — md5($salt.$pass.$salt)
Lineage II C4 — lineage2_c4
4) Salt (соль) – это строка из случайных символов, сохраняется либо вместе с самим хэшем (к примеру, в MD5(Unix)) либо отдельно от хэша, обычно в таблице рядом с ним.
5) Всегда можно увидеть, как выглядит тот или иной хэш, используя сервис [ Ссылки могут видеть только зарегистрированные пользователи. ], где представлено около 100 видов хэшей.
6) Иногда хэш может быть в Base64-кодировке и для его анализа хэш лучше преобразовать в более удобный 16-ричный вид. Для этого также можно использовать вышеупомянутый сервис или соответствующий инструмент в программе PasswordsPro.
MD5, SHA-1 и SHA-2. Какой алгоритм хэширования самый безопасный и как их проверить
Хэш-функция принимает входное значение, например, строку данных, и возвращает какое-то значение фиксированной длины. Идеальная хэш-функция должна обладать следующими свойствами:
- она должна быть очень быстрой;
- она должна иметь возможность возвращать огромный диапазон хэш-значений;
- она должна генерировать уникальный хэш для каждого входного значения (без коллизий);
- она должна генерировать различные хэш-значения для одинаковых входных значений;
- сгенерированные ей хэш-значения не должны иметь ярко выраженной закономерности в своем распределении.
Разумеется, идеальных хэш-функций не бывает, однако каждая хэш-функция максимально старается приблизится к идеалу. Учитывая тот факт, что большинство хэш-функций возвращают значения фиксированной длины и из-за этого диапазон значений ограничен, в принципе это ограничение можно игнорировать. Например, количество возможных значений, которые может вернуть 256-битная хэш-функция, соразмерно количеству атомов во Вселенной.
В идеале хэш-функция должна работать без коллизий, иными словами ни одна пара различных входных значений не должна генерировать одно и то же значение хэш-функции. Это является важным условием особенно для криптографических хэш-функций, поскольку коллизии хэшей рассматриваются как уязвимости.
И наконец, хэш-функция должна генерировать различные хэш-значения для любого входного значения без возможности их прогнозирования. Например, возьмем следующие два очень похожих предложения:
А теперь сравним хэш-значения MD5, сгенерированные для каждого предложения:
Для двух похожих предложений были сгенерированы два мало похожих хэша. Такое свойство является полезным как для проверки, так и для криптографии. Это и есть закон распределения: хэш-значения всех входных данных должны быть равномерно распределены без возможности прогнозирования по всему диапазону возможных хэш-значений.
Популярные хэш-функции
Существует несколько широко используемых хэш-функций. Все они были разработаны математиками и программистами. В процессе их дальнейшего изучения было выявлено, что некоторые из них имеют недостатки, однако все они считаются приемлемыми для не криптографических приложений.
Хэш-функция MD5 генерирует 128-битное хэш-значение. Изначально она была разработана для использования в криптографии, однако со временем в ней были обнаружены уязвимости, вследствие чего для этой цели она больше не подходит. И тем не менее, она по-прежнему используется для разбиения базы данных и вычисления контрольных сумм для проверки передачи файлов.
SHA расшифровывается как Secure Hash Algorithm. SHA-1 – это первая версия алгоритма, за которой в дальнейшем последовала SHA-2.
В то время как MD5 генерирует 128-битный хэш, SHA-1 создает 160-битный (20 байт). Если представить это число в шестнадцатеричном формате, то это целое число длиной в 40 символов. Подобно MD5, этот алгоритм был разработан для криптографических приложений, но вскоре в нем также были найдены уязвимости. На сегодняшний день он считается более устойчивым к атакам в сравнении с MD5.
Вторая версия алгоритма, SHA-2, имеет множество разновидностей. Пожалуй, наиболее часто используемая – SHA-256, которую Национальный институт стандартов и технологий (NIST) рекомендует использовать вместо MD5 и SHA-1.
Алгоритм SHA-256 возвращает 256-битное хэш-значение, что представляет собой шестнадцатеричное значение из 64 символов. Хоть это и не самый идеальный вариант, то текущие исследования показывают, что этот алгоритм значительно превосходит в безопасности MD5 и SHA-1.
Если рассматривать этот алгоритм с точки зрения производительности, то вычисление хэша с его помощью происходит на 20-30% медленнее, чем с использованием MD5 или SHA-1.
Этот алгоритм хэширования был разработан в конце 2015 года и до сих пор еще не получил широкого применения. Этот алгоритм не имеет отношения к тому, что использовался его предшественником, SHA-2.
Алгоритм SHA3-256 – это алгоритм с эквивалентной применимостью более раннего алгоритма SHA-256, причем вычисления первого алгоритма занимают немного больше времени, чем вычисления второго.
Использование хэш-значений для проверки
Как правило, хэш-функции используются для проверки правильности передачи данных. Одним из таких применений является проверка сжатых коллекций файлов, таких как архивные файлы .zip или .tar .
Имея архив и его ожидаемое хэш-значение (обычно называемое контрольной суммой), можно выполнить собственное вычисление хэш-функции, чтобы убедиться в целостности полученного вами архива.
Например, можно сгенерировать контрольную сумму MD5 для tar-файла в Unix, используя следующие команды:
Чтобы получить хэш MD5 для файла в Windows, используйте команду PowerShell Get-FileHash:
Сгенерированную контрольную сумму можно разместить на сайте загрузки рядом со ссылкой на скачивание архива. Получатель, скачав архив, может проверить правильность его получения, выполнив следующую команду:
где 2e87284d245c2aae1c74fa4c50a74c77 — сгенерированная контрольная сумма, которая была размещена. При успешном выполнении вышеуказанной команды появится статус OK, как показано ниже:
Определяем метод хеширования
Применяется в phpBB v2.x, Joomla версии ниже 1.0.13, а также во многих других форумах и CMS.
Алгоритм: соответствует функции md5() языка PHP.
Длина: 40 символов.
Применяется во многих форумах и CMS.
Длина: 34 символа.
Применяется в phpBB 3.x.x.
Описание: хэш начинается с сигнатуры $H$, затем идет один символ (чаще всего это символ '9' или '7'), затем идет соль (8 случайных символов, в нашем примере солью является строка "12345678"), а затем – непосредственно хэш.
Алгоритм: фактически это цикл на 2048 вызовов алгоритма MD5.
Длина: 34 символа.
Применяется в WordPress.
Описание: хэш начинается с сигнатуры $P$, затем идет один символ (чаще всего это символ 'B'), затем идет соль (8 случайных символов, в нашем примере солью является строка "12345678"), а затем – непосредственно хэш.
Алгоритм: фактически это цикл на 8192 вызовов алгоритма MD5
Длина: 40 символов.
Применяется в новых версиях MySQL.
Примечание: в программу нужно загружать хэши без звездочки, которая стоит в начале хэшей.
Длина: 32 символа.
Соль: 16,32 символа
Применяется в WB News, Joomla версии 1.0.13 и выше.
Длина: 24 символа.
Применяется в osCommerce, AEF, Gallery и других CMS.
Длина: 13 символов.
Применяется в Linux и др. подобных ОС.
Описание: первые 2 символа – это соль (случайные символы, в нашем примере солью является строка "Iv"), а затем – непосредственно хэш.
Длина: 34 символа.
Применяется в Linux и др. подобных ОС.
Описание: хэш начинается с сигнатуры $1$, затем идет соль (до 8 случайных символов, в нашем примере солью является строка "12345678"), еще один символ $, а затем – непосредственно хэш.
Длинна: 32 символа
Применяется в e107, DLE, AVE, Diferior, Koobi и других CMS.
Длина: 32 символа.
Соль: 3,30 символов
Применяется в vBulletin, IceBB.
Длина: 32 символа.
Соль: 5,8 символов.
Применяется в IPB.
Длина: 32 символа.
Применяется в MyBB.
Domain Cached Credentials
Длина: 32 символа.
Применяется для кэширования паролей домена Windows.
Длина: 37 символов.
Применяется в Linux и др. подобных ОС.
Описание: хэш начинается с сигнатуры $apr1$, затем идет соль (до 8 случайных символов, в нашем примере солью является строка "12345678"), еще один символ $, а затем – непосредственно хэш.
Алгоритм: фактически это цикл на 2000 вызовов алгоритма MD5.
Длина: 16 символов.
Применяется в старых версиях MySQL.
Описание: хэш состоит из двух DWORD'ов, каждый из которых не превышает значения 0x7fffffff.
Длина: 24 символа.
Применяется в программе Remote Administrator v2.x.
Алгоритм: пароль дополняется нулями до длины 100 байт и вся эта строка хэшируется алгоритмом MD5.
Длина: 32 символа.
Применяется в TBDev.
Длина: 32 символа.
Применяется в DLP.
Длина: 40 символов.
Применяется в SMF
Программы для определения типа хешей.
Hash Analyzer 1.0
Madleets Hash Identifier
Программы для брута хешей.
PasswordsPro — использует CPU.
Hashcat — использует GPU.
Extreme GPU Bruteforcer — использует GPU.
BarsWF — использует CPU/GPU.
RainbowCrack — использует GPU.
Online Reverse Hash Tool — онлайн проверка по сервисам.
Сайты с онлайн расшифровкой хешей.
Если я могу быстро вычислить хэш от своего пароля, то почему я не могу быстро сделать обратную операцию – вычислить пароль из хэша?
Любой алгоритм хэширования фактически представляет собой подсчет контрольной суммы от исходного текста. При этом используются необратимые математические операции над исходным сообщением, такие как логические операции AND, OR и др. Например, даже если в выражении "X AND Y = Z" мы знаем Y и Z, то мы никогда не сможем по ним точно восстановить исходное значение X (максимум, что мы сможем – это рассчитать область возможных значений X, удовлетворяющих данному равенству). Вторая же причина, почему невозможно абсолютно точно вычислить исходный пароль на основе хэша – это коллизии.
Что такое коллизии?
Так как область всевозможных хэшей в любом алгоритме хэширования является величиной конечной и определяется размером хэша (к примеру, для алгоритма MD5 количество возможных хэшей составляет 2128 или 3.4*1038 вариантов), а количество исходных сообщений для хэширования – величина бесконечная, то очевидно, что существуют такие исходные сообщения, которым соответствует один и тот же хэш. Такие исходные сообщения и называются коллизиями.
Соль (или "salt", по англ. "соль") – это несколько случайных символов, которые являются уникальными для каждого пользователя и используются при хэшировании паролей, что существенно затрудняет восстановление таких паролей. Очень часто хэши и алгоритмы, в которых используется соль, называют "солеными"
Почему атака на соленые хэши такая медленная?
Так как для соленых хэшей каждый проверяемый пароль приходится по очереди хэшировать с разной солью (в то время как у несоленых хэшей пароль хэшируется один раз для всех пользователей), то и скорость атаки будет снижаться пропорционально количеству пользователей. Особенно медленной будет атака на большое количество хэшей.
Почему у некоторых типов хэшей скорость атаки совсем маленькая – всего несколько паролей в секунду?
В этих алгоритмах пароли многократно хэшируются в цикле одним и тем же алгоритмом – например, 2000 раз алгоритмом MD5 или 5000 раз алгоритмом SHA-1. Очевидно, что это колоссально снижает скорость атаки на хэши, а если они еще и соленые, то скорость атаки на несколько хэшей становится совсем мизерной.
Я восстанавливаю пароль к хэшу уже долгое время, но никак не могу его найти, почему?
Т.к. математически невозможно вычислить из хэша пароль, то пароли приходится подбирать, генерируя хэш от каждого проверяемого пароля и сравнивая его с исходным хэшем. Поэтому нужно пробовать разные атаки на хэш и желательно с разными настройками. Иначе (к примеру) можно искать пароль полным перебором с алфавитом a. z и никогда его не найти, т.к. исходный пароль состоит из цифр. Разумеется, ваш хэш может быть и от действительно сложного пароля (к примеру, "tGEa+.4W\Z$C") – к сожалению, восстановить такие пароли нереально.
Что такое "словари" и где их взять?
Словарь – это текстовый файл, в котором находятся возможные пароли пользователей (одна строка файла – один пароль). Это могут быть как часто используемые пароли ("admin", "master" и др.), так и пароли из нужного диапазона символов ("11111". "99999", к примеру), которые можно сгенерировать плагином "Генератор словарей".На данной странице доступно несколько десятков мегабайт подобных словарей, состоящих из реальных паролей пользователей. Так же вы можете скачать словари с интернета.
При атаке по словарю программа выдает сообщение, что атака закончена, хотя словарь был обработан не полностью. Почему?
Причина в том, что в словаре имеется какой-то служебный символ, который программа воспринимает как конец файла (EOF) и заканчивает свою работу. К примеру, это может быть символ с ASCII-кодом 0x1F, который добавляется командой COPY после объединения нескольких файлов в один. Таким образом, рекомендуется предварительно очистить все используемые словари от подобных символов, а также от пустых строк и другой лишней информации – все это позволяет сделать плагин "Генератор словарей".
"Таблицы замены символов" в гибридной атаке по словарям – что это такое?
Данные таблицы (*.KBT-файлы) представляют собой текстовые файлы, в которых можно указать – какие символы проверяемых паролей должны быть заменены на другие символы. Эта возможность обычно требуется пользователям из тех стран, которые имеют на клавиатуре 2 раскладки символов – английскую и свою национальную. В этом случае пароли на своем языке могут быть набраны в английской раскладке клавиатуры и наоборот – английские слова набраны национальными символами. В дистрибутиве программы находится файл "Russian.kbt", в котором представлены такие таблицы для пользователей с русской раскладкой клавиатуры.
Таблица определения по длину хеша.
CRC-16: длинна: 4 цифры, мал.буквы <g
CRC-16-CCITT: длинна: 4 цифры, мал.буквы <g
FCS-16: длинна: 4 цифры, мал.буквы <g
ADLER32: длинна: 8 цифры, мал.буквы <g
CRC-32: длинна: 8 цифры, мал.буквы <g
CRC-32B: длинна: 8 цифры, мал.буквы <g
GHash-32-3: длинна: 8 цифры, мал.буквы <g
GHash-32-5: длинна: 8 цифры, мал.буквы <g
Elf-32: длинна: 9 цифры
DES (Unix): длинна: 13 мал.буквы, бол.буквы, цифры, /, .
MySQL: длинна: 16 цифры, мал.буквы <g
Haval128 (Base64): длинна: 24 цифры, мал.буквы, бол.буквы, + ,/. окончание ==
MD4 (Base64): длинна: 24 цифры, мал.буквы, бол.буквы, + ,/. окончание ==
MD2 (Base64): длинна: 24 цифры, мал.буквы, бол.буквы, + ,/. окончание ==
MD5 (Base64): длинна: 24 цифры, мал.буквы, бол.буквы, + ,/. окончание ==
RipeMD128 (Base64): длинна: 24 цифры, мал.буквы, бол.буквы, + ,/. окончание ==
SNEFRU128 (Base64): длинна: 24 цифры, мал.буквы, бол.буквы, + ,/. окончание ==
Tiger128 (Base64): длинна: 24 цифры, мал.буквы, бол.буквы, + ,/. окончание ==
Haval160 (Base64): длинна: 28 цифры, мал.буквы, бол.буквы, + ,/. окончание =
SHA-1 (Base64): длинна: 28 цифры, мал.буквы, бол.буквы, + ,/. окончание =
RipeMD160 (Base64): длинна: 28 цифры, мал.буквы, бол.буквы, + ,/. окончание =
Tiger160 (Base64): длинна: 28 цифры, мал.буквы, бол.буквы, + ,/. окончание =
MD5: длинна: 32 цифры, мал.буквы <g
DCC: длина: 32 цифры, мал.буквы <g
Haval128_3: длина: 32 цифры, мал.буквы <g
Haval128_4: длина: 32 цифры, мал.буквы <g
Haval128_5: длина: 32 цифры, мал.буквы <g
Haval128 (HMAC): длина: 32 цифры, мал.буквы <g
Haval192 (Base64): длина: 32 цифры, мал.буквы, бол.буквы, + ,/,.
MD2: длинна: 32 цифры, мал.буквы <g
MD2 (HMAC): длина: 32 цифры, мал.буквы <g
MD4: длина: 32 цифры, мал.буквы <g
MD4 (HMAC): длина: 32 цифры, мал.буквы <g
MD5 (HMAC): длина: 32 цифры, мал.буквы <g
RipeMD128: длина: 32 цифры, мал.буквы <g
NTLM: длина: 32 цифры, мал.буквы <g
RipeMD128 (HMAC): длина: 32 цифры, мал.буквы <g
SNEFRU128: длина: 32 цифры, мал.буквы <g
Tiger128: длина: 32 цифры, мал.буквы <g
SNEFRU128 (HMAC): длина: 32 цифры, мал.буквы <g
Tiger128 (HMAC): длина: 32 цифры, мал.буквы <g
Tiger192 (Base64): длина: 32 цифры, мал.буквы, бол.буквы
md5(md5($pass)): длина: 32 цифры, мал.буквы <g
md5(md5($pass).$salt): длина: 32 цифры, мал.буквы <g
md5(md5($salt).md5($pass)): длина: 32 цифры, мал.буквы <g
Windows-LM: длина: 32 цифры, бол.буквы <G
Windows-NTLM: длина: 32 цифры, бол.буквы <G
MD5 (Unix): длина: 34 $1$P2lE.rGp$SYCpUzBZjWRGKyMe/MbU00
начинаеться на $1$, 12 символов слева от $
MD5 (APR): длинна: 37 $apr1$ZSc84vgF$YiKqBzqnUskAPKeDWlN8/0
начинаеться на $apr1$, 15 символов слева от $ цифры, мал.буквы, бол.буквы.
SHA-1: длина: 40 цифры, мал.буквы <g
Haval160: длина: 40 цифры, мал.буквы <g
Haval160_3: длина: 40 цифры, мал.буквы <g
Haval160_4: длина: 40 цифры, мал.буквы <g
Haval160_5: длина: 40 цифры, мал.буквы <g
Haval160 (HMAC): длина: 40 цифры, мал.буквы <g
Haval224 (Base64): длина: 40 цифры, мал.буквы, бол.буквы, + ,/. окончание ==
MySQL v5.x: длина: 40 цифры, мал.буквы <g
RipeMD160: длина: 40 цифры, мал.буквы &llt;g
RipeMD160 (HMAC): длина: 40 цифры, мал.буквы <g
SHA-0: длина: 40 цифры, мал.буквы <g
SHA-1 (HMAC): длина: 40 цифры, мал.буквы <g
SHA224 (Base64): длина: 40 цифры, мал.буквы, бол.буквы, + ,/. окончание ==
Tiger160: длина: 40 цифры, мал.буквы <g
Tiger160 (HMAC): длина: 40 цифры, мал.буквы <g
SNEFRU256 (Base64): длина: 44 цифры, мал.буквы, бол.буквы, + ,/. окончание =
Haval256 (Base64): длина: 44 цифры, мал.буквы, бол.буквы, + ,/. окончание ==
RipeMD256 (Base64): длина: 44 цифры, мал.буквы, бол.буквы, + ,/. окончание =
SHA256 (Base64): длина: 44 цифры, мал.буквы, бол.буквы, + ,/. окончание =
Tiger2: длина: 48 цифры, мал.буквы <g
Tiger192: длина: 48 цифры, мал.буквы <g
Tiger192 (HMAC): длина: 48 цифры, мал.буквы <g
Haval192: длина: 48 цифры, мал.буквы <g
Haval192_4: длина: 48 цифры, мал.буквы <g
Haval195_5: длина: 48 цифры, мал.буквы <g
Haval192 (HMAC): длина: 48 цифры, мал.буквы <g
Haval224: длина: 56 цифры, мал.буквы <g
Haval244_3: длина: 56 цифры, мал.буквы <g
Havan244_4: длина: 56 цифры, мал.буквы <g
Haval224 (HMAC): длина: 56 цифры, мал.буквы <g
RipeMD320 (Base64): длина: 56 цифры, мал.буквы, бол.буквы, + ,/. окончание ==
SHA224: длина: 56 цифры, мал.буквы <g
SHA224 (HMAC): длина: 56 цифры, мал.буквы <g
Blowfish: длина: 60 цифры, мал.буквы, бол.буквы, /,.
начинаеться на $2a$, 7 символов слева от $
GOST R34.11-94: длина: 64 цифры, мал.буквы <g
Haval256_5: длина: 64 цифры, мал.буквы <g
Haval256: длина: 64 цифры, мал.буквы <g
Haval256_3: длина: 64 цифры, мал.буквы <g
Haval256_4: длина: 64 цифры, мал.буквы <g
Haval256 (HMAC): длина: 64 цифры, мал.буквы <g
Haval256_3: длина: 64 цифры, мал.буквы <g
PANAMA: длина: 64 цифры, мал.буквы <g
RipeMD256: длина: 64 цифры, мал.буквы <g
RipeMD256 (HMAC): длина: 64 цифры, мал.буквы <g
SHA256: длина: 64 цифры, мал.буквы <g
SHA256 (HMAC): длина: 64 цифры, мал.буквы <g
SHA384 (Base64): длина: 64 цифры, мал.буквы, бол.буквы, + ,/,.
SNEFRU256: длина: 64 цифры, мал.буквы <g
SNEFRU256 (HMAC): длина: 64 цифры, мал.буквы <g
RipeMD320: длина: 80 цифры, мал.буквы <g
RipeMD320 (HMAC): длина: 80 цифры, мал.буквы <g
WHIRLPOOL (Base64): длина: 88 цифры, мал.буквы, бол.буквы, + ,/. окончание ==
SHA512 (Base64): длина: 88 цифры, мал.буквы, бол.буквы, + ,/. окончание ==
HackWare.ru
Этичный хакинг и тестирование на проникновение, информационная безопасность
Хеши: определение типа, подсчёт контрольных сумм, нестандартные и итерированные хеши
Что такое хеши и как они используются
Хеш-сумма (хеш, хеш-код) — результат обработки неких данных хеш-функцией (хеширования).
Хеширование, реже хэширование (англ. hashing) — преобразование массива входных данных произвольной длины в (выходную) битовую строку фиксированной длины, выполняемое определённым алгоритмом. Функция, реализующая алгоритм и выполняющая преобразование, называется «хеш-функцией» или «функцией свёртки». Исходные данные называются входным массивом, «ключом» или «сообщением». Результат преобразования (выходные данные) называется «хешем», «хеш-кодом», «хеш-суммой», «сводкой сообщения».
Это свойство хеш-функций позволяет применять их в следующих случаях:
- при построении ассоциативных массивов;
- при поиске дубликатов в сериях наборов данных;
- при построении уникальных идентификаторов для наборов данных;
- при вычислении контрольных сумм от данных (сигнала) для последующего обнаружения в них ошибок (возникших случайно или внесённых намеренно), возникающих при хранении и/или передаче данных;
- при сохранении паролей в системах защиты в виде хеш-кода (для восстановления пароля по хеш-коду требуется функция, являющаяся обратной по отношению к использованной хеш-функции);
- при выработке электронной подписи (на практике часто подписывается не само сообщение, а его «хеш-образ»);
- и др.
Одним из применений хешов является хранение паролей. Идея в следующем: когда вы придумываете пароль (для веб-сайта или операционной системы) сохраняется не сам пароль, а его хеш (результат обработки пароля хеш-функцией). Этим достигается то, что если система хранения паролей будет скомпрометирована (будет взломан веб-сайт и злоумышленник получит доступ к базе данных паролей), то он не сможет узнать пароли пользователей, поскольку они сохранены в виде хешей. Т.е. даже взломав базу данных паролей он не сможет зайти на сайт под учётными данными пользователей. Когда нужно проверить пароль пользователя, то для введённого значения также рассчитывается хеш и система сравнивает два хеша, а не сами пароли.
По этой причине пентестер может столкнуться с необходимостью работы с хешами. Одной из типичных задач является взлом хеша для получения пароля (ещё говорят «пароля в виде простого текста» — поскольку пароль в виде хеша у нас и так уже есть). Фактически, взлом заключается в подборе такой строки (пароля), которая будет при хешировании давать одинаковое значение со взламываемым хешем.
Для взлома хешей используется, в частности, Hashcat. Независимо от выбранного инструмента, необходимо знать, хеш какого типа перед нами.
Как определить тип хеша
Существует большое количество хешей. Некоторые из них являются универсальными и применяются различными приложениями, например, MD5, SHA1, CRC8 и другие. Некоторые хеши применяются только в определённых приложениях (MySQL, vBulletin) и протоколами.
Кроме популярных хешей, разработчики могут использовать различные сочетания универсальных хешей (например, посчитать хеш с помощью MD5, а затем для полученной строки получить хеш SHA1), либо итерированные (с повторением) хеши (например, для пароля рассчитывается MD5 хеш, затем для полученной строки вновь рассчитывается MD5 хеш, затем для полученной строки вновь считается MD5 – и так тысячу раз).
Применительно к взлому, иногда хешем называют сформированную определённым образом строку или файл, которые не применяются целевым приложением, но которые были рассчитаны исходя из исходных данных так, что позволяют взломать пароль целевого файла или протокола.
Пример такой строки для WinZip: $zip2$*0*3*0*b5d2b7bf57ad5e86a55c400509c672bd*d218*0**ca3d736d03a34165cfa9*$/zip2$
Пример строки для взлома пароля файла PDF 1.7 Level 8 (Acrobat 10 — 11): $pdf$5*6*256*-4*1*16*381692e488413f5502fa7314a78c25db*48*e5bf81a2a23c88f3dccb44bc7da68bb5606b653b733bcf9adaa5eb2c8ccf53abba66539044eb1957eda68469b1d0b9b5*48*b222df06deb308bf919d13447e688775fdcab972faed2c866dc023a126cb4cd4bbffab3683ecde243cf8d88967184680
Обычно пентестеру известен источник хеша и он знает его тип. Но бывают исключения. В этой ситуации необходимо «угадать» какой хеш перед нами.
Это можно сделать сравнивая исходный хеш с образцами. Либо исходя из количества символов и используемого набора символов.
Также можно использовать инструменты, которые значительно ускоряют этот процесс. Программами для определения типа хеша являются hashID и HashTag.
hashID
Эта программа по умолчанию уже установлена в Kali Linux. Она идентифицирует различные типы хешей, используемых для шифрования данных, в первую очередь, паролей.
hashID – это инструмент, написанный на Python 3, который поддерживает идентификацию более 220 уникальных типов хешей используя регулярные выражения.
Использование программы очень простое:
Пара важных замечаний:
- хеш всегда лучше указывать в одинарных кавычках (а не без кавычек и не в двойных)
- имеется опция -m, при использовании которой выводится информация о режиме Hashcat
Хеш режимы Hashcat – это условное обозначение типа хеша, которое необходимо указать с опцией -m, —hash-type.
Информацию о других опциях hashID вы найдёте здесь: https://kali.tools/?p=2772
К примеру, мне необходимо идентифицировать хеш $S$C33783772bRXEx1aCsvY.dqgaaSu76XmVlKrW9Qu8IQlvxHlmzLf:
Как можно увидеть по скриншоту, это Drupal > v7.x в Hashcat для взлома данного хеша необходимо указать режим 7900.
Идентифицируем хеш $1$VnG/6ABB$t6w9bQFxvI9tf0sFJf2TR.:
Получаем сразу несколько вариантов:
MD5cryp – это алгоритм, который вызывает тысячу раз стандартный MD5, для усложнения процесса.
Для справки: MD5 использовался для хеширования паролей. В системе UNIX каждый пользователь имеет свой пароль и его знает только пользователь. Для защиты паролей используется хеширование. Предполагалось, что получить настоящий пароль можно только полным перебором. При появлении UNIX единственным способом хеширования был DES (Data Encryption Standard), но им могли пользоваться только жители США, потому что исходные коды DES нельзя было вывозить из страны. Во FreeBSD решили эту проблему. Пользователи США могли использовать библиотеку DES, а остальные пользователи имеют метод, разрешённый для экспорта. Поэтому в FreeBSD стали использовать MD5 по умолчанию. Некоторые Linux-системы также используют MD5 для хранения паролей.
Ещё один хеш $6$q8C1F6tv$zTP/eEVixqyQBEfsSbTidUJfnaE2ojNIpTwTHava/UhFORv3V4ehyTOGdQEoFo1dEVG6UcXwhG.UHvyQyERz01:
Программа говорит, что это SHA-512 Crypt – т.е. SHA512 (Unix).
HashTag
HashTag – это инструмент на python, который разбирает и идентифицирует различные хеши паролей на основе их типа. HashTag поддерживает определение более 250 типов хешей и сопоставляет их с более чем 110 режимами hashcat. HashTag способен идентифицировать единичный хеш, разобрать единичный файл и определить хеши внутри него или обойти директорию и все поддиректории в поисках потенциальных файлов хешей и идентифицировать все найденные хеши.
Т.е. это аналогичная предыдущей программа.
По умолчанию в Kali Linux она отсутствует, поэтому требуется её скачать:
Хеш для HashTag также нужно помещать в одинарные кавычки. Хеш нужно писать после опции -sh. Зато сразу, без дополнительных опций выводятся режимы. Информацию о других опциях HashTag вы найдёте здесь: https://kali.tools/?p=2777
Идентифицируем те же самые хеши:
Как видим, результаты аналогичны.
Примеры хешей
Большое количество классических хешей, а также хешей, специально составленных для взлома пароля и хеш-файлов вы найдёте здесь.
На той странице вы можете:
- попытаться идентифицировать свой хеш по образцам
- найти ошибку в составленном хеше для взлома пароля, сравнив его с правильным форматом
- проверить работу программ по идентификации хеша
Программы hashID и HashTag не всегда правильно идентифицируют хеш (по крайней мере, в явных ошибках замечена hashID).
К примеру, меня интересует хеш c73d08de890479518ed60cf670d17faa26a4a71f995c1dcc978165399401a6c4:53743528:
Это явно ошибочный результат, поскольку соль после двоеточия будто бы была отпрошена при идентификации хеша.
Получаем более правильный результат:
В действительности это sha256($pass.$salt).
Как рассчитать хеш (контрольную сумму)
В Linux имеются программы для расчёта и сверки популярных хешей:
- b2sum – вычисляет и проверяет криптографическую хеш-функцию BLAKE2 (512-бит)
- cksum – печатает контрольную сумму CRC и количество байт
- md5sum – печатает или проверяет контрольную сумму MD5 (128-бит)
- sha1sum – печатает или проверяет контрольную сумму SHA1 (160-бит)
- sha224sum – печатает или проверяет контрольную сумму SHA224 (224- бит)
- sha256sum – печатает или проверяет контрольную сумму SHA256 (256- бит)
- sha384sum – печатает или проверяет контрольную сумму SHA384 (384- бит)
- sha512sum – печатает или проверяет контрольную сумму SHA512 (512- бит)
Информация о SHA-2 (безопасный алгоритм хеширования, версия 2) – семействе криптографических алгоритмов (SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/256 и SHA-512/224.): https://ru.wikipedia.org/wiki/SHA-2
Все эти программы установлены по умолчанию в большинстве дистрибутивов Linux, они позволяют рассчитать хеши для файлов или для строк.
Применение всех этих программ похожее – нужно указать имя файла, либо передать по стандартному вводу строку.
Если для расчёта хеша строки вы используете echo, то крайне важно указывать опцию -n, которая предотвращает добавление символа новой строки – иначе каждый хеш для строки будет неверным!
Пример подсчёта хеша SHA1 для строки test:
Ещё один способ передачи строки без добавления конечного символа newline
Как можно заметить, после хеша следует пробел и имя файла (в случае стандартного ввода – указывается тире), чтобы показать только хеш, можно использовать к команде добавить | awk '
Этот же результат можно получить следующей конструкцией:
Программы для вычисления различных хешей
Кроме перечисленных встроенных в Linux утилит, имеются другие программы, способные подсчитывать контрольные суммы. Часто они поддерживают сразу несколько алгоритмов хеширования, могут иметь дополнительные опции ввода и вывода (поддерживают различные форматы и кодировки), некоторые из них подготовлены для выполнения аудита файловой системы (выявления несанкционированных изменений в файлах).
Список некоторых популярных программ для вычисления хешей:
- hashrat
- hashdeep
- Hasher
- omnihash
Думаю, используя русскоязычную справку с примерами использования, вы без труда сможете разобраться в этих программах самостоятельно.
Последовательное хеширование с использованием трубы (|)
К примеру, нам нужно рассчитать sha256 хеш для строки 'HackWare'; а затем для полученной строки (хеша), рассчитать хеш md5. Задача кажется очень тривиальной:
Но это неправильный вариант. Поскольку результатом выполнения в любом случае является непонятная строка из случайных символов, трудно не только обнаружить ошибку, но даже понять, что она есть. А ошибок здесь сразу несколько! И каждая из них ведёт к получению абсолютно неправильных данных.
Даже очень бывалые пользователи командной строки Linux не сразу поймут в чём проблема, а обнаружив первую проблему не сразу поймут, что есть ещё одна.
Очень важно помнить, что в строке вместе с хешем всегда выводится имя файла, поэтому выполняя довольно очевидную команду вроде следующей:
мы получим совсем не тот результат, который ожидаем. Мы предполагаем посчитать sha256 хеш строки 'HackWare', а затем для полученной строки (хеша) рассчитать новый хеш md5. На самом деле, md5sum рассчитывает хеш строки, к которой прибавлено « —». Т.е. получается совершенно другой результат.
Выше уже рассмотрено, как из вывода удалять « —», кажется, теперь всё должно быть в порядке:
Давайте разобьём это действие на отдельные команды:
Второй этап хеширования:
Это и есть правильный ответ.
Проблема в том, что когда выводится промежуточный хеш, к нему добавляется символ новой строки, и второй хеш считается по этой полной строке, включающей невидимый символ!
Используя printf можно вывести результат без конечного символа новой строки:
Результат вновь правильный:
С printf не все дружат и проблематично использовать рассмотренную конструкцию если нужно хешировать более трёх раз, поэтому лучше использовать tr:
Вновь правильный результат:
Или даже сделаем ещё лучше – с программой awk будем использовать printf вместо print (это самый удобный и короткий вариант):
Как посчитать итерированные хеши
Итерация – это повторное применение какой-либо операции. Применительно к криптографии, итерациями называют многократное хеширование данных, которые получаются в результате хеширования. Например, для исходной строки в виде простого текста рассчитывается SHA1 хеш. Полученное значение вновь хешируется – рассчитывается SHA1 хеш и так далее много раз.
Итерация – очень эффективный метод для борьбы с радужными таблицами и с полным перебором (брут-форсом), поэтому в криптографии итерированные хеши очень популярны.