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

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

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

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

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

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

  ```
  powershell -EncodedCommand UwB0AGEAcgB0AC0AUAByAG8AYwBlAHMAcwAgACIAYwBhAGwAYwAuAGUAeABlACIA

  POST /api/data=U3RhcnQtUHJvY2VzcyBjYWxjLmV4ZQ==
  ```

  \
  Характерно для полезной нагрузки meterpreter, Cobalt и некоторых других инструментов. \
  Хотя может тспользоваться и легитимными инструментами. Например, Ansible дважды кодирует base64 выполняемые команды.&#x20;
* **URL-encoding (Percent-encoding)** – заменяет спецсимволы в URL на `%`-последовательности (пробел → `%20`).<br>

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

  \
  Обычно кодировка происхоит автоматически в браузере. \
  Иногда для обхода WAF может применяться двойной URL encode.&#x20;
* **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`).

{% embed url="<https://gchq.github.io/CyberChef/>" %}
Инструмент для работы с кодированными данными
{% endembed %}

| Кодировка        | Пример          | Особенности                      |
| ---------------- | --------------- | -------------------------------- |
| **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"`. \
Раскодирование позволяет увидеть истинное содержимое.&#x20;

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

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

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

* **Детерминированность** – одинаковые входные данные всегда дают одинаковый хеш.
* **Необратимость** – по хешу нельзя восстановить исходные данные.
* **Уникальность** – даже небольшое изменение входа резко меняет хеш ("лавинный эффект").

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

* **Проверки целостности файлов** (например, скачанный дистрибутив ПО).
* **Хранения паролей** (в хешированном виде).
* **Анализа вредоносных файлов** (сравнение хешей в базах угроз).

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

#### **MD5 (Message-Digest Algorithm 5)**

* **Длина хеша:** 128 бит (32 hex-символа).
* **Уязвимости:** Уже взломан (возможны коллизии — два разных файла с одинаковым хешем).
* **Пример хеша:**

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

{% hint style="info" %}
NTLM хешируется алгоритмом **MD4** (да, именно MD4!).\
Хранится в SAM-файле (Windows) или Active Directory (NTDS.dit):

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

{% endhint %}

#### **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
  ```

{% hint style="info" %}
Sysmon для исполнямый файлов считает SHA1 (по умолчанию), MD5, SHA256 или IMPHASH.&#x20;
{% endhint %}

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

* **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)

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

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

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

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...');
```

{% hint style="info" %}
Чтобы усилить безопасность NTLM Microsoft добавила **NTLMv2**, который:

1. Использует **HMAC-MD5** (на основе NTLM-хеша).
2. Добавляет **случайный challenge** от сервера.
3. Включает метку времени и другие данные.

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

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

{% endhint %}

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

* Даже одинаковые пароли дают разные хеши.
* Невозможно использовать радужные таблицы.

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

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

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

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

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

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

* **Локальные системы**:
  * 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` — случайная строка.

{% content-ref url="../windows/ntlm-hashes" %}
[ntlm-hashes](https://vasilisa-l.gitbook.io/blue-team-cookbook/windows/ntlm-hashes)
{% endcontent-ref %}

## Шифрование

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

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

* Используется **один ключ** для шифрования и расшифровки.
* Отправитель и получатель должны заранее обменяться ключом.
* Если ключ украден — все данные можно расшифровать.

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

* **Зашифрованный трафик** (например, malware C2 с AES).
* **Ransomware** (файлы шифруются симметричным алгоритмом).
* **Шифрование дисков (BitLocker, VeraCrypt)**
* **Kerberos**: Использует симметричное шифрование (AES) для билетов (tickets).  Ключом выступает хеш пароля пользователя/сервиса.&#x20;

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

* Используется **пара ключей**:
  * **Публичный (public key)** — для шифрования.
  * **Приватный (private key)** — для расшифровки.
* Не требует предварительного обмена секретом.

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

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

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

  По открытому ключу клиент может удостовериться, что сертификат продписан доверенным CA.&#x20;
* **Блокчеин и электронные подписи**

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

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

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

**Пример в HTTPS:**

* Клиент получает публичный ключ сервера.
* Генерирует временный симметричный ключ (сессионный).
* Шифрует его RSA и отправляет серверу.
* Дальнейший трафик идёт через AES.

<br>
