Изображение


СОДЕРЖАНИЕ


1. Введение: зачем уметь распознавать шифрование ransomware

2. Как ransomware шифрует файлы: гибридная схема и почему её нельзя сломать

3. Метод 1 — Видимые маркеры: расширения, имена файлов, записки с выкупом

4. Метод 2 — Энтропия файла: математический след шифрования

5. Метод 3 — Magic bytes и файловые заголовки: что осталось от оригинала

6. Метод 4 — ID Ransomware и онлайн-сервисы идентификации

7. Метод 5 — YARA-правила: сигнатурный поиск штамма

8. Метод 6 — Анализ бинарного образца malware

9. Актуальные семейства 2025–2026: алгоритмы LockBit, BlackCat, Akira, Cloak

10. Частичное (интермиттирующее) шифрование: почему энтропия больше не всегда работает

11. Python-инструментарий: энтропия, сравнение заголовков, карта файлов

12. Тактика восстановления: что делать после идентификации

13. Практический кейс: идентификация семейства от начала до конца

14. FAQ: 12 горячих вопросов об идентификации ransomware-шифрования

15. Чек-лист: идентификация ransomware-инцидента за 30 минут

16. Заключение и теги




1. Введение: зачем уметь распознавать шифрование ransomware


Когда в 03:47 ночи дежурный SOC-аналитик получает алерт о подозрительной активности на файловом сервере, у него есть несколько минут, чтобы понять: это ransomware или нет, и если да — какое именно. От правильного ответа зависит всё: изоляция нужных сегментов, проверка наличия дешифратора, уведомление руководства и регуляторов.

Классическая ситуация — папка с зашифрованными файлами и запиской с требованием выкупа. Но реальность сложнее: атака не только имеет применения в детектировании файл-шифрующего ransomware, но и должна обслуживать более широкие задачи — триаж при реагировании на инциденты, форензический анализ и детектирование утечки данных.

Кроме того, изучение того, как байтовая статистика изменяется при разных степенях интермиттирующего шифрования в разных типах файлов, даёт критически важные базовые знания о том, как частичное шифрование влияет на структуру файла.

Навык идентификации нужен в трёх сценариях:

IR (Incident Response) — активный инцидент. Цель: быстро подтвердить природу атаки, определить семейство, оценить масштаб. Время — критичный ресурс.

Форензика постфактум — расследование после инцидента. Цель: восстановить временну́ю шкалу, атрибутировать атаку, оценить возможность восстановления данных.

Threat Hunting — проактивная охота. Цель: обнаружить ransomware до массового шифрования, когда зашифрованы только первые тестовые файлы.

Метод идентификацииСкоростьНадёжностьНужен образец?Требования
Расширение файлов / запискаМгновенноСредняяНетНет
ID Ransomware (онлайн)1–2 минВысокаяНетИнтернет
Анализ энтропии1–5 минСредняяНетPython/инструмент
Magic bytes / заголовок1–5 минВысокаяНетHex-редактор
YARA-сканирование5–15 минВысокаяДа (образец)YARA + правила
Анализ бинарного образцаЧасыОчень высокаяДаРеверс-инжиниринг

> *💡 Статья рассчитана на специалистов по реагированию на инциденты, аналитиков SOC и форензических экспертов. Все описанные методы применяются для защиты систем и расследования инцидентов.*




2. Как ransomware шифрует файлы: гибридная схема и почему её нельзя сломать


Понимание криптографии ransomware критично для правильной интерпретации артефактов.

Гибридная схема шифрования


Современные семейства используют гибридную криптографию: современный крипто-ransomware использует стойкие алгоритмы шифрования, включая AES-256, ChaCha20 и RSA-2048, которые вычислительно невозможно взломать.

Схема работает так:

1
. При запуске ransomware генерирует:
Session Key — симметричный ключ (AES-256 или ChaCha20)
Этим ключом шифруется СОДЕРЖИМОЕ файлов (быстро)

2. Session Key шифруется:
Public Key злоумышленника (RSA-2048/4096 или Curve25519)
Зашифрованный Session Key сохраняется рядом с файлами
или отправляется на C2-сервер

3. Оригинальный Session Key уничтожается в памяти

Результат: без приватного ключа злоумышленника —
дешифрование вычислительно невозможно.


Что это значит для форензики


text
Артефакты схемы шифрования, которые можно обнаружить:

В зашифрованных файлах:
- Зашифрованный симметричный ключ (если prepend/append к файлу)
- IV (Initialization Vector) для AES-CBC / nonce для ChaCha20
- Magic marker идентификации от некоторых семейств

В памяти процесса (при живом анализе):
- Незашифрованный Session Key (до его уничтожения)
- RSA Public Key (иногда встроен в бинарник)

На диске:
- Временные ключевые файлы (некоторые семейства)
- Реестровые ключи (некоторые семейства Windows)


Актуальные алгоритмы по семействам 2025–2026


Qilin.B использует AES-256-CTR для систем с поддержкой AES-NI и ChaCha20 для остальных, с RSA-4096 и OAEP-паддингом для защиты ключей, что делает дешифрование без приватного ключа фактически невозможным.

Cloak шифрует файлы с использованием алгоритма HC-128, с ключами шифрования, генерируемыми через многоэтапный процесс с использованием CryptGenRandom, Curve25519 и хэширования SHA512 для безопасного управления ключами и генерации IV.

text
Алгоритмы актуальных семейств (2025–2026):

LockBit 3.0: AES-256 (файлы) + RSA-2048 (ключ)
BlackCat: ChaCha20 (файлы) + RSA-4096 (ключ)
Akira: ChaCha20 (файлы) + RSA (ключ)
Qilin.B: AES-256-CTR или ChaCha20 + RSA-4096
Cloak: HC-128 + Curve25519 + SHA512
GhostLocker: AES-128-CBC (Fernet) + PKCS7 padding
Babuk/Gizm: ChaCha20 + RSA





3. Метод 1 — Видимые маркеры: расширения, имена файлов, записки с выкупом


Первое, что проверяется при подозрении на ransomware — визуальные маркеры. Быстро и не требует инструментов.

Изменение расширений файлов


Большинство семейств добавляют кастомное расширение к зашифрованным файлам:

text
Примеры расширений по семействам:
LockBit 3.0: .lockbit, .abcd, или случайное (8 символов)
BlackCat/ALPHV: .alphv, случайное (5–8 символов hex)
Akira: .akira
Cloak: .cloak
Qilin: случайное расширение + .README.txt
Ryuk: .RYK
REvil/Sodinokibi: случайное (5–10 символов)
Conti: .CONTI
Phobos: .[ID].[email].phobos
STOP/Djvu: .djvu, .djvus, .djvut, .nomad, .beast...
Cuba: .cuba
Makop: .makop
Dharma: .[ID].[email].dharma


Важное наблюдение: зашифрованные файлы обычно дополняются уникальным расширением (например, *.imps), что делает их непригодными для использования без соответствующего ключа дешифрования.

Отсутствие изменения расширения не означает, что файл не зашифрован — некоторые семейства сохраняют оригинальное расширение для незаметности.

Записки с выкупом: имена и расположение


Имя и содержимое файла с требованием выкупа — сильный идентификационный признак:

text
Характерные имена файлов записок:
LockBit 3.0: Restore-My-Files.txt
BlackCat: RECOVER-[случайно]-FILES.txt
Akira: akira_readme.txt
Conti: CONTI_README.txt
REvil: [случайно]-readme.txt
Ryuk: RyukReadMe.txt
Phobos: info.hta, info.txt
Dharma: FILES ENCRYPTED.txt
Cloak: CLOAK_README.txt

Характерные расположения:
- Корень каждой зашифрованной папки
- Рабочий стол пользователя
- Корень каждого диска (C:\, D:\...)


Изменение обоев рабочего стола


Многие семейства меняют обои Windows на изображение с инструкцией по выкупу. Оригинальный файл обоев иногда зашифрован или заменён.

Реестровые маркеры (Windows)


powershell
<h2 id="proverit-sledy-ransomware-v-reestre">Проверить следы ransomware в реестре:</h2>
<h2 id="nekotorye-semeystva-dobavlyayut-klyuchi-zapuska">Некоторые семейства добавляют ключи запуска:</h2>
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
Get-ItemProperty "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"

<h2 id="sledy-izmeneniya-oboev">Следы изменения обоев:</h2>
Get-ItemProperty "HKCU:\Control Panel\Desktop" -Name Wallpaper


Shadow Copies: характерное удаление


Удаление теневых копий — универсальный признак ransomware:

powershell
<h2 id="proverit-byli-li-udaleny-vss">Проверить, были ли удалены VSS:</h2>
Get-WmiObject Win32_ShadowCopy

<h2 id="esli-vyvod-pust-pri-vklyuchyonnoy-vss-udaleny">Если вывод пуст при включённой VSS — удалены</h2>
<h2 id="tipichnye-komandy-udaleniya-sled-v-event-log">Типичные команды удаления (след в Event Log):</h2>
<h2 id="vssadmin-delete-shadows-all-quiet">vssadmin delete shadows /all /quiet</h2>
<h2 id="wmic-shadowcopy-delete">wmic shadowcopy delete</h2>
<h2 id="bcdedit-set-default-recoveryenabled-no">bcdedit /set {default} recoveryenabled No</h2>
<h2 id="powershell-get-wmiobject-win32-shadowcopy-remove-wmiobject">PowerShell: Get-WmiObject Win32_ShadowCopy | Remove-WmiObject</h2>


bash
<h2 id="poisk-v-event-log-komand-udaleniya-vss">Поиск в Event Log команд удаления VSS:</h2>
Get-WinEvent -FilterHashtable @{
LogName='Security'; Id=4688
StartTime=(Get-Date).AddDays(-7)
} | Where-Object {
$_.Message -match "vssadmin|shadowcopy|bcdedit"
}





4. Метод 2 — Энтропия файла: математический след шифрования


Энтропия Шеннона — фундаментальный инструмент обнаружения шифрования. Зашифрованный файл близок к «идеальному случайному шуму» с максимальной энтропией.

Теория: что такое энтропия Шеннона


Энтропия измеряет «случайность» или «непредсказуемость» данных. Значение варьируется от 0 (все байты одинаковые) до 8.0 бит/байт (идеальное случайное распределение).

text
Типичные значения энтропии:
Текстовый файл (.txt, .docx): 4.0–6.5
Исполняемый файл (.exe, .dll): 5.5–7.0
Сжатый файл (.zip, .gz): 7.5–8.0
Зашифрованный файл: 7.8–8.0
Случайные данные: ~8.0


Проблема: сжатие также может удалить структурные паттерны и дать почти равномерное байтовое распределение. Например, DOCX-файлы Microsoft, которые по сути являются ZIP-архивами с коллекцией XML-файлов, часто имеют паттерны случайности, зеркально отражающие паттерны зашифрованных данных. Это перекрытие ведёт к ложным срабатываниям при использовании только энтропии для детектирования шифрования.

Алгоритм идентификации по энтропии


text
Правило интерпретации:

Энтропия 7.8–8.0:
+ расширение изменено → ВЫСОКАЯ вероятность шифрования
+ расширение сохранено → проверить magic bytes

Энтропия 7.5–7.8:
→ Возможно сжатый файл (ZIP, PDF с изображениями)
→ Проверить оригинальное расширение и magic bytes
→ Возможно интермиттирующее шифрование (частичное)

Энтропия < 7.0:
→ Маловероятно полное шифрование
→ Исключить: могло быть зашифровано частично
(первые/последние N байт или каждый N-й блок)


Сравнение энтропии оригинала и подозрительного файла


Мощный метод при наличии резервной копии или необработанной версии файла:

python
import math
from collections import Counter

def shannon_entropy(data: bytes) -> float:
"""Вычислить энтропию Шеннона в битах на байт."""
if not data:
return 0.0
counts = Counter(data)
total = len(data)
entropy = 0.0
for count in counts.values():
p = count / total
entropy -= p * math.log2(p)
return entropy

<h2 id="sravnenie">Сравнение:</h2>
with open("original.docx", "rb") as f:
orig_data = f.read()
with open("suspicious.docx.encrypted", "rb") as f:
susp_data = f.read()

print(f"Оригинал: {shannon_entropy(orig_data):.3f} бит/байт")
print(f"Подозрительный: {shannon_entropy(susp_data):.3f} бит/байт")
<h2 id="original-6-21-bit-bayt">Оригинал: 6.21 бит/байт</h2>
<h2 id="podozritelnyy-7-97-bit-bayt-yavnyy-priznak-shifrovaniya">Подозрительный: 7.97 бит/байт → явный признак шифрования</h2>


Блочная энтропия: карта шифрования файла


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

python
def block_entropy_map(filepath: str, block_size: int = 512) -> list:
"""Вычислить энтропию для каждого блока файла."""
results = []
with open(filepath, "rb") as f:
offset = 0
while True:
block = f.read(block_size)
if not block:
break
ent = shannon_entropy(block)
results.append((offset, ent))
offset += len(block)
return results

<h2 id="primer-vyvoda-blochnoy-karty">Пример вывода блочной карты:</h2>
<h2 id="offset-entropy">Offset Entropy</h2>
<h2 id="0-6-21-originalnyy-zagolovok-ne-zashifrovan">0 6.21 ← оригинальный заголовок (не зашифрован)</h2>
<h2 id="512-7-98-zashifrovano">512 7.98 ← зашифровано</h2>
<h2 id="1024-7-97-zashifrovano">1024 7.97 ← зашифровано</h2>
<h2 id="1536-7-96-zashifrovano">1536 7.96 ← зашифровано</h2>
<h2 id="">...</h2>
<h2 id="50000-1-23-nulevye-bayty-padding-ne-zashifrovano">50000 1.23 ← нулевые байты (паддинг, не зашифровано)</h2>

<h2 id="pri-intermittiruyuschem-shifrovanii-pattern-budet-cheredovatsya">При интермиттирующем шифровании паттерн будет чередоваться:</h2>
<h2 id="0-6-21-ne-zashifrovano">0 6.21 ← не зашифровано</h2>
<h2 id="512-7-98-zashifrovano">512 7.98 ← зашифровано</h2>
<h2 id="1024-5-85-ne-zashifrovano-cheredovanie">1024 5.85 ← не зашифровано ← чередование!</h2>
<h2 id="1536-7-96-zashifrovano">1536 7.96 ← зашифровано</h2>





5. Метод 3 — Magic bytes и файловые заголовки: что осталось от оригинала


Magic bytes (сигнатуры файлов) — фиксированные байтовые последовательности в начале файла, определяющие его формат. Ransomware, шифруя содержимое, уничтожает их — или наоборот, добавляет свои маркеры.

Проверка magic bytes в hex-редакторе


text
Исходные magic bytes распространённых форматов:
PDF: 25 4D 46 2D (%PDF-)
DOCX/XLSX: 50 4B 03 04 (PK — это ZIP)
JPEG: FF D8 FF (ÿØÿ)
PNG: 89 50 4E 47 0D 0A (‰PNG\r\n)
ZIP: 50 4B 03 04 (PK)
EXE/DLL: 4D 5A (MZ)
MP4: 00 00 00 XX 66 74 (....ft)


Если первые байты файла не совпадают с ожидаемой сигнатурой для данного расширения — файл, вероятно, зашифрован.

bash
<h2 id="proverka-cherez-xxd-linux-mac">Проверка через xxd (Linux/Mac):</h2>
xxd suspicious_document.pdf | head -4

<h2 id="ozhidaemyy-rezultat-dlya-neshifrovannogo-pdf">Ожидаемый результат для нешифрованного PDF:</h2>
<h2 id="00000000-2550-4446-2d31-2e34-0a25-c7ec-8fa2-0a35-pdf-1-4-5">00000000: 2550 4446 2d31 2e34 0a25 c7ec 8fa2 0a35 %PDF-1.4.%....5</h2>

<h2 id="rezultat-dlya-zashifrovannogo-fayla-s-sohranyonnym-rasshireniem-pdf">Результат для зашифрованного файла с сохранённым расширением .pdf:</h2>
<h2 id="00000000-a3f7-2b9e-14cc-8821-7e4d-33ab-00f2-6741-m3-ga">00000000: a3f7 2b9e 14cc 8821 7e4d 33ab 00f2 6741 ..+....!~M3...gA</h2>
<h2 id="magic-bytes-razrusheny-fayl-zashifrovan">Magic bytes разрушены → файл зашифрован</h2>


python
<h2 id="python-proverit-magic-bytes-fayla">Python: проверить magic bytes файла</h2>
MAGIC_SIGNATURES = {
b'\x25\x50\x44\x46': 'PDF',
b'\x50\x4B\x03\x04': 'ZIP/DOCX/XLSX',
b'\xFF\xD8\xFF': 'JPEG',
b'\x89\x50\x4E\x47': 'PNG',
b'\x4D\x5A': 'PE (EXE/DLL)',
b'\x37\x7A\xBC\xAF': '7-ZIP',
b'\x1F\x8B': 'GZIP',
}

def check_magic(filepath: str) -> str:
with open(filepath, 'rb') as f:
header = f.read(8)
for sig, name in MAGIC_SIGNATURES.items():
if header.startswith(sig):
return f"Соответствует: {name}"
return "Неизвестная сигнатура — возможно зашифровано"

<h2 id="dopolnitelno-sravnit-rasshirenie-fayla-s-ego-realnym-tipom">Дополнительно: сравнить расширение файла с его реальным типом</h2>
import os
ext = os.path.splitext("document.pdf")[1].lower()
magic_result = check_magic("document.pdf")
if ext == '.pdf' and 'PDF' not in magic_result:
print("НЕСООТВЕТСТВИЕ: файл имеет расширение .pdf, но не является PDF")
print("Вероятно зашифрован ransomware")


Кастомные заголовки ransomware


Некоторые семейства добавляют собственный заголовок к зашифрованным файлам. Это содержит зашифрованный сессионный ключ, IV и метаданные. Например:

lockbit
3.0 добавляет заголовок в конец файла:
[зашифрованные данные][зашифрованный ключ 256 байт][маркер LB3]

Dharma prepend-заголовок (начало файла):
[magic marker 4 байта][зашифрованный ключ][зашифрованные данные]

STOP/Djvu заголовок:
[зашифрованные данные][уникальный ID жертвы 32 байта]


Идентификация кастомного заголовка — задача реверс-инжиниринга конкретного семейства.

Инструменты для анализа заголовков


bash
<h2 id="file-opredelenie-tipa-fayla-po-magic-bytes">file — определение типа файла по magic bytes:</h2>
file suspicious_document.pdf
<h2 id="suspicious-document-pdf-data-data-vmesto-pdf-net-magic-bytes">suspicious_document.pdf: data ← «data» вместо PDF = нет magic bytes</h2>

<h2 id="xxd-hexdump-prosmotr-hex-dampa">xxd / hexdump — просмотр hex-дампа:</h2>
xxd suspicious.pdf | head -10
hexdump -C suspicious.pdf | head -10

<h2 id="python-magic-biblioteka">python-magic (библиотека):</h2>
pip install python-magic
python3 -c "import magic; print(magic.from_file('suspicious.pdf'))"

<h2 id="binwalk-poisk-vstroennyh-signatur-i-kastomnyh-markerov">binwalk — поиск встроенных сигнатур и кастомных маркеров:</h2>
binwalk suspicious.pdf





6. Метод 4 — ID Ransomware и онлайн-сервисы идентификации


Для быстрой идентификации семейства без глубокого технического анализа — онлайн-сервисы, которые сопоставляют характеристики зашифрованных файлов и записки с выкупом с известными семействами.

ID Ransomware (id-ransomware.malwarehunterteam.com)


Наиболее полный публичный сервис. База данных регулярно обновляется и охватывает сотни семейств.

Что загружать:
1
. Записку с выкупом (README.txt, RECOVER-*.txt и т.п.)
→ Обязательно, если есть

2. Зашифрованный файл
→ Необязательно, но повышает точность
→ Сервис анализирует: расширение, кастомный заголовок,
размер файла, паттерн

3. Email из записки (если указан)
→ Некоторые семейства идентифицируются именно по email


Что возвращает:
- Название семейства ransomware
- Версию (если определима)
- Ссылку на профиль в базе MalwareHunterTeam
- Ссылку на дешифратор (если доступен!)

Nomoreransom.org — реестр дешифраторов


Проект No More Ransom — инициатива Europol, совместно с Лабораторией Касперского и другими. Содержит бесплатные дешифраторы для конкретных семейств.

text
Алгоритм работы с NoMoreRansom:
1. Перейти на nomoreransom.org → Crypto Sheriff
2. Загрузить 2 зашифрованных файла + записку
3. Сервис идентифицирует семейство и проверяет
наличие дешифратора в базе
4. Если дешифратор есть — скачать и применить


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

VirusTotal и аналоги


bash
<h2 id="zagruzka-zapiski-s-vykupom-na-virustotal">Загрузка записки с выкупом на VirusTotal:</h2>
<h2 id="virustotal-com-zagruzit-fayl-readme-txt">virustotal.com → загрузить файл README.txt</h2>
<h2 id="rezultat-detektiruetsya-kak-semeystvo-x-mnogimi-av-dvizhkami">Результат: детектируется как семейство X многими AV-движками</h2>

<h2 id="cli-cherez-vt-cli">CLI через vt-cli:</h2>
pip install vt-cli
vt file scan README.txt
vt file report <sha256_of_sample>

<h2 id="poisk-po-heshu-obraztsa">Поиск по хэшу образца:</h2>
<h2 id="esli-obrazets-uzhe-proanalizirovan-naydyote-detalnyy-otchyot">Если образец уже проанализирован — найдёте детальный отчёт</h2>
<h2 id="s-identifikatsiey-semeystva-i-povedeniem">с идентификацией семейства и поведением</h2>


Ransomwhere (ransomwhe.re) и Emsisoft Decryptor Check


ransomwhere
— публичный реестр известных Bitcoin-адресов из 
ransomware-записок. Если адрес из вашей записки там есть —
семейство идентифицировано.

Emsisoft (emsisoft.com/ransomware-decryption-tools/) —
официальные бесплатные дешифраторы от Emsisoft для
конкретных семейств. Проверять при каждом инциденте.





7. Метод 5 — YARA-правила: сигнатурный поиск штамма


YARA — стандартный инструмент для поиска малвари по паттернам. При наличии образца ransomware (исполняемого файла) YARA-правила позволяют идентифицировать семейство и версию.

Установка и базовое использование


bash
<h2 id="ustanovka-yara">Установка YARA:</h2>
apt install yara # Linux
brew install yara # macOS
pip install yara-python # Python-биндинг

<h2 id="bazovyy-zapusk">Базовый запуск:</h2>
yara rules.yar suspicious_file.exe

<h2 id="rekursivno-po-direktorii">Рекурсивно по директории:</h2>
yara -r rules.yar /infected_directory/

<h2 id="s-vyvodom-sovpadeniy-i-smescheniy">С выводом совпадений и смещений:</h2>
yara -s rules.yar suspicious.exe


Открытые YARA-репозитории для ransomware


bash
<h2 id="repozitoriy-yara-pravil-florian-roth-neo23x0">Репозиторий YARA правил Florian Roth (Neo23x0):</h2>
git clone https://github.com/Neo23x0/signature-base
ls signature-base/yara/ | grep -i ransom

<h2 id="valhalla-yara-feed-besplatnyy-publichnyy">Valhalla YARA Feed (бесплатный публичный):</h2>
<h2 id="valhalla-nextron-systems-com">valhalla.nextron-systems.com</h2>

<h2 id="cert-gib-av-vendory-publikuyut-yara-v-blogah">CERT-GIB, AV-вендоры публикуют YARA в блогах:</h2>
<h2 id="github-com-elastic-detection-rules">github.com/elastic/detection-rules</h2>
<h2 id="github-com-mandiant-red-team-tool-countermeasures">github.com/mandiant/red_team_tool_countermeasures</h2>


Написание кастомного YARA-правила под конкретное семейство


Если образец найден, но не детектируется готовыми правилами:

yara
// Пример: YARA-правило для LockBit 3.0
// Базируется на строках из записки и характерных импортах

rule Ransomware_LockBit3 {
meta:
description = "Detects LockBit 3.0 ransomware"
author = "Incident Response Team"
date = "2026-01-15"
severity = "critical"
reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.lockbit"

strings:
// Строки из типичной записки LockBit 3.0
$note1 = "Restore-My-Files.txt" ascii nocase
$note2 = "LockBit" ascii wide
$note3 = "darknetspy" ascii nocase

// Характерные API-вызовы в бинарнике
$api1 = "CryptGenRandom" ascii
$api2 = "CryptEncrypt" ascii
$api3 = "vssadmin" ascii nocase

// Маркер удаления теневых копий
$vss1 = "delete shadows /all" ascii nocase wide
$vss2 = "shadowcopy delete" ascii nocase wide

condition:
uint16(0) == 0x5A4D // PE файл (MZ заголовок)
and filesize < 5MB
and (
2 of ($note*)
or (1 of ($note*) and 2 of ($api*))
or (1 of ($vss*) and 1 of ($api*))
)
}

// Правило для идентификации ЗАШИФРОВАННЫХ файлов LockBit
rule LockBit3_Encrypted_File {
meta:
description = "Encrypted file marker - LockBit 3.0"

strings:
// LockBit 3.0 appends marker to end of encrypted files
// Точный маркер зависит от версии — уточнять по образцу
$marker = { ?? ?? ?? ?? 6C 6F 63 6B 62 69 74 } // "lockbit" в конце

condition:
$marker at (filesize - 16)
}


YARA для анализа записки с выкупом


yara
rule RansomNote_Generic_Extortion {
meta:
description = "Generic ransom note detection"

strings:
// Универсальные фразы из записок
$bitcoin = "bitcoin" ascii nocase
$tor1 = ".onion" ascii
$decrypt = "decryption key" ascii nocase
$pay1 = "ransom" ascii nocase
$recover1 = "your files have been encrypted" ascii nocase wide
$recover2 = "все ваши файлы зашифрованы" wide // RU-таргетинг

condition:
(2 of ($bitcoin, $tor1, $decrypt, $pay1))
or ($recover1 or $recover2)
}





8. Метод 6 — Анализ бинарного образца malware


Если образец исполняемого файла ransomware доступен — реверс-инжиниринг даёт наиболее точную идентификацию алгоритма шифрования.

Статический анализ: строки и импорты


bash
<h2 id="izvlech-stroki-iz-obraztsa-bez-zapuska">Извлечь строки из образца (без запуска):</h2>
strings -a suspicious.exe | grep -iE "(aes|chacha|rsa|crypt|encrypt|rand)"

<h2 id="harakternye-stroki-po-algoritmam">Характерные строки по алгоритмам:</h2>
<h2 id="aes-aes-256-rijndael-cryptencrypt-bcryptencrypt">AES: &quot;AES-256&quot;, &quot;Rijndael&quot;, &quot;CryptEncrypt&quot;, &quot;BCryptEncrypt&quot;</h2>
<h2 id="chacha20-chacha20-chacha-salsa20-rodstvennyy">ChaCha20: &quot;ChaCha20&quot;, &quot;ChaCha&quot;, &quot;salsa20&quot; (родственный)</h2>
<h2 id="rsa-rsaencrypt-cryptimportpublickeyinfo-begin-public-key">RSA: &quot;RSAEncrypt&quot;, &quot;CryptImportPublicKeyInfo&quot;, &quot;BEGIN PUBLIC KEY&quot;</h2>

<h2 id="proverit-importirovannye-windows-api">Проверить импортированные Windows API:</h2>
<h2 id="objdump-d-suspicious-exe-grep-i-crypt-mingw-linux">objdump -d suspicious.exe | grep -i crypt (MinGW/Linux)</h2>
<h2 id="dumpbin-imports-suspicious-exe-msvc">dumpbin /imports suspicious.exe (MSVC)</h2>

<h2 id="ili-cherez-python-s-pefile">Или через Python с pefile:</h2>
pip install pefile


python
import pefile

def analyze_imports(pe_path: str):
"""Анализ импортированных функций для идентификации крипто-API."""
pe = pefile.PE(pe_path)

crypto_imports = []
if hasattr(pe, 'DIRECTORY_ENTRY_IMPORT'):
for entry in pe.DIRECTORY_ENTRY_IMPORT:
dll_name = entry.dll.decode('utf-8', errors='replace')
for imp in entry.imports:
if imp.name:
func_name = imp.name.decode('utf-8', errors='replace')
# Список криптографических API Windows
if any(kw in func_name.lower() for kw in
['crypt', 'bcrypt', 'ncrypt', 'rand']):
crypto_imports.append((dll_name, func_name))

return crypto_imports

<h2 id="zapusk">Запуск:</h2>
imports = analyze_imports("suspicious.exe")
for dll, func in imports:
print(f" {dll}: {func}")

<h2 id="harakternye-api">Характерные API:</h2>
<h2 id="cryptgenrandom-generatsiya-sluchaynyh-klyuchey-lyuboy-algoritm">CryptGenRandom → генерация случайных ключей (любой алгоритм)</h2>
<h2 id="bcryptencrypt-windows-cng-aes-chacha20">BCryptEncrypt → Windows CNG (AES, ChaCha20)</h2>
<h2 id="cryptencrypt-cryptoapi-ustarevshiy-aes-rc4">CryptEncrypt → CryptoAPI устаревший (AES, RC4)</h2>
<h2 id="rtlgenrandom-getrandom-klyuchi">RtlGenRandom → GetRandom (ключи)</h2>


Динамический анализ: песочница


Безопасный запуск образца в изолированной среде:

bash
<h2 id="any-run-any-run-interaktivnaya-onlayn-pesochnitsa">Any.run (any.run) — интерактивная онлайн-песочница:</h2>
<h2 id="zagruzit-obrazets-poluchit-polnyy-povedencheskiy-otchyot">Загрузить образец → получить полный поведенческий отчёт</h2>
<h2 id="vklyuchaet-sozdanie-faylov-reestrovye-izmeneniya-setevoy-trafik">Включает: создание файлов, реестровые изменения, сетевой трафик</h2>

<h2 id="cuckoo-sandbox-self-hosted-reshenie">Cuckoo Sandbox — self-hosted решение:</h2>
<h2 id="pip-install-cuckoo">pip install cuckoo</h2>
<h2 id="cuckoo-submit-suspicious-exe">cuckoo submit suspicious.exe</h2>

<h2 id="chto-iskat-v-otchyote-pesochnitsy">Что искать в отчёте песочницы:</h2>
<h2 id="import-zagruzka-kripto-bibliotek">- Импорт/загрузка крипто-библиотек</h2>
<h2 id="generatsiya-klyuchey-cryptgenrandom-bcryptgenrandom">- Генерация ключей (CryptGenRandom / BCryptGenRandom)</h2>
<h2 id="massovoe-otkrytie-faylov-na-zapis">- Массовое открытие файлов на запись</h2>
<h2 id="udalenie-tenevyh-kopiy">- Удаление теневых копий</h2>
<h2 id="c2-kommunikatsiya-dlya-polucheniya-publichnogo-klyucha">- C2-коммуникация (для получения публичного ключа)</h2>


Дизассемблирование: идентификация константы AES S-box


AES использует жёстко закодированную таблицу подстановок (S-box). Это характерная константа, которую можно найти в дизассемблированном коде:

aes
S-box начинается с: 63 7C 77 7B F2 6B 6F C5 30 01 67 2B FE D7 AB 76
(первые 16 байт из 256)

В hex-редакторе или Ghidra:
Поиск байтовой последовательности 63 7C 77 7B F2 6B 6F C5
→ Найдено → AES реализован в данном бинарнике


bash
<h2 id="poisk-s-box-konstanty-v-binarnike">Поиск S-box константы в бинарнике:</h2>
python3 -c "
import sys

AES_SBOX = bytes([
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
])

with open(sys.argv[1], 'rb') as f:
data = f.read()

offset = data.find(AES_SBOX)
if offset >= 0:
print(f'AES S-box найден на смещении 0x{offset:X} — файл использует AES')
else:
print('AES S-box не найден напрямую')
" suspicious.exe


Аналогичные константы есть у ChaCha20 (sigma-константы: «expand 32-byte k»).




9. Актуальные семейства 2025–2026: алгоритмы LockBit, BlackCat, Akira, Cloak


Краткий справочник по актуальным семействам — для быстрого поиска при инциденте.

LockBit 3.0 (Ransomware-as-a-Service)


text
Алгоритм:     AES-256 (файлы) + RSA-2048 (ключ)
Расширение: .lockbit или случайное (8 hex-символов)
Записка: Restore-My-Files.txt
Удаление VSS: vssadmin delete shadows /all /quiet
Платформы: Windows, Linux (ESXi)
Особенности: Intermittent encryption (первые N байт каждого файла)
Идентификация: ID Ransomware, наличие ECDH-публичного ключа в образце


BlackCat / ALPHV (Rust, кросс-платформенный)


text
Алгоритм:     ChaCha20 (файлы) + RSA-4096 (ключ)
Расширение: Случайное (5–8 hex-символов)
Записка: RECOVER-[расширение]-FILES.txt
Написан: Rust (сложнее поддаётся реверсингу)
Платформы: Windows, Linux, VMware ESXi
Особенности: Настраиваемый режим шифрования (полное / intermittent)
Идентификация: Наличие Rust-рантайма, ChaCha20 sigma-константы


Akira


В июне 2023 года Avast опубликовал дешифратор для Akira. Впоследствии группа обновила свой пейлоад, и дешифратор больше не работает с файлами, зашифрованными последними версиями.

text
Алгоритм:     ChaCha20 (текущие версии) + RSA
(ранние версии использовали AES-256-CBC)
Расширение: .akira
Записка: akira_readme.txt
Платформы: Windows (C++), Linux/ESXi
Особенности: Intermittent encryption — шифрует блоки по
1,5 МБ через интервалы (зависит от размера файла)
Идентификация: Расширение .akira, характерный паттерн
блочного шифрования


Qilin.B


text
Алгоритм:     AES-256-CTR (если есть AES-NI) 
или ChaCha20 + RSA-4096 + OAEP
Написан: Rust
Расширение: Случайное
Особенности: Удаляет Event Log, самоудаляется после шифрования,
удаляет VSS, специализируется на VMware ESXi
Платформы: Windows, Linux


Cloak


text
Алгоритм:     HC-128 (потоковый шифр) + Curve25519 + SHA512
Расширение: .cloak
Записка: CLOAK_README.txt
Особенности: Поддерживает полное и интермиттирующее шифрование
Базируется на утечках исходников Babuk
Идентификация: HC-128 — нетипичный алгоритм,
идентифицируется по константам генератора


STOP/Djvu (самый массовый среди частных лиц)


text
Алгоритм:     Salsa20 (файлы) + RSA-1024 (ключ)
Важно: если нет интернета при шифровании —
использует OFFLINE KEY (один и тот же для всех)
Расширение: .djvu, .djvus, .nomad, .beast, .ousa и сотни других
Записка: _readme.txt
Особенности: Offline-ключ означает возможность дешифрования
через STOPDecrypter / Emsisoft STOP Djvu Decryptor
Идентификация: _readme.txt с email restorealldata@firemail.cc
или аналогичными адресами


Обнаружение конкретного алгоритма по артефактам


chacha20
идентификаторы:
Строка "expand 32-byte k" в бинарнике (sigma-константа)
Строка "expand 16-byte k" (для ChaCha20 с 128-bit ключом)

AES идентификаторы:
S-box константа (63 7C 77 7B ...)
Вызовы BCryptEncrypt / CryptEncrypt
Строка "AES" или константа AES_KEY_SIZE

RSA идентификаторы:
PEM-строка "-----BEGIN PUBLIC KEY-----" в бинарнике
Большие простые числа в качестве констант
Вызовы CryptImportPublicKeyInfo или аналогов





10. Частичное (интермиттирующее) шифрование: почему энтропия больше не всегда работает


Интермиттирующее шифрование представляется всё более популярным выбором операторов ransomware. Оно значительно ускоряет атаку (особенно критично для крупных файловых серверов), при этом делая зашифрованные файлы неиспользуемыми.

Что такое интермиттирующее шифрование


Вместо шифрования файла целиком ransomware шифрует только часть:

text
Режим "первые N байт":
[зашифровано: первые 512 КБ][не зашифровано: остаток файла]
Файл неиспользуем, но шифрование быстрее в 10–100 раз

Режим "каждый N-й блок":
[шифр][открыт][шифр][открыт][шифр][открыт]...
Паттерн чередования — энтропия усреднена

Режим "процент файла":
BlackCat/ALPHV: шифрует заданный % от размера файла
LockBit 3.0: шифрует первые N байт (N зависит от размера файла)
Akira: блоки по 1,5 МБ через интервалы


Почему это ломает энтропийный анализ


Модель производит аналитические границы детектируемости в зависимости от типа файла и указывает на режимы, где детекторы, основанные только на энтропии, заведомо неадекватны.

text
При шифровании первых 10% большого файла:
Общая энтропия файла: 5.2 (высокая только первые 10%)
→ Простой энтропийный детектор скажет: "не зашифровано"
→ Блочный анализ покажет: высокая энтропия в начале, низкая в конце

При режиме "каждый 2-й блок":
Общая энтропия файла: ~6.5–7.0
→ Порогово-энтропийный детектор: неопределённо / промах
→ Блочная карта: чёткое чередование высокой/низкой энтропии


Контрмера: блочный анализ


python
def detect_intermittent_encryption(
filepath: str,
block_size: int = 4096,
high_threshold: float = 7.5,
low_threshold: float = 6.5
) -> dict:
"""
Обнаружить интермиттирующее шифрование по паттерну
чередования блоков с высокой/низкой энтропией.
"""
blocks = block_entropy_map(filepath, block_size)
if not blocks:
return {"status": "empty"}

high_blocks = sum(1 for _, e in blocks if e >= high_threshold)
low_blocks = sum(1 for _, e in blocks if e < low_threshold)
total = len(blocks)

# Подсчёт переходов (высокий→низкий и низкий→высокий)
transitions = 0
for i in range(1, len(blocks)):
prev_high = blocks[i-1][1] >= high_threshold
curr_high = blocks[i][1] >= high_threshold
if prev_high != curr_high:
transitions += 1

alternating = transitions > total * 0.3 # >30% переходов = чередование

return {
"total_blocks": total,
"high_entropy": high_blocks,
"low_entropy": low_blocks,
"transitions": transitions,
"alternating": alternating,
"verdict": (
"ПОЛНОЕ шифрование" if high_blocks / total > 0.90 else
"ИНТЕРМИТТИРУЮЩЕЕ шифрование" if alternating else
"ЧАСТИЧНОЕ шифрование" if high_blocks / total > 0.30 else
"Шифрование не обнаружено"
)
}





11. Python-инструментарий: энтропия, сравнение заголовков, карта файлов


Полный скрипт для первичного анализа подозрительного файла или директории.

python
#!/usr/bin/env python3
"""
ransomware_file_analyzer.py
Первичный анализ файлов на признаки ransomware-шифрования.

Использование:
python ransomware_file_analyzer.py file.pdf
python ransomware_file_analyzer.py /infected_folder/ --recursive
python ransomware_file_analyzer.py file.enc --block-map
"""

import os
import sys
import math
import argparse
from collections import Counter
from pathlib import Path

<h2 id="konstanty">─── Константы ────────────────────────────────────────────────────────────</h2>
MAGIC_SIGNATURES = {
b'\x25\x50\x44\x46': ('PDF', '.pdf'),
b'\x50\x4B\x03\x04': ('ZIP/Office', '.zip .docx .xlsx .pptx'),
b'\xFF\xD8\xFF': ('JPEG', '.jpg .jpeg'),
b'\x89\x50\x4E\x47\x0D\x0A': ('PNG', '.png'),
b'\x47\x49\x46\x38': ('GIF', '.gif'),
b'\x42\x4D': ('BMP', '.bmp'),
b'\x4D\x5A': ('PE Executable', '.exe .dll'),
b'\x7F\x45\x4C\x46': ('ELF Executable', ''),
b'\x37\x7A\xBC\xAF\x27\x1C': ('7-ZIP', '.7z'),
b'\x1F\x8B': ('GZIP', '.gz'),
b'\x52\x61\x72\x21': ('RAR', '.rar'),
b'\x25\x21\x50\x53': ('PostScript', '.ps'),
b'\xD0\xCF\x11\xE0': ('MS OLE (old Office)', '.doc .xls .ppt'),
b'\x30\x82': ('DER Certificate/Key', '.der .cer'),
}

AES_SBOX_START = bytes([
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76
])
CHACHA20_SIGMA = b"expand 32-byte k"

<h2 id="entropiya">─── Энтропия ─────────────────────────────────────────────────────────────</h2>
def shannon_entropy(data: bytes) -> float:
if not data:
return 0.0
counts = Counter(data)
total = len(data)
return -sum((c / total) * math.log2(c / total)
for c in counts.values())

def block_entropy(filepath: str, block_size: int = 4096) -> list[tuple]:
results = []
with open(filepath, "rb") as f:
offset = 0
while chunk := f.read(block_size):
results.append((offset, shannon_entropy(chunk), len(chunk)))
offset += len(chunk)
return results

<h2 id="magic-bytes">─── Magic bytes ──────────────────────────────────────────────────────────</h2>
def check_magic(header: bytes) -> str | None:
for sig, (name, _) in MAGIC_SIGNATURES.items():
if header[:len(sig)] == sig:
return name
return None

<h2 id="kriptokonstanty">─── Криптоконстанты ──────────────────────────────────────────────────────</h2>
def check_crypto_constants(data: bytes) -> list[str]:
found = []
if AES_SBOX_START in data:
found.append("AES S-box")
if CHACHA20_SIGMA in data:
found.append("ChaCha20 sigma")
if b"-----BEGIN PUBLIC KEY-----" in data:
found.append("RSA Public Key (PEM)")
if b"-----BEGIN CERTIFICATE-----" in data:
found.append("X.509 Certificate")
return found

<h2 id="osnovnoy-analiz">─── Основной анализ ──────────────────────────────────────────────────────</h2>
def analyze_file(filepath: str, show_block_map: bool = False) -> dict:
path = Path(filepath)
result = {
"file": str(path),
"size": path.stat().st_size,
"ext": path.suffix.lower(),
"entropy": None,
"magic": None,
"ext_mismatch": False,
"verdict": "Unknown",
"crypto_constants": [],
"block_map": [],
}

with open(filepath, "rb") as f:
header = f.read(16)
f.seek(0)
data = f.read()

# Энтропия всего файла
result["entropy"] = shannon_entropy(data)

# Magic bytes
detected_type = check_magic(header)
result["magic"] = detected_type or "Unknown / No valid magic bytes"

# Несоответствие расширения и типа
if detected_type:
for sig, (name, extensions) in MAGIC_SIGNATURES.items():
if name == detected_type and result["ext"]:
if result["ext"] not in extensions:
result["ext_mismatch"] = True

# Криптоконстанты (для исполняемых файлов или образцов малвари)
result["crypto_constants"] = check_crypto_constants(data)

# Блочная карта (если запрошена)
if show_block_map:
result["block_map"] = block_entropy(filepath)

# Вердикт
ent = result["entropy"]
if ent >= 7.8:
if detected_type is None:
result["verdict"] = "ВЫСОКАЯ ВЕРОЯТНОСТЬ ШИФРОВАНИЯ"
else:
# Сжатый файл тоже может иметь высокую энтропию
result["verdict"] = "Высокая энтропия (сжатый или зашифрованный)"
elif ent >= 7.5:
result["verdict"] = "СРЕДНЯЯ вероятность — проверить блочную карту"
elif result["ext_mismatch"]:
result["verdict"] = "НЕСООТВЕТСТВИЕ расширения — подозрительно"
else:
result["verdict"] = "Признаков шифрования не выявлено"

return result

<h2 id="vyvod-rezultatov">─── Вывод результатов ────────────────────────────────────────────────────</h2>
def print_result(r: dict, show_map: bool = False):
print(f"\n{'─'*60}")
print(f" Файл: {r['file']}")
print(f" Размер: {r['size']:,} байт")
print(f" Расш.: {r['ext'] or 'нет'}")
print(f" Magic: {r['magic']}")
print(f" Энтропия:{r['entropy']:.4f} бит/байт")
if r["ext_mismatch"]:
print(f" ⚠️ НЕСООТВЕТСТВИЕ: расширение не совпадает с типом файла")
if r["crypto_constants"]:
print(f" Крипто: {', '.join(r['crypto_constants'])}")
print(f" Вердикт: {r['verdict']}")

if show_map and r["block_map"]:
print(f"\n Блочная карта энтропии (каждые 4 КБ):")
print(f" {'Смещение':>12} Энтропия Визуализация")
for offset, ent, sz in r["block_map"]:
bar = "█" * int(ent / 8.0 * 20)
print(f" {offset:>12,} {ent:5.2f} {bar}")

<h2 id="cli">─── CLI ──────────────────────────────────────────────────────────────────</h2>
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Анализ файлов на признаки ransomware-шифрования")
parser.add_argument("target",
help="Файл или директория для анализа")
parser.add_argument("-r", "--recursive", action="store_true",
help="Рекурсивный анализ директории")
parser.add_argument("--block-map", action="store_true",
help="Показать блочную карту энтропии")
parser.add_argument("--threshold", type=float, default=7.5,
help="Порог энтропии для алерта (по умолчанию 7.5)")
args = parser.parse_args()

target = Path(args.target)
files = []

if target.is_file():
files = [str(target)]
elif target.is_dir() and args.recursive:
files = [str(p) for p in target.rglob("*") if p.is_file()]
elif target.is_dir():
files = [str(p) for p in target.glob("*") if p.is_file()]
else:
print(f"Ошибка: {args.target} не найден")
sys.exit(1)

suspicious = []
for filepath in files:
try:
result = analyze_file(filepath, args.block_map)
if result["entropy"] >= args.threshold or result["ext_mismatch"]:
suspicious.append(result)
print_result(result, args.block_map)
except (PermissionError, OSError) as e:
print(f" Ошибка чтения {filepath}: {e}")

print(f"\n{'='*60}")
print(f"Проверено файлов: {len(files)}")
print(f"Подозрительных: {len(suspicious)}")





12. Тактика восстановления: что делать после идентификации


Идентификация семейства — не финальная цель, а начало процесса восстановления.

Немедленные действия после идентификации


1
. ИЗОЛЯЦИЯ (в первые минуты):
Отключить заражённые хосты от сети
Не выключать — это уничтожит данные в памяти
Сделать образ оперативной памяти (если активный процесс ещё жив):
winpmem.exe memory.raw (Windows)
avml /proc/kcore memory.raw (Linux)

2. ОЦЕНКА МАСШТАБА:
Сколько файлов зашифровано?
Какие директории затронуты?
Есть ли незашифрованные резервные копии?
Достигла ли атака Active Directory?

3. ИДЕНТИФИКАЦИЯ ВЕКТОРА:
Как ransomware попал в систему?
Закрыт ли вектор (уязвимость, учётная запись)?

4. НОТИФИКАЦИЯ:
Регулятор (если персональные данные — РОСКОМНАДЗОР)
Страховая компания (если есть кибер-страховка)
Правоохранители (при необходимости)


Проверка наличия дешифратора


text
Приоритетные ресурсы для проверки:

1. nomoreransom.org/crypto-sheriff.php
Загрузить 2 зашифрованных файла + записку

2. id-ransomware.malwarehunterteam.com
Идентификация + проверка доступности дешифратора

3. emsisoft.com/ransomware-decryption-tools/
Официальные бесплатные дешифраторы Emsisoft

4. bleepingcomputer.com/news/security/free-ransomware-decryptors/
Актуальный список бесплатных дешифраторов с описаниями

5. Malpedia (malpedia.caad.fkie.fraunhofer.de)
Профиль семейства с ссылками на ресурсы


Восстановление из резервных копий


text
Порядок проверки резервных копий:

1. Облачное хранилище (если не было синхронизировано
в момент атаки — версии могут быть целы)

2. Оффлайн-резервные копии (не подключённые в момент атаки)

3. Previous Versions в Windows (если VSS не удалены):
Правая кнопка на файле → Properties → Previous Versions

4. Резервные копии на изолированных серверах

5. Восстановление из snapshots виртуальных машин
(если хранятся отдельно от основной инфраструктуры)


Когда не платить и когда может иметь смысл


text
НИКОГДА не платить без консультации с:
- Юристом (санкционные риски — платёж организациям из SDN-листа
может быть незаконен)
- Правоохранителями (у них может быть ключ или данные об акторе)
- Киберстраховщиком (условия полиса)
- Специалистом по переговорам (если рассматриваете оплату)

Данные: в 2025 году 63% жертв отказались платить,
97% восстановили данные через резервные копии или другие средства.





13. Практический кейс: идентификация семейства от начала до конца


Ситуация: В 04:15 поступает алерт — на файловом сервере массово изменяются файлы. Обнаружены файлы с расширением `.akira` и файл `akira_readme.txt` на рабочем столе пользователя.

Шаг 1: Первичная идентификация (2 минуты)


text
Расширение .akira → семейство Akira
Записка akira_readme.txt → подтверждение

Немедленное действие: изолировать хост от сети
(не выключать — у Akira есть особенности завершения)


Шаг 2: Загрузка в ID Ransomware (3 минуты)


text
Загружаем akira_readme.txt на id-ransomware.malwarehunterteam.com
Результат: Akira Ransomware — идентифицировано
Статус дешифратора: недоступен для текущих версий

(Напоминание: ранний дешифратор от Avast уже не работает
с обновлёнными версиями Akira)


Шаг 3: Анализ зашифрованных файлов (5 минут)


bash
<h2 id="zapusk-analizatora-na-zashifrovannyh-faylah">Запуск анализатора на зашифрованных файлах:</h2>
python ransomware_file_analyzer.py /srv/fileserver/finance/ -r

<h2 id="vyvod">Вывод:</h2>
<h2 id="">─────────────────────────────────────────────</h2>
<h2 id="fayl-q4-report-2025-docx-akira">Файл: Q4_report_2025.docx.akira</h2>
<h2 id="razmer-2-847-382-bayt">Размер: 2,847,382 байт</h2>
<h2 id="entropiya-7-94-bit-bayt">Энтропия: 7.94 бит/байт</h2>
<h2 id="magic-unknown-no-valid-magic-bytes">Magic: Unknown / No valid magic bytes</h2>
<h2 id="verdikt-vysokaya-veroyatnost-shifrovaniya">Вердикт: ВЫСОКАЯ ВЕРОЯТНОСТЬ ШИФРОВАНИЯ</h2>
<h2 id="fayl-contracts-archive-zip-akira"># Файл: contracts_archive.zip.akira</h2>
<h2 id="razmer-15-284-910-bayt">Размер: 15,284,910 байт</h2>
<h2 id="entropiya-7-93-bit-bayt">Энтропия: 7.93 бит/байт</h2>
<h2 id="verdikt-vysokaya-veroyatnost-shifrovaniya">Вердикт: ВЫСОКАЯ ВЕРОЯТНОСТЬ ШИФРОВАНИЯ</h2>


Шаг 4: Блочная карта — верификация интермиттирующего шифрования


bash
python ransomware_file_analyzer.py Q4_report_2025.docx.akira --block-map

<h2 id="vyvod-pervye-bloki">Вывод (первые блоки):</h2>
<h2 id="blochnaya-karta-entropii">Блочная карта энтропии:</h2>
<h2 id="smeschenie-entropiya-vizualizatsiya">Смещение Энтропия Визуализация</h2>
<h2 id="0-7-96">0 7.96 ████████████████████</h2>
<h2 id="4-096-7-94">4,096 7.94 ████████████████████</h2>
<h2 id="8-192-7-97">8,192 7.97 ████████████████████</h2>
<h2 id="12-288-7-95">12,288 7.95 ████████████████████</h2>
<h2 id="">...</h2>
<h2 id="pattern-vse-bloki-8-0-polnoe-shifrovanie-ili-pervaya-chast">Паттерн: все блоки ~8.0 → полное шифрование (или первая часть)</h2>


Шаг 5: Проверка образца малвари (30 минут, если образец найден)


bash
<h2 id="poisk-obraztsa-na-zarazhyonnom-hoste">Поиск образца на заражённом хосте:</h2>
strings akira_payload.exe | grep -iE "(chacha|aes|expand 32)"
<h2 id="naydeno-expand-32-byte-k-chacha20-podtverzhdyon">Найдено: &quot;expand 32-byte k&quot; → ChaCha20 подтверждён</h2>

<h2 id="analiz-importov">Анализ импортов:</h2>
python ransomware_file_analyzer.py akira_payload.exe
<h2 id="vyvod-kripto-chacha20-sigma">Вывод: Крипто: ChaCha20 sigma</h2>


Итоговый вывод кейса


text
Идентифицировано:  Akira Ransomware (актуальная версия)
Алгоритм: ChaCha20 (файлы) + RSA (ключ сессии)
Дешифратор: Недоступен
Масштаб: Зашифровано 4,847 файлов на файловом сервере
VSS: Удалены (vssadmin delete shadows /all)

Действия:
1. Восстановление из последней резервной копии (вчерашней 22:00)
2. Потеря данных: ~6 часов работы
3. Анализ вектора проникновения: открытый RDP с брутфорсом
4. Нотификация руководства и юридического отдела
5. Создание YARA-правила для детектирования повторного появления





14. FAQ: 12 горячих вопросов об идентификации ransomware-шифрования


Q 01 Можно ли по зашифрованному файлу узнать оригинальное содержимое?
A Нет — если использован стойкий алгоритм (AES-256, ChaCha20). Современные реализации гибридного шифрования вычислительно неуязвимы без приватного ключа злоумышленника. Исключения: старые семейства с ошибками в реализации (использование предсказуемого IV, слабого PRNG, жёстко закодированного ключа). Именно для таких случаев существуют дешифраторы на NoMoreRansom.

Q 02 Энтропия 7.9 — это однозначно зашифрованный файл?
A Не однозначно. Такую же энтропию имеют сжатые файлы (ZIP, 7Z, GZ) и видео (MP4, MKV). Высокая энтропия — необходимый, но не достаточный признак. Подтверждение: несоответствие magic bytes ожидаемому типу, изменённое расширение, наличие записки с выкупом, блочный паттерн (для интермиттирующего шифрования).

Q 03 Как отличить зашифрованный файл от сжатого?
A Три способа. Первый: проверить magic bytes — у ZIP есть `PK\x03\x04`, у GZIP `\x1F\x8B`, у 7Z `\x37\x7A\xBC\xAF`. Второй: попробовать открыть файл архиватором — сжатый откроется, зашифрованный нет. Третий: блочная карта — у сжатого файла вся энтропия равномерно высокая, у частично зашифрованного — чередование.

Q 04 Что делать, если расширение файла не изменилось?
A Некоторые семейства сохраняют расширение для скрытности. Алгоритм: проверить magic bytes (несоответствие = признак шифрования), измерить энтропию, проверить, открывается ли файл соответствующим приложением. Если PDF не открывается ни в одном просмотрщике — высокая вероятность шифрования.

Q 05 Нашёл зашифрованные файлы, но записки нет. Это ransomware?
A Не обязательно. Записка может быть в другой директории, уже удалена, или атака прервана до завершения. Альтернативные объяснения: шифрование файлов сотрудником вручную, ошибочное перемещение в зашифрованный контейнер, действие другого малвари. Анализ энтропии и magic bytes актуален в любом случае.

Q 06 Можно ли восстановить зашифрованные файлы без ключа?
A В большинстве случаев современных атак — нет. Исключения: семейства с утечкой ключей (через ликвидацию C2-инфраструктуры), ошибки реализации PRNG (предсказуемые ключи), использование offline-ключа (STOP/Djvu при отсутствии интернет-соединения), резервные копии до шифрования.

Q 07 Как быстро определить семейство без интернета?
A Последовательность: расширение + имя записки (база в памяти или локальном справочнике), YARA-сканирование с оффлайн-правилами (neo23x0/signature-base), анализ образца малвари на строки и крипто-константы. Основные расширения и записки лучших 20 семейств стоит знать наизусть или держать в локальном cheatsheet.

Q 08 Безопасно ли загружать зашифрованные файлы на ID Ransomware?
A Зашифрованные файлы — безопасны: это «случайные данные», не содержащие читаемой информации. Записки с выкупом — минимальный риск, они не содержат персональных данных жертвы. Осторожно: не загружать образцы малвари (исполняемые файлы) на публичные сервисы без согласования — это раскрывает информацию об инциденте.

Q 09 Что такое «offline key» и почему он важен для восстановления?
A STOP/Djvu и некоторые другие семейства используют разные ключи в зависимости от наличия интернета. При подключённом C2-сервере генерируется уникальный ключ для каждой жертвы (online key) — восстановление без оплаты невозможно. При отсутствии доступа к C2 используется вшитый ключ (offline key) — один для многих жертв. Эти offline-ключи постепенно становятся известны исследователям и позволяют создавать дешифраторы.

Q 10 Поможет ли форензика памяти при живом инциденте?
A Критически важна при активном инциденте. Образ RAM может содержать: незашифрованный сессионный ключ (если ransomware ещё работает или недавно завершился), расшифрованные фрагменты файлов в буферах, строки конфигурации и C2-адреса. Инструменты: winpmem (Windows), avml / /proc/mem dump (Linux), LiME (Linux kernel module).

Q 11 Как отличить шифрование ransomware от легитимного шифрования (BitLocker, VeraCrypt)?
A BitLocker шифрует целые тома, а не отдельные файлы — зашифрован диск, а не директории с файлами. VeraCrypt/TrueCrypt создают контейнеры-файлы, но не затрагивают соседние файлы. Ransomware: массово изменяет файлы в нескольких директориях, добавляет расширения, оставляет записки. Если видите зашифрованные файлы рядом с незашифрованными в тех же папках — это почти наверняка не BitLocker.

Q 12 Нужен ли реверс-инжиниринг образца для подачи заявления в полицию?
A Нет — для заявления достаточно документирования факта атаки, масштаба ущерба и имеющихся артефактов (записки, зашифрованные файлы, логи). Реверс-инжиниринг нужен для атрибуции конкретному актору — это задача специализированных ИБ-компаний и следователей, а не обязательное условие для возбуждения дела.




15. Чек-лист: идентификация ransomware-инцидента за 30 минут


Первые 5 минут: изоляция и первичная оценка
- ☐ Изолировать подозрительные хосты от сети (не выключать!)
- ☐ Зафиксировать время обнаружения и первых симптомов
- ☐ Найти и сохранить записку с выкупом (скопировать, не удалять)
- ☐ Перечислить затронутые директории и примерное количество файлов
- ☐ Проверить, удалены ли теневые копии: `Get-WmiObject Win32_ShadowCopy`

Минуты 5–10: визуальные маркеры
- ☐ Зафиксировать расширение зашифрованных файлов
- ☐ Сохранить имя файла записки (README.txt, RECOVER-*.txt и т.п.)
- ☐ Проверить обои рабочего стола на изменение
- ☐ Поиск по Event Log: `vssadmin`, `shadowcopy`, `bcdedit` в последних 48 ч
- ☐ Проверить автозапуск: `HKCU/HKLM\...\CurrentVersion\Run`

Минуты 10–15: онлайн-идентификация
- ☐ Загрузить записку в `id-ransomware.malwarehunterteam.com`
- ☐ Зафиксировать имя идентифицированного семейства
- ☐ Проверить наличие дешифратора на `nomoreransom.org`
- ☐ Проверить `emsisoft.com/ransomware-decryption-tools/`
- ☐ Если доступен дешифратор — скачать и сохранить (не применять сразу!)

Минуты 15–25: технический анализ
- ☐ Проверить magic bytes 3–5 зашифрованных файлов: `file suspicious.ext`
- ☐ Измерить энтропию: `python ransomware_file_analyzer.py suspicious.ext`
- ☐ Если образец малвари найден: `strings sample.exe | grep -iE "chacha|aes|expand 32"`
- ☐ Запустить YARA-сканирование на образце: `yara signature-base/yara/ sample.exe`
- ☐ Если устройство живо — снять образ RAM: `winpmem.exe memory.raw`

Минуты 25–30: документирование и следующие шаги
- ☐ Записать идентифицированное семейство, алгоритм, версию
- ☐ Оценить наличие восстанавливаемых резервных копий
- ☐ Определить точку восстановления (последняя чистая резервная)
- ☐ Нотифицировать руководство и юридический отдел
- ☐ Зафиксировать вектор проникновения (если установлен)
- ☐ Начать создание IR-отчёта с временно́й шкалой




16. Заключение и теги


Идентификация ransomware-шифрования — не одна проверка, а многоуровневый процесс. Расширение файла и записка с выкупом дают первичную гипотезу. Анализ энтропии и magic bytes её подтверждает или опровергает. ID Ransomware идентифицирует конкретное семейство. YARA и реверс-инжиниринг образца дают окончательный ответ об алгоритме.

Три изменения ландшафта, которые важно учитывать в 2025–2026 году. Первое: интермиттирующее шифрование делает энтропийные детекторы недостаточными — блочный анализ необходим. Второе: атакующие используют Format-Preserving Encryption и кодирование Base64 для обхода энтропийных детекторов — простой порог больше не работает. Третье: Qilin.B удаляет Event Log и самоудаляется после шифрования, затрудняя форензический анализ — снимать образ RAM при живом инциденте критически важно.

Главный практический вывод: держите локально обновлённый набор YARA-правил, Python-скрипт энтропийного анализа и оффлайн-справочник семейств. При инциденте каждая минута без интернета — потенциальная проблема, если инструменты зависят от подключения.

> 🔍 Каждый зашифрованный файл — это улика. Знать, как её читать — значит быстрее вернуть данные.