Главная / Блог / Стеганография CTF: binwalk, steghide и zsteg

14 мин.00

Стеганография CTF: binwalk, steghide и zsteg

Стеганография CTF: binwalk, steghide и zsteg

На CTF получил PNG-файл весом 4 МБ при разрешении 200×200 пикселей — картинка весила в десять раз больше нормы. Запустил steghide info, потратил двадцать минут на подбор пароля и только потом осознал: steghide не поддерживает PNG. Переключился на zsteg -a — флаг нашёлся за пять секунд. Полчаса соревновательного времени в пустоту из-за одной ошибки в выборе инструмента. Обидно, но поучительно.

Ниже — алгоритм, который от таких потерь спасает: какой инструмент для какого формата, как читать вывод и когда переключаться дальше.

Разведка: file, strings, exiftool — три команды перед тяжёлой артиллерией

Самая дорогая ошибка в стеганографии CTF — хвататься за специализированные инструменты без базовой разведки. Три минуты на начальный анализ экономят тридцать на подборе пароля или переборе методов.

file — реальный тип файла

Расширение в forensics CTF заданиях врёт регулярно. Файл challenge.txt оказывается BMP-картинкой, photo.jpg — ZIP-архивом, а data.bin — вполне обычным PNG. Команда file challenge.txt определяет формат по magic bytes — первым байтам файла, уникальным для каждого формата. JPEG начинается с FF D8 FF, PNG — с 89 50 4E 47 (символы \x89PNG), ZIP — с 50 4B (PK).

Важно читать весь вывод file, а не только тип. Поле comment в JPEG, значение segment length, количество components — всё может содержать подсказку или пароль. В разборе задачи picoCTF Hidden in Plainsight (по описанию автора решения на dev.to) вывод file img.jpg показал в поле comment строку c3RlZ2hpZGU6Y0VGNmVuZHZjbVE9 — base64, внутри которого было прямое указание на steghide и закодированный пароль. Большинство участников пролистали вывод и упустили ключ к решению.

Мораль: не ленись прочитать три строки вывода целиком.

strings — поиск скрытой информации за три секунды

Запускаете strings image.png | grep -i flag — дело трёх секунд, а на лёгких заданиях флаг бывает вписан открытым текстом после маркера конца изображения. Если формат флага неизвестен, strings -n 8 image.png выведет строки длиной от 8 символов, отсекая бинарный шум.

Комбинация с grep расширяет возможности: strings file | grep -iE "flag|ctf|key|pass" ищет сразу несколько паттернов. Ограничение: если данные закодированы (base64, hex, XOR), strings их не обнаружит.

exiftool — метаданные как тайник

Команда exiftool file.jpg вытаскивает полный набор метаданных: GPS-координаты, автора, программу редактирования, комментарии, временные метки. В CTF флаг регулярно прячут в полях Comment, Artist, Copyright или Description.

PNG формально не поддерживает стандарт EXIF, но хранит метаданные в текстовых чанках tEXt, zTXt и iTXt — exiftool читает их без проблем. Геолокационные задачи (определить город по GPS-координатам из метаданных фото) — отдельная подкатегория, где exiftool незаменим.

Только после этих трёх шагов переходите к специализированным инструментам. Дальнейший порядок зависит от формата файла — и тут начинаются системные ошибки.

binwalk: извлечение данных из вложенных файлов

binwalk сканирует бинарный файл на предмет сигнатур — заголовков известных форматов (ZIP, RAR, PNG, gzip, ELF и десятков других). Типичный CTF-сценарий: в JPEG-картинку дописан ZIP-архив после маркера конца изображения (байт FF D9). Браузер или просмотрщик покажет обычную фотографию, а binwalk увидит два файла с их смещениями.

Команда binwalk challenge.jpg выводит список найденных сигнатур. Флаг -e автоматически извлекает обнаруженные файлы: binwalk -e challenge.jpg создаёт директорию _challenge.jpg.extracted с содержимым.

Нюанс, о который спотыкаются: binwalk распознаёт заголовки, но не проверяет целостность найденных объектов. Ложноположительные срабатывания — обычное дело. Инструмент принимает случайную последовательность байт за начало файла. Если извлечённый объект весит несколько байт или не открывается — почти наверняка ложное срабатывание. Не стоит свято верить каждой строке в выводе.

Главное преимущество binwalk — он работает с любым форматом. JPEG, PNG, WAV, PDF, ELF-бинарники — без ограничений. Но он ищет вложенные файлы, а не данные, спрятанные в пикселях или аудиосэмплах. Поэтому binwalk и стего-инструменты дополняют друг друга: первый находит вложения на уровне файловой структуры, вторые — данные, закодированные в содержимом.

Альтернатива для файлового carving'а — утилита foremost, которая восстанавливает файлы по заголовкам и footer'ам. На практике binwalk справляется чаще, но foremost иногда вытягивает файлы, которые binwalk пропустил. Держите обе под рукой.

steghide: как использовать для JPEG и WAV

steghide — один из самых распространённых инструментов для стеганографии CTF, но у него жёсткое ограничение по форматам: поддерживаются только JPEG, BMP, WAV и AU. Попытка скормить ему PNG завершится ошибкой. Запомните эту связку — она сэкономит время на каждом соревновании.

Как steghide прячет данные

Для JPEG steghide работает не с пикселями напрямую, а с DCT-коэффициентами (Discrete Cosine Transform) — числовыми значениями, которые возникают при JPEG-сжатии. Алгоритм переставляет пары коэффициентов так, что статистическое распределение изображения остаётся практически неизменным. Именно поэтому binwalk тут бесполезен: нет дописанных файлов, нет лишних сигнатур. Payload вплетён в саму структуру сжатия, и обнаружить его без правильного инструмента невозможно.

Для WAV steghide модифицирует младшие биты аудиосэмплов. Человеческое ухо разницу не уловит, да и спектральный анализ в Audacity обычно не показывает аномалий.

Проверка и извлечение

Первый шаг — steghide info target.jpg. Утилита спросит пароль: нажмите Enter для пустого пароля. Удивительное количество задач лёгкого уровня встраивают данные без защиты — авторы тасков, видимо, рассчитывают, что участники до steghide просто не дойдут. Если steghide покажет имя вложенного файла, его размер и алгоритм шифрования (обычно Rijndael-128, CBC) — данные точно есть.

Извлечение: steghide extract -sf target.jpg. Пароль может быть спрятан в метаданных файла (проверьте вывод exiftool), в тексте описания задания, в имени файла или в выводе strings. Иногда пароль закодирован в base64 прямо в комментарии JPEG — как в упомянутом кейсе с picoCTF.

Ловушка для начинающих: сообщения при неправильном пароле и при полном отсутствии вложенных данных выглядят одинаково — could not extract any data with that passphrase!. Различить ситуации можно только через steghide info с правильным паролем, что создаёт замкнутый круг. Практический подход: если задание подразумевает стеганографию и файл формата JPEG или WAV — считайте, что steghide использован, и ищите пароль тщательнее, а не переключайтесь на другой инструмент.

Brute-force: stegseek вместо stegcracker

Когда пароль не находится вручную, нужен brute-force. Разница между инструментами тут — небо и земля.

StegCracker запускает отдельный процесс steghide для каждого пароля из словаря. На rockyou.txt (14 миллионов записей) это занимает часы — каждый вызов steghide пересчитывает хеши заново. На CTF, где время ограничено, это просто непозволительно.

Stegseek работает напрямую с библиотекой steghide, минуя повторные вычисления. Тот же rockyou.txt обрабатывается за секунды. Команда: stegseek target.jpg /usr/share/wordlists/rockyou.txt. При успешном подборе stegseek сразу извлекает данные.

Если и stegseek не нашёл пароль — вероятно, используется кастомный пароль вне стандартных словарей или данные спрятаны другим инструментом.

zsteg и LSB стеганография в PNG

zsteg — главный инструмент для поиска скрытой информации в изображениях PNG и BMP. Он анализирует младшие биты (Least Significant Bit) в цветовых каналах и перебирает множество комбинаций кодирования.

Как работает LSB-кодирование

Каждый пиксель PNG хранит значения красного, зелёного и синего каналов по 8 бит (256 значений на канал). При LSB-стеганографии последний бит каждого канала заменяется на бит секретного сообщения. Визуально картинка не меняется: сдвиг цвета на 1 из 256 незаметен. Но биты извлекаемы — достаточно прочитать младшие разряды в правильном порядке.

Вариативность метода и создаёт сложность: данные могут быть в одном канале (только R), во всех трёх (RGB), в обратном порядке (BGR), по строкам (xy) или по столбцам (yx), в первом бите или во втором. Комбинаций много, перебирать вручную — безумие. Для этого и существует zsteg.

zsteg на практике

Команда zsteg -a file.png запускает полный перебор: каналы (R, G, B, A), порядки (RGB, BGR, GBR и другие), направления обхода (xy, yx) и битовые плоскости (b1, b2, b3...). Вывод бывает объёмным — ищите строки с осмысленным текстом, ASCII-паттернами или сигнатурами файлов (PK для ZIP, \x89PNG для изображения).

Для извлечения конкретного payload: zsteg -E b1,rgb,lsb,xy file.png > output.bin, где b1 — первый бит, rgb — порядок каналов, lsb — младший бит, xy — построчный обход. Параметры подбираются по результатам zsteg -a: инструмент сам указывает, в какой комбинации нашлись данные.

Принципиальное отличие от steghide: zsteg не требует пароля. Если данные закодированы в LSB — они извлекаются напрямую, без ключа. steghide шифрует payload (по умолчанию Rijndael-128), а zsteg работает с открытыми данными. Это два разных подхода к стеганографии, и путать их — терять время.

Установка: gem install zsteg (требует Ruby). На Kali Linux обычно предустановлен.

stegsolve: ручной визуальный анализ слоёв

Когда zsteg ничего не нашёл, но подозрение на стеганографию в картинках остаётся — stegsolve позволяет просмотреть изображение по отдельным цветовым плоскостям. Java-приложение, запускается через java -jar stegsolve.jar.

Три режима, которые реально применяются на CTF:

Переключение слоёв — стрелки перебирают Red plane 0, Green plane 1, Blue plane 7 и т.д. Скрытый текст или QR-код иногда виден только на конкретной плоскости конкретного канала. Тыкаешь стрелками, пока не проявится что-то осмысленное.

Data Extract — выбираете конкретные биты конкретных каналов и читаете данные. Если zsteg показал результат в b1,rgb,lsb, Data Extract позволяет визуально подтвердить находку.

Image Combiner — накладывает два изображения через операции XOR, ADD, SUB. Если в задании дают оригинал и модифицированный файл — XOR покажет пиксели, в которых спрятаны данные. Этот режим часто забывают, а зря.

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

Аудио-стеганография в CTF делится на два принципиально разных подхода: данные закодированы в сэмплах (LSB) или скрыты как визуальный паттерн на спектрограмме.

Спектрограммы в Sonic Visualiser и Audacity

Откройте аудиофайл в Sonic Visualiser, добавьте слой спектрограммы (Layer → Add Spectrogram). Если в частотном диапазоне 8–20 кГц видны чёткие линии, формирующие буквы, текст или QR-код — это спектрограммная стеганография. Sonic Visualiser даёт тонкий контроль над параметрами визуализации: размер окна FFT, цветовая карта, масштаб частот. Чем больше окно FFT, тем лучше разрешение по частоте — для текста в спектрограмме обычно подходит 2048 или 4096.

В Audacity аналогичный результат: откройте файл, переключите трек в режим «Спектрограмма» через выпадающее меню. Увеличьте верхнюю границу частот до максимума в настройках спектрограммы.

Морзе-код — ещё один классический приём. На осциллограмме он выглядит как чередование тишины и тона с характерными длинными и короткими импульсами. Расшифровка — вручную или через онлайн-декодер. Звучит просто, но на практике отличить точки от тире на зашумлённом сигнале бывает нетривиально.

LSB в WAV-файлах

Для WAV со скрытыми данными в младших битах сэмплов применяются steghide (если payload защищён паролем) или WavSteg (извлечение без пароля): python3 WavSteg.py -r -s sound.wav -o output.txt.

Порядок проверки аудиофайла: file audio.wav (реальный формат?) → strings audio.wav | grep -i flag (открытый текст?) → binwalk audio.wav (вложенные файлы?) → Sonic Visualiser для спектрограммы → steghide info для WAV → WavSteg для LSB.

Дерево решений: forensics CTF алгоритм

Главная проблема стеганографии CTF — не отсутствие инструментов, а выбор правильного. Таблица ниже — референс, который стоит держать открытым на каждом соревновании:

Формат Первый инструмент Альтернатива На что смотреть
JPEG steghide info stegseek (brute-force) DCT payload, пароль обязателен
PNG zsteg -a stegsolve, binwalk LSB в каналах RGB/RGBA
BMP zsteg или steghide stegsolve Оба инструмента применимы
WAV steghide, Sonic Visualiser WavSteg, Audacity LSB сэмплов или спектрограмма
GIF stegsolve (Frame browser) ImageMagick convert Данные в отдельных кадрах
MP3/FLAC strings, binwalk Sonic Visualiser Метаданные, вложения, спектрограмма
Любой file, strings, exiftool binwalk -e Всегда начинать с разведки

Полный workflow для каждого forensics CTF задания со стеганографией:

file target                                        # 1. реальный формат
strings target | grep -iE "flag|ctf|key|pass"      # 2. открытый текст
exiftool target                                    # 3. метаданные
binwalk target                                     # 4. вложенные файлы
# JPEG/BMP/WAV:
steghide info target                               # 5. пустой пароль (Enter)
# PNG/BMP:
zsteg -a target                                    # 6. LSB-анализ
# аудио без результата:
# Sonic Visualiser → спектрограмма                 # 7. визуальный анализ
# steghide нашёл данные, пароль неизвестен:
stegseek target /usr/share/wordlists/rockyou.txt   # 8. brute-force

Этот алгоритм покрывает подавляющее большинство стего-задач лёгкого и среднего уровня. На сложных тасках подключаются hex-анализ (через xxd или hexdump), кастомные Python-скрипты и проверка PNG-padding.

Python для нестандартного LSB

Когда zsteg не справляется с нестандартным LSB-кодированием (нетипичный порядок каналов, биты не в младшей позиции, кастомный обход пикселей), помогает ручной скрипт:

from PIL import Image

img = Image.open('steg.png')
bits = ''
for y in range(img.height):
    for x in range(img.width):
        r, g, b = img.getpixel((x, y))[:3]
        bits += str(r & 1) + str(g & 1) + str(b & 1)
text = ''.join(chr(int(bits[i:i+8], 2)) for i in range(0, len(bits), 8))
print(text[:500])

Скрипт читает младший бит каждого канала (R, G, B) каждого пикселя по строкам, собирает биты в байты и выводит как текст. Порядок обхода (xy → yx), выбор канала и номер бита (& 1 для LSB, & 2 для второго бита, & 4 для третьего) — параметры, которые подбираются под конкретную задачу. Brute-force по этим параметрам через скрипт занимает меньше минуты.

Скрытые данные за границами PNG

Метод, который не ловится ни zsteg, ни steghide, ни binwalk в стандартном режиме — PNG-наполнение за границами видимой области (post-pixel padding). Принцип: берётся PNG-изображение, в нижнюю часть добавляется секретная информация (текст, ещё одна картинка, архив), затем в hex-редакторе уменьшается значение высоты в блоке IHDR. Рендерер показывает картинку с меньшей высотой — нижние строки пикселей игнорируются, но данные остаются внутри IDAT-блоков.

Структура PNG: файл начинается с 8-байтной подписи (89 50 4E 47 0D 0A 1A 0A), затем блок IHDR с шириной (4 байта) и высотой (4 байта), потом данные IDAT и завершающий блок IEND. Высота записана по смещению 0x14–0x17 от начала файла.

Обнаружить padding можно несколькими путями. Утилита pngcheck -v file.png сообщит о несоответствии заявленного размера и объёма данных IDAT. В hex-редакторе можно вручную увеличить значение высоты, пересчитать CRC блока IHDR (четыре байта сразу после данных блока) и увидеть скрытую часть изображения. Для пересчёта CRC — Python-скрипт с модулем zlib.crc32 или онлайн-инструменты.

Этот приём встречается на CTF среднего уровня — особенно в заданиях, где стандартные инструменты для CTF forensics дают пустой результат. Если binwalk молчит, zsteg пуст, а файл подозрительно тяжёлый — проверяйте высоту в IHDR.

Стеганография за пределами CTF: MITRE ATT&CK

Навыки анализа стеганографии в CTF переносимы в реальную работу. В MITRE ATT&CK стеганография описана в двух контекстах: как метод обфускации payload — Steganography (T1027.003, тактика stealth), и как способ маскировки C2-трафика — Steganography (T1001.002, тактика Command and Control). Вредоносы прячут полезную нагрузку в картинках на легитимных хостингах и загружают через обычный HTTP-запрос. Без навыков извлечения скрытых данных из файлов такие артефакты остаются невидимыми для аналитика.

Формула на бумаге понятна, но навык формируется только на практике — когда прогоняешь файлы руками и видишь, как разные методы стеганографии выглядят в выводе инструментов. На HackerLab.pro есть категория Stego с задачами разного уровня — можно потренироваться на реальных CTF-тасках без привязки к расписанию соревнований.

Девять из десяти проваленных стего-тасков на CTF — не проблема инструментов, а проблема последовательности. Запускать steghide на PNG, zsteg на JPEG, binwalk на файл, в котором данные спрятаны в DCT-коэффициентах — бессмысленная трата соревновательного времени. Формат определяет инструмент, и эта связка должна быть в голове до автоматизма: PNG → zsteg, JPEG → steghide, непонятно → file + binwalk. Не «попробую всё подряд», а осознанный выбор на основе file.

Второе наблюдение, которое подтверждается раз за разом: новички недооценивают strings и exiftool. Три секунды на strings image.png | grep flag — и на половине лёгких задач дело решено. Но участники пропускают этот шаг и уходят в LSB-анализ, хотя текст лежит открытым после маркера конца изображения. Базовый чек-лист в голове важнее любого продвинутого инструмента.

И третье: стеганография — не изолированная CTF-дисциплина. Те же техники, те же форматы, тот же binwalk используются реальными APT-группами для доставки payload через легитимные каналы. Кто решает стего-таски на соревнованиях, тот быстрее распознаёт подобные артефакты в продакшене. На WAPT эту цепочку — от разведки файла до извлечения payload — проходят в лабораторных условиях с разбором каждого шага, если хочется закрепить навык на живых задачах, а не только на write-up'ах.

🚀 Хочешь закрепить на практике? Реши задачи по теме на HackerLab — категория «pentest-machines».

Поделиться

0 комментариев

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

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

Читайте также

OSINT для начинающих: поиск по нику, фото и email

14 мин.

3

OSINT для начинающих: поиск по нику, фото и email

Пошаговые цепочки OSINT в CTF: Sherlock для ника, Holehe для email, Yandex для фото. Команды, типичные ошибки новичков и разбор таска от старта до флага.

22 ОКТЯБРЬ, 2026

John the Ripper и Hashcat: взлом хешей в CTF

12 мин.

7

John the Ripper и Hashcat: взлом хешей в CTF

Пошаговый разбор взлома хешей в CTF: словарные и mask-атаки, форматы MD5/SHA/NTLM, *2john-утилиты. Команды, бенчмарки и типичные ошибки новичков.

22 ОКТЯБРЬ, 2026

Wireshark для начинающих: пароли в трафике CTF

14 мин.

13

Wireshark для начинающих: пароли в трафике CTF

Пошаговый разбор PCAP в Wireshark: фильтры для CTF, Follow TCP Stream, Export Objects. Ищем пароли в HTTP и FTP, секреты в DNS и ICMP-пейлоадах.

21 ОКТЯБРЬ, 2026