Урок 5. Что можно узнать из метаданных

Читаем служебные поля изображения, проверяем Base64 и сохраняем источник ответа.

У файла есть не только видимое содержимое. Фотография может хранить модель камеры и комментарий, документ — имя автора, архив — пути и даты файлов. Такие служебные сведения называют метаданными, то есть данными о самом объекте.

В олимпиадной задаче ответ нередко лежит именно там. Новичок может долго искать скрытое изображение или запускать сложный анализ, хотя достаточно одной предустановленной команды exiftool.

Работа с метаданными состоит из нескольких связанных действий:

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

Где бывают метаданные

Полезно различать три источника.

Файловая система хранит размер, владельца, права и время изменения файла. Эти сведения могут измениться при копировании.

Архив хранит имена файлов внутри, их размеры и даты. Это уже знакомый список unzip -l.

Сам формат может содержать встроенные поля. Например:

  • JPEG — модель камеры, координаты, время съёмки;
  • PNG — текстовые комментарии;
  • PDF — заголовок, автор, программа создания;
  • DOCX — свойства документа.

Если вопрос просит «комментарий внутри изображения», время текущего файла в папке не поможет: это другой источник.

Основной инструмент — exiftool

exiftool читает метаданные множества форматов. Он есть в олимпиадном образе Kali:

exiftool picture.png

Для показа одинаковых полей с их техническими именами удобно:

exiftool -G -s picture.png

Результат может содержать десятки обычных строк. Не копируйте самую длинную или самую странную автоматически. Сначала свяжите вопрос с названием поля.

Например, если спрашивается запись об инциденте, среди Title, Software и Incident-Data наиболее вероятный источник — Incident-Data. Затем значение всё равно нужно проверить.

Метаданные PNG

PNG состоит из последовательных блоков. В обязательных блоках хранятся размер и пиксели изображения, а в текстовых — пары вида «название поля — значение».

Эти блоки показывает exiftool. Понимание структуры всё равно важно: видимое изображение и текстовый комментарий — разные части одного файла.

Используйте демонстрационный l5_metadata_demo.png из блока файла этого урока. Сначала подтвердите тип и выведите поля:

file l5_metadata_demo.png
exiftool -G -s l5_metadata_demo.png

В демонстрации нужное поле называется Case-Note. У самостоятельного файла другое имя и другое значение.

Демонстрационный PNG для повторения примера
Какая запись точнее всего сохраняет место поля PNG? · 4 б.

Что такое Base64

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

Строка Base64 часто состоит из латинских букв, цифр, +, / и иногда заканчивается на =. Но похожий внешний вид ещё ничего не доказывает. Проверка — успешное декодирование и осмысленный результат.

Командная строка:

printf '%s' '<ЗНАЧЕНИЕ-ПОЛЯ>' | base64 -d

Почему используется printf, а не echo? echo обычно добавляет перевод строки. Для многих декодеров это не мешает, но printf точнее передаёт исходное значение.

Если результатом является JSON, он может выглядеть так:

{"host":"192.0.2.55","port":7443}

Условие может просить ответ в формате host:port. Тогда сдаётся:

192.0.2.55:7443

Скобки, кавычки JSON и названия полей в ответ не входят, если условие не требует обратного.

Маленькая проверка через Python

Для одной строки достаточно base64 -d. Если нужно убедиться, что получен корректный JSON и взять конкретные поля, можно использовать короткий понятный фрагмент:

import base64
import json

encoded = "<ЗНАЧЕНИЕ-ПОЛЯ>"
record = json.loads(base64.b64decode(encoded, validate=True))
print(f"{record['host']}:{record['port']}")

Здесь выполняются три проверки:

  1. строка действительно является Base64;
  2. результат действительно является JSON;
  3. в нём есть нужные поля host и port.

В этом фрагменте Python только проверяет Base64, читает JSON и собирает адрес из двух полей.

Как сохранить происхождение ответа

Представьте, что вы нашли адрес 192.0.2.55:7443. Через несколько вопросов легко забыть, откуда он взялся. Поэтому рядом с ответом запишите путь:

Файл: l5_metadata_demo.png
Место: текстовое поле Case-Note
Преобразование: Base64 -> JSON
Ответ: 192.0.2.55:7443

Короткая запись места может выглядеть так:

l5_metadata_demo.png:tEXt/Case-Note

Здесь tEXt — вид текстового блока PNG, а Case-Note — имя поля. Такая запись полезнее, чем просто Case-Note: она указывает и файл, и место внутри файла.

Что подтверждает, что строка действительно является нужным Base64-значением? · 4 б.

Насколько можно доверять метаданным

Метаданные можно изменить. Поэтому сила вывода зависит от формулировки вопроса.

  • «Какое значение записано в поле Comment?» — поле даёт прямой ответ.
  • «Куда действительно подключался процесс?» — комментарий в картинке даёт версию, которую нужно подтвердить сетевыми или процессными данными.
  • «Когда сделана фотография?» — встроенное время является полезным признаком, но могло быть изменено или не содержать часовой пояс.

Не называйте комментарий доказательством реального события, если он только описывает это событие.

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

Для самостоятельной работы используется l5_photo.png:

file l5_photo.png
exiftool -G -s l5_photo.png

Далее выберите поле по смыслу вопроса, декодируйте его значение и запишите происхождение результата.

Задания разделены намеренно:

  • C13 — назвать точное имя поля;
  • C14 — получить адрес в формате host:port;
  • C15 — указать точное место поля внутри файла.

Так проверяется весь путь, а не случайно скопированная строка.

Реальная задача ВСОШ: «Шифры Нейрополимерной лаборатории»

Открыть исходный PDF с условием и решением. Это задача заключительного этапа 2024–2025 для 9 класса.

Подробный разбор реальной задачи

Участнику выдавали файл definitely_not_a_sanity_check.png. В условии прямо рекомендовались exiftool и base64.

Сначала подтверждаем тип:

file definitely_not_a_sanity_check.png

Изображение не содержало видимого ответа. Следующий шаг:

exiftool -G -s definitely_not_a_sanity_check.png

Среди обычных свойств выделялось поле Comment с необычной строкой. Окончание == позволяло предположить Base64, но окончательная проверка выполнялась декодированием:

printf '%s' '<ЗНАЧЕНИЕ-COMMENT>' | base64 -d

В результате получался флаг в требуемом формате vsosh{...}.

Полная цепочка решения:

PNG -> метаданные -> поле Comment -> Base64 -> флаг

В исходном PDF изображение названо стегоконтейнером, однако скрывать данные в пикселях здесь не требовалось: ответ лежал в открытом служебном поле. Это важный олимпиадный навык — сначала проверять простой и обоснованный путь, а не сразу применять самый сложный инструмент.

Что именно доказали метаданные

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

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

Скачать практический набор: l5_photo.png
C13

C13. Поле с данными инцидента

10 б.

Как называется поле метаданных PNG, в котором хранится закодированная запись инцидента? Регистр важен.

C14

C14. Адрес из metadata

14 б.

Декодируйте значение поля, найденного в C13, проверьте JSON и сдайте адрес в формате host:port.

C15

C15. Точный locator

12 б.

Укажите точное место поля с адресом в формате filename:chunk-type/field.