Этичный хакинг и тестирование на проникновение, информационная безопасность
Как определить тип хеша
В статье «Хеши: определение типа, подсчёт контрольных сумм, нестандартные и итерированные хеши» мы уже знакомились с такими утилитами как hashID и HashTag, которые по строке хеша определяют, по какому алгоритму он был вычислен.
Упомянутые инструменты по-прежнему работают, но мир не стоит на месте (а развитие этих программ — стоит). Сейчас появились новые типы хешей, поддержка которых не реализована или имеет ошибки в данных инструментах.
Прямо сейчас, на момент написания, активно развиваются две новые программы для идентификации типов хешей. Они поддерживают больше алгоритмов хеширования и просто во всём лучше старых инструментов. Данная статья посвящена знакомству с новыми инструментами по идентификации типа хеша.
Зачем нужны новые инструменты идентификации типа хеша?
hashID не поддерживается с марта 2015 года, hash-identifier не поддерживается с 2011 года, Dagon с июня 2018 года и findmyhash с 2011 года. Все они не имеют вовсе, или имеют неправильную, ошибочную поддержку современных хешей, таких как Keccak/SHA3/Blake2 и т. д. Также такой инструмент, как hash-identifier, который является полностью интерактивным, не имеет параметров и не удобен для использования в скриптах. findmyhash имеет очень ограниченный набор обнаруживаемых хешей. Самый интересный инструмент — hashID (для идентификации хеша), но, поскольку он не поддерживается более 5 лет, проблемы и открытые PR (Pull Request — запросы на внесение изменения в исходный код) накапливаются, ошибки не исправляются, а некоторые функции отсутствуют.
Это всё могло побудить авторов создать новые инструменты с возможностями отсутствующими в предшественниках.
Посмотрим на сравнительную таблицу инструментов по определению типа хеша:
Инструмент
Поддерживается
Цветной вывод
Ref.
Библиотека
Язык
#️⃣
🔢
haiti
✅ (2019-настоящее время)
✅
✅
✅
💎
✅
382
hashID
❌ (2013-2015)
❌
✅
❌
🐍
⭕️
275
hash-identifier
❌ (2011-2011)
❌
❌
❌
🐍
❌
126
Dagon
❌ (2017-2018)
⭕️
❌
❌
🐍
⭕️
17
Name-That-Hash
✅ (2021-настоящее время)
✅
✅
✅
🐍
✅
365
HashTag
❌ (2013-2013)
❌
❌
❌
🐍
⭕
Образцы хешей
Если вам нужны образцы хешей для поверки инструментов, то смотрите раздел «Где посмотреть примеры хешей».
Я отобрал несколько хешей для анализа:
Хеши необходимо заключать в одинарные кавычки!
Хеши могу включать в себя специальные символы, которые имеют для оболочки специальное значение. Особенно это важно если вы работаете в Linux. Если вы не будете это учитывать, то программа по определению типа хеша хоть и не сообщит об ошибке, но получит строку отличную от той, которую вы думали что ввели.
Причём даже в двойных кавычках оболочка трактует некоторые символы как специальные. Поэтому чтобы не экранировать их, поместите весь хеш в одинарные кавычки.
Необязательно помещать в кавычки хеши, состоящие только из букв и цифр, но я предпочитаю все хеши передавать в одинарных кавычках.
HAITI
HAITI (HAsh IdenTifIer) — это инструмент командной строки (и библиотека) для идентификации типа заданного хеша. Библиотека особенно хороша для написания скриптов, поскольку не нужно заключать инструмент командной строки в подпроцесс.
Полный список опций программы и инструкции по установке вы найдёте в карточке программы: https://kali.tools/?p=6638
Использование программы очень простое — укажите ваш хеш после имени программы:
Причём ОПЦИИ являются необязательными, поведение программы по умолчанию очень сбалансированной и в большинстве случаев вам не захочется менять его какими-либо дополнительными параметрами.
Среди вывода есть и правильный ответ: SHA3-512
В выводе HC — это сокращение для Hashcat, а последующие цифры (например, 1700, 17600 и так далее) это номера режимов в данной программе.
JtR — это сокращение от John the Ripper, а последующие строки — это название алгоритмов хешей для взлома в данной программе (raw-sha512, raw-sha3 и так далее).
Цвет очень хорошо улучшает читаемость вывода, особенно если он обширный. Если вы хотите отключить цветной вывод, то используйте опцию —no-color:
Хотя зачастую вывод содержит более одного предположения о типе хеша, по умолчанию из него исключены алгоритмы с солью. Чтобы показать все возможные алгоритмы хеширования, в том числе с использованием соли используйте опцию -e или —extended:
Если вы хотите только узнать тип хеша и информация о режимах hashcat и john the ripper для вас является излишней, то вы можете указать опцию —short для укороченного вывода:
Name-That-Hash
С января 2021 года, почти через два года после того, как началась работа над HAITI, появился проект под названием Name-That-Hash, потому что автору требовалась библиотека Python для Ciphey. Теперь есть два актуальных варианта для идентификации хеша.
Name That Hash определяет тип хеша. Программа поддерживает MD5, SHA256 и более 300 других хешей.
Особенности Name That Hash:
Инструкцию по установке и полный список опций вы найдёте на странице https://kali.tools/?p=6626.
Для определения типа хеша укажите его с опцией -t (—text):
Хеши разбиты на две группы:
Причём в этих группах они также отсортированы по частоте использования.
В выводе вы можете увидеть уже знакомые строки HC и JtR с номерами и названиями алгоритмов хеширования в Hashcat и John.
Кроме этого, имеется краткое описание применения, например:
Причём обратите внимание, некоторые записи являются гиперсылками (они подчёркнуты точками) и для получения дополнительной информации можно пройти на веб-страницу. Всё это делается для того, чтобы вы могли сориентироваться в предлагаемых типах хешей и выбрать наиболее подходящий.
Для проверки множества хешей используйте опцию -f (—file):
Формат файла — один хеш на строку.
Одна из этих опций (-t или -f) являются обязательной.
Если ваши хеши кодированы в Base64, то используйте опцию -b64 (—base64). Она говорит программе перед идентификацией декодировать хеши из Base64. Для файлов со смешанными строками Base64 и в обычном тексте программа пытается вначале декодировать base64 и если это не получается, то трактует хеш как обычную строку без кодировки.
Обратите внимание, что в качестве хеша (после шапки) показана уже декодированная строка.
Опция -e (—extreme) включает поиск хешей в строке. Этот режим получит 5d41402abc4b2a76b9719d911017c592 из ####5d41402abc4b2a76b9719d911017c592###.
По идее, следующие две команды должны дать одинаковый результат:
Но у меня они получились разные. Поэтому используйте этот режим скорее как экспериментальный.
Бесплатное онлайн определение типа хеша
Сервис Онлайн определение типа хеша существует уже давно. Он работает очень просто — вы вводите хеш и получаете тип хеша. Ранее он основывался на утилитах hashID и HashTag. Теперь сервис обновлён и работает с утилитами HAITI и Name That Hash — самыми актуальными инструментами для определения типа хеша.
Заключение
Как можно убедиться, трудно выбрать, какая из программ лучше — HAITI или Name That Hash. Можно пользоваться или двумя. Либо если вам нужен вывод в формате JSON или вам нужна поддержка API или библиотека для определения хешей, то вы можете выбрать наиболее подходящую для ваших потребностей.
Этичный хакинг и тестирование на проникновение, информационная безопасность
Хеши: определение типа, подсчёт контрольных сумм, нестандартные и итерированные хеши
Что такое хеши и как они используются
Хеш-сумма (хеш, хеш-код) — результат обработки неких данных хеш-функцией (хеширования).
Хеширование, реже хэширование (англ. hashing) — преобразование массива входных данных произвольной длины в (выходную) битовую строку фиксированной длины, выполняемое определённым алгоритмом. Функция, реализующая алгоритм и выполняющая преобразование, называется «хеш-функцией» или «функцией свёртки». Исходные данные называются входным массивом, «ключом» или «сообщением». Результат преобразования (выходные данные) называется «хешем», «хеш-кодом», «хеш-суммой», «сводкой сообщения».
Это свойство хеш-функций позволяет применять их в следующих случаях:
Одним из применений хешов является хранение паролей. Идея в следующем: когда вы придумываете пароль (для веб-сайта или операционной системы) сохраняется не сам пароль, а его хеш (результат обработки пароля хеш-функцией). Этим достигается то, что если система хранения паролей будет скомпрометирована (будет взломан веб-сайт и злоумышленник получит доступ к базе данных паролей), то он не сможет узнать пароли пользователей, поскольку они сохранены в виде хешей. Т.е. даже взломав базу данных паролей он не сможет зайти на сайт под учётными данными пользователей. Когда нужно проверить пароль пользователя, то для введённого значения также рассчитывается хеш и система сравнивает два хеша, а не сами пароли.
Для взлома хешей используется, в частности, Hashcat. Независимо от выбранного инструмента, необходимо знать, хеш какого типа перед нами.
Как определить тип хеша
Существует большое количество хешей. Некоторые из них являются универсальными и применяются различными приложениями, например, MD5, SHA1, CRC8 и другие. Некоторые хеши применяются только в определённых приложениях (MySQL, vBulletin) и протоколами.
Кроме популярных хешей, разработчики могут использовать различные сочетания универсальных хешей (например, посчитать хеш с помощью MD5, а затем для полученной строки получить хеш SHA1), либо итерированные (с повторением) хеши (например, для пароля рассчитывается MD5 хеш, затем для полученной строки вновь рассчитывается MD5 хеш, затем для полученной строки вновь считается MD5 – и так тысячу раз).
Применительно к взлому, иногда хешем называют сформированную определённым образом строку или файл, которые не применяются целевым приложением, но которые были рассчитаны исходя из исходных данных так, что позволяют взломать пароль целевого файла или протокола.
Обычно пентестеру известен источник хеша и он знает его тип. Но бывают исключения. В этой ситуации необходимо «угадать» какой хеш перед нами.
Это можно сделать сравнивая исходный хеш с образцами. Либо исходя из количества символов и используемого набора символов.
Также можно использовать инструменты, которые значительно ускоряют этот процесс. Программами для определения типа хеша являются hashID и HashTag.
hashID
Эта программа по умолчанию уже установлена в Kali Linux. Она идентифицирует различные типы хешей, используемых для шифрования данных, в первую очередь, паролей.
hashID – это инструмент, написанный на Python 3, который поддерживает идентификацию более 220 уникальных типов хешей используя регулярные выражения.
Использование программы очень простое:
Пара важных замечаний:
Хеш режимы Hashcat – это условное обозначение типа хеша, которое необходимо указать с опцией -m, —hash-type.
Информацию о других опциях hashID вы найдёте здесь: https://kali.tools/?p=2772
Как можно увидеть по скриншоту, это Drupal > v7.x в Hashcat для взлома данного хеша необходимо указать режим 7900.
Получаем сразу несколько вариантов:
MD5cryp – это алгоритм, который вызывает тысячу раз стандартный MD5, для усложнения процесса.
Для справки: MD5 использовался для хеширования паролей. В системе UNIX каждый пользователь имеет свой пароль и его знает только пользователь. Для защиты паролей используется хеширование. Предполагалось, что получить настоящий пароль можно только полным перебором. При появлении UNIX единственным способом хеширования был DES (Data Encryption Standard), но им могли пользоваться только жители США, потому что исходные коды DES нельзя было вывозить из страны. Во FreeBSD решили эту проблему. Пользователи США могли использовать библиотеку DES, а остальные пользователи имеют метод, разрешённый для экспорта. Поэтому в FreeBSD стали использовать MD5 по умолчанию. Некоторые Linux-системы также используют MD5 для хранения паролей.
Программа говорит, что это 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 имеются программы для расчёта и сверки популярных хешей:
Информация о 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
Этот же результат можно получить следующей конструкцией:
Программы для вычисления различных хешей
Кроме перечисленных встроенных в Linux утилит, имеются другие программы, способные подсчитывать контрольные суммы. Часто они поддерживают сразу несколько алгоритмов хеширования, могут иметь дополнительные опции ввода и вывода (поддерживают различные форматы и кодировки), некоторые из них подготовлены для выполнения аудита файловой системы (выявления несанкционированных изменений в файлах).
Список некоторых популярных программ для вычисления хешей:
Думаю, используя русскоязычную справку с примерами использования, вы без труда сможете разобраться в этих программах самостоятельно.
Последовательное хеширование с использованием трубы (|)
К примеру, нам нужно рассчитать sha256 хеш для строки ‘HackWare’; а затем для полученной строки (хеша), рассчитать хеш md5. Задача кажется очень тривиальной:
Но это неправильный вариант. Поскольку результатом выполнения в любом случае является непонятная строка из случайных символов, трудно не только обнаружить ошибку, но даже понять, что она есть. А ошибок здесь сразу несколько! И каждая из них ведёт к получению абсолютно неправильных данных.
Даже очень бывалые пользователи командной строки Linux не сразу поймут в чём проблема, а обнаружив первую проблему не сразу поймут, что есть ещё одна.
Очень важно помнить, что в строке вместе с хешем всегда выводится имя файла, поэтому выполняя довольно очевидную команду вроде следующей:
мы получим совсем не тот результат, который ожидаем. Мы предполагаем посчитать sha256 хеш строки ‘HackWare’, а затем для полученной строки (хеша) рассчитать новый хеш md5. На самом деле, md5sum рассчитывает хеш строки, к которой прибавлено « —». Т.е. получается совершенно другой результат.
Выше уже рассмотрено, как из вывода удалять « —», кажется, теперь всё должно быть в порядке:
Давайте разобьём это действие на отдельные команды:
Второй этап хеширования:
Это и есть правильный ответ.
Проблема в том, что когда выводится промежуточный хеш, к нему добавляется символ новой строки, и второй хеш считается по этой полной строке, включающей невидимый символ!
Используя printf можно вывести результат без конечного символа новой строки:
Результат вновь правильный:
С printf не все дружат и проблематично использовать рассмотренную конструкцию если нужно хешировать более трёх раз, поэтому лучше использовать tr:
Вновь правильный результат:
Или даже сделаем ещё лучше – с программой awk будем использовать printf вместо print (это самый удобный и короткий вариант):
Как посчитать итерированные хеши
Итерация – это повторное применение какой-либо операции. Применительно к криптографии, итерациями называют многократное хеширование данных, которые получаются в результате хеширования. Например, для исходной строки в виде простого текста рассчитывается SHA1 хеш. Полученное значение вновь хешируется – рассчитывается SHA1 хеш и так далее много раз.
Итерация – очень эффективный метод для борьбы с радужными таблицами и с полным перебором (брут-форсом), поэтому в криптографии итерированные хеши очень популярны.
Пример кода, который подсчитывает MD5 хеш с 1000 итераций:
Как работают алгоритмы хеширования данных. Лучшие алгоритмы хеширования
Криптографические хэш-функции используются для хранения паролей при аутентификации, защиты данных в системах проверки файлов, обнаружения вредоносного программного обеспечения, а также для кодирования информации в блокчейне.
В этой статье поговорим об алгоритмах хеширования в криптографии: что это, какие типы бывают, какими свойствами обладают.
Криптографические алгоритмы отличаются по сложности, разрядности, криптографической надежности, особенностям работы.
Алгоритмы хеширования появилась более пятидесяти назад, и за эти годы, хотя кардинальных изменений не произошло, хеширование данных приобрело много новых свойств.
Что такое хеширование?
Как обычные, так и криптографические хэш-функции являются детерминированными. То есть, подразумевается, что до тех пор, пока входные данные не изменяются, алгоритм хеширования всегда будет выдавать один и тот же результат (также известный как дайджест или хэш).
Алгоритмы хеширования в криптовалютах разработаны таким образом, что их функция работает в одностороннем порядке, то есть, данные не могут быть возвращены без вложения большого количества времени и ресурсов для осуществления вычислений. Создать выход из входных данных довольно легко, но осуществить процесс в обратном направлении (сгенерировать вывод на основе входных данных) труднее. Чем сложнее найти входное значение, тем более безопасным считается алгоритм хеширования.
Как работает хэш-функция?Сравнение хеш функций
Разные виды хэш-функций производят вывод разной величины, но возможный размер данных на выходе для каждого из алгоритмов хеширования всегда является постоянным. Например, алгоритм SHA-256 может производить вывод исключительно в формате 256-бит, в то время как SHA-1 всегда генерирует 160-битный дайджест.
На примере слов “Binance“ и “binance”, которые пропущены через алгоритм хеширования SHA-256 (используется в сети Биткоин), проиллюстрируем это.
SHA-256
Обратите внимание, что незначительное изменение (регистр первой буквы) привело к другому значению хэша. Но поскольку использовался SHA-256, данные на выходе имеют фиксированный размер в 256 бит (или 64 символа).
Не имеет значения какое количество раз эти два слова будут пропущены через алгоритм, два выхода не будут видоизменяться, поскольку они являются постоянными.
При обработке тех же входных данных через алгоритм хеширования SHA-1, получаются следующие результаты:
Акроним SHA расшифровывается как Secure Hash Algorithms (безопасный алгоритм хеширования). Он относится к набору криптографических хэш-функций, который включает такие алгоритмы как SHA-0 и SHA-1 вместе с группами SHA-2 и SHA-3. SHA-256 является частью группы SHA-2, наряду с SHA-512 и другими аналогами. В настоящее время, только группы SHA-2 и SHA-3 считаются безопасными.
Коллизии
Коллизии возникают из-за того, что в хеш используется мало символов. Чем меньше знаков использует конечная формула, тем больше вероятность итерации (повтора) одного и того же хэш-кода на разные наборы данных. Чтобы снизить риск появления коллизии, применяют двойное хеширование строк, образующее открытый и закрытый ключ – то есть, используется 2 протокола, как, например, в сети Bitcoin.
Технические параметры
Рассмотрим основополагающие характеристики протоколов хеширования:
Есть еще следующие важные свойства алгоритмов: способность «свертывать» любой массив данных, производить хэш конкретной длины, распределять равномерно на выходе значения функции.
Любые изменения во входящем сообщении (другая буква, цифра, знак препинания, даже лишний пробел) внесут коррективы в итоговый хэш-код. Он будет такой же длины, но с иными символами.
Требования
К эффективной во всех отношениях хэш-функции выдвигаются следующие требования:
Виды хешей
Он еще не заменил SHA-2, а просто предоставляет криптографам еще один вариант, который может обеспечить повышенную безопасность в определенных ситуациях.
Популярные алгоритмы хеширования
Перечислим, какие алгоритмы хеширования являются самыми известными:
MD5 сейчас редко используется, но он был одним из самых распространенных алгоритмов хеширования в ранней криптографии. Это пример алгоритма хеширования, из-за которого, поскольку он обладает рядом уязвимостей, включая частоту коллизий, ни одна криптовалюта не использует 128-битные выходы.
Заключение
В любой технологии шифрования все сводится к решению одной из двух задач:
1) увеличения сложности внутренних операций хэширования;
2) увеличения длины hash-выхода данных с расчетом на то, что вычислительные мощности атакующих не смогут эффективно вычислять коллизию.
И, несмотря на появление в будущем квантовых компьютеров, специалисты уверены, что правильные инструменты (то же хеширование) способны выдержать испытания временем, с учетом того, что они еще будут развиваться. Ведь с увеличением вычислительных мощностей снижается математическая формализация структуры внутренних алгоритмических хэш-конструкций. А квантовые вычисления наиболее эффективны лишь в отношении к вещам, имеющим строгую математическую структуру.