
Forensics на CTF — категория, которую новички обходят стороной, потому что «скучно, это же просто файлы». А потом те же новички зависают на таске, где флаг лежит в поле Comment картинки. Одна команда exiftool challenge.file — и строка на экране. Секунды вместо часов.
На picoCTF, root-me и десятках других площадок forensics-задачи стабильно прячут флаги в метаданных: Comment в EXIF, Author в PDF, удалённый текст в Track Changes внутри .docx. Проблема — русскоязычные гайды показывают один пример с GPS-координатами в JPEG и на этом всё. PDF-объекты, Office XML, нестандартные XMP-теги, подмена thumbnail — за кадром. Ниже — полный workflow извлечения метаданных из трёх ключевых категорий файлов с разбором вывода exiftool построчно и описанием альтернативных инструментов.
Метаданные — информация о файле, встроенная в сам файл. В зависимости от формата они живут в разных контейнерах, и каждый — потенциальное место для флага.
EXIF (Exchangeable Image File Format) — стандарт для JPEG, TIFF, RAW. Модель камеры, дата съёмки, параметры экспозиции, GPS-координаты. По данным исследования «Forensic Value of Exif Data» (SciEPublish, 2025), EXIF автоматически генерируется устройством и включает десятки полей, часть которых обычный пользователь никогда не видит. Именно эти невидимые поля (Comment, UserComment, Artist) становятся контейнерами для флагов.
XMP (Extensible Metadata Platform) — формат от Adobe, встраиваемый в JPEG, PNG, PDF, PSD. История редактирования, авторство, произвольные пользовательские поля. XMP — XML-структура, и её можно обнаружить даже через strings по характерному тегу <x:xmpmeta>.
IPTC — используется в фотожурналистике. Поля Caption, Keywords, City — ещё один уровень метаданных, который составители CTF иногда задействуют.
PDF Internal Metadata — PDF хранит метаданные в двух местах: Info Dictionary (Author, Creator, Producer, CreationDate) и XMP-поток внутри объектов. Сам PDF — контейнер с нумерованными объектами, каждый из которых может содержать встроенные файлы, JavaScript или скрытые потоки данных.
Office XML Properties — файлы .docx, .xlsx, .pptx это ZIP-архивы. Внутри XML-файлы: docProps/core.xml (автор, дата, ревизия), docProps/app.xml (приложение, общее время редактирования) и word/document.xml (текст с историей правок). Настоящая матрёшка.
В forensics CTF заданиях метаданные используют тремя способами: прямой флаг в поле Comment/Artist/Copyright; подсказка для следующего шага (GPS-координаты города или имя автора как пароль к архиву); скрытые данные в нестандартных полях — base64-строка в MakerNote или кастомном XMP-теге. Trail of Bits CTF Field Guide прямо говорит: «the easy initial analysis step is to check an image file's metadata fields with exiftool» — и это работает чаще, чем кажется.
ExifTool — кроссплатформенная утилита на Perl от Phil Harvey. Читает и пишет метаданные для сотен форматов: JPEG, PNG, PDF, DOCX, MP4, исполняемые файлы и десятки других.
В Kali exiftool предустановлен. На чистой Ubuntu или Debian: sudo apt install libimage-exiftool-perl. На macOS: brew install exiftool. На Windows — standalone-exe с официального сайта exiftool.org. Проверка: exiftool -ver — версия не ниже 12.x, иначе часть тегов может не читаться.
Базовый запуск: exiftool challenge.jpg. Утилита выводит все найденные теги в формате «ИмяТега : Значение». Вывод может занимать десятки строк. Для CTF ключевые поля в порядке приоритета:
exiftool -gps:all challenge.jpg.exiftool -b -ThumbnailImage challenge.jpg > thumb.jpg. Иногда thumbnail содержит совсем другое изображение — классический CTF-приём.Типичный CTF-сценарий: получен файл suspicious.jpg, нужно найти флаг.
Шаг 1 — определяем реальный формат. Прежде чем запускать exiftool, проверяем: file suspicious.jpg. Если утилита говорит JPEG image data — формат совпадает с расширением. Если data — расширение врёт. Команда file опирается на magic bytes: JPEG начинается с FF D8 FF, PNG — с 89 50 4E 47, PDF — с 25 50 44 46. Если file показывает «data» — смотрите первые байты вручную через xxd suspicious.jpg | head -5 и сравнивайте с таблицей сигнатур.
Шаг 2 — извлекаем метаданные. Запускаем exiftool suspicious.jpg и изучаем вывод:
ExifTool Version Number : 12.76
File Name : suspicious.jpg
File Size : 2.1 MB
MIME Type : image/jpeg
Camera Model Name : Canon EOS 5D Mark IV
GPS Latitude : 48 deg 51' 24.00" N
GPS Longitude : 2 deg 21' 7.00" E
Comment : flag{m3tadata_1s_th3_k3y}
User Comment : Check the thumbnail too
Флаг лежит прямо в поле Comment. GPS-координаты указывают на Париж — если задание просит город, ответ очевиден. User Comment намекает: нужно проверить thumbnail.
Шаг 3 — извлекаем thumbnail. Команда exiftool -b -ThumbnailImage suspicious.jpg > thumb.jpg сохраняет встроенную миниатюру в отдельный файл. Если при открытии thumb.jpg вы видите другое изображение — это вторая часть задания. Запустите exiftool thumb.jpg для анализа метаданных уже самой миниатюры.
Шаг 4 — нестандартные поля. Флаг может скрываться в менее очевидных тегах. Используйте exiftool -G -s -u suspicious.jpg: флаг -G добавляет группу тега, -s показывает короткие имена, -u включает неизвестные теги. Последний — критически важен: он выводит теги, которые exiftool не распознал по имени, но вытащил из бинарной структуры файла.
Шаг 5 — GPS и геолокация. Для задач на определение местоположения exiftool выводит координаты в формате градусы-минуты-секунды. Чтобы получить десятичный формат для Google Maps: exiftool -n -gps:all suspicious.jpg. Флаг -n отключает конвертацию и показывает числовые значения — копируете прямо в строку поиска карт.
PNG формально не поддерживает EXIF. Но PNG хранит метаданные в текстовых чанках: tEXt, zTXt (сжатый), iTXt (Unicode). ExifTool читает их все. Современные телефоны и редакторы ещё и внедряют XMP-блок в PNG, который exiftool тоже парсит. Если exiftool на PNG-файле показывает пустой вывод — используйте strings challenge.png | grep -i flag как запасной вариант: текстовые чанки PNG видны через strings. Именно так устроена задача «EXIF - Metadata» на root-me: PNG-файл содержит GPS Position и другие атрибуты, невидимые в стандартных свойствах Windows, но доступные через exiftool.
PDF — один из самых недооценённых форматов в CTF forensics. Все гоняют EXIF в картинках, а PDF-файлы тем временем прячут больше: встроенные файлы, JavaScript-код, скрытые объекты и невидимый текст.
ExifTool на PDF. Запуск exiftool document.pdf показывает базовые метаданные: Author, Creator, Producer, Create Date, Modify Date, Page Count. В CTF флаг может находиться в любом из этих полей. Поле Producer содержит название программы-генератора PDF — подсказка к формату или методу создания файла.
Глубокий анализ. ExifTool читает только метаданные верхнего уровня. Для внутренней структуры PDF нужны утилиты Didier Stevens. Первая — pdfid document.pdf — выводит статистику по ключевым словам PDF: /JS (JavaScript), /OpenAction (автозапуск при открытии), /EmbeddedFile (вложенные файлы), /Encrypt (шифрование). Если pdfid показывает /EmbeddedFile 1 — внутри PDF спрятан файл. Вторая — pdf-parser document.pdf — разбирает PDF по объектам. Каждый объект пронумерован и может содержать поток данных. Команда pdf-parser --object 5 document.pdf покажет содержимое объекта №5, а с флагом --filter декомпрессирует потоки (FlateDecode, ASCIIHexDecode). Trail of Bits CTF Field Guide прямо рекомендует pdf-parser для анализа PDF в CTF.
Workflow для PDF-таска: запустите pdfid challenge.pdf и ищите ненулевые значения у /EmbeddedFile, /JS, /OpenAction. Если /EmbeddedFile больше нуля — найдите объект с вложением через pdf-parser --search /EmbeddedFile challenge.pdf, затем вытащите его командой pdf-parser --object N --filter --dump embedded.bin challenge.pdf, где N — номер найденного объекта.
Невидимый текст. В PDF текст может быть написан белым цветом на белом фоне или размещён за пределами видимой области страницы. ExifTool такое не покажет. Используйте pdftotext document.pdf - для извлечения всего текстового контента, включая невидимый. Если pdftotext выдаёт больше текста, чем видно при открытии — флаг в невидимой части.
Файлы Microsoft Office формата OOXML (2007+) — ZIP-архивы. Файлы .docx, .xlsx, .pptx распаковываются стандартной командой unzip. Для анализа метаданных Office-документов это ключевое знание.
Шаг 1 — распаковка. Команда unzip -d docx_contents report.docx создаёт каталог со следующей структурой:
docx_contents/
├── [Content_Types].xml
├── _rels/
├── docProps/
│ ├── core.xml (автор, дата, ревизия)
│ └── app.xml (приложение, время редактирования)
└── word/
├── document.xml (основной текст и Track Changes)
└── media/ (встроенные изображения)
Шаг 2 — core.xml. Этот файл содержит Dublin Core метаданные: dc:creator (автор), dc:title, dc:description, cp:lastModifiedBy (последний редактор), cp:revision (номер ревизии), dcterms:created и dcterms:modified. Флаг может быть в любом из этих полей. Часто dc:creator содержит имя, являющееся ответом на задание, а dc:description хранит base64-строку.
Шаг 3 — app.xml. Здесь: Application (например, «Microsoft Office Word»), AppVersion, TotalTime (общее время редактирования в минутах), Pages, Words, Characters. Поле TotalTime с подозрительным значением вроде 31337 минут (leet speak) — привет от составителей.
Шаг 4 — Track Changes (история правок). Если автор документа включал отслеживание изменений, удалённый текст сохраняется в document.xml внутри тегов <w:del>. Этот текст не виден при обычном открытии, но легко вытаскивается из XML. Ищите <w:delText> через grep -oP '<w:delText>[^<]+' word/document.xml — удалённые фрагменты могут содержать флаг или часть флага.
Шаг 5 — встроенные медиафайлы. Каталог word/media/ содержит все изображения из документа. Каждое можно прогнать через exiftool — составители CTF иногда прячут второй флаг в метаданных встроенного изображения. Не забывайте про этот уровень вложенности.
ExifTool тоже читает метаданные Office-документов без распаковки: exiftool report.docx покажет Author, Last Modified By, Create Date. Но для доступа к Track Changes и media-файлам распаковка через unzip необходима.
ExifTool — основной инструмент извлечения метаданных, но не единственный. В зависимости от задачи другие утилиты справляются лучше.
mat2 (Metadata Anonymisation Toolkit) — утилита для удаления метаданных, которая заодно показывает, что в файле есть. Запуск mat2 -s challenge.jpg (флаг -s — show metadata) выводит список полей. Полезна как перекрёстная проверка: если exiftool что-то пропустил, mat2 может обнаружить метаданные в экзотических форматах.
Python + Pillow для программного EXIF-извлечения. Когда задача требует обработки пачки файлов или извлечения конкретного поля по скрипту — Python с библиотекой Pillow решает задачу. Trail of Bits CTF Field Guide называет Python основным скриптовым языком для forensics. По данным EN-источника (Medium, foysol60s), «Both ExifTool (Perl) and Pillow (Python) leverage underlying libraries to access and parse the EXIF data» — подходы взаимодополняемы.
from PIL import Image
from PIL.ExifTags import TAGS
img = Image.open("challenge.jpg")
exif_data = img._getexif()
if exif_data:
for tag_id, value in exif_data.items():
tag_name = TAGS.get(tag_id, tag_id)
print(f"{tag_name}: {value}")
Скрипт выводит все EXIF-теги с человекочитаемыми именами. Для CTF-автоматизации оберните его в цикл по файлам из каталога и добавьте фильтрацию по ключевым словам.
Metagoofil для OSINT-разведки. Metagoofil скачивает публичные документы (PDF, DOCX, XLSX) с целевого домена через Google и автоматически вытаскивает из них метаданные: имена пользователей, email-адреса, пути к файлам. В чистом CTF forensics он редко нужен — файлы уже даны. Но в заданиях с OSINT-компонентом Metagoofil незаменим для osint анализа файлов.
strings + grep как последний рубеж. Когда exiftool не показывает ничего интересного (метаданные очищены или повреждены), возвращайтесь к базовому: strings -n 8 challenge.file | grep -iE "flag|ctf|key|pass". Грубый метод, но на CTF он работает регулярно. Trail of Bits подтверждает: strings — «a first-pass technique that reveals plaintext flags or encoded data».
| Задача | Инструмент | Почему именно он |
|---|---|---|
| Первый проход по любому файлу | exiftool | Максимальный охват форматов |
| Массовая обработка файлов | Python + Pillow | Скриптуемость |
| Глубокий анализ PDF | pdf-parser, pdfid | Доступ к объектам и потокам |
| Office revision history | unzip + grep по XML | Прямой доступ к Track Changes |
| Перекрёстная проверка | mat2 | Альтернативный парсер |
| OSINT по домену | Metagoofil | Автоматический сбор с веба |
| Очищенные метаданные | strings + grep | Работает когда всё остальное не сработало |
Составители CTF не ограничиваются стандартными полями Comment и Artist. Данные прячут в нестандартных EXIF-тегах, и знание этих приёмов отличает опытного участника от новичка.
MakerNote — блок метаданных, специфичный для производителя камеры. ExifTool парсит MakerNote большинства камер (Canon, Nikon, Sony и десятков других). Кастомные данные внутри могут выглядеть как мусор — но если MakerNote содержит строку, похожую на base64 (заканчивается на = или ==), декодируйте: echo "строка" | base64 -d.
XMP произвольные поля. Стандарт XMP позволяет создавать пользовательские пространства имён. Тег вроде <ctf:secret> не покажет ни один просмотрщик, но exiftool с флагом -G его выведет. Ищите нетипичные группы тегов в выводе — всё, что не относится к стандартным EXIF, IPTC или XMP-группам.
ICC Profile — цветовой профиль изображения. Редко, но данные можно внедрить в Description-поле ICC-профиля. ExifTool показывает ICC-теги в группе ICC_Profile.
Base64, hex и другие кодировки. Частый приём стеганографии в метаданных: флаг закодирован в base64 и помещён в текстовое поле. Строка ZmxhZ3t0ZXN0fQ== в поле Comment — это flag{test}. Также встречаются hex-строки: 666c61677b... — ASCII-коды символов flag{...}. Менее типичный, но возможный вариант — ROT13. Если поле содержит нечитаемый, но печатный текст — пробуйте все стандартные декодирования. Не угадали с первого раза? Попробуйте CyberChef — закиньте строку и нажмите «Magic», он сам подберёт кодировку.
В реальных расследованиях злоумышленники используют технику Timestomp (T1070.006, MITRE ATT&CK) для подмены временных меток файлов. На CTF этот приём работает в обе стороны: составители могут намеренно поставить подозрительные даты (файл «создан» в 1970 году или в 2099-м) как подсказку. Если exiftool показывает Create Date, резко отличающийся от Modify Date или File Modification Date — это сигнал копать глубже.
ExifTool умеет не только читать, но и записывать временные метки: exiftool -AllDates="2023:01:01 00:00:00" file.jpg перезаписывает все даты. В CTF-контексте это означает, что дата в EXIF — ненадёжный индикатор, её легко подменить. В Atomic Red Team есть три теста для T1070.006: изменение access timestamp, modification timestamp и creation timestamp через shell-команды на Linux и macOS.
Для обнаружения Timestomp в реальных расследованиях существуют Sigma-правила из репозитория SigmaHQ: proc_creation_lnx_touch_susp.yml отслеживает подозрительные вызовы touch в Linux, posh_ps_timestomp.yml детектирует манипуляции с файловыми атрибутами через PowerShell, win_security_susp_time_modification.yml фиксирует подозрительные изменения времени в Windows Security Log. Всего по тегу T1070.006 доступно 6 Sigma-правил для трёх платформ: Linux, Windows, macOS.
Метаданные и платформы передачи. Исследование «Forensic Value of Exif Data» (SciEPublish, 2025, 15 цитирований) установило, что разные платформы по-разному обращаются с метаданными при передаче файлов. Мессенджеры вроде WhatsApp и Signal пережимают картинки и удаляют значительную часть EXIF. Передача через email-вложения или USB обычно сохраняет метаданные целиком. Для CTF это контекст: если в легенде задания файл «был скачан с сервера» или «передан по email» — метаданные на месте. Если «получен через мессенджер» — часть данных могла быть удалена, и это часть головоломки.
Этот алгоритм работает для любых задач на извлечение метаданных:
file challenge.ext — определяем реальный формат по magic bytesexiftool challenge.ext — читаем все метаданные, ищем Comment, Author, GPS, нестандартные тегиexiftool -b -ThumbnailImage challenge.ext > thumb.jpg — вытаскиваем thumbnail (для изображений)pdfid challenge.pdf — ищем /EmbeddedFile, /JS — затем pdf-parser для извлеченияunzip -d out challenge.docx — читаем docProps/core.xml, ищем <w:delText> в document.xmlstrings -n 8 challenge.ext | grep -iE "flag|ctf|base64" — если метаданные пустыecho "строка" | base64 -dАлгоритм циклический. Файлы-матрёшки — норма в forensics CTF: архив внутри PDF, изображение внутри .docx, флаг в метаданных вложенного изображения. Каждый извлечённый файл прогоняется по полному чеклисту заново. Trail of Bits описывает этот подход как стандартный: от определения типа файла к метаданным, строкам, hex-анализу и file carving — и снова по кругу для каждого извлечённого слоя.
Многие начинают с web и crypto — кажется, что там больше «хакерства». А forensics воспринимается как скучный разбор файлов. На практике именно forensics даёт стабильные очки на соревнованиях: задачи на метаданные решаются за минуты, не требуют знания конкретного фреймворка или языка.
Большинство гайдов на русском останавливаются после одного примера с GPS в JPEG. PDF, Office, нестандартные XMP-теги — всё это за рамками типичной статьи, но именно эти источники дают флаг, когда поле Comment пустое.
Совет: заведите каталог с тестовыми файлами разных форматов (JPEG с GPS, PDF с embedded files, DOCX с Track Changes) и прогоняйте каждый через exiftool — не ради флага, а чтобы запомнить, как выглядит нормальный вывод. Когда на CTF увидите аномалию — узнаете её мгновенно. Это ощущение формируется только на реальных задачах — если хочется начать с формата «скачал файл → нашёл флаг», на HackerLab.pro в категории forensics лежат таски всех уровней сложности, нужна только регистрация. Если же хочется не просто решать отдельные таски, а системно пройти базу от нуля — на Codeby School есть IB Basics, где forensics идёт в связке с остальными направлениями ИБ без лишней академичности.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...