
Три часа на стего-таск весом в 100 очков — и ноль результата. На квалификационном CTF я получил PNG-файл с котом, запустил steghide (который PNG не поддерживает в принципе), потом binwalk (нашёл ложные сигнатуры в IDAT-чанках), потом полез в hex-дамп руками. Флаг сидел в LSB красного канала — zsteg вывел его за две секунды. Проблема была не в знании инструментов: каждый из них по отдельности я использовал десятки раз. Проблема — в отсутствии алгоритма: какой инструмент для какого формата, в каком порядке, когда переключаться на следующий. Эта статья — рабочий алгоритм, собранный за полтора года участия в соревнованиях на PicoCTF, HackTheBox CTF и площадках CTFtime.
Стеганография в CTF — категория задач, где данные спрятаны внутри обычных файлов: изображений, аудиозаписей, видео. В отличие от криптографии, где факт шифрования очевиден, стеганография маскирует само наличие скрытого сообщения. Задача участника — обнаружить факт сокрытия и вытащить спрятанное.
Навык разбора стего-задач переносится за пределы соревнований. В реальном мире злоумышленники используют стеганографию в двух сценариях, которые MITRE ATT&CK документирует как отдельные техники:
В CTF-задачах стего-категории чаще всего встречаются три группы файлов:
Изображения (PNG, JPEG, BMP, GIF, TIFF). PNG и BMP — основные кандидаты для LSB-стеганографии, потому что используют сжатие без потерь. JPEG — для steghide-подобных методов, но не для классического LSB: JPEG-сжатие (DCT) разрушает младшие биты.
Аудио (WAV, MP3, FLAC). WAV — основной формат для LSB-вставок и спектрограммных задач. MP3 реже, но встречается в задачах с метаданными или встроенными файлами.
Видео (MP4, AVI). Обычно сводятся к разбору на кадры через ffmpeg -i video.mp4 frame_%03d.png с последующим анализом отдельных фреймов как изображений.
Ниже — последовательность шагов, которая покрывает примерно 90% стего-тасков лёгкого и среднего уровня. Оставшиеся 10% — скриптинг на Python и нестандартные подходы.
steghide, exiftool, binwalk, audacity, ffmpeg — всё из стандартного репозитория Kalizsteg (установка: gem install zsteg)stegseek — форк steghide для брутфорса паролей, доступен на GitHub (RickdeJager/stegseek) и в репозиториях KaliШаг 1 — определение реального типа файла. Расширение может врать. file mystery_file покажет реальный формат по магическим байтам. Если файл называется flag.txt, а file выдаёт PNG image data, 1920 x 1080 — перед вами изображение с подменённым расширением. Две секунды на эту проверку экономят двадцать минут мучений.
Шаг 2 — поиск строк в открытом виде. strings mystery.png | grep -iE "flag|ctf|key|{|}" ищет текстовые данные внутри бинарного файла. На простых тасках флаг бывает буквально дописан в конец файла или спрятан в текстовых чанках. Смешно, но работает чаще, чем хотелось бы.
Шаг 3 — метаданные. exiftool mystery.png показывает все метаданные: EXIF, IPTC, XMP, текстовые чанки PNG (tEXt, iTXt, zTXt). Авторы тасков часто прячут подсказки или сам флаг в полях Comment, Author, Description или GPS-координатах.
Шаг 4 — встроенные файлы. binwalk mystery.png сканирует файл на наличие известных сигнатур (ZIP-архивы, другие изображения, исполняемые файлы). Если binwalk нашёл что-то — binwalk -e mystery.png для извлечения. Но тут есть подвох: binwalk часто генерирует ложные срабатывания на сжатых данных (IDAT-чанки PNG, DCT-данные JPEG). Проверяйте каждый извлечённый файл — если «архив» не открывается, это не повреждение, а фантом.
Шаг 5 — формат-специфичный анализ. Здесь маршрут зависит от типа файла:
zsteg, затем Stegsolve для визуального анализаsteghide extract -sf file.jpg (сначала пустой пароль, потом слова из описания задания)steghide или WavSteg для LSBffmpeg -i anim.gif frame_%03d.png, затем анализ кадров по отдельностиstrings + exiftool для метаданных, конвертация в WAV через ffmpeg для дальнейшего анализаШаг 6 — эскалация. Если пять шагов ничего не дали — скриптинг. Python с библиотекой PIL/Pillow для ручного чтения пикселей, проверка кастомных алгоритмов (XOR-маска, нестандартные битовые плоскости, дописанные данные за IEND-маркером PNG).
Три команды, которые запускаются на любом файле до специализированных инструментов. file определяет формат, exiftool читает метаданные, binwalk ищет встроенные файлы. Эта тройка — фундамент, и в заметной доле тасков флаг находится уже здесь.
Отдельно про exiftool: инструмент активно поддерживается автором (Phil Harvey), работает с сотнями форматов. Помимо стандартных EXIF-полей, он извлекает текстовые чанки PNG, IPTC-блоки, XMP-метаданные и даже миниатюры, встроенные в JPEG. На задачах начального уровня GPS-координаты из EXIF ведут к названию города, которое и оказывается флагом — классический сценарий, описанный на платформе root-me.org. Нюанс: Windows не отображает EXIF у PNG через стандартные свойства — используйте exiftool из командной строки, не полагайтесь на графический интерфейс ОС.
zsteg — инструмент на Ruby, заточенный под обнаружение LSB-стеганографии. Работает быстро, перебирает множество комбинаций каналов и битовых порядков за один запуск. Последний стабильный релиз доступен как Ruby-гем; инструмент активно используется CTF-сообществом.
Поддерживаемые форматы: только PNG и BMP. На JPEG не работает — JPEG использует сжатие с потерями, которое уничтожает данные в младших битах.
Ограничения: не обнаруживает steghide-метод (steghide использует собственный алгоритм на основе графовой теории, а не чистый LSB). Не работает с аудиофайлами. Не справляется с кастомными алгоритмами вставки. Если zsteg молчит — это не значит, что файл чистый. Это значит, что классического LSB там нет.
Типичный запуск и вывод:
$ zsteg challenge.png
b1,r,lsb,xy .. text: "flag{lsb_is_the_classic_one}"
b1,rgb,lsb,xy .. text: "CTF{not_so_hidden}"
b2,g,msb,xy .. file: PNG image data, 64 x 64
b1,rgba,lsb,xy .. zlib: data="compressed payload"
Обозначения: b1,r,lsb,xy — 1-й бит, красный канал, порядок от младшего бита, построчное чтение. Если стандартный запуск ничего не дал — zsteg -a challenge.png перебирает все возможные комбинации каналов и битовых порядков. Работает дольше, но покрывает экзотические варианты.
На практике zsteg — первый инструмент для любого PNG/BMP на стего-таске. Если в выводе появился читаемый текст или знакомые заголовки файлов (PK для ZIP, PNG для изображения) — вы нашли скрытые данные.
steghide — консольная утилита, которая встраивает и извлекает данные через собственный алгоритм, модифицирующий DCT-коэффициенты (JPEG) или значения сэмплов (WAV/AU). Последний релиз — версия 0.5.1, 2003 год. Проект не обновляется с тех пор, но утилита включена в репозитории Kali и Debian и остаётся стандартом де-факто для CTF-задач с парольной стеганографией. Двадцать лет без коммитов — а альтернативы до сих пор нет.
Поддерживаемые форматы: JPEG, BMP, WAV, AU. Не поддерживает PNG — самая частая ошибка новичков.
Ограничение: для извлечения данных требуется пароль (passphrase). Если пароль неизвестен — нужен перебор.
$ steghide info secret.jpg
format: jpeg
capacity: 3.2 KB
embedded file "flag.txt": size: 42 Byte
$ steghide extract -sf secret.jpg -p ""
wrote extracted data to "flag.txt".
$ stegseek secret.jpg /usr/share/wordlists/rockyou.txt
[i] Found passphrase: "sunshine"
[i] Extracted to "secret.jpg.out"
Порядок действий: (1) steghide info — проверить, есть ли вложенные данные; (2) steghide extract -sf file.jpg -p "" — попробовать пустой пароль (срабатывает примерно в трети простых тасков); (3) если задание содержит хинт — слова из хинта подставлять как пароль; (4) если ничего не помогает — stegseek со словарём rockyou.txt.
stegseek — форк steghide, оптимизированный под перебор паролей. Проходит словарь на 14 миллионов записей за секунды, тогда как встроенный перебор steghide занял бы часы. На Kali доступен через apt install stegseek.
Stegsolve — Java-приложение для визуального анализа изображений по отдельным битовым плоскостям. Запускается через java -jar Stegsolve.jar. Проект не обновлялся несколько лет, но остаётся незаменимым для задач, где автоматические инструменты пасуют.
Когда использовать: zsteg не нашёл текстовых данных, но вы подозреваете визуальную стеганографию — скрытое изображение или текст, видимый только в определённом канале.
Ключевые функции:
По данным CTF Field Guide от Trail of Bits, Stegsolve — один из основных инструментов для побитового анализа изображений при решении стего-тасков.
Аудио-стеганография в CTF встречается реже изображений, но именно здесь новички чаще всего сдаются. Инструменты менее очевидны, а методы требуют понимания того, как звук представлен в частотной области.
Самый распространённый аудио-приём в CTF — скрытое изображение или текст, видимый при переключении на спектрограммное отображение. Авторы тасков используют специализированные инструменты для записи визуальных данных в частотный диапазон аудиофайла. При обычном прослушивании файл звучит как шум или слегка искажённая музыка. Но стоит открыть спектрограмму — и там проступает текст или QR-код.
Последовательность действий в Audacity:
Типичная ошибка: по умолчанию Audacity отображает спектрограмму с ограниченным частотным диапазоном и низким разрешением. Если скрытые данные сидят в высоких частотах (16–22 кГц) — вы их просто не увидите без настройки. Я на этом терял время дважды, пока не вбил себе в привычку сразу выкручивать диапазон на максимум.
Альтернатива — Sonic Visualiser (разработан Queen Mary University of London, активно поддерживается). Даёт более гибкую настройку спектрограммы: размер окна FFT, цветовая схема, диапазон dB. В ряде случаев показывает скрытые данные отчётливее, чем Audacity.
SSTV (Slow Scan Television) — протокол передачи изображений через звуковой канал, изначально из мира радиолюбителей. В CTF SSTV-сигнал звучит как характерное «буканье» с меняющимся тоном — нечто среднее между факс-модемом и трелью робота. Если вы слышите что-то подобное, а спектрограмма не показала ничего визуального — пробуйте SSTV-декодер.
Для декодирования на Linux — QSSTV (apt install qsstv). На Windows — RX-SSTV. Принцип: декодер принимает аудиосигнал и восстанавливает из него изображение. В Linux можно настроить PulseAudio для перенаправления вывода проигрывателя на вход QSSTV без физического аудиокабеля.
SSTV-таски иногда маскируют сигнал внутри обычной музыкальной дорожки. Обращайте внимание на участки с нехарактерным тоновым шумом — именно там может прятаться передача.
WAV — формат без сжатия, каждый сэмпл хранится целиком. Младший бит каждого сэмпла можно заменить на бит скрытого сообщения — разница на слух неуловима.
Для извлечения подходит WavSteg (Python-скрипт, доступен на GitHub). Команда python3 WavSteg.py -r -i audio.wav -o output.txt -n 1 извлекает по одному младшему биту из каждого сэмпла. Параметр -n 2 извлечёт два младших бита — пробуйте разные значения. И не забывайте, что steghide тоже работает с WAV и AU — если WavSteg не дал результата, попробуйте steghide extract -sf audio.wav.
| Инструмент | Форматы | Что находит | Ограничения | Когда применять |
|---|---|---|---|---|
| zsteg | PNG, BMP | LSB в различных каналах и битовых порядках | Не работает с JPEG и аудио; не детектирует steghide-метод | Первый шаг для любого PNG/BMP |
| steghide | JPEG, BMP, WAV, AU | Данные, встроенные алгоритмом steghide | Не поддерживает PNG; требует пароль; релиз 2003, не обновляется | Парольная стеганография в JPEG/WAV |
| stegseek | JPEG, BMP, WAV, AU | То же, что steghide, плюс брутфорс пароля | Только словарный перебор, не кастомные алгоритмы | Когда steghide требует пароль без подсказок |
| Stegsolve | PNG, BMP, JPEG, GIF | Визуальные артефакты в битовых плоскостях | Java-зависимость; только ручной анализ; не обновляется | Визуальная стеганография, XOR двух изображений |
| Audacity | WAV, MP3, FLAC, OGG | Скрытые изображения в спектрограмме | Ручной анализ; не извлекает LSB автоматически | Все аудио-таски, спектрограммный анализ |
| binwalk | Любые | Встроенные файлы по сигнатурам | Много ложных срабатываний на сжатых данных | Поиск файлов внутри файлов (шаг 4) |
| exiftool | Любые | Метаданные: EXIF, XMP, IPTC, GPS, комментарии | Не находит стеганографию, только метаданные | Быстрая проверка метаданных (шаг 3) |
| WavSteg | WAV | LSB в аудиосэмплах | Только WAV; нет GUI | LSB-извлечение из WAV-файлов |
Главное, что стоит запомнить: zsteg работает с PNG, но не с JPEG. steghide работает с JPEG, но не с PNG. Путаница между ними — причина номер один потерянного времени на стего-тасках.
steghide на PNG-файле. Steghide выдаст the file format of the file "image.png" is not supported — и это прямой текст ошибки, но новички игнорируют его и думают, что файл повреждён. Для PNG — zsteg и Stegsolve.
Пустой пароль не пробовался. При запуске steghide extract без -p утилита запросит пароль интерактивно. Нажатие Enter (пустая строка) срабатывает удивительно часто на тасках начального и среднего уровня. Многие сразу запускают брутфорс, потеряв минуты на ровном месте.
Слепое доверие binwalk. В сжатых данных (PNG IDAT, JPEG-потоки) binwalk находит «фантомные» ZIP-заголовки и GZIP-сигнатуры, которые на деле — часть стандартного сжатия формата. Если извлечённый «архив» не открывается — это ложное срабатывание, а не повреждённый файл.
Игнорирование условия задания. Название таска, описание, теги, количество баллов — всё это подсказки. Название «Johnny» может означать пароль «johnny» для steghide. Описание «Listen carefully» указывает на аудио-стеганографию. Не бросайтесь в инструменты до прочтения условия целиком.
Стандартные настройки спектрограммы Audacity. По умолчанию спектрограмма показывает ограниченный частотный диапазон с низким разрешением. Скрытые данные в высоких частотах (16–22 кГц) невидимы без увеличения максимальной частоты и размера FFT-окна.
Пропущенный первый шаг — file. Авторы CTF-тасков обожают менять расширение. Файл .mp3 может оказаться PNG, а .jpg — ZIP-архивом. Две секунды на file mystery_file экономят двадцать минут попыток открыть файл неправильным инструментом. Алгоритм на бумаге понятен, но отработать его по-настоящему получается только на живых тасках — готовый стенд есть на HackerLab.pro, российской CTF-платформе с категориями forensics и stegano, нужна регистрация, после неё доступны таски разных уровней.
Девять из десяти стего-тасков среднего уровня решаются пятью инструментами: file, strings, exiftool, zsteg (или steghide для JPEG) и binwalk. Сложные — это Python-скрипты, кастомные алгоритмы, нестандартные форматы. Но фундамент один: определил формат → проверил очевидное → применил правильный инструмент.
Большинство CTF-игроков, застревающих на стего, знают все перечисленные инструменты. Проблема не в знании — в хаотичном подходе. Запускают всё подряд, надеясь на удачу, теряют время на несовместимых связках «инструмент — формат». Я видел, как команды-новички с чётким чеклистом из шести шагов обходили опытных игроков на стего-категории, потому что не уходили в тупиковые ветки. Стеганография — одна из немногих CTF-категорий, где дисциплина бьёт талант. В pwn нужна глубокая экспертиза в эксплуатации памяти, в crypto — математическая база. В stego — правильный порядок действий и твёрдое знание ограничений каждого инструмента. Мой прогноз на ближайшие год-два: серьёзные CTF будут сдвигать стего-таски от классического «найди LSB в PNG» к задачам с кастомными алгоритмами, AI-генерированным контентом и стеганографией в нетипичных контейнерах (PDF, DOCX, сетевые протоколы). Но базовый алгоритм — «определи формат, проверь очевидное, применяй правильный инструмент» — останется фундаментом, на который наслаивается всё остальное.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...