Основы стеганографии в "capture the flag"

Основы стеганографии в "capture the flag"

Life-Hack

Всем хорошего времяпрепровождения!

Недавно образовалась команда новичков по ctf нашего любимого форума, в связи с этим своей статьей хотел бы начать обмен опытом, так сказать, по решению тасков той или иной направленности. Ведь всегда есть некий алгоритм, которому вы следуете при решении тасков, который приводит, на легком и среднем уровне, к найденному флагу. Это тот уровень, который находится между «пфф, изипизи» и тем, когда вы начинаете видеть заговоры иллюминатов во всех хинтах и файлах.

И так, я попробую рассказать вам основы стеганографии. Точнее сказать, основы в моем представлении. Приятного чтения 

1. Область применения

Что такое стеганография рассказывать не буду, дабы не захламлять статью. Просто поясню, что это метод сокрытия информации в объектах(картинка, музыка, видео, кожа головыJ(это не шутка) и т.д.) в которых непосвященный человек не сможет разглядеть ничего подозрительного.

В ctf чаще всего встречается стего в следующих типах файлов:

----> Картинки – bmp, png, jpg, tiff, gif

----> Звуковые файлы – wav, mp3, midi

----> Видео файлы – mp4, avi

И для каждой области файлов свои инструменты обнаружения стего.


2. Инструменты

Ниже будут приведены тулзы для определения стеганографии разделенные по операционным системам. Я их выделил две: Linux и Windows.

Картинки:

Linux:

----> File – консольная утилита для определения типа файла

----> Strings – консольная утилита для вывода строк файла

----> Exiftool – консольная утилита для чтения мета-данных

----> Binwalk - инструмент для поиска файлов и исполняемого кода в данном двоичном образе

----> Stegsolve - open source решение для анализа структуры файлов

----> Steghide - консольная C++ утилита позволяющая скрывать информацию методом стеганографии в графических или аудио файлах

Windows:

----> PentestBox - портативная сборка популярных security утилит

----> Stegsolve - open source решение для анализа структуры файлов

Web ресурсы:

----> http://exif.regex.info/exif.cgi - аналог exiftool

----> https://www.geoimgr.com/ - определения геоданных в картинке

----> Image Steganography - дешифровка стего зашифрованных с помощью метода lsb(если скрытая часть является то же картинкой)

----> Online Steganography tool (embed/hide secret messages or images within a host-image) - декодирование стего картинки если в ней зашифрован текст

----> Steganography Online - аналог предыдущего

Python библиотеки:

----> from PIL import Image

img = Image.open('steg.png', 'r')

for i in range(128): #цикл по высоте (допустим ширина 128 пикселей)

for j in range(128): #цикл по ширине(допустим ширина 128 пикселей)

r,g,b = img.getpixel((j,i)) #чтение каждого цвета одного пикселя

Думаю этого пока будет достаточно что бы решить практически любой таск по стего легкого и среднего уровня.

Звуковые файлы:

Со звуковыми файлами нет необходимости разделения по операционным система т.к. софт и там и там одинаков. За исключения основных утилит: file, strings exiftool и их аналогов в Windows, которые я описал выше.

----> Sonic Visualiser – это приложение для просмотра и анализа содержимого музыкальных аудио-файлов

----> Audacity - свободный многоплатформенный аудиоредактор звуковых файлов, ориентированный на работу с несколькими дорожками

----> Python:

----> from scipy.io.wavfile import read

rate, samples = read('steg.wav') #чтение рейтов и массива семплов для их анализа

----> Steganographic Decoder - декодер стего файлов

Видео файлы:

----> ffmpeg - набор свободных библиотек с открытым исходным кодом, которые позволяют записывать, конвертировать и передавать цифровые аудио- и видеозаписи в различных форматах

Я извинтиляюсь за такой скудный набор тулз для стего видео файлов, но это связано с моим скудным опытов в ctf. И все задачи которые я решал по стего, которые были связаны с видео файлами, сходились к тому, что бы разбить видео ряд на кадры и уже с ними продолжать работу.

Что же, инструменты даны. Теперь я бы хотел показать вам как я с этими инструментами работа при решении тасков.

3. Использование

Картинки:

Windows:

----> PentestBox 

Первым делом качаем PentestBox. Он нам необходим для возможности использовать утилиты Linux (file, strings, grep).

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

----> Утилита file

Вот смотрите, допустим у нас есть файл steg.txt

Давай те посмотрим на него через утилиту file

и вы только посмотрите какой хитрец подлец. Оказывается это bmp файл. Картинка.

----> Утилита strings

Далее, снова имеем в наличии файл steg.bmp. Давайте попробуем использовать утилиту strings. Мы там увидим много чего(неполезного), а вот что бы увидеть полезное давайте немного подружим strings с grep и вот что мы получим:

«Изипизи» как говорится. Ессесно слово flag замените на любое другое по которому вы его будете искать.


Этот метод, кстати, будет бесполезен если вы получите данные картинки, в виде одной строки. Например после манипуляций с python. Т.к. утилита strings, как следует из названия, читает файл по строкам. Ну вы понимаете конечно, что если искать вхождение какой нибудь подстроки в большой строке, то тут можно получить только один тип информации. А именно есть эта подстрока в этой строке или нет.

----> Stegsolve

ООооочень полезная утилите для стего. Качаем прогу тут. Это исполняем jar файл, по этому для запуска необходим предустановленный jdk или jre.

И так программа имеет следующий интерфейс

----> #1 File format – выдает информацию вида

Очень полезен для определения спрятанных сообщений и даже картинок и файлов внутри исследуемой картинки.

----> #2 Data extract – то же очень полезная возможность программы позволяющая выявить lsb стего. Виде интерфейса меню такой

Выбрав некоторые биты цветов(как показано на картинке) stegsolve прочтет только те биты которые вы отметили и выдаст результат в форме.

Главная проблема заключается в том, что бы понять, в какие биты были использованы для стего.

----> #3 Stereogram Solver – накладывает друг на друга одно и то же изображение, после чего есть возможность двигать один из слоев. Выглядит все это примерно так

Далее покажу на нормальном пример и вы увидите его полезность.

----> #4 Frame browser –позволяет нам просматривать гиф по кадрам. По моему опыту еще ни разу не использовал эту часть.

----> #5 Image combainer – позволяет нам накладывать два изображения друг на друг(как в режиме stereogram solver, но картинки разные) благодаря чему можно увидеть различия (видимые) в картинках. Это применяется тогда, когда нам дана картинка со стего и ее оригинал. Ну об этом расскажу чуть позже.

Ну и самое главное, это начальный экран программы, который позволяет просматривать картинку по слоям, оставляя только сини пикси или зеленые, или только первые биты красного цвета и многое другое.

Вывод прост – очень полезная программа, которая достойна быть в арсенале любого, кто решать стего таски.


Linux:

За исключением exiftool, binwalk и steghide все что мы перечислили выше справедливо и для Linux. По этому далее мы рассмотрим только три этих утилите.

----> Утилита exiftool – читает мета-данные файлом. Применяется первым делом. Может дать много разной информации от автора статьи до кол-во фреймов на секунду в видео файле.

----> Steghide оооочень хорошо описан данный инструмент тут. Так же эта утилита фигурирует в курсе ParaNoID, так что советую к ней приглядеться 

----> Binwalk

То же очень полезная тулза. Распознает сигнатуры внутри файла. Но я не советую свято верить ему. Были моменты когда он давал неправильную информацию. Как я понял это из за того, что он просматривает только сигнатуры начала.

Binwalk имеет очень много функций, но нам достаточно 2х. Просто передавая ему файл на вход мы получаем инфу о хранящихся в нем файлах.

А добавив ключ -e распакуем эти файлы в ту же директорию, что и оригинальный файл в отдельную директорию _[имя файла].

Выглядит это примерно так: Есть файл steg.jpg, вот что выдает утилита file

Он думает что это картинка давайте спросим у binwalkа

У него есть другое мнение. Давайте дадим ему попробовать распаковать их binwalk -e steg.jpg

вот мы и нашли спрятанные картинки

Звуковые файлы:

----> Sonic Visualizer

Функционал:

Открывать звуковые файлы различных форматов (WAV/AIFF, Ogg, mp3 и т.д.) и просматривать их графическое представление;

Просматривать такие визуализации, как волновое представление и спектрограмма с возможностью интерактивного управления параметрами отображения;

В одном окне программы строить несколько волновых представлений и спектрограмм, причем каждая визуализация может иметь собственные параметры отображения;

Синхронно прокручивать все интересующие построенные визуализации и изменять их масштаб;

Снабжать звуковые данные примечаниями с помощью добавления различных меток и выделения отрезков сигнала

По моему опыту вся работа в этом редакторе сводится только к тому, что бы просмотреть звуковой ряд под разными слоями спектрограмм и игры с их настройками.

Давай те покажу на примере. Пусть имеется некий wav файл. Если просто открыть его в SV то вот что мы увидим

Пока что ничего не понятно. Но если наложить слой спектрограммы

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

Что касается Audacity, то это аналогичный аудио редактор с практически теми же возможностями. Тут уж кто чем привык пользоваться.

Видео файлы:

Как я уже писал выше весь мой опыт работы с видео файлами, в стего, сводился к тому, что бы разрезать видео ряд на кадры и уже с ними работать как с картинками. По этому приведу лишь одну строчку кода, которая позволяет это сделать с помощью ffmpeg.

ffmpeg -i input.mp4 -r 25 -f image2 images%05d.png

где:

----> i – видео файл, который необходимо разбить на фреймы

----> -r – кол-во фреймов в секунду. Можно узнать в мета данных файла

----> -f – тип файла в который необходимо перевести фрейм

Так же может быть полезен ключ –t: ffmpeg -i input.mp4 -r 25 –t 00:00:01 -f image2 images%05d.png

Этот ключ позволяет обработать заданное кол-во времени видео файла. В данном примере 1 секунду.

Теперь я бы хотел расписать некие алгоритмы для различных ситуаций:

- Первым делом, не важно, какой это файл, проверяйте утилитами file, exiftool, binwalk.

- Далее проверьте утилитой strings [имя файла] | grep –I [искомая подстрока(например flag)]

- Если ничего из этого не дало результата, то далее уже все зависит от вида объекта.

Картинка:

- Если картинка монотонная, то первым делом попробуйте открыть его в каком нибудь реакторе и примините заливку или используйте утилиту Steglove и прогоните по слоям.

было:

стало:

Есть с чем работать, как говорится.

- Если на картинке вы видите два цвета, то первая ваша мысль должна быть – бинарный код

Например:

Для облегчения это задачи есть наш верный друг python и его библиотека PIL.

Используем следующим образом:
Подключаем библиотеку: import PIL from Image
Читаем картинку: img = Img.open(‘[File name]’, ‘r’)
С помощью цикла пробегаем по каждому пикселю и читаем его:
    For I in range([Height]):
        For j in range([Weight]):
            r,g,b = img.getpixel((j,i))

- Если же у нас дана обычная картинка и в ней зашифровано стего, то стоит поискать оригинал картинки с помощью сервисов google pictures или аналогов.

- Так же было бы не лишним прогнать картинку по всем веб ресурсам которые я указывал выше.

Звуковые файлы:

- Если звуковой файл при прослушивании похож на зов пришельцев в брачный период, то сразу же посмотрите спектрограмму этого файла как я описывал выше. С большой вероятностью вы увидите, что то с чем можно будет работать.

- Если звуковая дорожка монотонно. Я имею ввиду, что на протяжении всей дорожки частоты не превышают определенной границы, то скорее всего это в файле зашифрована бинарная последовательность. На разных слоях спектрограммы будет лучше видно. Так же в этом может помочь наш друг python и его библиотека scipy.io.wavfile.

Подключаем библиотеку: from scipy.io.wavfile import read
Читаем частоту и семплы: rate, samples = read('steg.wav')
Пробегаем по массиву семплов и проверяем наши догадки:
    for I in range(len(samples)):
        print(samples[i])

- Если же звуковой файл у нас будет в стерео, то код немного поменяется:

Подключаем библиотеку: from scipy.io.wavfile import read
Читаем частоту и семплы: rate, samples = read('steg.wav')
Пробегаем по массиву семплов и проверяем наши догадки:
    for I in range(len(samples)):
        print(str(samples[i][0]) + ‘-’ + str(samples[i][1]))

Т.е. каждый элемент массива samples будет иметь массив из двух значений. Первой и второй дорожки соответственно.

Кстати из за этого можно попробовать найти разность звуковых дороже.

Подключаем библиотеку: from scipy.io.wavfile import read
Читаем частоту и семплы: rate, samples = read('steg.wav')
Пробегаем по массиву семплов и проверяем наши догадки:
    for I in range(len(samples)):
        print(samples[i][0]-samples[i][1])

Вполне может оказаться, что результатом станет последовательность цифр каждый элемент которой, переведя в нужную кодировку, может составлять флаг.

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

Надеюсь эта статья пригодится новичкам и поспособствует приливу новой крови в бурную реку ctf соревнований. Всем удачи!

Ссылки на тулзы:

Stegsolve - http://www.caesum.com/handbook/Stegsolve.jar

PentestBox - PentestBox

Sonic Visualiser - Download Sonic Visualiser (есть в репозитории Kali)

Audacity - https://www.audacityteam.org/download/ (есть в репозитории Kali)

Ffmpeg - https://www.ffmpeg.org/download.html (есть в репозитории Kali)

Источник

Report Page