Криптография для аналитика SOC

Базовые понятия: кодирование, хеширование, шифрование

Кодирование (Encoding)

Кодирование — это преобразование данных в другой формат без цели их скрыть. Оно используется для удобства передачи или хранения информации, но не обеспечивает защиту от несанкционированного доступа.

Примеры алгоритмов кодирования:

  • Base64 – применяется для передачи бинарных данных в текстовом виде (например, вложения в email или веб-запросах). Обычно выглядит как "бессмысленный" набор букв и цифр. Длина должна быть кратна 4 (иначе дополняется = в конце). Используются символы: A-Z, a-z, 0-9, +, /, = (padding). Если есть другие символы (например, !, @), это не чистый Base64.

    Чаще всего используется в скриптах Powershell для обфускация вредоносных payload. Может применяться для скрытия данных в логах или DNS-туннелировании.

    powershell -EncodedCommand UwB0AGEAcgB0AC0AUAByAG8AYwBlAHMAcwAgACIAYwBhAGwAYwAuAGUAeABlACIA
    
    POST /api/data=U3RhcnQtUHJvY2VzcyBjYWxjLmV4ZQ==

    Характерно для полезной нагрузки meterpreter, Cobalt и некоторых других инструментов. Хотя может тспользоваться и легитимными инструментами. Например, Ansible дважды кодирует base64 выполняемые команды.

  • URL-encoding (Percent-encoding) – заменяет спецсимволы в URL на %-последовательности (пробел → %20).

    http://example.org/index.php/file%3D..%2F..%2F..%2F..%2F..%2F..%2F..%2Fvar%2Flog%2Fauth.log%26c%3Did

    Обычно кодировка происхоит автоматически в браузере. Иногда для обхода WAF может применяться двойной URL encode.

  • Hex (шестнадцатеричное представление) – преобразует байты в ASCII-строку (например, 0x41"A"). Может встречаться как в виде просто чисел:

    65786563202f62696e2f62617368202d6320226d616c6963696f75732e736822

    Так и с \x:

    \x65\x78\x65\x63\x20\x2f\x62\x69\x6e\x2f\x62\x61\x73\x68\x20\x2d\x63\x20\x22\x6d\x61\x6c\x69\x63\x69\x6f\x75\x73\x2e\x73\x68\x22

Важно: Кодирование ≠ Шифрование! Его можно легко обратить стандартными инструментами (например, echo "SGVsbG8=" | base64 -d).

Инструмент для работы с кодированными данными
Кодировка
Пример
Особенности

Base64

"SGVsbG8="

A-Z, a-z, 0-9, +, /, =

HEX

"48656C6C6F"

Только 0-9, A-F, длина чётная

URL-encoding

"%2Fbin%2Fsh"

Начинается с %, содержит %XX

Злоумышленники часто используют кодирование (Base64, URL-encoding, HEX и др.) для маскировки вредоносных команд, обхода сигнатур IDS/IPS и сокрытия атак в логах или сетевом трафике. Например, строка UwB0AGEAcgB0AC0AUAByAG8AYwBlAHMAcwAgACIAYwBhAGwAYwAuAGUAeABlACIA в логах выглядит как случайный набор символов, но после декодирования из Base64 превращается в команду Start-Process "calc.exe". Раскодирование позволяет увидеть истинное содержимое.

Поэтому важно сначала снять кодирование, а потом применять правила обнаружения к чистому тексту, повышая шансы на обнаружение атаки.

Хеширование (Hashing)

Хеширование — это одностороннее преобразование данных в фиксированную строку (хеш). Основные свойства:

  • Детерминированность – одинаковые входные данные всегда дают одинаковый хеш.

  • Необратимость – по хешу нельзя восстановить исходные данные.

  • Уникальность – даже небольшое изменение входа резко меняет хеш ("лавинный эффект").

Где применяется в безопасности?

  • Проверки целостности файлов (например, скачанный дистрибутив ПО).

  • Хранения паролей (в хешированном виде).

  • Анализа вредоносных файлов (сравнение хешей в базах угроз).

Основные алгоритмы хеширования

MD5 (Message-Digest Algorithm 5)

  • Длина хеша: 128 бит (32 hex-символа).

  • Уязвимости: Уже взломан (возможны коллизии — два разных файла с одинаковым хешем).

  • Пример хеша:

    echo -n "hello" | md5sum
    # Результат: 5d41402abc4b2a76b9719d911017c592

NTLM хешируется алгоритмом MD4 (да, именно MD4!). Хранится в SAM-файле (Windows) или Active Directory (NTDS.dit):

Пользователь:RID:B4B9B02E6F09A9BD760F388B67351E2B:...

SHA-1 (Secure Hash Algorithm 1)

  • Длина хеша: 160 бит (40 hex-символов).

  • Статус: Устарел (Google нашел коллизии в 2017).

  • Пример хеша:

    echo -n "hello" | sha1sum
    # Результат: aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d

SHA-256 (часть семейства SHA-2)

  • Длина хеша: 256 бит (64 hex-символа).

  • Применение: Блокчейн (Bitcoin), TLS-сертификаты.

  • Пример хеша:

    echo -n "hello" | sha256sum
    # Результат: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

SHA-3 (Keccak)

  • Криптографическая хеш-функция, разработанная в 2015 году как часть нового стандарта NIST

  • Невосприимчив к атакам длины (length-extension), которые возможны в SHA-2. Считается устойчивым к атакам на квантовых компьютерах (в отличие от SHA-2).

  • Нет известных эффективных коллизий (в отличие от SHA-1 и теоретических уязвимостей SHA-256).

  • Пример хеша:

    echo -n "hello" | sha3sum -a 256
    # Результат: 3338be694f50c5f338814986cdf0686453a888b84f424d792af4b9202398f392

Sysmon для исполнямый файлов считает SHA1 (по умолчанию), MD5, SHA256 или IMPHASH.

Поиск в базах угроз

  • VirusTotal (поиск по MD5/SHA1/SHA256).

  • MISP (корреляция хешей с известными атаками).

Всегда проверяйте файлы по нескольким хешам (например, MD5 + SHA-256 + Imphash).

Что такое Imphash?

Imphash (Import Hash) — это специальный хеш, который вычисляется на основе импортируемых функций PE-файла (исполняемых файлов Windows). Это мощный инструмент для кластеризации вредоносных файлов.

Зачем нужен Imphash?

  • Помогает находить похожие вредоносные файлы, даже если их основной хеш (MD5/SHA1) разный. Два разных файла могут иметь разные SHA-256, но одинаковый Imphash, если используют одни и те же API.

  • Используется в анализе APT-групп (например, Lazarus, TA505).

Как вычисляется?

  1. Берутся все импортируемые функции (из kernel32.dll, user32.dll и др.).

  2. Сортируются в алфавитном порядке.

  3. Хешируются через MD5.

Инструменты:

  • PEStudio

  • CAPA (от Mandiant)

Хеширование паролей

Хранение паролей в открытом виде — критическая уязвимость. Вместо этого системы используют хеширование с дополнительными мерами защиты.

Базовый принцип

  1. Пользователь регистрируется: вводит пароль (например, MyPass123).

  2. Система хеширует пароль (например, SHA-256 → a2f5...).

  3. Хеш сохраняется в БД, оригинальный пароль не хранится.

  4. При аутентификации:

    • Введённый пароль хешируется.

    • Сравнивается с хешом из базы.

Радужные таблицы

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

Решение: Добавление случайной "соли" (salt) к паролю перед хешированием:

hash("password" + "x7gH2") → совсем другой хеш, чем hash("password").  

Как работает:

  1. Генерируется уникальная соль для каждого пользователя (например, x7gH2).

  2. Пароль комбинируется с солью: hash("MyPass123" + "x7gH2").

  3. В БД сохраняются и хеш, и соль.

-- Правильно: хранение соли и хеша
INSERT INTO users VALUES ('admin', 'a1b2c3', 'sha256$salt$x7gH2$a2f5d...');

Чтобы усилить безопасность NTLM Microsoft добавила NTLMv2, который:

  1. Использует HMAC-MD5 (на основе NTLM-хеша).

  2. Добавляет случайный challenge от сервера.

  3. Включает метку времени и другие данные.

Формат NTLMv2-хеша

USER::DOMAIN:CHALLENGE:HMAC-MD5_RESPONSE:...

Почему это безопаснее?

  • Даже одинаковые пароли дают разные хеши.

  • Невозможно использовать радужные таблицы.

Pepper (Дополнительный секрет)

Pepper — это общий секретный ключ, известный только серверу. Даже при утечке БД без pepper хеши бесполезны.

hash = sha256(password + salt + pepper)  # Pepper не хранится в БД!

Медленные хеш-функции

Обычные хеши (SHA-256, MD5) слишком быстрые для паролей и позволяют проводить атаку подбором (Оффлайн-брутфорс). Вместо них используют медленные хеш-функци: PBKDF2, bcpypt, Argon2.

Где хранят хеши паролей?

  • Локальные системы:

    • Windows: SAM-файл (NTLM-хеши).

    • Linux: /etc/shadow (использует crypt() с солью).

  • Веб-приложения:

    • SQL-базы (MySQL, PostgreSQL).

    • LDAP (Active Directory).

Пример записи в /etc/shadow (Linux):

user:$6$salt$a2f5d...:19485:0:99999:7:::
  • $6 — алгоритм (SHA-512).

  • salt — случайная строка.

NTLM-хеши

Шифрование

Шифрование — это процесс преобразования данных в нечитаемый формат для защиты конфиденциальности. В криптографии используются два основных подхода: симметричное и асимметричное шифрование.

Симметричное шифрование

  • Используется один ключ для шифрования и расшифровки.

  • Отправитель и получатель должны заранее обменяться ключом.

  • Если ключ украден — все данные можно расшифровать.

Где встречается

  • Зашифрованный трафик (например, malware C2 с AES).

  • Ransomware (файлы шифруются симметричным алгоритмом).

  • Шифрование дисков (BitLocker, VeraCrypt)

  • Kerberos: Использует симметричное шифрование (AES) для билетов (tickets). Ключом выступает хеш пароля пользователя/сервиса.

Асимметричное шифрование

  • Используется пара ключей:

    • Публичный (public key) — для шифрования.

    • Приватный (private key) — для расшифровки.

  • Не требует предварительного обмена секретом.

Где встречается

  • SSH-доступ (аутентификация по ключам). Пользователь генерирует пару ключей. Публичный ключ (id_ed25519.pub) копируется на сервер в ~/.ssh/authorized_keys. При подключении SSH проверяет подпись закрытым ключом, не передавая его.

    Если злоумышленник добавит свой публичный ключ в authorized_keys, он сможет авторизовываться на сервере по своему закрытому ключу, то есть он получит постоянный доступ к серверу.

  • TLS-сертификаты (проверка подлинности сайтов). Цепочка доверия — это иерархия цифровых сертификатов, которая гарантирует, что сервер или клиент являются теми, за кого себя выдают. При подключении сервер отправляет цифровой сертификат, содержащий подпись CA, подтверждающий его подлинность.

    По открытому ключу клиент может удостовериться, что сертификат продписан доверенным CA.

  • Блокчеин и электронные подписи

Гибридные схемы

На практике часто комбинируют оба метода:

  1. Асимметричное шифрование для обмена симметричным ключом (например, в TLS).

  2. Симметричное шифрование для основного трафика.

Пример в HTTPS:

  • Клиент получает публичный ключ сервера.

  • Генерирует временный симметричный ключ (сессионный).

  • Шифрует его RSA и отправляет серверу.

  • Дальнейший трафик идёт через AES.

Last updated

Was this helpful?