Урок 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. У самостоятельного файла другое имя и другое значение.
Что такое 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']}")
Здесь выполняются три проверки:
- строка действительно является Base64;
- результат действительно является JSON;
- в нём есть нужные поля
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: она указывает и файл, и место внутри файла.
Насколько можно доверять метаданным
Метаданные можно изменить. Поэтому сила вывода зависит от формулировки вопроса.
- «Какое значение записано в поле 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 изображение названо стегоконтейнером, однако скрывать данные в пикселях здесь не требовалось: ответ лежал в открытом служебном поле. Это важный олимпиадный навык — сначала проверять простой и обоснованный путь, а не сразу применять самый сложный инструмент.
Что именно доказали метаданные
В самостоятельном файле метаданные прямо отвечают на вопрос о записанном адресе: известны файл, поле и способ декодирования. Они не доказывают, что соединение с этим адресом действительно состоялось. Для такого вывода понадобился бы сетевой или процессный журнал.
Следующий урок меняет уровень задачи. Там у изображения не будет собственного имени: сначала его придётся обнаружить внутри большого фрагмента данных и извлечь в отдельный файл.
C13. Поле с данными инцидента
Как называется поле метаданных PNG, в котором хранится закодированная запись инцидента? Регистр важен.
C14. Адрес из metadata
Декодируйте значение поля, найденного в C13, проверьте JSON и сдайте адрес в формате host:port.
C15. Точный locator
Укажите точное место поля с адресом в формате filename:chunk-type/field.