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

14 мин.00

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

Стеганография в 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 (всегда, любой файл): filestrings -n 8 ... | grep flagexiftool. Три команды, десять секунд.

Шаг 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 комментариев

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

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