
Четыре часа на PNG размером 6 КБ. Реальный итог команды на CTF средней сложности. Ребята запустили steghide (не поддерживает PNG), потом binwalk (нашёл ложную сигнатуру TIFF), а про zsteg не вспомнили. Флаг сидел в LSB красного канала — zsteg вытащил бы его за секунды. Разница между «крутить таск два часа» и «решить за пять минут» в стеганографии CTF — не уровень мастерства, а наличие системного чеклиста: какой инструмент для какого формата, что запускать первым и когда переключаться на ручной анализ. Здесь — полный алгоритм с командами, таблицей ограничений и decision tree.
Перед разбором инструментов — минимальный стек:
stegseek и foremost хотят Linux. Windows — через WSL2.--add-opens.gem install zsteg).steghide, exiftool, binwalk, foremost, strings, file, sonic-visualiser, audacity. Отдельно ставить: stegseek (.deb с GitHub-репозитория RickdeJager/stegseek), zsteg (Ruby gem), Stegsolve (JAR с GitHub). Aperi'Solve — веб-инструмент, установки не требует.Любой таск по стеганографии начинается с одних и тех же шагов. Порядок критичен: перепрыгнете базовый анализ и сразу полезете в специализированные инструменты — потеряете время на ложных следах.
Первое действие — выяснить, что перед вами на самом деле. Расширение файла в forensics CTF заданиях часто врёт: challenge.txt окажется PNG, image.jpg — ZIP-архивом. Как описывает Trail of Bits CTF Field Guide: «in a CTF, part of the game is to identify the file ourselves, using a heuristic approach.»
Команда file определяет тип по магическим байтам (сигнатурам в заголовке файла). Если file challenge.txt отвечает PNG image data, 800 x 600, 8-bit/color RGBA — перед вами картинка, расширение ложное. Уже подсказка.
Дальше — exiftool для извлечения метаданных. Автор фотографии, GPS-координаты, нестандартные поля Comment, Artist, Description — классические места для сокрытия флагов или хинтов в тасках на стеганографию. На среднем уровне Base64-строка в поле Comment — стабильный паттерн.
Параллельно — strings для вытаскивания всех текстовых строк из бинарного файла. Комбинация с grep сужает поиск: strings challenge.png | grep -iE "flag|ctf|key|{|}|base64". Тривиально, но на лёгких и средних тасках по поиску скрытых данных это решает задачу примерно в трети случаев.
Следующий обязательный шаг — проверка на вложенные файлы. Binwalk сканирует бинарный образ на известные сигнатуры и показывает всё, что спрятано внутри. Trail of Bits CTF Field Guide описывает эту технику как «file carving» — стандартный приём в forensics:
binwalk challenge.png
# DECIMAL HEXADECIMAL DESCRIPTION
# 0 0x0 PNG image, 800 x 600
# 524288 0x80000 Zip archive data
Если binwalk нашёл ZIP, вторую картинку или данные после маркера конца файла (IEND для PNG) — извлекаем: binwalk -e challenge.png. Результат попадёт в директорию _challenge.png.extracted.
Ограничение binwalk: инструмент ищет сигнатуры по смещениям, ложные срабатывания — обычное дело. Случайное совпадение байт с сигнатурой ZIP или JPEG — не редкость. Как написал один автор с форума Codeby: «я не советую свято верить ему — были моменты когда он давал неправильную информацию, из-за того что он просматривает только сигнатуры начала.» Извлечённые файлы проверяйте через file и пробуйте открыть.
Если binwalk молчит — foremost -i challenge.png -o output/. Foremost работает иначе: ищет header/footer пары для восстановления файлов. Иногда цепляет то, что binwalk пропускает.
На этом базовый анализ завершён. Нет результата — переходим к специализированным инструментам. Дальнейший путь зависит от типа файла.
Абсолютное большинство стего-тасков в CTF — изображения: PNG, JPEG, BMP, GIF. У каждого формата свои механизмы сокрытия данных, и путать инструменты между форматами — классическая ошибка (привет, steghide + PNG).
Stegsolve — Java-приложение для просмотра изображения по отдельным цветовым каналам и битовым плоскостям. Запуск: java -jar stegsolve.jar, открываете файл, листаете стрелками между режимами. Основные режимы для анализа изображений CTF:
Проект стабильный, но JAR давно не обновлялся. На свежих JDK может потребоваться ручная настройка. Не работает по SSH без X-forwarding или VNC.
Веб-альтернатива — StegOnline (georgeom.net/StegOnline). Те же функции в браузере: битовые плоскости, извлечение LSB, анализ гистограмм. Из каталога CTF-инструментов gregalletti/CTF_tools на GitHub: «big stego tool, upload image and modify/extract data.» Спасает, когда GUI-окружения нет.
LSB (Least Significant Bit) — самый распространённый метод цифровой стеганографии в CTF-задачах. Принцип: младший бит каждого цветового компонента пикселя заменяется битом скрытого сообщения. Визуально изображение не меняется — разница в один уровень из 256 неразличима.
zsteg автоматически проверяет десятки вариантов LSB-кодирования в PNG и BMP:
zsteg challenge.png
# b1,r,lsb,xy .. text: "FLAG{hidden_in_plain_sight}"
# b1,rgb,lsb,xy .. file: Zip archive data
# b2,g,msb,xy .. text: "\x00\x00\x00"
Каждая строка — комбинация параметров: номер бита (b1, b2), канал (r, g, b, rgb, rgba), порядок (lsb/msb), направление обхода пикселей (xy/yx). Если zsteg нашёл осмысленный текст или файловую сигнатуру — задача решена. Для более глубокого анализа: zsteg -a challenge.png проверяет все доступные комбинации, включая экзотические — обход по столбцам, отдельные бит-плоскости альфа-канала.
Ограничение zsteg: работает только с PNG и BMP. Для JPEG не подходит принципиально — lossy-сжатие уничтожает LSB-данные. Если вам дали JPEG с подозрением на LSB — скорее всего, данные внедрены специализированным инструментом (jsteg), и zsteg их не найдёт.
Статус: Ruby gem, репозиторий zed-0xff/zsteg на GitHub, проект активен.
Steghide — классика жанра, прячет данные в JPEG и BMP с шифрованием паролем. В CTF это один из самых частых сценариев: получаете JPEG и подсказку к паролю (или пароль где-то рядом — в описании таска, в имени файла, в метаданных).
Просмотр без извлечения: steghide info challenge.jpg покажет, есть ли встроенные данные и размер. Извлечение: steghide extract -sf challenge.jpg — если пароль пустой, данные выйдут сразу, иначе утилита запросит passphrase.
Steghide не поддерживает PNG. Это источник ошибки номер один у начинающих. Steghide работает с JPEG, BMP, WAV и AU. При попытке скормить PNG — ответ the file format of "challenge.png" is not supported. Для PNG — zsteg или stegsolve. Я видел, как на CTF целые команды убивают полчаса, потому что не знают этого ограничения.
Когда пароль неизвестен — stegseek. Брутфорсер для steghide, способный перебрать словарь rockyou.txt за секунды благодаря оптимизации: stegseek challenge.jpg rockyou.txt. Если пароль найден — данные извлекаются автоматически. В тасках средней сложности пароль часто сидит в rockyou.txt или является словом из описания задания.
Статус stegseek: репозиторий RickdeJager/stegseek на GitHub, предоставляет .deb-пакеты для Kali и Ubuntu, активно поддерживается.
Аудио-стеганография в CTF встречается реже изображений, но таски стабильно появляются в категориях forensics и misc. Два основных вектора: визуальные сообщения в спектрограмме и LSB в WAV.
Самый зрелищный приём — спрятать текст или QR-код в спектрограмме аудиофайла. Ухо слышит звуки определённых частот, но не «видит» их распределение по спектру. Авторы тасков генерируют аудио, при визуализации которого на спектрограмме проявляется изображение — текст флага, координаты или ссылка.
Sonic Visualiser — специализированное приложение для анализа аудио. Откройте файл, добавьте слой спектрограммы через Pane → Add Spectrogram. Настройки: FFT size 1024 или 2048, Window Type — Hann. Если скрытое сообщение есть — оно проявится как рисунок на спектре. Из каталога lnwatson.co.uk: «tools to visualise sound waves and frequencies — useful for audio-based steganography challenges.»
Audacity — более распространённый вариант. Откройте файл, переключите отображение дорожки с Waveform на Spectrogram (выпадающее меню слева от трека). Тонкая настройка через Spectrogram Settings: увеличить FFT Size до 2048–4096, попробовать разные цветовые схемы. Иногда сообщение видно только при определённых параметрах окна — приходится покрутить.
Ограничение: спектрограммный анализ бесполезен для LSB-стеганографии в аудио. Там данные спрятаны на уровне отдельных семплов, а не частотного распределения.
WAV — формат без сжатия, каждый семпл хранится целиком. Это делает его идеальным контейнером для LSB-стеганографии: младший бит каждого семпла заменяется битом скрытого сообщения, качество звука не страдает.
Для извлечения — WavSteg (Python): pip install WavSteg, затем python3 -m WavSteg -r -i challenge.wav -o output.txt -n 1 (параметр -n 1 — один LSB-бит на семпл).
Ручной подход через Python, если WavSteg не справился:
from scipy.io.wavfile import read
rate, samples = read('challenge.wav')
bits = ''.join(str(s & 1) for s in samples[:8000])
text = ''.join(chr(int(bits[i:i+8], 2))
for i in range(0, len(bits), 8))
print(text)
Скрипт извлекает младшие биты первых 8000 семплов и конвертирует двоичную строку в текст группами по 8 бит.
MP3, OGG и другие lossy-форматы уничтожают LSB-данные при кодировании. Если вам дали MP3 — LSB-стеганография маловероятна. Проверяйте спектрограмму, метаданные через exiftool, или ищите вложенные файлы через binwalk.
Когда нужно быстро прогнать файл через все проверки разом — Aperi'Solve (aperisolve.com). Веб-инструмент автоматически запускает zsteg, steghide (с пустым паролем), exiftool, binwalk, foremost, strings и отображает анализ битовых плоскостей. Загрузили файл — получили сводный отчёт. Из каталога gregalletti/CTF_tools: «one of the best online tools, with static analysis and also running zsteg, steghide, exiftool, binwalk, foremost.»
На практике Aperi'Solve экономит 5–10 минут ручного анализа и часто выдаёт ответ на лёгких тасках сразу. Но полагаться только на него — ошибка.
Ограничения Aperi'Solve: не поддерживает аудиофайлы, steghide пробует только пустой пароль, для файлов больше 10 МБ может тормозить. Это инструмент первой линии, не замена ручному стегоанализу.
CyberChef (gchq.github.io/CyberChef) — для декодирования извлечённых данных. Строка в Base64, Hex, ROT13 или вложенная кодировка — CyberChef конвертирует за секунды. Незаменим, когда результат стего-анализа закодирован в несколько слоёв (а авторы тасков это любят — матрёшка из кодировок).
Вместо хаотичного перебора инструментов — фиксированная последовательность. Каждый шаг даёт результат или сужает область поиска.
Шаг 1. Формат. file challenge.xxx — реальный тип. Расширение врёт — переименовать.
Шаг 2. Метаданные. exiftool challenge.xxx — нестандартные поля, комментарии, GPS.
Шаг 3. Строки. strings challenge.xxx | grep -iE "flag|ctf|key" — открытый текст.
Шаг 4. Вложенные файлы. binwalk -e challenge.xxx — file carving.
Шаг 5 (изображение). Развилка по формату:
- PNG/BMP → zsteg -a для автоматического LSB-анализа
- JPEG/BMP → steghide info и stegseek с rockyou.txt
- Любое изображение → stegsolve или StegOnline для визуального анализа битовых плоскостей
- Два файла (оригинал + изменённый) → Image Combiner в stegsolve
Шаг 6 (аудио). Развилка:
- Любой формат → спектрограмма в Sonic Visualiser или Audacity
- WAV → WavSteg или Python-скрипт для LSB
- Нестандартный формат → exiftool, strings, binwalk
Шаг 7. Декодирование. Извлечённые данные часто закодированы: Base64, Hex, XOR, ROT13. CyberChef или быстрый однострочник на Python.
Шаг 8. Автоматизация. Ничего не нашли вручную — Aperi'Solve для изображений. Иногда один инструмент ловит то, что другой пропустил.
Сводная таблица инструментов стеганографии CTF с ограничениями:
| Инструмент | Форматы | Метод | Ограничения | Когда использовать |
|---|---|---|---|---|
| zsteg | PNG, BMP | LSB (автоперебор) | Не работает с JPEG; Ruby-зависимость | Первым для PNG |
| steghide | JPEG, BMP, WAV, AU | Парольная стего | Не поддерживает PNG; нужен пароль | JPEG-файлы |
| stegseek | JPEG, BMP, WAV, AU | Брутфорс steghide | Только steghide-контейнеры | Когда steghide просит пароль |
| stegsolve | Любое изображение | Визуал битовых плоскостей | Java; нет CLI-режима | Всегда, визуальная проверка |
| StegOnline | Любое изображение | Визуал (веб) | Лимит на размер загрузки | Нет Java или GUI |
| binwalk | Любой файл | File carving по сигнатурам | Ложные срабатывания | Всегда, на этапе базового анализа |
| Sonic Visualiser | Аудио (WAV, MP3, FLAC) | Спектрограмма | Не находит LSB-стего | Аудио: поиск визуальных сообщений |
| WavSteg | WAV | LSB в аудио | Только WAV; нет GUI | WAV с подозрением на LSB |
| Aperi'Solve | Изображения | Комплексный анализ | Пустой пароль; нет аудио | Быстрая первичная проверка |
| foremost | Любой файл | File carving (header/footer) | Медленнее binwalk | Когда binwalk ничего не нашёл |
В реальных атаках стеганография — не только CTF-головоломка. В матрице MITRE ATT&CK она фигурирует как метод сокрытия команд в C2-трафике — Steganography (T1001.002, Command and Control) и как способ маскировки полезной нагрузки — Steganography (T1027.003, Defense Evasion). Навыки стегоанализа из CTF напрямую транслируются в задачи incident response.
Теперь — про ошибки, на которых горят не только новички.
Первая: steghide и PNG. Steghide физически не работает с этим форматом и выдаёт the file format is not supported. Для PNG — zsteg или stegsolve. Повторяю это третий раз в статье, потому что это третья по частоте причина потраченного впустую времени на CTF.
Вторая: игнорирование альфа-канала. PNG формата RGBA содержит канал прозрачности, и данные нередко спрятаны именно в нём. Stegsolve покажет Alpha plane 0 — проверяйте при каждом анализе изображений.
Третья: слепая вера binwalk. Инструмент находит «ZIP-архив» внутри файла, хотя это случайное совпадение байт с сигнатурой. Извлечённые файлы всегда проверяйте через file и пробуйте открыть — если не открываются, это артефакт.
Неочевидный приём — PNG с манипулированным IHDR. Значение высоты изображения в заголовке PNG можно уменьшить. Визуально картинка обрезается снизу, но пиксельные данные остаются в файле. Признак: binwalk или pngcheck показывают несоответствие между размером IDAT-блоков и заявленными размерами. Исправление — увеличить высоту в IHDR через hex-редактор и пересчитать четыре байта CRC блока. Скрытая часть проявится внизу изображения. В русскоязычных гайдах по CTF этот приём почти не описан, хотя в тасках встречается регулярно.
Ещё нюанс — GIF-анимация. Stegsolve имеет режим Frame Browser для покадрового просмотра. Флаг может быть в одном кадре из сотни, и обычный просмотр GIF его не покажет — кадр мелькнёт на 10 миллисекунд. Разбивайте GIF на отдельные кадры через convert challenge.gif frame_%d.png (ImageMagick) и анализируйте каждый.
Решаю стего-таски на CTF с 2020 года, и за это время один вывод подтверждается снова и снова: 80% задач закрываются на первых четырёх шагах чеклиста — file, strings, exiftool, binwalk. Авторы тасков переоценивают хитрость своих решений: прячут флаг в комментарии EXIF, дописывают ZIP после маркера конца PNG или кладут текст в поле Artist — и считают это «средней сложностью». Настоящая средняя начинается с LSB и парольной стеганографии, настоящая высокая — с кастомных алгоритмов сокрытия информации в файлах, где автоматические инструменты бессильны и нужен собственный скрипт на Python.
Проблема большинства русскоязычных гайдов — они дают список инструментов, но не объясняют порядок и ограничения. Человек читает «steghide — утилита для стеганографии», пробует на PNG, получает ошибку, и думает, что инструмент сломан. Или запускает десять утилит подряд, не понимая, какая для чего. Чеклист решает эту проблему: шаг за шагом, с развилками по формату, с таблицей «когда использовать / когда бесполезно».
Если через пять минут zsteg, stegseek и Aperi'Solve молчат — перечитывайте описание таска. Хинт почти всегда есть: в названии файла, в теге категории, в количестве очков за задание. Стеганография в CTF — последовательный перебор по чеклисту, а не магия. Кто это понял — перестаёт тратить часы на один PNG.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...