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

14 мин.00

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

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

На недавнем CTF-турнире команда убила полтора часа на PNG-файл с пейзажем. Прогнали через binwalk — ничего. Strings — мусор. Steghide — «формат не поддерживается» (ещё бы, это PNG). Открыли hex-редактор, побродили по тысячам строк байтов, закрыли. Флаг лежал в младшем бите красного канала — zsteg -a landscape.png вытащил его за три секунды. Проблема не в сложности таска. Проблема — все хаотично прыгали между инструментами вместо последовательного исключения вариантов. Эта статья — тот самый чек-лист, который я собрал после сотен решённых стего-тасков. За год он сэкономил десятки часов на турнирах.

Стеганография в контексте CTF и реальных атак

Стеганография в CTF — категория forensics-заданий, где флаг спрятан внутри обычного на вид файла: картинки, аудиозаписи, PDF или текстового документа. Криптография прячет содержимое, но факт шифрования очевиден. Стеганография маскирует само существование данных. Картинка с котиком выглядит как картинка с котиком — пока не запустишь нужный инструмент.

Навыки поиска скрытых данных в файлах работают далеко за пределами CTF. По классификации MITRE ATT&CK стеганография фигурирует минимум в двух техниках: Steganography (T1001.002, Command and Control) — вредоносное ПО прячет команды C2-сервера внутри изображений на легитимных хостингах, и Steganography (T1027.003, Defense Evasion) — сокрытие полезной нагрузки в медиафайлах для обхода детекции. Отдельно стоит Embedded Payloads (T1027.009) — встраивание исполняемого кода в обычные файлы. Решая CTF-таски, вы фактически тренируете навыки threat hunting и incident response.

В CTF стего-таски работают с тремя основными типами:

  • Изображения — PNG, JPEG, BMP, GIF, TIFF. Самая частая категория: подавляющее большинство стего-тасков на турнирах всех уровней
  • Аудио — WAV, MP3, FLAC, AU. Встречаются реже, но регулярно на средних и сложных уровнях
  • Прочие бинарные файлы — PDF, архивы, прошивки, иногда видео

Универсального инструмента нет: steghide не работает с PNG, zsteg не работает с JPEG, Sonic Visualiser бесполезен для картинок. Поэтому нужен decision tree — алгоритм, который подсказывает, какой инструмент запускать следующим в зависимости от типа файла и результатов предыдущего шага.

Требования к окружению

Прежде чем переходить к практике — подготовьте рабочее окружение.

  • ОС: Linux (Kali 2023.1+ / Parrot / Ubuntu 22.04+) или WSL2 на Windows 10/11. macOS подходит, но часть инструментов потребует сборки из исходников.
  • RAM: 2 ГБ минимум, 4 ГБ рекомендуется. StegSolve и Aperi'Solve потребляют память на файлах крупнее 10 МБ.
  • Зависимости: Python 3.8+, Java JRE 8+ (для StegSolve), Ruby 2.7+ с gem (для zsteg).
  • Установка: базовая тройка ставится одной командой sudo apt install binwalk exiftool steghide. Для zsteg: gem install zsteg. Для stegseek: скачать .deb с GitHub. StegSolve: скачать JAR и запускать через java -jar StegSolve.jar.

В Kali binwalk, exiftool и steghide предустановлены. На чистой Ubuntu всё ставится за пять минут. Отдельно стоит поставить foremost (sudo apt install foremost) — альтернатива binwalk для извлечения файлов, которая иногда находит то, что binwalk пропускает.

Базовая разведка файла: file, strings, exiftool

Главная ошибка новичков в CTF forensics заданиях — сразу кидаться в steghide или zsteg, не проверив элементарные вещи. Типичная ситуация: файл назван flag.png, а внутри — ZIP-архив с изменённым расширением. Или флаг лежит прямо в EXIF-комментарии. Системный подход начинается с трёх команд за десять секунд.

file и strings — проверка очевидного

file определяет реальный тип файла по magic bytes (сигнатуре в заголовке), полностью игнорируя расширение. Запускайте первой всегда: file challenge.png. Если результат — PNG image data, 800 x 600, 8-bit/color RGBA, файл действительно PNG. Но если file покажет Zip archive data или JPEG image data при расширении .png — расширение врёт, и дальнейший анализ нужно строить от реального типа.

Дальше — strings. Утилита вытягивает читаемые ASCII-строки из бинарного файла. Запуск: strings -n 8 challenge.png | grep -iE "flag|ctf|key|pass". Ключ -n 8 отсекает строки короче 8 символов, убирая мусор. На лёгких тасках флаг бывает дописан в конец файла обычным текстом — strings найдёт его мгновенно. Не нашёл — двигаемся дальше. Но пропускать этот шаг нельзя.

[Применимо: любой уровень сложности, любой тип файла]

exiftool — анализ метаданных файлов

exiftool challenge.jpg выводит полный набор метаданных: автора, программу создания, GPS-координаты, дату съёмки, комментарии и десятки специфичных для формата полей. В CTF флаг регулярно прячут в полях Comment, Artist, Copyright, Description или XMP-данных.

Частый паттерн — флаг закодирован в Base64 и записан в поле Comment. Видите строку вроде Q1RGe2ZsYWdfaW5fZXhpZn0= — декодируйте через echo "..." | base64 -d. Ещё один приём — GPS-координаты, ведущие к точке на карте, где записан флаг (чаще в OSINT-тасках, но встречается и в стего).

exiftool работает не только с изображениями. PDF, DOCX, MP3, MP4 — везде есть метаданные, и везде может быть спрятана информация.

Ограничение: если автор таска очистил метаданные командой exiftool -all= file.jpg, инструмент вернёт минимум полей. Это нормально — переходите к следующему шагу.

Поиск скрытых данных в изображениях

Изображения — основной тип файлов в стего-тасках. Три вектора сокрытия: вложенные файлы (append/embed), манипуляция пикселями (LSB), модификация структуры формата (PNG padding, альфа-канал).

binwalk — извлечение вложенных файлов из картинок

binwalk сканирует файл, сопоставляя байты с базой сигнатур известных форматов. Классический приём создателей тасков — приклеить ZIP-архив, другое изображение или ELF-бинарник в конец JPEG/PNG. Визуально картинка отображается нормально (рендерер читает до маркера конца и останавливается), а binwalk видит вторую сигнатуру.

Запуск: binwalk challenge.jpg. Типичный вывод при обнаружении вложенного файла:

DECIMAL       HEXADECIMAL     DESCRIPTION
0             0x0             JPEG image data, JFIF standard 1.01
45892         0xB344          Zip archive data, at least v2.0
45990         0xB3A6          End of Zip archive, footer length: 22

С offset 0xB344 начинается ZIP-архив. Извлечение: binwalk -e challenge.jpg создаст папку _challenge.jpg.extracted. Внутри архива часто лежит текстовый файл с флагом или ещё одно изображение для следующего этапа — матрёшка.

Альтернатива — foremost -i challenge.jpg. foremost восстанавливает файлы по заголовкам и футерам и хорошо работает с PNG. Если binwalk извлёк повреждённый файл — попробуйте foremost.

Предусловия: работает с любыми бинарными файлами. Не требует знания пароля.

Когда binwalk не работает: вложенные данные зашифрованы или обфусцированы — сигнатура не совпадает. Бывают и ложные срабатывания: случайная последовательность байт может совпасть с сигнатурой LZMA или gzip. Всегда проверяйте извлечённые файлы через file.

steghide — как использовать для JPEG и BMP

steghide — классика стеганографии, встраивает данные с помощью статистически устойчивого алгоритма. Поддерживает JPEG, BMP, WAV и AU — и только их. Больше ничего, не пытайтесь.

Извлечение: steghide extract -sf challenge.jpg. Программа запросит пароль (passphrase). Первое действие — нажать Enter, не вводя ничего. Пустой пароль — самая частая точка, на которой новички ломаются: видят запрос passphrase, теряются и переключаются на другой инструмент. На тасках easy и medium пустой пароль работает на удивление часто.

Предварительная проверка без извлечения: steghide info challenge.jpg покажет наличие встроенных данных, размер и метод шифрования.

Предусловия: файл — JPEG, BMP, WAV или AU. Для PNG steghide бесполезен, даже не тратьте время.

Ограничение: если пароль непустой и неизвестен — steghide не поможет, нужен брутфорс (см. раздел про stegseek ниже).

zsteg и StegSolve — LSB стеганография в PNG

LSB (Least Significant Bit) — техника записи данных в младшие биты значений цветовых каналов пикселей. Визуально изображение не меняется: глаз не различает разницу между значениями канала 100 и 101. Но в этих младших битах может быть закодирован текст, файл или другое изображение.

zsteg — главный инструмент для обнаружения LSB стеганографии в PNG и BMP. Ключ -a запускает полный перебор: каналы (R, G, B, A), порядок бит (LSB/MSB), направление обхода (строки/столбцы). Пример вывода:

b1,r,lsb,xy         .. text: "CTF{hidden_in_lsb}"
b1,rgb,lsb,xy       .. file: "flag.txt"
b2,g,msb,xy         .. [nothing interesting]

Первая строка: флаг в первом бите красного канала, порядок LSB, обход по строкам. Для прицельного извлечения: zsteg -E "b1,r,lsb,xy" challenge.png > extracted.txt.

StegSolve — Java-приложение с GUI для визуального анализа слоёв. Открываете файл и переключаете фильтры стрелками: Red plane 0, Green plane 0, Blue plane 0 и далее по битам. На определённом слое может проявиться текст, QR-код или контур, невидимый на оригинале. Интерфейс у StegSolve — привет из 2005 года, но свою работу делает.

Ключевые функции StegSolve для CTF: - Побитовый просмотр — переключение слоёв стрелками на основном экране - Data Extract — выбор конкретных бит каналов для извлечения данных в текстовом виде - Image Combiner — наложение двух изображений для поиска различий (когда дан оригинал и стего-версия) - Frame Browser — покадровый просмотр GIF, где флаг может прятаться в одном из кадров

Предусловия: zsteg — только PNG и BMP. StegSolve открывает большинство растровых форматов.

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

PNG padding и альфа-канал — продвинутые техники

На тасках среднего и высокого уровня стандартные инструменты могут не сработать. Тут начинается работа руками.

PNG padding за границами картинки. Автор таска берёт PNG, дописывает секретные данные в нижнюю часть изображения, а затем уменьшает значение высоты в блоке IHDR и пересчитывает CRC. Рендерер показывает только верхнюю часть, но данные остаются в файле. Обнаружить трюк можно, сравнив заявленные размеры в IHDR с реальным объёмом данных в блоках IDAT. Если данных больше нужного — часть скрыта. Исправьте высоту в hex-редакторе (первые четыре байта после метки IHDR — ширина, следующие четыре — высота), пересчитайте CRC — и скрытая часть проявится.

Кто понимает структуру PNG (IHDR → IDAT → IEND), тот сразу замечает аномалию в размере чанков. Кто не понимает — прогоняет десять инструментов и пишет в чат «таск на гессинг».

Стеганография в альфа-канале. PNG поддерживает канал прозрачности (alpha). Если все пиксели имеют alpha = 255 (полная непрозрачность), канал визуально невидим, но в нём могут быть записаны данные. zsteg проверяет альфа-канал при запуске с -a, а StegSolve показывает его через фильтр Alpha plane 0.

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

Стеганография в аудио файлах

Аудио-стеганография встречается реже картинок, но регулярно попадается на турнирах среднего и высокого уровня. Два основных метода: встраивание данных через steghide (WAV/AU) и визуальное сокрытие в спектрограмме.

Классический приём — записать текст или QR-код прямо в спектрограмму аудиофайла. При прослушивании слышен шум или музыка, а спектральный анализатор показывает буквы. Красиво, если честно.

Sonic Visualiser — специализированный инструмент для анализа аудио. Алгоритм: откройте WAV/MP3, добавьте слой через Layer → Add Spectrogram, подберите цветовую схему и масштаб. Текст флага обычно виден в области 1–8 кГц.

Audacity — запасной вариант. Откройте файл, переключите отображение с Waveform на Spectrogram (выпадающее меню у названия дорожки). Качество хуже Sonic Visualiser, но для грубой проверки хватит.

Не забывайте: прежде чем открывать спектральный анализатор, попробуйте steghide extract -sf audio.wav с пустым паролем. Если данные встроены через steghide — спектрограмма не нужна.

Для продвинутых тасков есть WavSteg — Python-инструмент для извлечения данных из LSB аудиосэмплов: python3 WavSteg.py -r -s audio.wav -o output.txt. Встречается редко, но полезно знать о существовании.

Ограничение: спектрограммный анализ бесполезен, если данные скрыты не визуально, а в младших битах сэмплов. Sonic Visualiser не поддерживает автоматическое извлечение — только визуальный анализ.

Брутфорс паролей и автоматизация анализа

Когда steghide требует пароль, подсказок нет и пустой пароль не подошёл — время для перебора.

stegseek — быстрый подбор паролей steghide

stegcracker challenge.jpg rockyou.txt — классический инструмент, перебирающий пароли из словаря через steghide. Работает, но мучительно медленно: steghide не оптимизирован для массового перебора.

stegseek — замена stegcracker на C++, работающая в сотни раз быстрее. Весь rockyou.txt (14 миллионов записей) прогоняется за секунды, а не часы. Запуск: stegseek challenge.jpg rockyou.txt. Установка — скачать .deb с GitHub-репозитория проекта. Разница в скорости настолько дикая, что stegcracker после stegseek ощущается как dial-up после оптоволокна.

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

Aperi'Solve — агрегатор инструментов стеганографии CTF

Aperi'Solve (aperisolve.com) — веб-сервис, который автоматически прогоняет загруженный файл через целый набор инструментов: exiftool, binwalk, strings, zsteg, steghide (с пустым паролем), foremost и визуальный анализ по слоям. Результат — одна страница со всеми находками.

Для тасков easy Aperi'Solve часто решает задачу полностью: загрузил файл, пролистал результаты, нашёл флаг. Для medium и hard — экономит время на первичном анализе.

Ограничение: онлайн-сервис. Не подходит для закрытых CTF и работы с конфиденциальными артефактами. Не поддерживает аудио. Бывает перегружен во время крупных турниров — как раз когда нужен больше всего.

Decision tree — какой инструмент для какого файла

Вместо хаотичного перебора — чёткий алгоритм, минимизирующий время на 90% стего-тасков.

Шаг 1 (всегда, любой файл): file → strings -n 8 ... | grep flag → exiftool. Три команды, десять секунд.

Шаг 2 (всегда): binwalk. Нашёл вложенные файлы — binwalk -e для извлечения.

Шаг 3 (по формату):

Формат Инструмент Действие
JPEG steghide Извлечение с пустым паролем, затем stegseek
PNG zsteg zsteg -a для полного перебора каналов
BMP zsteg + steghide Оба инструмента последовательно
WAV/AU steghide + Sonic Visualiser Извлечение + спектрограмма
MP3/FLAC Sonic Visualiser Спектрограмма для визуальных паттернов
GIF StegSolve Frame Browser для покадрового анализа

Шаг 4 (если предыдущие шаги не дали результата): - StegSolve — ручной перебор битовых слоёв - stegseek — брутфорс пароля steghide по rockyou.txt - Hex-редактор (xxd, HxD) — ручной поиск данных после маркера конца файла - Aperi'Solve — автоматическая проверка, если не использовалась ранее

Ограничения инструментов и типичные ошибки новичков

Инструмент Форматы Не работает с Типичная ловушка
steghide JPEG, BMP, WAV, AU PNG, GIF, MP3, TIFF Не пробуют пустой пароль
zsteg PNG, BMP JPEG, аудио, GIF Ложные срабатывания при шуме
binwalk Любые бинарные — Ложные сигнатуры LZMA/gzip
exiftool Практически все — Очищенные метаданные
StegSolve Растровые изображения Аудио, видео Ручной перебор, требует Java
stegcracker JPEG, BMP, WAV, AU PNG Крайне медленный

Пять ошибок, которые стоят часов на турнире:

  1. Не запускают file первым. Файл с расширением .png может быть ZIP-архивом. Всегда проверяйте реальный тип по magic bytes.
  2. Не пробуют пустой пароль в steghide. На лёгких тасках это решает задачу мгновенно — просто нажмите Enter.
  3. Запускают steghide на PNG. steghide принципиально не поддерживает этот формат. Для PNG нужен zsteg. Я видел, как люди тратили на это по двадцать минут, прежде чем прочитать man page.
  4. Игнорируют описание задания. Подсказка к паролю или методу часто спрятана в тексте или названии файла. Имя use_rockyou_on_me.jpg — прямой хинт на брутфорс.
  5. Не смотрят конец файла в hex-дампе. Данные бывают дописаны после маркера конца (FF D9 для JPEG, чанк IEND для PNG). Ни один автоматический инструмент их не подхватит, а xxd challenge.jpg | tail -20 покажет всё.

Отдельная категория — нестандартные таски, где чек-лист не спасёт: программы на эзотерическом языке Piet (где изображение — это код), данные в невидимых Unicode-символах (zero-width steganography), стеганография в разнице между двумя почти идентичными файлами. Тут нужно понимание принципов, а не знание кнопок.

Минилаб для самостоятельной отработки

Закрепить навыки можно за пять минут, создав тренировочный набор файлов:

  1. Возьмите JPEG. Спрячьте текст: steghide embed -cf photo.jpg -ef secret.txt -p "". Извлеките обратно — убедитесь, что workflow работает.
  2. Склейте PNG и ZIP: cat image.png archive.zip > challenge.png. Проверьте, что binwalk challenge.png находит оба файла.
  3. Скачайте StegSolve, откройте любой PNG и пройдитесь по битовым слоям — привыкните к интерфейсу до турнира, а не во время.
  4. Для аудио: откройте WAV в Sonic Visualiser, добавьте спектрограмму — запомните, как выглядят визуальные паттерны и в какой области частот искать текст.

Готовые стего-таски для тренировки есть на picoCTF (категория forensics, уровни easy–medium) и на HackTheBox в разделе Challenges → Stego.

Стеганография в CTF воспринимается многими как лотерея — запустил десяток инструментов, какой-то сработал, повезло. Не сработал — «таск на гессинг, авторы криворукие». За три года решения стего-тасков на десятках турниров я вижу другую картину: люди учат кнопки вместо форматов. Кто понимает структуру PNG (IHDR → IDAT → IEND), тот сразу замечает аномалию в размере IDAT-чанков. Кто помнит, что JPEG заканчивается маркером FF D9, тот проверит данные после маркера раньше, чем запустит steghide. Инструменты автоматизируют рутину, но не заменяют понимание.

С ростом популярности агрегаторов вроде Aperi'Solve авторы тасков осознанно усложняют задачи: кастомные алгоритмы встраивания, многослойное вложение, стеганография с шифрованием поверх LSB. Через пару лет стандартный набор binwalk + steghide + zsteg будет закрывать только категорию easy. Для остального потребуется умение писать собственные скрипты извлечения на Python с библиотекой PIL — побитовый разбор каналов, нестандартные порядки обхода пикселей, восстановление данных из повреждённых контейнеров. Кто вкладывается в понимание форматов и базовый скриптинг сейчас — тот будет решать стего и через два года, когда чек-листы из статей перестанут работать. Потренируйтесь на кошках — возьмите любой PNG, напишите десять строк на Python с PIL, которые вытягивают младший бит каждого пикселя. Когда поймёте, как это работает изнутри, zsteg перестанет быть чёрной коробкой.

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

Поделиться

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

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

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

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

Pwntools для начинающих: buffer overflow на CTF

13 мин.

4

Pwntools для начинающих: buffer overflow на CTF

Пошаговый разбор ret2win: установка pwntools, поиск offset через cyclic, написание эксплойта на Python за 8 строк. Отладка через GDB и типичные ошибки новичков.

27 СЕНТЯБРЬ, 2026

Криптография для CTF для начинающих: практика

13 мин.

6

Криптография для CTF для начинающих: практика

Как распознать Base64 за секунду, сломать шифр Цезаря брутфорсом и подобрать XOR-ключ: Python-скрипты, CyberChef и пошаговый алгоритм для крипто-тасков CTF.

26 СЕНТЯБРЬ, 2026

Burp Suite для начинающих: от прокси до флага

12 мин.

7

Burp Suite для начинающих: от прокси до флага

Пошаговое руководство: настройка Burp Suite с FoxyProxy, перехват и модификация HTTP-запросов, Repeater, Intruder — решаем web CTF таски за минуты вместо часов.

26 СЕНТЯБРЬ, 2026