
На недавнем CTF-турнире команда убила полтора часа на PNG-файл с пейзажем. Прогнали через binwalk — ничего. Strings — мусор. Steghide — «формат не поддерживается» (ещё бы, это PNG). Открыли hex-редактор, побродили по тысячам строк байтов, закрыли. Флаг лежал в младшем бите красного канала — zsteg -a landscape.png вытащил его за три секунды. Проблема не в сложности таска. Проблема — все хаотично прыгали между инструментами вместо последовательного исключения вариантов. Эта статья — тот самый чек-лист, который я собрал после сотен решённых стего-тасков. За год он сэкономил десятки часов на турнирах.
Стеганография в 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 стего-таски работают с тремя основными типами:
Универсального инструмента нет: steghide не работает с PNG, zsteg не работает с JPEG, Sonic Visualiser бесполезен для картинок. Поэтому нужен decision tree — алгоритм, который подсказывает, какой инструмент запускать следующим в зависимости от типа файла и результатов предыдущего шага.
Прежде чем переходить к практике — подготовьте рабочее окружение.
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 пропускает.
Главная ошибка новичков в CTF forensics заданиях — сразу кидаться в steghide или zsteg, не проверив элементарные вещи. Типичная ситуация: файл назван flag.png, а внутри — ZIP-архив с изменённым расширением. Или флаг лежит прямо в EXIF-комментарии. Системный подход начинается с трёх команд за десять секунд.
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 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 сканирует файл, сопоставляя байты с базой сигнатур известных форматов. Классический приём создателей тасков — приклеить 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, WAV и AU — и только их. Больше ничего, не пытайтесь.
Извлечение: steghide extract -sf challenge.jpg. Программа запросит пароль (passphrase). Первое действие — нажать Enter, не вводя ничего. Пустой пароль — самая частая точка, на которой новички ломаются: видят запрос passphrase, теряются и переключаются на другой инструмент. На тасках easy и medium пустой пароль работает на удивление часто.
Предварительная проверка без извлечения: steghide info challenge.jpg покажет наличие встроенных данных, размер и метод шифрования.
Предусловия: файл — JPEG, BMP, WAV или AU. Для PNG steghide бесполезен, даже не тратьте время.
Ограничение: если пароль непустой и неизвестен — steghide не поможет, нужен брутфорс (см. раздел про stegseek ниже).
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, дописывает секретные данные в нижнюю часть изображения, а затем уменьшает значение высоты в блоке 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 требует пароль, подсказок нет и пустой пароль не подошёл — время для перебора.
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 (aperisolve.com) — веб-сервис, который автоматически прогоняет загруженный файл через целый набор инструментов: exiftool, binwalk, strings, zsteg, steghide (с пустым паролем), foremost и визуальный анализ по слоям. Результат — одна страница со всеми находками.
Для тасков easy Aperi'Solve часто решает задачу полностью: загрузил файл, пролистал результаты, нашёл флаг. Для medium и hard — экономит время на первичном анализе.
Ограничение: онлайн-сервис. Не подходит для закрытых CTF и работы с конфиденциальными артефактами. Не поддерживает аудио. Бывает перегружен во время крупных турниров — как раз когда нужен больше всего.
Вместо хаотичного перебора — чёткий алгоритм, минимизирующий время на 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 | Крайне медленный |
Пять ошибок, которые стоят часов на турнире:
file первым. Файл с расширением .png может быть ZIP-архивом. Всегда проверяйте реальный тип по magic bytes.use_rockyou_on_me.jpg — прямой хинт на брутфорс.xxd challenge.jpg | tail -20 покажет всё.Отдельная категория — нестандартные таски, где чек-лист не спасёт: программы на эзотерическом языке Piet (где изображение — это код), данные в невидимых Unicode-символах (zero-width steganography), стеганография в разнице между двумя почти идентичными файлами. Тут нужно понимание принципов, а не знание кнопок.
Закрепить навыки можно за пять минут, создав тренировочный набор файлов:
steghide embed -cf photo.jpg -ef secret.txt -p "". Извлеките обратно — убедитесь, что workflow работает.cat image.png archive.zip > challenge.png. Проверьте, что binwalk challenge.png находит оба файла.Готовые стего-таски для тренировки есть на 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 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...