Хеши: определение типа, подсчёт контрольных сумм, нестандартные и итерированные хеши

Что такое хеши и как они используются

Хеш-сумма (хеш, хеш-код) — результат обработки неких данных хеш-функцией (хеширования).

Хеширование, реже хэширование (англ. 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

Пример файла-хеша для взлома VeraCrypt PBKDF2-HMAC-RIPEMD160 + AES: https://hashcat.net/misc/example_hashes/vc/hashcat_ripemd160_aes_13711.vc

Обычно пентестеру известен источник хеша и он знает его тип. Но бывают исключения. В этой ситуации необходимо «угадать» какой хеш перед нами.

Это можно сделать сравнивая исходный хеш с образцами. Либо исходя из количества символов и используемого набора символов.

Также можно использовать инструменты, которые значительно ускоряют этот процесс. Программами для определения типа хеша являются hashID и HashTag.

hashID

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

hashID – это инструмент, написанный на Python 3, который поддерживает идентификацию более 220 уникальных типов хешей используя регулярные выражения.

Использование программы очень простое:

hashid хеш_для_идентификации

Пара важных замечаний:

  • хеш всегда лучше указывать в одинарных кавычках (а не без кавычек и не в двойных)
  • имеется опция -m, при использовании которой выводится информация о режиме Hashcat

Хеш режимы Hashcat – это условное обозначение типа хеша, которое необходимо указать с опцией -m, --hash-type.

Информацию о других опциях hashID вы найдёте здесь: https://kali.tools/?p=2772

К примеру, мне необходимо идентифицировать хеш $S$C33783772bRXEx1aCsvY.dqgaaSu76XmVlKrW9Qu8IQlvxHlmzLf:

hashid -m '$S$C33783772bRXEx1aCsvY.dqgaaSu76XmVlKrW9Qu8IQlvxHlmzLf'

Как можно увидеть по скриншоту, это Drupal > v7.x в Hashcat для взлома данного хеша необходимо указать режим 7900.

Идентифицируем хеш $1$VnG/6ABB$t6w9bQFxvI9tf0sFJf2TR.:

hashid -m '$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:

hashid -m '$6$q8C1F6tv$zTP/eEVixqyQBEfsSbTidUJfnaE2ojNIpTwTHava/UhFORv3V4ehyTOGdQEoFo1dEVG6UcXwhG.UHvyQyERz01'

Программа говорит, что это SHA-512 Crypt – т.е. SHA512 (Unix).

HashTag

HashTag – это инструмент на python, который разбирает и идентифицирует различные хеши паролей на основе их типа. HashTag поддерживает определение более 250 типов хешей и сопоставляет их с более чем 110 режимами hashcat. HashTag способен идентифицировать единичный хеш, разобрать единичный файл и определить хеши внутри него или обойти директорию и все поддиректории в поисках потенциальных файлов хешей и идентифицировать все найденные хеши.

Т.е. это аналогичная предыдущей программа.

По умолчанию в Kali Linux она отсутствует, поэтому требуется её скачать:

git clone https://github.com/SmeegeSec/HashTag.git
cd HashTag/
python2 HashTag.py -h

Хеш для HashTag также нужно помещать в одинарные кавычки. Хеш нужно писать после опции -sh. Зато сразу, без дополнительных опций выводятся режимы. Информацию о других опциях HashTag вы найдёте здесь: https://kali.tools/?p=2777

Идентифицируем те же самые хеши:

python2 HashTag.py -sh '$S$C33783772bRXEx1aCsvY.dqgaaSu76XmVlKrW9Qu8IQlvxHlmzLf'

python2 HashTag.py -sh '$1$VnG/6ABB$t6w9bQFxvI9tf0sFJf2TR.'

python2 HashTag.py -sh '$6$q8C1F6tv$zTP/eEVixqyQBEfsSbTidUJfnaE2ojNIpTwTHava/UhFORv3V4ehyTOGdQEoFo1dEVG6UcXwhG.UHvyQyERz01'

Как видим, результаты аналогичны.

Примеры хешей

Большое количество классических хешей, а также хешей, специально составленных для взлома пароля и хеш-файлов вы найдёте здесь.

На той странице вы можете:

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

Программы hashID и HashTag не всегда правильно идентифицируют хеш (по крайней мере, в явных ошибках замечена hashID).

К примеру, меня интересует хеш c73d08de890479518ed60cf670d17faa26a4a71f995c1dcc978165399401a6c4:53743528:

hashid -m 'c73d08de890479518ed60cf670d17faa26a4a71f995c1dcc978165399401a6c4:53743528'

Получаем:

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

python2 HashTag.py -sh 'c73d08de890479518ed60cf670d17faa26a4a71f995c1dcc978165399401a6c4:5374'

Получаем более правильный результат:

В действительности это 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:

echo -n 'test' | sha1sum
a94a8fe5ccb19ba61c4c0873d391e987982fbbd3  -

Ещё один способ передачи строки без добавления конечного символа newline

printf '%s' 'test' | md5sum

Как можно заметить, после хеша следует пробел и имя файла (в случае стандартного ввода – указывается тире), чтобы показать только хеш, можно использовать к команде добавить | awk '{print $1}' или  | cut -d" " -f1:

echo -n 'test' | sha1sum | awk '{print $1}'

Этот же результат можно получить следующей конструкцией:

echo -n 'test' | sha1sum | cut -d" " -f1

Программы для вычисления различных хешей

Кроме перечисленных встроенных в Linux утилит, имеются другие программы, способные подсчитывать контрольные суммы. Часто они поддерживают сразу несколько алгоритмов хеширования, могут иметь дополнительные опции ввода и вывода (поддерживают различные форматы и кодировки), некоторые из них подготовлены для выполнения аудита файловой системы (выявления несанкционированных изменений в файлах).

Список некоторых популярных программ для вычисления хешей:

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

Последовательное хеширование с использованием трубы (|)

К примеру, нам нужно рассчитать sha256 хеш для строки 'HackWare'; а затем для полученной строки (хеша), рассчитать хеш md5. Задача кажется очень тривиальной:

echo -n 'HackWare' | sha256sum | md5sum

Но это неправильный вариант. Поскольку результатом выполнения в любом случае является непонятная строка из случайных символов, трудно не только обнаружить ошибку, но даже понять, что она есть. А ошибок здесь сразу несколько! И каждая из них ведёт к получению абсолютно неправильных данных.

Даже очень бывалые пользователи командной строки Linux не сразу поймут в чём проблема, а обнаружив первую проблему не сразу поймут, что есть ещё одна.

Очень важно помнить, что в строке вместе с хешем всегда выводится имя файла, поэтому выполняя довольно очевидную команду вроде следующей:

echo -n 'HackWare' | sha256sum | md5sum

мы получим совсем не тот результат, который ожидаем. Мы предполагаем посчитать sha256 хеш строки 'HackWare', а затем для полученной строки (хеша) рассчитать новый хеш md5. На самом деле, md5sum рассчитывает хеш строки, к которой прибавлено « -». Т.е. получается совершенно другой результат.

Выше уже рассмотрено, как из вывода удалять « -», кажется, теперь всё должно быть в порядке:

echo -n 'HackWare' | sha256sum | awk '{print $1}' | md5sum

Давайте разобьём это действие на отдельные команды:

echo -n 'HackWare' | sha256sum | awk '{print $1}'

Получаем

353b717198496e369cff5fb17bc8be8a1d8e6e6e30be65d904cd000ebe394833

Второй этап хеширования:

echo -n '353b717198496e369cff5fb17bc8be8a1d8e6e6e30be65d904cd000ebe394833' | md5sum
0fcc41fc5d3d7b09e35866cd6e831085  -

Это и есть правильный ответ.

Попробуем выполнить

echo -n 'HackWare' | sha256sum | awk '{print $1}' | md5sum

Мы получим:

379f867937e7a241f7c7609f1d84d11f  -

Проблема в том, что когда выводится промежуточный хеш, к нему добавляется символ новой строки, и второй хеш считается по этой полной строке, включающей невидимый символ!

Используя printf можно вывести результат без конечного символа новой строки:

printf '%s' `echo -n 'HackWare' | sha256sum | awk '{print $1}'` | md5sum

Результат вновь правильный:

0fcc41fc5d3d7b09e35866cd6e831085  -

С printf не все дружат и проблематично использовать рассмотренную конструкцию если нужно хешировать более трёх раз, поэтому лучше использовать tr:

echo -n 'HackWare' | sha256sum | awk '{print $1}' | tr -d '\n' | md5sum

Вновь правильный результат:

0fcc41fc5d3d7b09e35866cd6e831085  -

Или даже сделаем ещё лучше – с программой awk будем использовать printf вместо print (это самый удобный и короткий вариант):

echo -n 'HackWare' | sha256sum | awk '{printf $1}' | md5sum

Как посчитать итерированные хеши

Итерация – это повторное применение какой-либо операции. Применительно к криптографии, итерациями называют многократное хеширование данных, которые получаются в результате хеширования. Например, для исходной строки в виде простого текста рассчитывается SHA1 хеш. Полученное значение вновь хешируется – рассчитывается SHA1 хеш и так далее много раз.

Итерация – очень эффективный метод для борьбы с радужными таблицами и с полным перебором (брут-форсом), поэтому в криптографии итерированные хеши очень популярны.

Пример кода, который подсчитывает MD5 хеш с 1000 итераций:

#!/bin/bash

text='HackWare'
iterations=1000

function iterateMD5 {
	echo -n "$text" | md5sum
}

count=1
while [[ $count -le $iterations ]]; do
	text="$(iterateMD5 | awk '{printf $1}')"
	count=$((count + 1))
done

echo "$text"

Здесь:

  • HackWare – строка для хеширования
  • 1000 – количество итераций
  • md5sum – используемая функция хеширования

Онлайн сервис определения хешей

Описанный выше способ идентификации типа хешей реализован в виде бесплатного онлайн сервиса на SuIP.biz: https://suip.biz/ru/?act=hashtag

Рекомендуется Вам:

6 комментариев to Хеши: определение типа, подсчёт контрольных сумм, нестандартные и итерированные хеши

  1. кукумария:

    не работает при атаке на рукопожатия пишет

    hashcat (v4.0.1) starting…

    OpenCL Platform #1: The pocl project
    ====================================
    * Device #1: pthread-Intel(R) Pentium(R) CPU  N3710  @ 1.60GHz, 1024/2895 MB allocatable, 4MCU

    /root/hsout2.hccap: Old hccap format detected! You need to update: https://hashcat.net/q/hccapx

     

    ------------------------------

    зашел по  ссылке там какие то изменения произошли, скачал что то там новое. установил но так и не понял что это за новость такая***((((

    конвертировал по схеме

    wpaclean <out.cap> <in.cap>

    aircrack-ng <out.cap> -J <out.hccap>

    hashcat -m 2500 -a 3 capture.hccap

     

     

     

  2. Артемыч:

    Добрый день народ. Простите что не по теме. На каком дистрибьютиве основана Kali Linux 2018.1 ?

    Я так понимаю , что дебиан, но какой 8.10 или уже 9й?

    • Alexey Alexey:

      Kali Linux основана на Debian Testing, который является Rolling дистрибутивом. Kali Linux поэтому также является Rolling дистрибутивом. Следовательно, для Debian Testing и Kali Linux не применимы понятие «релизов», «версий».

      Понятие релизов Kali Linux относится к LIVE-версиям, которые являются «снимками» системы на момент выпуска «релиза».

      Самое важное практическое следствие из всего этого: если у вас установлен Rolling релиз Kali Linux любой давности (хоть даже в 2016 году), то вам не нужно переустанавливать систему при выходе новых выпусков (например, при появлении Kali Linux 2018.2), а достаточно просто обновить систему и вы получите у себя самую последнюю версию ОС.

      • Артемыч:

        Спасибо, теперь понятно. А кали может подхватывать репы от дебиан для установки программ?

        • Alexey Alexey:

          Официально крайне не рекомендуется добавлять какие-либо сторонние источники приложений:

          Any additional repositories added to the Kali sources.list file will most likely BREAK YOUR KALI LINUX INSTALL.

          Перевод: Любые дополнительные репозитории, добавленные в файл Kali sources.list, скорее всего, ПОЛОМАЮТ ВАШУ УСТАНОВЛЕННУЮ KALI.

          Отсюда: https://docs.kali.org/general-use/kali-linux-sources-list-repositories

Добавить комментарий

Ваш e-mail не будет опубликован.