Главная / Блог / Стеганография CTF: ищем скрытые данные в файлах

13 мин.00

Стеганография CTF: ищем скрытые данные в файлах

Стеганография CTF: ищем скрытые данные в файлах

Стего-таски — самая алгоритмизированная категория forensics CTF заданий. Шесть утилит в правильном порядке закрывают подавляющее большинство заданий уровня easy и medium: file, exiftool, strings, binwalk, zsteg, steghide. Проблема в том, что большинство русскоязычных гайдов перечисляют их простым списком — без объяснения, когда какой запускать, почему zsteg бесполезен на JPEG и зачем пробовать пустой пароль перед брутфорсом steghide. Я видел, как люди тратят полчаса, натравливая zsteg на JPEG-файл, — сжатие с потерями убивает LSB, там нечего ловить. Ниже — пошаговый разбор каждого инструмента с рабочими командами и логикой переходов между шагами.

Определяем реальный тип файла: утилита file и магические байты

Первое правило стеганографии CTF — не доверяйте расширению. Файл challenge.txt может оказаться PNG-изображением, а photo.jpg — ZIP-архивом с флагом внутри. Авторы тасков подменяют расширения постоянно — дёшево и сердито, но неопытных это тормозит на ровном месте.

Утилита file определяет формат по магическим байтам — сигнатурным последовательностям в начале файла. Запуск элементарный: file challenge.txt. Если ответ — PNG image data, 800 x 600, 8-bit/color RGBA вместо ожидаемого текста — расширение подменено, работайте с картинкой.

Когда file показывает просто data без конкретного типа — файл либо повреждён, либо заголовок изменён намеренно. Лезем в hex: xxd challenge.txt | head -5. Магические байты основных форматов, которые стоит знать наизусть:

  • 89 50 4E 47 — PNG
  • FF D8 FF — JPEG
  • 52 49 46 46 — WAV и другие RIFF-контейнеры
  • 50 4B 03 04 — ZIP-архив
  • 42 4D — BMP
  • 47 49 46 38 — GIF

Если сигнатура не совпадает ни с одним известным форматом, но контекст таска указывает на изображение — заголовок повреждён намеренно. Это отдельная подкатегория стего-тасков: восстанавливаете magic bytes через hex-редактор (HxD на Windows, hexedit на Linux) и продолжаете анализ. На одном CTF мне попался PNG с затёртыми первыми четырьмя байтами — file показывал data, но xxd сразу выдал IHDR чанк на правильном смещении. Вписал 89 50 4E 47 — и картинка открылась.

Когда file показывает неполную картину

file анализирует только начало файла. Если после корректного PNG (за маркером IEND) дописан ZIP-архив — file покажет PNG image data и промолчит о ZIP. С JPEG та же история: данные после маркера FF D9 (конец JPEG-потока) не попадают в анализ. Поэтому одного file недостаточно — binwalk на следующих шагах просканирует весь файл на вложенные структуры. Но первый шаг всегда file: без знания реального формата невозможно выбрать правильный инструмент дальше.

Анализ метаданных файлов: exiftool и скрытые поля

Метаданные — первое место, где прячут флаги на CTF начального уровня. EXIF-теги в JPEG, текстовые чанки tEXt, zTXt, iTXt в PNG, ID3-теги в MP3 — всё это контейнеры, куда можно записать произвольный текст, а стандартные средства просмотра его не покажут.

exiftool читает метаданные практически любого формата: exiftool challenge.jpg. В выводе ищите нестандартные поля: Comment, Artist, Description, User Comment, XP Comment, GPS Position. На forensics CTF заданиях флаг регулярно оказывается в Comment или в пользовательском теге, который авторы добавили вручную.

GPS-геолокация — отдельный класс тасков на стыке стеганографии и OSINT. Если в метаданных есть GPS Latitude и GPS Longitude — координаты указывают на конкретное место, название которого и есть флаг. Классический пример — таск EXIF-Metadata на root-me.org: дана картинка, нужно определить город по GPS-координатам. Координаты вбиваете в Google Maps или OpenStreetMap — и готово.

Нюанс, который сбивает новичков: формат PNG технически не поддерживает EXIF-стандарт. Windows не показывает метаданные в свойствах PNG-файлов. Но PNG хранит аналогичные данные в текстовых чанках (tEXt для нежатого текста, zTXt для сжатого, iTXt для Unicode) — и exiftool их вытаскивает без проблем. Не пропускайте exiftool только потому, что файл — PNG.

Для быстрого поиска флага в метаданных — конвейер с grep: exiftool challenge.png | grep -iE "flag|ctf|key|secret|hint|pass". Это отсекает десятки строк технической информации и оставляет только поля с типичными ключевыми словами. Альтернатива exiftool — утилита exiv2, работает аналогично: exiv2 challenge.jpg.

Строки и hex-анализ: как найти скрытые данные в файле

strings извлекает все читаемые текстовые последовательности из бинарных файлов. Базовый вызов: strings challenge.png | grep -i flag. Флаг может быть дописан в конец файла обычным ASCII-текстом, вставлен между чанками PNG или добавлен в неиспользуемую область JPEG. Простейший вид скрытия данных в файлах, но на CTF начального уровня встречается постоянно.

По умолчанию strings выводит последовательности от четырёх символов. Для коротких флагов снизьте порог: strings -n 3 challenge.png. Будьте готовы к мусору — на трёхсимвольных строках ложных совпадений много. В обратную сторону — strings -n 8 покажет только строки от восьми символов, отсекая большую часть шума.

Если strings ничего не дал — смотрим hex-представление: xxd challenge.png | tail -20. Данные, дописанные после маркера конца файла (IEND в PNG, FF D9 в JPEG), видны в hex-дампе как текст или как сигнатуры других форматов. Тут же обнаруживаются строки в Base64 (характерные наборы A-Za-z0-9+/=) и нестандартные паттерны: повторяющиеся байты, подозрительно длинные нулевые области.

Когда strings даёт ложное чувство безопасности

strings работает построчно — ищет последовательности printable-символов, разделённые непечатаемыми байтами. Если файл сгенерирован программно без переводов строк, вся информация может оказаться в одной гигантской строке с вкраплениями мусора. В таких случаях берите grep -a "flag" challenge.png — прямой поиск подстроки в бинарном файле без построчной разбивки. Тупо, но работает.

Binwalk: извлечение вложенных файлов и анализ архивов

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

Запуск: binwalk challenge.png. Типичный вывод для PNG с вложенным ZIP: binwalk находит PNG-заголовок по смещению 0 и сигнатуру ZIP-архива дальше по файлу. Извлечение: binwalk -e challenge.png — утилита создаёт директорию _challenge.png.extracted с найденными файлами.

# Анализ файла на вложенные структуры
binwalk challenge.png
# Автоматическое извлечение найденных файлов
binwalk -e challenge.png
# Рекурсивное извлечение (файл-в-файле-в-файле)
binwalk -eM challenge.png
# Просмотр результатов
ls _challenge.png.extracted/

Предупреждение, которое сэкономит нервы: binwalk даёт ложные срабатывания. Особенно на JPEG — внутренняя структура JPEG содержит маркеры, которые binwalk интерпретирует как сигнатуры других форматов. Если binwalk показывает десятки «вложенных файлов» в обычном JPEG — это почти наверняка false positives. Проверяйте извлечённые файлы: нулевой размер или невозможность открытия — мусор.

Альтернатива — foremost, восстанавливает файлы по заголовкам и футерам: foremost -i challenge.png. foremost работает лучше, когда binwalk находит сигнатуру, но не может определить границы файла — foremost ищет пару «заголовок + футер» и вырезает данные между ними.

Защищённые архивы и рекурсивный анализ

На CTF средней сложности авторы вкладывают файлы рекурсивно: PNG → ZIP → PNG → ZIP → flag.txt. Матрёшка. Флаг -eM в binwalk обрабатывает такие случаи автоматически — извлекает вложенные файлы до последнего уровня.

Если извлечённый архив защищён паролем — fcrackzip -u -D -p wordlist.txt extracted.zip для перебора по словарю. Распространённый приём авторов: пароль от архива спрятан в метаданных исходного файла. Шаг с exiftool на ранней стадии может дать ответ, который понадобится только здесь — записывайте все подозрительные строки из метаданных. Я на этом обжигался: пролистал exiftool-вывод, дошёл до запароленного ZIP и пришлось возвращаться.

LSB-стеганография в изображениях CTF: zsteg и stegsolve

LSB (Least Significant Bit) — самый распространённый метод стеганографии в изображениях CTF. Суть: младшие биты цветовых каналов (R, G, B) заменяются битами скрытого сообщения. Визуально изображение не меняется — глаз не различает разницу в один бит яркости пикселя.

Для обнаружения LSB-стеганографии в PNG и BMP — zsteg. Ruby-утилита, ставится через gem install zsteg. Основная команда: zsteg -a challenge.png — запускает все доступные методы анализа. zsteg проверяет разные порядки битов (LSB и MSB), разные каналы (RGB, BGR, RBG и так далее), разные направления обхода пикселей (по строкам, по столбцам).

Если zsteg обнаружил payload — извлекаем конкретные данные: zsteg -E "b1,rgb,lsb,xy" challenge.png > extracted.txt. Параметры: b1 — первый (младший) бит, rgb — порядок каналов, lsb — от младшего бита, xy — обход пикселей по строкам слева направо.

Принципиальное ограничение: zsteg работает только с PNG и BMP. На JPEG LSB-анализ через zsteg бесполезен — сжатие с потерями уничтожает младшие биты при каждом пересохранении. Если подозревается стеганография в JPEG — это территория steghide, о нём ниже.

Stegsolve: визуальный анализ битовых плоскостей

Stegsolve — Java-приложение для ручного анализа изображений по отдельным битовым слоям. Запуск: java -jar stegsolve.jar. Программа позволяет переключаться между битовыми плоскостями каждого канала. Если в нулевом бите красного канала спрятан QR-код или текст — при просмотре слоя Red plane 0 он проявится.

Ключевые режимы stegsolve для поиска флага в изображении CTF:

Data Extract — ручной выбор конкретных битов и каналов. Позволяет попробовать нестандартные комбинации, которые zsteg мог пропустить.

Image Combiner — XOR или другие операции над двумя изображениями. Работает, когда в таске даны оригинал и стего-версия: разница покажет именно те пиксели, которые модифицированы для скрытия данных.

Frame Browser — покадровый просмотр GIF-анимаций. Флаг может быть скрыт в одном кадре, мелькающем слишком быстро для глаза.

Stegsolve незаменим, когда zsteg ничего не находит: ручной просмотр битовых плоскостей обнаруживает паттерны, которые автоматический анализ пропускает. Особенно если данные записаны в MSB вместо LSB или используют нестандартный порядок каналов.

Steghide: извлечение данных и брутфорс пароля

steghide — C++-утилита для встраивания и извлечения данных в JPEG, BMP, WAV и AU. В CTF это основной инструмент стеганографии для JPEG — фактически единственный популярный вариант, который корректно работает с этим форматом.

Проверка наличия вложенных данных: steghide info challenge.jpg. Утилита сообщит, есть ли встроенный файл, и запросит пароль. Первое действие — попытка извлечения с пустым паролем: steghide extract -sf challenge.jpg -p "". На CTF начального уровня авторы часто оставляют steghide без защиты. Пустой пароль — буквально первое, что нужно попробовать, до любого брутфорса.

Если пароль непустой — два инструмента на выбор:

StegCracker — Python-обёртка над steghide, перебирает пароли из словаря. Ставится через pip install stegcracker, но работает медленно: каждый пароль проверяется через вызов steghide как отдельного процесса.

Stegseek — написан на C++, работает на порядки быстрее StegCracker за счёт прямого доступа к данным steghide без повторных запусков процесса. Если есть выбор — берите stegseek.

# Брутфорс пароля steghide через stegseek
stegseek challenge.jpg /usr/share/wordlists/rockyou.txt
# При успехе: выводит найденный пароль
# Автоматически извлекает данные в challenge.jpg.out

Типичные ошибки на этом шаге: забывают попробовать пустой пароль перед запуском длительного брутфорса и используют маленький словарь. На CTF пароли для steghide обычно берутся из стандартных списков вроде rockyou.txt — нет смысла придумывать что-то экзотическое.

Скрытые данные в аудио: спектрограммы и LSB-кодирование

Аудио-стеганография встречается на CTF реже изображений, но приносит больше очков — авторы считают её сложнее. Два основных метода: визуальная информация в спектрограмме и LSB-кодирование в WAV-сэмплах.

Спектрограмма: скрытые изображения в частотном спектре

Текст или изображение встраиваются в частотный спектр аудиофайла. При обычном прослушивании — шум, гул или обычная музыка. Но при переключении на спектрограмму в аудиоредакторе проявляется скрытая картинка: QR-код, текст с флагом или подсказка.

В Audacity: откройте WAV-файл, кликните на имя дорожки слева → выберите «Spectrogram» вместо «Waveform». Настройте частотный диапазон — данные иногда прячут в ультразвуке выше 15–18 кГц, где ухо ничего не слышит. Sonic Visualiser даёт более гибкое управление: Layer → Add Spectrogram с настройкой окна FFT, цветовой палитры и масштаба частот.

LSB в WAV-файлах

Принцип тот же, что и в изображениях: младшие биты аудиосэмплов заменяются битами секретного сообщения. Для извлечения — WavSteg: python3 WavSteg.py -r -s challenge.wav -o output.txt. Утилита считывает LSB каждого сэмпла и собирает из них исходное сообщение.

Базовые проверки для аудиофайлов — те же, что для изображений: file, strings, exiftool, binwalk. В WAV-файл можно вложить ZIP через конкатенацию, спрятать флаг в метаданных ID3 или дописать ASCII-строку после основных данных. steghide поддерживает WAV и AU — проверяйте через steghide info challenge.wav.

Для MP3 ситуация отличается: сжатие с потерями делает LSB-стего невозможной (как и в JPEG). Если таск содержит MP3 — конвертируйте через ffmpeg -i challenge.mp3 challenge.wav и анализируйте WAV. Но на практике в MP3-тасках данные чаще прячут в спектрограмме или метаданных, а не в LSB.

Стеганография в реальных атаках: связь с MITRE ATT&CK

Стеганография — не только CTF-категория. В реальных атаках она применяется для обхода средств защиты и скрытия коммуникаций. В матрице MITRE ATT&CK стеганография фигурирует минимум в двух техниках:

Steganography (T1001.002, Command and Control) — команды управления прячутся внутри изображений или аудиофайлов, передаваемых через легитимные каналы. Средства сетевого мониторинга видят обычный HTTPS-трафик с картинками и не замечают C2-инструкций, закодированных в пикселях.

Steganography (T1027.003, Defense Evasion) — payload вредоноса встраивается в изображение и извлекается уже на заражённом хосте. Файл выглядит как обычная картинка при статическом сканировании антивирусом — ничего подозрительного.

После извлечения скрытых данных малварь декодирует их на хосте — этот этап описывается техникой Deobfuscate/Decode Files or Information (T1140, Defense Evasion). Связка T1027.003 + T1140 — стандартная цепочка для доставки полезной нагрузки через стеганографию в реальных инцидентах.

Понимание этих техник превращает CTF-навыки в практические: если умеете извлекать данные через zsteg и steghide — понимаете, как атакующие прячут коммуникации. Это основа для построения detection-правил.

Чек-лист для решения стего-тасков на CTF

Последовательность ниже покрывает подавляющее большинство forensics CTF заданий по стеганографии. Порядок не случаен — каждый шаг включается, если предыдущие не дали результата.

Шаг Команда / Инструмент Что ищем Форматы
1 file challenge.* Реальный тип файла Любой
2 exiftool challenge.* Флаг в метаданных, GPS, комментарии Любой
3 strings challenge.* \| grep -i flag ASCII-строки с флагом Любой
4 xxd challenge.* \| tail -20 Данные после конца файла Любой
5 binwalk -e challenge.* Вложенные файлы: ZIP, RAR, PNG Любой
6 zsteg -a challenge.png LSB-стеганография PNG, BMP
7 steghide extract -sf file -p "" Данные steghide (пустой пароль) JPEG, BMP, WAV, AU
8 stegseek file rockyou.txt Брутфорс пароля steghide JPEG, BMP, WAV, AU
9 Stegsolve → битовые плоскости Визуальные паттерны в каналах PNG, BMP, GIF
10 Audacity → Spectrogram Скрытое изображение в спектре WAV, MP3

Если все десять шагов пройдены без результата — вернитесь к шагу 1: возможно, заголовок повреждён намеренно и file определил формат неверно. Или binwalk извлёк файл, к которому нужно применить чек-лист заново — от начала до конца.

Когда стандартный подход не работает

На hard-уровне авторы применяют кастомные алгоритмы: LSB в нестандартном порядке каналов (BGR вместо RGB), стего в альфа-канале PNG, Unicode Zero-Width Characters в текстовых файлах (невидимые символы между обычным текстом), комбинации нескольких методов в одном файле. Чек-лист в таких случаях даёт начальные зацепки — дальше ручной побитовый анализ через Python с библиотекой PIL или прямое чтение байтов.

Стеганография на CTF часто воспринимается как «угадайка» — нет алгоритма, тупо перебирай утилиты и надейся. На практике ровно наоборот: стего — одна из самых предсказуемых категорий. Десять шагов из таблицы — не интуиция, а воспроизводимый процесс. Проблема большинства гайдов в том, что они перечисляют инструменты без логики применения. Новички запускают zsteg на JPEG (бесполезно — сжатие с потерями убивает LSB) или пробуют steghide на PNG (steghide не поддерживает PNG). Каждый инструмент заточен под конкретные форматы и конкретные методы скрытия данных в файлах — понимание этих ограничений важнее заучивания опций.

И ещё одна вещь, которую обычно не проговаривают: навыки стего-анализа переносятся в цифровую форензику и threat hunting практически один к одному. APT-группировки используют стеганографию для C2-коммуникаций (T1001.002) и обхода антивирусов (T1027.003) — это задокументированные техники из MITRE ATT&CK. Решая forensics CTF задания, вы тренируете тот самый набор навыков, который нужен при разборе реальных инцидентов: анализ файловых форматов, побитовый разбор данных, выявление аномалий в структуре файлов. Разница между CTF-игроком и форензик-аналитиком — не в наборе утилит, а в знании, какие артефакты искать на живой системе. Инструменты одни и те же. Попробуйте прогнать чек-лист на тасках со стего-раздела HackerLab — там есть задания от easy до hard, и логика переходов между шагами станет автоматической после пяти-шести решённых тасков.

🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».

Поделиться

0 комментариев

Пожалуйста, войдите, чтобы оставить комментарий.

Загрузка комментариев...

Читайте также

OSINT для CTF: поиск флагов по метаданным

15 мин.

4

OSINT для CTF: поиск флагов по метаданным

Методика решения OSINT-заданий в CTF: Google Dorks, ExifTool, Sherlock, WHOIS и Wayback Machine. Пошаговая цепочка от артефакта до флага

5 СЕНТЯБРЬ, 2026

Небезопасная десериализация RCE в PHP и Python

13 мин.

2

Небезопасная десериализация RCE в PHP и Python

Разбор PHP POP-цепочек и Python pickle на CTF: формат сериализации побайтно, магические методы, PHPGGC, PHAR и типичные ошибки при эксплуатации десериализации

5 СЕНТЯБРЬ, 2026

Повышение привилегий Linux: SUID и sudo на CTF

12 мин.

7

Повышение привилегий Linux: SUID и sudo на CTF

Пошаговая методология повышения привилегий Linux на CTF: SUID-бинари, sudo -l, capabilities, cron. Реальные команды, PATH hijacking, чек-лист из 10 шагов.

4 СЕНТЯБРЬ, 2026