
Ассортимент алгоритмов хеширования, используемых в вредоносном ПО
HashDB — это библиотека алгоритмов хэширования, используемых в вредоносном ПО, созданная силами сообщества.
HashDB можно использовать как самостоятельную библиотеку хэширования, а также он питает сервис поиска HashDB, поддерживаемый OALabs. Этот сервис позволяет аналитикам восстанавливать хэши и получать хэшированные имена API и строковые значения.
HashDB можно клонировать и использовать в своих скриптах для реверс-инжиниринга как любой стандартный Python-модуль. Ниже приведён пример кода.
>>> import hashdb
>>> hashdb.list_algorithms()
['crc32']
>>> hashdb.algorithms.crc32.hash(b'test')
3632233996
OALabs предоставляют бесплатный сервис поиска HashDB, с помощью которого можно запросить хэш-таблицу для любого хэша из библиотеки HashDB. В хэш-таблицы включён полный набор Windows API, а также множество распространённых строк, используемых в вредоносном ПО. Вы даже можете добавить собственные строки!
Сервис поиска HashDB имеет плагин для IDA Pro, который позволяет автоматизировать поиск хэшей прямо из IDA! Клиент можно скачать с GitHub здесь.
HashDB полагается на поддержку сообщества, чтобы наша библиотека хэшей оставалась актуальной! Наша цель — чтобы контрибьюторы тратили не более пяти минут на добавление нового хэша — от первого коммита до PR. Для достижения этой цели мы предлагаем следующий оптимизированный процесс.
Убедитесь, что такого алгоритма хэширования ещё не существует… знаем, это звучит глупо, но просто перепроверьте.
Создайте ветку с описательным названием.
Добавьте новый Python-файл в каталог /algorithms с названием вашего алгоритма хэширования. Старайтесь использовать официальное название алгоритма, а если он уникален — название вредоносного ПО, для которого он характерен.
Используйте следующий шаблон для настройки вашего нового алгоритма хэширования. Все поля обязательны и чувствительны к регистру.
#!/usr/bin/env python
DESCRIPTION = "your hash description here"
# Type can be either 'unsigned_int' (32bit) or 'unsigned_long' (64bit)
TYPE = 'unsigned_int'
# Test must match the exact hash of the string 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
TEST_1 = hash_of_string_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
def hash(data):
# your hash code here
Перепроверьте свой стиль Python: мы используем Flake8 на Python 3.9. Вы можете запустить следующие команды линтера локально из корня git-репозитория.
pip install flake8
flake8 ./algorithms --count --select=E9,F63,F7,F82 --show-source --statistics
Протестируйте свой код локально с помощью нашего набора тестов. Выполните следующие команды локально из корня git-репозитория. Обратите внимание, что pytest нужно запускать как модуль, а не напрямую, иначе он не подхватит наш каталог тестов.
pip install pytest
python -m pytest
Отправьте pull request — ваш новый алгоритм будет автоматически поставлен в очередь на тестирование, и в случае успеха будет объединён.
Вот и всё! Ваш новый хэш будет доступен не только в библиотеке HashDB, но и для него будет создана новая хэш-таблица для сервиса поиска HashDB, так что вы сможете начать восстанавливать хэши немедленно!
PR с изменениями вне каталога /algorithms не являются частью нашего автоматизированного CI и будут подвергнуты дополнительной проверке.
Все хэши должны иметь корректное описание в поле DESCRIPTION.
Все хэши должны иметь тип либо unsigned_int, либо unsigned_long в поле TYPE. HashDB в настоящее время принимает только беззнаковые 32-битные и 64-битные хэши.
Все хэши должны содержать хэш строки ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 в поле TEST_1.
Все хэши должны включать функцию hash(data), которая принимает байтовую строку и возвращает хэш этой строки.
Некоторые алгоритмы хэширования хэшируют имя модуля и API по отдельности, а затем объединяют результаты в единый хэш модуль+API. Примером такого подхода является стандартный хэш Metasploit ROR13. Эти алгоритмы не будут работать со стандартным списком слов и требуют пользовательского списка, включающего как имя модуля, так и API. Чтобы обработать такие случаи, мы разрешаем пользовательские алгоритмы, которые будут возвращать корректный хэш только для некоторых слов.
Добавление пользовательского API-хэша требует следующих дополнительных компонентов.
Поле TEST_1 должно быть установлено в 4294967294 (-1).
Алгоритм хэширования должен возвращать значение 4294967294 для всех недопустимых хэшей.
Должно быть добавлено дополнительное поле TEST_API_DATA_1 с примером слова, допустимого для данного алгоритма.
Должно быть добавлено дополнительное поле TEST_API_1 с хэшем значения поля TEST_API_DATA_1.
Огромная благодарность команде FLARE за их работу над shellcode_hashes. Много лет назад этот проект задал высокую планку для быстрого и простого восстановления хэшей вредоносного ПО, и он до сих пор остаётся чрезвычайно полезным инструментом. Так зачем его дублировать?
Честно говоря, дело в списке слов и доступности. Мы наблюдаем резкий сдвиг в сторону использования хэшей для самых разных строк в вредоносном ПО, и старый метод хэширования всех экспортов Windows DLL уже недостаточно хорош. Мы хотели получить решение, способное непрерывно обрабатывать миллионы ключей и значений реестра, имён файлов и процессов. И мы хотели, чтобы эти данные были доступны через REST API, чтобы использовать их в наших автоматизированных рабочих процессах, а не только в инструментах статического анализа. При этом без shellcode_hashes нас бы не существовало, так что почёт тому, кто его заслужил 🙌