
На региональном CTF в прошлом году наша команда получила JPEG-файл весом 3 МБ — пейзаж с горами. Два человека параллельно запустили stegsolve и начали перебирать цветовые каналы. Ещё один полез в Python писать скрипт для LSB-извлечения. Через 35 минут четвёртый участник набрал strings mountains.jpg | grep -i flag и получил флаг за три секунды — он был дописан в конец файла открытым текстом.
Вот она, главная болезнь стего-тасков: люди начинают со сложного, пропуская тривиальное. Ниже — пошаговая методология, которая расставляет инструменты в правильном порядке и экономит часы на соревнованиях.
Все инструменты из статьи работают на Linux. Оптимальный вариант — Kali Linux, где большинство утилит предустановлено. На Ubuntu или Debian придётся ставить руками.
Минимальные требования: 2 ГБ RAM, любой x86_64-процессор, интернет для установки пакетов (после установки всё работает offline). Для Stegsolve нужен JRE 8+, для zsteg — Ruby 2.7+.
Установка ключевых инструментов:
sudo apt install steghide binwalk exiftool — базовый набор из репозиториев Debian/Kaligem install zsteg — установка zsteg через Ruby gemsjava -jar stegsolve.jarsudo apt install sonic-visualiser или с официального сайта sonicvisualiser.orgПроверить работоспособность стека можно одной строкой: steghide --help && zsteg --help && binwalk --help — если все три утилиты вернули справку, окружение готово.
Разница между опытным CTF-игроком и новичком — не набор инструментов, а порядок их запуска. Новички хватаются за специализированные утилиты сразу. Опытные идут от простого к сложному и отсекают гипотезы за секунды, а не за минуты.
Последовательность, которая работает на практике:
file) — расширение может быть подмененоstrings, exiftool) — флаг бывает в открытом видеbinwalk) — внутри картинки может быть ZIP или другой файлsteghide для JPEG/WAV, zsteg для PNG/BMPstegsolve) — если предыдущие шаги ничего не далиПорядок не случайный. Шаги 1–3 занимают меньше минуты и закрывают примерно половину стего-тасков среднего уровня. Шаги 4–6 требуют больше времени и запускаются только после того, как простые методы не сработали.
Одна из частых ошибок — запуск steghide на PNG-файле или zsteg на JPEG. Каждый инструмент заточен под конкретные форматы, и попытка использовать его не по назначению просто вернёт ошибку.
| Инструмент | Поддерживаемые форматы | Что находит | Ограничения | Типичный сценарий в CTF |
|---|---|---|---|---|
| steghide | JPEG, BMP, WAV, AU | Данные, встроенные с паролем | Не работает с PNG и GIF | Задание с подсказкой-паролем |
| zsteg | PNG, BMP | LSB-стеганография, скрытые строки | Только PNG и BMP | PNG с подозрительным размером |
| binwalk | Любой формат | Встроенные файлы по сигнатурам | Ложные срабатывания на случайных совпадениях | Файл подозрительно большой для своего содержимого |
| stegsolve | Любое изображение | Визуальные аномалии в битовых плоскостях | GUI, требует Java | Задание с двумя похожими изображениями |
| Sonic Visualizer | WAV, MP3, FLAC, OGG | Паттерны в спектрограмме | GUI, не автоматизируется | Аудиофайл без явных подсказок |
| pngcheck | PNG | Повреждённые чанки, аномалии структуры | Только PNG | Файл не открывается или отображается частично |
Таблица не покрывает экзотику (видеофайлы, PDF, сетевые дампы со стеганографией), но для 90% тасков категории Stego на CTF этого набора хватает за глаза.
Первые три команды при получении любого файла на стего-таске — file, strings и exiftool. Они отвечают на три вопроса: что это за файл на самом деле, есть ли в нём читаемый текст и что записано в метаданных.
Команда file task_image.png определяет тип файла по magic bytes (первые байты файла), а не по расширению. Организаторы CTF регулярно меняют расширение — файл с расширением .txt оказывается BMP, а .gif — на самом деле JPEG. Если file показывает тип, не совпадающий с расширением, — это уже подсказка.
strings task_image.png | grep -i flag ищет читаемые строки с ключевым словом. Если флаг записан открытым текстом, задача решается за секунды. Можно расширить поиск: strings -n 10 task_image.png покажет только строки длиной от 10 символов, отфильтровав мусор. На соревнованиях уровня Easy-Medium этот приём закрывает заметную долю заданий — и именно его пропустила наша команда с горным пейзажем.
file task.*
strings -n 8 task.jpg | grep -iE "flag|ctf|key|secret"
exiftool task.jpg | grep -iE "comment|author|description"
exiftool извлекает метаданные: автор, комментарии, GPS-координаты, софт для создания файла. В CTF-заданиях флаг или подсказка (например, пароль для steghide) часто записаны в поле Comment или Description. Ещё один индикатор — нестандартное значение в поле Software: если PNG якобы создан в «SecretEncoder v1.0», это намёк на конкретный метод стеганографии.
Отдельно — pngcheck -v file.png для PNG-файлов. Утилита проверяет целостность чанков и может выявить аномалии: нестандартные чанки с произвольными данными, неправильный CRC (что иногда используется для скрытия информации), несоответствие заявленных размеров реальным. Если pngcheck сообщает об ошибке — файл намеренно повреждён, и восстановление структуры (обычно правка высоты изображения в IHDR-чанке) может открыть скрытую часть картинки.
Steghide — классика для скрытия и извлечения данных в файлах JPEG, BMP, WAV и AU. В CTF он применяется для извлечения. Главная особенность — данные защищены паролем (passphrase), и без правильного пароля извлечение невозможно.
Проверка наличия встроенных данных: steghide info task.jpg — утилита покажет, есть ли внедрённый файл, и запросит пароль. Извлечение: steghide extract -sf task.jpg — steghide запросит passphrase в интерактивном режиме.
Три типичных сценария с паролем в CTF:
exiftool и strings запускаются до steghide. Пароль может быть в поле Comment, в имени автора или даже в имени файла.stegseek task.jpg /usr/share/wordlists/rockyou.txt перебирает пароли из словаря. Stegseek работает на порядки быстрее устаревшего stegcracker и на словаре rockyou.txt обычно завершается за секунды.Ограничение, о котором нужно помнить: steghide не поддерживает PNG. Если в задании PNG-файл, steghide бесполезен — переходите к zsteg. WAV steghide поддерживает, так что для аудиозаданий с WAV-файлами его стоит проверить наряду с анализом спектрограммы.
Ещё нюанс: steghide использует собственный алгоритм встраивания, и данные, внедрённые другими инструментами (OpenStego, jsteg), steghide не обнаружит. Если steghide info ничего не находит — это не значит, что файл чист. Это значит, что steghide-формат не использовался.
Zsteg — специализированный инструмент для обнаружения данных, скрытых методом LSB (Least Significant Bit) в PNG и BMP файлах. LSB-стеганография заменяет младшие биты цветовых каналов на биты скрытого сообщения. Визуально это никак не влияет на картинку — человеческий глаз не различает изменение младшего бита цвета.
Zsteg перебирает комбинации каналов (R, G, B, A), порядок бит (LSB/MSB), направление обхода пикселей (по строкам / по столбцам) и выводит результат для каждой комбинации. Команда zsteg -a file.png запускает все встроенные проверки.
$ zsteg -a challenge.png
b1,r,lsb,xy .. text: "FLAG{lsb_is_not_that_hard}"
b1,rgb,lsb,xy .. text: "FLAG{lsb_is_not_that_hard}"
b2,g,msb,xy .. file: data
b1,rgba,lsb,xy .. text: "\x00FLAG{lsb_is_not_that_hard}"
b1,abgr,msb,xy .. file: PGP Secret Key
Тут видно: флаг спрятан в первом бите (b1) красного канала с порядком LSB и обходом xy (по строкам). Zsteg нашёл его сразу в нескольких комбинациях каналов — типичная картина для простого LSB-внедрения.
На что смотреть в выводе zsteg:
text: — читаемый текст, часто содержит флагfile: — обнаружен файл определённого типа (PNG, ZIP, PDF), который можно извлечьzsteg -E "b1,r,lsb,xy" file.png > extracted.bin — аргумент после -E берётся из вывода zsteg -aZsteg обрабатывает только PNG и BMP. Для JPEG формата LSB-стеганография технически сложнее из-за lossy-сжатия: JPEG при каждом пересохранении модифицирует данные, и классический LSB-метод в чистом виде не работает. Если задание содержит JPEG и подразумевает LSB — ищите jsteg.
Binwalk сканирует бинарный файл на наличие сигнатур известных форматов. Если внутри JPEG-файла склеен ZIP-архив, binwalk обнаружит заголовок PK (сигнатура ZIP) и покажет смещение. Это один из самых частых приёмов в CTF: два файла конкатенированы в один, при этом изображение открывается нормально, потому что парсер JPEG игнорирует данные после маркера конца (FFD9).
Команда binwalk task.jpg покажет найденные сигнатуры, а binwalk -e task.jpg автоматически извлечёт обнаруженные файлы в директорию _task.jpg.extracted.
$ binwalk task.jpg
DECIMAL HEXADECIMAL DESCRIPTION
------------------------------------------
0 0x0 JPEG image data, JFIF standard 1.01
45231 0xB0AF Zip archive data, name: secret.txt
45389 0xB14D End of Zip archive
Binwalk обнаружил ZIP-архив начиная с байта 45231. После binwalk -e task.jpg в извлечённой директории окажется secret.txt. Если архив запаролен — пригодится fcrackzip -u -D -p /usr/share/wordlists/rockyou.txt archive.zip для подбора пароля.
Но есть подвох: binwalk определяет сигнатуры по заголовкам, а не по полному парсингу файлов. Это приводит к ложным срабатываниям — случайные последовательности байт могут совпасть с сигнатурой какого-нибудь экзотического формата. Если binwalk показывает десятки «найденных» файлов разных типов в маленьком изображении — почти наверняка это false positives. Ориентируйтесь на распространённые форматы: ZIP, RAR, PNG, GZIP, ELF.
Ещё сценарий: организаторы прячут данные за пределами видимой области PNG-изображения. Записывают информацию в нижнюю часть картинки и уменьшают значение высоты в IHDR-чанке. Изображение выглядит нормально, но binwalk может ничего не обнаружить, потому что скрытые пиксели — часть штатных данных PNG. Тут нужно вручную увеличить высоту в IHDR через hex-редактор и пересчитать CRC чанка.
Stegsolve — Java-приложение с GUI для побитового анализа изображений. Оно перебирает отображение картинки по отдельным битовым плоскостям каждого цветового канала. Где binwalk ищет вложенные файлы, а zsteg — LSB-данные, Stegsolve даёт визуальную картину: вы видите, что скрыто в конкретном бите конкретного канала.
Запуск: java -jar stegsolve.jar, затем File → Open для загрузки изображения. Стрелки «<» и «>» переключают режимы отображения: Red plane 0, Red plane 1, Green plane 0 и так далее. Если в одной из плоскостей проступает текст, QR-код или контур другого изображения — вот они, скрытые данные.
Три функции Stegsolve, которые реально нужны на CTF:
Когда Stegsolve не нужен: если zsteg уже нашёл флаг в LSB, открывать Stegsolve для подтверждения — пустая трата времени. Stegsolve полезен, когда автоматические инструменты ничего не нашли, но есть основания полагать, что данные скрыты визуально — например, задание содержит подсказку про «цвета» или «слои».
Аудиозадания в forensics CTF делятся на два больших класса. Первый — данные скрыты в спектрограмме: при визуализации частотного спектра проступает текст, QR-код или другой визуальный паттерн. Второй — данные встроены в аудиопоток методами, аналогичными LSB в изображениях.
Для спектрограммного анализа — Sonic Visualizer: открыть файл, затем Layer → Add Spectrogram. Спектрограмма отображает частоты по вертикали и время по горизонтали. Скрытые надписи обычно сидят в высокочастотном диапазоне (выше 15 кГц) — там, где обычный звук минимален, но паттерн чётко виден. Альтернатива — Audacity с включённым режимом спектрограммы (в выпадающем меню дорожки выбрать Spectrogram).
Типичные формы спектрограммных посланий:
Если спектрограмма чистая — проверить steghide extract -sf task.wav. Steghide умеет работать с WAV и AU. Дальше — strings task.wav | grep -i flag на случай, если данные записаны текстом между аудиосэмплами. И binwalk task.wav покажет, нет ли вложенных файлов.
Для WAV-файлов есть WavSteg — Python-инструмент для LSB-стеганографии в аудио. Извлечение: python3 WavSteg.py -r -s task.wav -o output.txt. Инструмент вытаскивает данные из младших бит аудиосэмплов по аналогии с LSB в изображениях.
MP3-файлы — отдельная история. MP3 использует lossy-сжатие, поэтому LSB-методы к нему напрямую не применимы. Для MP3 в CTF чаще всего скрывают данные между фреймами (mp3stego) или в спектрограмме. Если задание — MP3, первый шаг — Sonic Visualizer, второй — strings и binwalk.
За несколько сотен решённых стего-тасков накопился набор ситуаций, где CTF-игроки стабильно сливают время. Разберу самые частые.
Гонка за глубиной при простой задаче. Организатор спрятал флаг в комментарии EXIF, а участник полтора часа анализирует битовые плоскости. Правило: первые 60 секунд — базовая разведка (file, strings, exiftool, binwalk). Ничего не нашлось — тогда переходить к специализированным инструментам.
Steghide на PNG. Steghide не поддерживает PNG — только JPEG и BMP. Утилита просто выдаст ошибку, но новички иногда решают, что «данных нет», и идут дальше, пропуская файл. Для PNG — zsteg.
Ложные срабатывания binwalk. Binwalk нашёл «LZMA compressed data» в середине JPEG — и участник тратит время на извлечение. А это случайное совпадение байтов с сигнатурой LZMA. Индикатор ложного срабатывания: извлечённые файлы нулевого размера или содержат мусор.
Игнорирование альфа-канала в PNG. Изображение выглядит полностью непрозрачным, но альфа-канал содержит данные — значения альфы немного отличаются от 255, и эти отличия кодируют сообщение. Stegsolve показывает это в режиме Alpha plane 0. Если PNG имеет тип RGBA — проверка альфа-канала обязательна.
Перебор без системы. Участник запускает все инструменты по очереди, каждый с дефолтными параметрами, получает отрицательный результат и сдаётся. Но данные могут быть в нестандартном порядке бит (MSB вместо LSB), в нестандартной комбинации каналов (только синий канал) или с обходом пикселей по столбцам вместо строк. Zsteg с флагом -a перебирает основные комбинации, но покрывает не всё — иногда нужен ручной подбор параметров в Data Extract Stegsolve.
Изменённый заголовок PNG. Организатор уменьшил высоту изображения в IHDR-чанке. Картинка отображается обрезанной, а скрытые данные находятся в пикселях ниже видимой границы. Утилита pngcheck покажет несоответствие CRC чанка IHDR — верный индикатор манипуляции с размерами.
Стеганография в CTF пересекается с реальными атаками: в матрице MITRE ATT&CK техника T1001.002 (Steganography) описывает использование стеганографии в канале управления (C2), а T1027.003 (Steganography, Defense Evasion) — скрытие вредоносных нагрузок в легитимных файлах. Навыки обнаружения стеганографии, наработанные на CTF, напрямую применимы в digital forensics и incident response.
В реальных инцидентах скрытые данные в изображениях — не академическая экзотика. APT-группы встраивают команды C2 в изображения, размещённые на легитимных хостингах, чтобы обойти сетевые фильтры. Техника T1027.009 (Embedded Payloads) описывает встраивание вредоносного кода в легитимные файлы — по сути, тот же binwalk-сценарий, только в продакшене.
Самый частый вопрос от новичков: «какой инструмент выучить?» — и это неправильный вопрос. Инструменты — самая простая часть. Steghide, zsteg, binwalk осваиваются за вечер. Stegsolve — за два. Сложная часть — научиться отбрасывать гипотезы быстро. Понять, что если zsteg ничего не нашёл в PNG за 5 секунд, надо не перебирать руками оставшиеся 200 комбинаций каналов, а переключиться на binwalk или проверить альфа-канал. Или что steghide с пустым паролем на JPEG — это первые 3 секунды работы, а не «запасной вариант».
За последние пару лет мета стего-заданий сдвинулась: организаторы знают, что участники прогоняют стандартный тулкит автоматом, и усложняют задания через нестандартные кодировки, кастомные алгоритмы встраивания и многоступенчатые цепочки, где извлечённый из картинки файл оказывается ещё одним контейнером (матрёшка, да). Побеждают не те, у кого длиннее список инструментов, а те, кто быстрее строит и проверяет гипотезы — и умеет вовремя выбросить текущую и взять следующую. Попробуйте на ближайшем CTF засечь время: сколько секунд от получения файла до первого strings | grep flag? Если больше десяти — есть над чем работать.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...