Урок 4. Как понять настоящий тип файла

Определяем формат по содержимому и безопасно просматриваем ZIP и JAR без запуска.

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

Задача урока сводится к двум результатам:

  1. чем файл является на самом деле;
  2. какой инструмент применять дальше.

Первый проход строится на утилитах file, binwalk, unzip и xxd, уже установленных в олимпиадном образе Kali. Конкретный инструмент выбирается после определения типа файла и чтения вопроса.

Почему расширению нельзя доверять

Расширение помогает операционной системе выбрать программу. Его можно изменить обычным переименованием:

mv archive.zip archive.jpg

Содержимое от этого не станет изображением. Поэтому различайте:

  • заявленный тип — то, что следует из имени;
  • фактический тип — то, что следует из содержимого.

Если эти типы не совпадают, ответ обычно строится по фактическому типу.

Первый инструмент — file

Команда file смотрит на служебные признаки внутри данных:

file suspicious.txt
file --mime-type suspicious.txt

Возможный вывод:

suspicious.txt: PNG image data, 640 x 360, 8-bit/color RGB
suspicious.txt: image/png

Первая команда даёт удобное описание, вторая — MIME-тип вида type/subtype. Если условие просит MIME, сдавать нужно именно image/png, а не весь вывод первой команды.

file хорошо подходит для первого прохода. Он часто распознаёт изображения, архивы, PDF, сетевые записи, исполняемые файлы и образы дисков. Но это не оракул: сильно повреждённый или редкий формат может быть определён слишком общо.

Что такое сигнатура

У многих форматов есть характерные байты в начале. Их называют сигнатурой или magic bytes.

Формат Начало файла Что означает
PNG 89 50 4e 47 0d 0a 1a 0a вероятно, изображение PNG
ZIP/JAR 50 4b 03 04 вероятно, ZIP-контейнер
PDF %PDF- вероятно, документ PDF
ELF 7f 45 4c 46 исполняемый файл или другой объект ELF

Посмотреть первые байты можно так:

xxd -l 32 suspicious.txt

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

Файл photo.jpg начинается с сигнатуры ZIP, а unzip -l показывает содержимое. Какой вывод обоснован? · 4 б.

Как подтвердить результат

Для разных форматов проверка выглядит по-разному:

  • ZIP или JAR: unzip -t и unzip -l;
  • PNG и JPEG: file, exiftool, обычное открытие копии;
  • вложенный объект в большом файле: binwalk;
  • PDF: pdfinfo или открытие копии в просмотрщике;
  • сетевой захват: file, затем Wireshark в сетевом модуле.

Например:

file strange.jpg
unzip -t strange.jpg
unzip -l strange.jpg

Если file сообщает ZIP, а unzip успешно проверяет архив и показывает его содержимое, вывод уже хорошо подтверждён. Переименовывать файл для этого не обязательно.

Архив и JAR — контейнеры

Контейнер — файл, внутри которого лежат другие файлы. JAR — это ZIP с принятой в Java структурой. Его можно исследовать без запуска:

file plugin.jar
unzip -l plugin.jar
unzip -p plugin.jar META-INF/MANIFEST.MF

Внутри JAR часто находятся:

  • META-INF/MANIFEST.MF;
  • файлы .class с Java-кодом;
  • конфигурации .json, .ini, .conf, .properties;
  • изображения и другие ресурсы.

Не запускайте неизвестный JAR. Если условие просит путь конфигурации, достаточно списка архива. Если позже потребуется понять Java-код, на олимпиадной Kali уже установлен jadx; он понадобится в отдельном уроке по анализу программ.

Важно не перепутать уровни. Хеш всего plugin.jar и хеш файла Stealer.class внутри него — разные значения. Всегда считайте сумму именно того объекта, который назван в вопросе.

PCAP — запись сетевого обмена

PCAP хранит сетевые пакеты. На первом проходе фиксируются:

  1. распознать такой файл;
  2. записать его точное имя;
  3. связать его с вопросом о сети.

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

Как безопасно начать анализ неизвестного JAR? · 4 б.

Что означает слово «дамп»

Дамп — сохранённая копия каких-либо данных. Это может быть:

  • память одного процесса;
  • образ оперативной памяти всей системы;
  • участок необработанных данных;
  • образ диска;
  • текстовая выгрузка базы.

Для них нужны разные инструменты. Например, Volatility предназначен прежде всего для образов оперативной памяти системы; его не следует запускать на любом файле только потому, что тот назван dump.bin. Сначала примените file, прочитайте условие и определите класс объекта.

Практический набор урока

В l4_unknowns.zip находятся семь файлов с неинформативными именами и README.txt. Сначала распакуйте архив в отдельную папку:

unzip -l l4_unknowns.zip
mkdir -p work/l4
unzip l4_unknowns.zip -d work/l4
file work/l4/*

Если file показывает, что один из объектов является ZIP или JAR, посмотрите его содержимое:

unzip -t work/l4/<ИМЯ-ФАЙЛА>
unzip -l work/l4/<ИМЯ-ФАЙЛА>

Задания проверяют три самостоятельных результата:

  • C10 — определить MIME изображения с неправильным расширением;
  • C11 — назвать файл, который на самом деле является PCAP;
  • C12 — найти полный путь конфигурации внутри JAR.

Каждый ответ получается на новых данных. Имена из примеров выше не являются ответами.

Реальная задача ВСОШ: «Заражённый лаунчер Pinecraft»

В региональной задаче ВСОШ 2025–2026 для 9 класса участнику выдавали zlauncher-premium.jar и launcher_process.dmp. Открыть исходное условие и разбор.

Подробный разбор JAR и дампа процесса

Нужно было найти:

  1. MD5 вредоносного файла внутри лаунчера;
  2. адрес отправки украденных паролей;
  3. ключ шифрования журнала.

Сначала JAR исследуется как архив, без запуска:

file zlauncher-premium.jar launcher_process.dmp
unzip -l zlauncher-premium.jar
unzip -Z1 zlauncher-premium.jar | grep -E '(^|/)Stealer\.class$'

Команда показывает полный путь к Stealer.class. Его можно извлечь под безопасным именем в рабочую папку:

mkdir -p work/launcher
unzip -p zlauncher-premium.jar <ПОЛНЫЙ-ПУТЬ>/Stealer.class \
  > work/launcher/Stealer.class
md5sum work/launcher/Stealer.class

В опубликованном решении получена сумма:

9b7dab9e88563c2ea2211165a2a463c9

Это сумма извлечённого .class, а не всего JAR.

launcher_process.dmp — снимок памяти одного процесса. Для первого поиска достаточно предустановленной команды strings, которая печатает читаемые строки и ничего не запускает:

strings -a launcher_process.dmp | grep -E 'https?://'
strings -a launcher_process.dmp | grep -iE 'xor|key'

Так в авторском разборе находились:

POST http://steal.darkmc.ru/collect
XOR_KEY = "MC2026"

Ответами становились http://steal.darkmc.ru/collect и MC2026.

Название Stealer.class само по себе не доказывает вредоносность. Для полного технического заключения потребовался бы анализ Java-кода. Но в рамках вопроса олимпиады список архива точно указывает требуемый файл, а строки дампа дают два остальных значения.

Расширение — только предположение

Результат первого прохода может быть коротким: «unknown.txt является PCAP» или «photo.png читается как ZIP/JAR». Этого достаточно, если вопрос просит тип или путь внутри контейнера. Расширение помогло выбрать кандидата, а вывод подтвердили содержимое и подходящая утилита.

Распознанный файл не всегда нужно разбирать глубже. Граница определяется вопросом: для имени PCAP достаточно типа, для конфигурации JAR нужен список архива, а выполнение неизвестного кода не требуется ни в одном из этих случаев.

Скачать практический набор: l4_unknowns.zip
C10

C10. Изображение без правильного имени

10 б.

Определите фактический MIME-тип файла artifact_k.log. Сдайте значение в формате type/subtype.

C11

C11. Где сетевой захват

12 б.

Какой файл набора является сетевой записью PCAP? Сдайте только имя файла с расширением.

C12

C12. Конфигурация внутри JAR

14 б.

Файл artifact_q.png является JAR/ZIP. Сдайте полный путь JSON-конфигурации агента внутри него, не запуская содержимое.