
На одном из недавних CTF потратил 40 минут на задачу, которая решалась за две. Получил JPEG, прогнал через binwalk — пусто, через zsteg — формат не поддерживается, через strings — шум. Только когда запустил steghide extract -sf с пустым паролем — выпал флаг. Проблема не в инструментах. Проблема — в бессистемном тыкании всем подряд.
В категориях Forensics и Misc на площадках PicoCTF, HackTheBox и RingZeroCTF стеганографические задачи попадаются стабильно. И каждый раз новички теряют время на хаотичный перебор тулз вместо того, чтобы за 30 секунд определить формат и запустить нужный инструмент. Дальше — про то, как превратить этот хаос в алгоритм: какой инструмент для какого формата, в каком порядке запускать и что делать, когда все инструменты молчат.
Прежде чем лезть в инструменты — убедитесь, что среда готова.
sudo apt update && sudo apt install -y steghide binwalk exiftool foremost
gem install zsteg
# stegsolve: скачать .jar с GitHub, запуск через java -jar stegsolve.jar
# stegseek: sudo apt install stegseek (в актуальных версиях Kali)
Всё перечисленное входит в стандартный набор Kali. stegsolve — единственное исключение, его качаем отдельно как Java-архив.
Главная ошибка новичка — запускать все инструменты подряд на каждый файл. На лёгких задачах прокатывает, на среднем уровне начинает жрать время. Каждый инструмент покрывает свою зону, и зоны эти почти не пересекаются.
| Инструмент | Форматы | Что находит | Ключевое ограничение |
|---|---|---|---|
| steghide | JPEG, BMP, WAV, AU | Данные, вшитые с паролем или без | Не поддерживает PNG |
| zsteg | PNG, BMP | LSB-стеганография в битовых плоскостях | Бесполезен для JPEG и аудио |
| binwalk | Любой бинарный файл | Вложенные файлы по сигнатурам (ZIP, RAR, ELF, изображения) | Ложные срабатывания на случайные совпадения байт |
| exiftool | Практически любой | Метаданные: автор, GPS, комментарии, software | Только метаданные, не трогает содержимое пикселей |
| stegsolve | PNG, BMP, JPEG, GIF | Визуальный анализ цветовых каналов и битовых плоскостей | GUI-only, требует Java, нет CLI-режима |
| strings | Любой | ASCII/UTF-строки в бинарных данных | Много шума, требуется фильтрация через grep |
| foremost | Любой | Восстановление файлов по заголовкам и футерам | Может извлечь артефакты, которых реально нет |
Ключевой момент: steghide не видит ничего в PNG, а zsteg не умеет работать с JPEG. Два разных мира стеганографии. Путаница между ними — причина номер один потерянного времени у тех, кто только начинает решать steg-задачи. Определение реального формата файла — шаг, от которого зависит весь дальнейший выбор.
По статусу поддержки: steghide (0.5.1) — последняя мажорная версия вышла давно, но инструмент стабильно работает и входит в репозитории Kali. binwalk — активно обновляется. zsteg — Ruby-гем на GitHub, CTF-сообщество им пользуется повсеместно. exiftool — один из самых активно поддерживаемых инструментов в этом наборе, автор обновляет регулярно. stegsolve — старый Java-проект, разработка стоит, но для визуального LSB-анализа альтернатив нет.
Типичный стеганографический workflow на демонстрационном примере:
$ file mysterious.jpg
mysterious.jpg: PNG image data, 800 x 600, 8-bit/color RGBA
$ exiftool mysterious.jpg | grep -i comment
Comment : look_at_the_least_bits
$ steghide extract -sf mysterious.jpg
steghide: the file format of "mysterious.jpg" is not supported.
$ mv mysterious.jpg mysterious.png
$ zsteg mysterious.png
b1,rgb,lsb,xy .. text: "CTF{hidden_in_plain_sight}"
Расширение лжёт — файл на самом деле PNG. steghide закономерно отказывается работать. Переименовали, запустили zsteg — флаг в младших битах RGB-каналов. Начни мы со steghide вместо file — потеряли бы время и ушли по ложному следу. Одна команда file экономит минуты.
Получили файл в задании — не доверяйте расширению. Расширение .jpg может скрывать PNG, а .txt — BMP-изображение. Первая команда всегда file challenge_image.jpg. Если вывод показывает PNG image data при расширении .jpg — формат подделан, и это сразу меняет набор применимых инструментов.
Дальше — метаданные: exiftool challenge_image.jpg. В forensics CTF заданиях лёгкого уровня флаг или подсказку часто кладут в поля Comment, Author, Description, Copyright или даже GPS-координаты. По материалам hacklido.com и 0xrick.github.io, exiftool — стандартная точка входа в forensics-workflow. На простых задачах одного вызова хватает для полного решения.
Если exiftool ничего не дал — strings challenge_image.jpg | grep -i flag. Команда strings вытаскивает последовательности печатных символов длиной от 4 байт. Когда формат флага известен (например, CTF{...} или picoCTF{...}), фильтруйте прицельно: strings file | grep -i "picoCTF". Модификация strings -n 8 file покажет строки от 8 символов, отсекая случайный мусор — в изображениях его много.
Ещё один приём на этапе разведки — проверка размера файла. JPEG 200x200 весит 5 МБ? Внутри почти наверняка спрятаны дополнительные данные. Нормальный JPEG такого разрешения — десятки килобайт.
binwalk сканирует бинарный файл на совпадения с известными сигнатурами форматов. Если внутри JPEG спрятан ZIP-архив, второе изображение или ELF-бинарник — binwalk покажет это с указанием офсетов.
Базовый вызов: binwalk challenge_image.jpg — выводит таблицу найденных сигнатур со смещениями в байтах от начала файла. Для автоматического извлечения: binwalk -e challenge_image.jpg — создаёт директорию _challenge_image.jpg.extracted/ с результатами.
Типичный CTF-сценарий: автор задания конкатенирует два файла — cat image.jpg secret.zip > challenge.jpg. Просмотрщик открывает картинку нормально (JPEG-парсер останавливается на маркере конца FF D9), а ZIP-архив прячется после конца изображения. binwalk видит обе сигнатуры и вытаскивает архив автоматически.
Работает если: в файле есть вложенные данные в виде отдельных файлов (конкатенация, appended data после EOF-маркера). Не работает если: данные вшиты на уровне пикселей (LSB стеганография) или зашифрованы steghide — тут нужны другие инструменты.
На форуме codeby.net не раз обсуждалось: binwalk не стоит воспринимать как истину в последней инстанции. Инструмент работает по сигнатурам начала файлов и выдаёт ложные срабатывания — случайное совпадение байт с заголовком ZIP не означает реальный архив. Если binwalk нашёл «Zip archive», но unzip не может распаковать результат — это ложное совпадение байт, не архив.
Альтернатива — foremost -i challenge_image.jpg. Foremost восстанавливает файлы по заголовкам и футерам, используя свою базу сигнатур. Бывает, foremost находит то, что binwalk пропускает, и наоборот.
LSB (Least Significant Bit) — самый распространённый метод стеганографии в CTF. Механика: младшие биты каждого цветового канала (R, G, B) заменяются битами скрытого сообщения. Визуально картинка не меняется — глаз не различает разницу в один бит яркости на канал. Но если прочитать младшие биты всех пикселей последовательно — проявляется текст или файл.
zsteg — основной инструмент для обнаружения LSB стеганографии в PNG и BMP. Команда zsteg -a image.png прогоняет все комбинации каналов (RGB, BGR, RBG и другие перестановки), порядков бит (LSB, MSB) и направлений обхода (строки, столбцы). Вывод бывает объёмным — ищите строки с читаемым текстом, особенно совпадающие с форматом флага.
Для прицельного извлечения: zsteg -E "b1,rgb,lsb,xy" image.png — вытаскивает данные из первого бита каналов RGB в порядке LSB при построчном обходе. Параметры для -E берутся из вывода zsteg -a — инструмент сам показывает, какая комбинация дала результат.
Критическое ограничение: zsteg работает только с PNG и BMP. JPEG использует сжатие с потерями, которое разрушает LSB-данные при каждом сохранении, поэтому классическая LSB-стеганография в JPEG технически невозможна без специально адаптированных алгоритмов. Если задание выдало JPEG с подозрением на LSB — либо предположение ошибочное, либо это нестандартная задача высокого уровня.
Связка zsteg и stegsolve: если zsteg нашёл подозрительные данные, но результат нечитаем — откройте изображение в stegsolve и переключайте фильтры по битовым плоскостям. Red plane 0, Green plane 0, Blue plane 0 показывают младшие биты каждого канала. Иногда скрытое сообщение проявляется визуально — как текст или QR-код на определённой плоскости.
steghide — классика стеганографических CTF-задач, особенно для JPEG. Инструмент встраивает данные в файлы JPEG, BMP, WAV и AU, используя шифрование (по умолчанию Blowfish). Принципиальное отличие от binwalk и zsteg — без правильного пароля данные не извлечь.
Проверка наличия скрытых данных: steghide info challenge.jpg — покажет, есть ли embedded-файл, его размер и алгоритм шифрования. Если steghide сообщает о наличии данных — задача сводится к подбору пароля.
Извлечение: steghide extract -sf challenge.jpg — запросит passphrase. На лёгких задачах пароль часто пустой (просто Enter) или совпадает с названием файла, именем автора из метаданных, словом из описания задачи. Проверяйте exiftool первым делом — подсказка к паролю нередко лежит в полях Comment или Author.
steghide работает и с аудио — WAV и AU. Команды те же: steghide info audio.wav, steghide extract -sf audio.wav. Получили WAV в forensics-задании — steghide стоит проверить в числе первых.
Для создания собственных steg-задач (скажем, при организации внутреннего CTF): steghide embed -cf cover.jpg -ef secret.txt -p "password". Без -p steghide запросит пароль интерактивно; с -p "" создаст файл с пустым паролем.
Ограничения steghide, которые стоит держать в голове:
Аудио-стеганография — слепое пятно большинства русскоязычных CTF-гайдов. При этом задачи с WAV и MP3 попадаются на соревнованиях регулярно, и подход к ним отличается от работы с картинками принципиально.
Стандартная разведка работает и здесь: file audio.wav, exiftool audio.wav, strings audio.wav | grep -i flag. На задачах начального уровня флаг бывает прямо в метаданных аудиофайла.
Дальше — прослушайте файл. Без шуток. Иногда аудио содержит морзянку, DTMF-тоны (звуки набора телефонного номера) или голосовое сообщение, надиктованное задом наперёд. Для реверса аудио: откройте в Audacity, выделите весь трек, Effect → Reverse. Для морзянки — онлайн-декодеры (morsecode.world и аналоги).
Главное оружие для аудио-стеганографии — спектральный анализ. Откройте файл в Sonic Visualiser, добавьте слой спектрограммы через Layer → Add Spectrogram. На спектрограмме скрытое изображение или текст проявляется как визуальный паттерн в частотном диапазоне. Типичный CTF-приём: автор генерирует WAV, где на частотах 15–20 кГц (за пределами слышимости) нарисован текст флага. На слух — обычный шум или музыка, на спектрограмме — чёткие буквы. Красота.
Альтернатива — Audacity: смените вид трека на Spectrogram (клик по стрелке рядом с названием трека → Spectrogram). Для базовой проверки хватит, но Sonic Visualiser даёт больше контроля над диапазонами частот и цветовой схемой — мелкие детали видны лучше.
Для LSB-стеганографии в аудио есть WavSteg — Python-инструмент с GitHub. Извлечение: python3 WavSteg.py -r -s audio.wav -o output.txt. Инструмент заточен под LSB в WAV и бывает полезен, когда спектрограмма ничего не показала, а steghide не нашёл embedded-данных.
Отдельная экзотика — SSTV (Slow-Scan Television). Иногда в CTF выдают аудиозапись с SSTV-сигналом — аналоговая передача изображения по звуковому каналу, технология из любительского радио. Характерный признак: файл звучит как серия тональных сигналов с переменной частотой. Для декодирования: QSSTV на Linux, Robot36 на Android. Если слышите что-то похожее на факс из 90-х — попробуйте SSTV-декодер, не пожалеете.
Прогнали стандартный набор — ничего. Ситуация нормальная для задач среднего уровня и выше. Вот куда копать дальше.
Брутфорс пароля steghide. Если steghide info показал наличие embedded-данных, но пароль неизвестен — берите stegseek. Это быстрая альтернатива устаревшему stegcracker, оптимизированная под скорость перебора. Установка: sudo apt install stegseek (в актуальных версиях Kali) или сборка из GitHub. Вызов: stegseek challenge.jpg /usr/share/wordlists/rockyou.txt. stegseek проходит весь rockyou.txt (14 миллионов записей) за секунды — stegcracker на той же задаче работает часы. По MITRE ATT&CK это техника Password Cracking (T1110.002, Credential Access) — перебор паролей по словарю.
Hex-анализ. Откройте файл в hex-редакторе — xxd challenge.jpg | less (CLI) или Bless/GHex (GUI). Что искать:
FF D9 не часть изображения. Текст или бинарные данные после этой метки — признак конкатенации.file показывает «data» вместо конкретного формата — заголовок повреждён или подменён намеренно. Восстановите корректные magic bytes (89 50 4E 47 для PNG, FF D8 FF для JPEG).Визуальный анализ через stegsolve. Запустите java -jar stegsolve.jar, загрузите изображение. Переключайте фильтры стрелками: Red plane 0, Green plane 0, Blue plane 0 показывают младшие биты каждого канала. Если данные вшиты в конкретный канал или битовую плоскость — на соответствующем фильтре проявится текст, паттерн или QR-код. Режим Data Extract (Analyse → Data Extract) позволяет вытащить биты из выбранных плоскостей — комбинируйте каналы и порядок бит для подбора правильной конфигурации.
Если в задании два изображения (оригинал и модифицированное) — режим Image Combiner в stegsolve. Наложение с операцией XOR покажет пиксели, которые были изменены — именно в них скрыты данные.
Онлайн-инструменты как последний рубеж. Aperi'Solve (aperisolve.com) запускает zsteg, steghide, binwalk, exiftool и foremost одновременно и показывает результаты в web-интерфейсе — удобно для быстрой проверки, когда уже отчаялись. CyberChef — для декодирования Base64, ROT13, XOR и других трансформаций, когда из файла извлечён закодированный текст.
Вместо перебора всего подряд — алгоритм, который экономит время:
file → определите реальный формат (не доверяйте расширению)exiftool → проверьте метаданные на наличие флага или подсказкиstrings | grep -i flag → быстрый поиск текстовых строкsteghide info, затем steghide extract -sfzsteg -abinwalk -e (поиск вложенных файлов)stegsolve (визуальный анализ битовых плоскостей)stegseek с rockyou.txtsteghideБыстрые проверки (file, strings, exiftool) стоят первыми — они занимают секунды. Ресурсоёмкие (stegsolve с ручным анализом, брутфорс) — в конце. BMP — особый случай: их поддерживают и steghide, и zsteg, поэтому для BMP проверяйте оба.
Стеганография в CTF — не только игровая механика. Те же техники используются в реальных атаках: по MITRE ATT&CK, стеганография задействована в тактике Command and Control — Steganography (T1001.002), когда C2-команды прячутся в изображениях на легитимных хостингах, и в тактике Defense Evasion — Steganography (T1027.003), когда вредоносный payload маскируется внутри обычного файла. Навык обнаружения скрытых данных применим напрямую в incident response: те же binwalk, exiftool и hex-анализ используются при расследовании инцидентов, когда подозрительный файл попал в периметр.
Чем больше steg-задач решаете — тем быстрее формируется чутьё. После пары десятков задач начинаешь по формату файла, его размеру и формулировке условия предсказывать нужный инструмент. JPEG без подсказок — steghide с пустым паролем. PNG с намёком на «невидимое» — zsteg. Картинка подозрительно большого размера для своего разрешения — binwalk, внутри архив. WAV с шумом — спектрограмма.
Есть наблюдение, которое сложилось за пару лет решения steg-задач: инструментарий стеганографии в CTF фактически заморожен. steghide, zsteg, binwalk — им годы, и значимых новых инструментов не появляется. При этом задачи усложняются: авторы комбинируют несколько слоёв сокрытия, используют кастомные алгоритмы, нестандартные форматы контейнеров. Тулзы стоят на месте, а challenge-мейкеры двигаются вперёд.
На задачах выше среднего уровня побеждает не тот, кто знает больше инструментов, а тот, кто быстрее пишет свои. Python-скрипт для извлечения данных из конкретного битового канала в конкретном порядке обхода — 15 минут работы с библиотекой Pillow для изображений или scipy.io.wavfile для аудио. Именно такой скрипт решит задачу, которую zsteg -a не покрывает, потому что автор использовал нестандартную раскладку каналов или чередование бит.
Большинство новичков застревают на стадии «прогнал все тулзы — ничего — не знаю что делать». Выход не в поиске ещё одного инструмента, а в понимании устройства формата файла. Когда знаете, что PNG состоит из chunks (IHDR, IDAT, IEND) с CRC на каждый блок — можете разобрать файл руками и найти аномалию, которую ни один автоматический инструмент не распознает. Это переход от уровня «пользователь инструментов» к уровню «исследователь формата». Именно он разделяет тех, кто решает easy, от тех, кто берёт medium и hard.
Попробуйте взять любой PNG, открыть его в xxd, найти IHDR-chunk и руками поменять высоту изображения на большее значение. Пересчитайте CRC (скрипт на Python в 5 строк). Если внизу появились скрытые данные — поздравляю, вы только что решили задачу, на которой зависают 80% новичков. На HackerLab есть лабы с подобными связками — можно отработать весь workflow от file до флага в контролируемой среде.
🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».
0 комментариев
Пожалуйста, войдите, чтобы оставить комментарий.
Загрузка комментариев...