Статья Основы Стеганографии в WAV файлах

Тема в разделе "Защита от взлома", создана пользователем OmLeT, 18 мар 2018.

  1. OmLeT

    OmLeT
    Команда форума Модератор
    Статус:
    Оффлайн
    Регистрация:
    2 май 2017
    Шалом дорогие форумчане, сегодня хотел залить статью по стегонографии, ибо как-раз недавно начал проходить hackthebox, а стегонография являеться неотьемлемой частью любого ctf, да и впринципе в тенвой сфере очень пригодиться.
    Стеганография в WAV файлах



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

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

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

    Как правило, скрытое сообщение (payload) по объему в несколько раз меньше, чем сообщение-контейнер (carrier). Посмотрите на статью в википедии en.wikipedia.org/wiki/Steganography. Найдите в статье картинку с деревом на фоне неба. В этой картинке формат пикселя rgb24, то есть, три цветовых канала по восемь бит в каждом (интенсивность каждого канала может принимать значение от 0 до 255). Если изменять младшие биты каждого канала, то цвет пикселя будет незначительно меняться, например синий компонент был 10011100 (156), а стал 10011111 (159), пиксель стал чуть ярче, но в целом картинка осталась прежней. Изменяя младшие биты мы можем заставить картинку хранить скрытое сообщение. Теперь посмотрите на картинку, которая была восстановнена из картинки с деревом. Обратите внимание на глубину цвета, используются пиксели только нескольких цветов. Вес файла картинки также заметно ниже, чем картинки-контейнера.

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

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

    Большие возможности стеганографии открываются в звуковых файлах. Постепенно набирают популярность форматы lossless (сжатие без потерь), которые часто встречаются на трекерах и в личных архивах. Основным форматом для работы со звуком является WAV, который содержит звуковые семплы в чистом виде, в последствии этот файл можно сжать кодеком flac, а затем при надобности восстановить обратно в wav.

    Что такое цифровой звук?
    Аналоговый звуковой сигнал можно загнать в компьютер, но для этого его надо сначала оцифровать. Сигнал поступает на специальный аналого-цифровой конвертер (ADC), этот конвертер производит равномерные переодические замеры уровня входного сигнала и выдает на выходе последовательность цифр, чем больше напряжение, тем больше цифры. Цифровой сигнал можно преобразовать обратно в аналоговый, для этого цифры подают на цифро-аналоговый конвертер (DAC), на выходе которого появляется меняющееся напряжение, которое можно усилить и прослушать на громкоговорителе. Такой способ записи звука называется LPCM (Linear Pulse Code Modulation) или просто PCM.

    Важный параметр PCM - ширина семпла в битах. От него зависит то, насколько тихие звуки может передавать звуковой канал, и при этом эти звуки не утонут в шуме квантования. В звуковом компакт-диске используется ширина 16 бит на каждый из двух каналов, при этом сигнал может принимать значения от -32768 до +32767. Профессиональная аппаратура способна работать с шириной 24 бита (от -8388608 до +8388607). 8-битное аудио сейчас почти нигде не используется из за очень высокого порога шумов.

    Второй важный параметр - это частота семплов, для компакт-диска стандартная скорость - 44100 семплов в секунду. Для звуковой дорожки из видео файла стандарт - 48000 семплов в секунду. Также могут быть другие частоты, например на торрентсру часто выкладывают пластинки в высоком разрешении 24/96, 24 бита, частота семплов - 96000 герц.

    Как устроен wav файл?
    Наглядная спецификация: soundfile.sapp.org/doc/WaveFormat/

    Wav файл является разновидностью RIFF контейнера. Файл состоит из чанков - небольших частей. У каждого чанка первые четыре байта обозначают тип чанка, следующие четыре байта содержат цифру, обозначающую длину тела чанка в байтах, затем идет тело чанка. Чанки идут по очереди друг за другом. Внутри тела можно хранить всякие данные.

    Все цифры, которые указывают длину чанков и параметры потока, записаны в формате little-endian (младшим концом вперед), их можно копировать напрямую в регистры процессора при условии, что программа выполняется на little-endian машине.

    Существует версия файла в формате big-endian, в таком случае в начале файла сигнатура будет не RIFF а RIFX.

    Звуковые семплы находятся в теле чанка "data" в виде блоков, в каждом блоке несколько семплов, по одному для каждого канала. Семплы представляют собой знаковые числа (two's complement) либо 16 либо 24 бита длиной, либо беззнаковые 8-битные. 16-битные семплы принимают значения от -32768 до 32767.

    Wav файл содержит чанк "fmt ", который хранит сведения о потоке: количество каналов, ширину семпла, скорость воспроизведения потока.

    Звук также можно хранить в виде сырых данных (raw format). Попробуйте поэкспериментировать на линуксе с программой sox:

    sox some_wav_file.wav -t raw some_raw_file



    Теперь файл some_raw_file содержит сырые звуковые данные, вы можете посмотреть его в шестнадцатиричном формате с помощью команды xxd. Чтобы воспроизвести файл, нужно правильно указать частоту семплов, ширину семплов, количество каналов, тип числа (знаковое или беззнаковое), и порядок байтов (little-endian или big-endian):

    play -t raw -r 44100 -b 16 -c 2 -e signed-integer some_raw_file



    Какие виды звуковой стеганографии бывают?
    Самый простой метод - это метод наименее значимого бита (LSB Last Significant Bit), мы уже рассматривали его в примере с картинкой выше. Мы можем менять самый младший бит в каждом семпле звукового файла. Такой способ обеспечивает максимальную емкость, однако, есть способ обнаружить такую стеганографию по изменению среднего значения (BIAS). После встраивания зашифрованного потока это значение будет в районе 0.5, хотя в исходном файле оно могло быть другим.

    Более интересный способ - проверка четности регионов: аудиопоток разбивается на регионы, например, по 100 блоков в регионе, в каждом блоке по два семпла (для стерео). Затем проверяется четность всего региона. Результат проверки и есть один бит спрятанных данных. Если изменить один из младших битов в регионе, то меняется четность всего региона. Этот способ используется в программе ниже.

    Данные, спрятанные этими способами, сохраняются при сжатии в flac, но погибают при перезаписи на аналоговый носитель или сжатии в mp3. Существуют способы акустической стеганографии, которые могут жить на аналоговых носителях, к ним относятся: кодирование изменением фазы, эхо-кодирование. Такие способы будут оставлять легкообнаружимые артефакты.

    Стеганография в MP3 файлах?
    Не рекомендую. Все известные способы встраивания данных в mp3 либо используют служебные поля, либо искажают звуковой поток, отчего такой файл будет отличаться от обычного mp3, и наверняка уже существуют способы автоматического обнаружения таких файлов. Это же касается других lossy-форматов и JPEG картинок.

    Код
    Программа получилась немного сложная и запутанная. Три файла:

    stealth.c - код основной части программы

    Вы не можете просматривать ссылки, зарегистрируйтесь или авторизуйтесь на форуме !


    Следующие два файла - это хеш-функции, на их основе построен PRNG

    sha1.c

    Вы не можете просматривать ссылки, зарегистрируйтесь или авторизуйтесь на форуме !


    md5.c

    Вы не можете просматривать ссылки, зарегистрируйтесь или авторизуйтесь на форуме !


    Как это работает?
    Как скомпилировать программу?

    Вам понадобится любой линукс. Если его нет, то перезагрузите компьютер с Linux Live-CD или Live-USB. (Впрочем, программу можно собрать и на Винде). Сделайте три файла выше, затем в этой папке выполните команду:

    gcc -Wall stealth.c -o stealth



    В результате у вас появится исполняемый файл stealth, который можно запустить из этого же терминала:

    ./stealth



    Появится подсказка с опциями.

    Теперь подробнее о принципе работы. Программа влияет на содержимое чанка 'data', остальные чанки копируются без изменения. Опция -wavin задает входной аудиофайл, -wavout - имя создаваемого аудиофайла, -hiddenin - секретный файл для встраивания. Вместо имени файла может стоять дефис, тогда программа будет читать стандартный поток ввода, либо писать в стандартный поток вывода.

    Программа имеет удобный инструмент, который позволяет более детально контроллировать процесс работы. Возьмите какой-нибудь звуковой файл, и выполните с ним команду:

    ./stealth encode -wavin=sound.wav -pass=xyzzy -hiddenin=md5.c -region=7 -microscope 100 2000



    Опция -microscope принимает два параметра: первый, это смещение в блоках, второй, это примерная длина вывода в блоках. Фрагмент выхлопа этой команды:

    0x00001ff0 00002033 work 00000 d8 fe 50 ff -0000296 0xfffffed8 -0000176 0xffffff50
    0x00001ff4 00002034 work 00001 da fe 55 ff -0000294 0xfffffeda -0000171 0xffffff55
    0x00001ff8 00002035 work 00002 d9 fe 65 ff -0000295 0xfffffed9 -0000155 0xffffff65
    0x00001ffc 00002036 work 00003 cf fe 70 ff -0000305 0xfffffecf -0000144 0xffffff70
    0x00002000 00002037 work 00004 d1 fe 65 ff -0000303 0xfffffed1 -0000155 0xffffff65
    0x00002004 00002038 work 00005 cc fe 6c ff -0000308 0xfffffecc -0000148 0xffffff6c
    0x00002008 00002039 work 00006 c5 fe 61 ff -0000315 0xfffffec5 -0000159 0xffffff61
    Нечетность региона = 0
    Бит для встраивания = 0

    0x0000200c 00002040 work 00000 cc fe 50 ff -0000308 0xfffffecc -0000176 0xffffff50
    0x00002010 00002041 work 00001 d9 fe 3f ff -0000295 0xfffffed9 -0000193 0xffffff3f
    0x00002014 00002042 work 00002 d2 fe 52 ff -0000302 0xfffffed2 -0000174 0xffffff52
    0x00002018 00002043 work 00003 c7 fe 54 ff -0000313 0xfffffec7 -0000172 0xffffff54
    0x0000201c 00002044 work 00004 c7 fe 53 ff -0000313 0xfffffec7 -0000173 0xffffff53
    0x00002020 00002045 work 00005 c5 fe 56 ff -0000315 0xfffffec5 -0000170 0xffffff56
    0x00002024 00002046 work 00006 c5 fe 58 ff -0000315 0xfffffec5 -0000168 0xffffff58
    Нечетность региона = 1
    Бит для встраивания = 0
    подходящий блок - 4, канал - 0
    0x0000201c 00002044 БЫЛО 00004 c7 fe 53 ff -0000313 0xfffffec7 -0000173 0xffffff53
    0x0000201c 00002044 СТАЛО 00004 c6 fe 53 ff -0000314 0xfffffec6 -0000173 0xffffff53

    0x00002028 00002047 work 00000 c3 fe 65 ff -0000317 0xfffffec3 -0000155 0xffffff65
    0x0000202c 00002048 work 00001 b6 fe 61 ff -0000330 0xfffffeb6 -0000159 0xffffff61
    0x00002030 00002049 work 00002 b4 fe 69 ff -0000332 0xfffffeb4 -0000151 0xffffff69



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

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

    PRNG (Pseudo-Random Number Generator) - генератор псевдослучайных чисел, он нужен в программе для того, чтобы генерировать криптостойкий шум. Этот шум XOR-ится с входным потоком, в результате получается зашифрованный поток, похожий на шум, качество шума зависит от качества генератора. Если генератору шума дать одно и то же зерно, то он произведет один и тот же поток. Это свойство используется при расшифровывании: зашифрованный поток XOR-ится этим же шумом, получается исходный поток.

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

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

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

    Чтобы встроить файл secret.txt в файл sound.wav выполните такую команду:

    ./stealth encode -wavin=sound.wav -hiddenin=secret.txt -pass=xyzzy -wavout=newsound.wav



    Внимательно изучите сообщения на экране, для расшифровки нам потребуется знать размер региона, смещение, пароль, и количество байт для чтения. Чтобы извлечь секретное сообщение, выполните эту команду:

    ./stealth decode -wavin=newsound.wav -hiddenout=extracted.txt -pass=xyzzy



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

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

    Техника безопасности
    Самый простой способ выявить стеганографию, это сравнить оригинальный файл без скрытого сообщения с этим же файлом после встраивания, тогда легкие изменения файла сразу будут видны. Из этого следует вывод: оригинальный файл рекомендуется уничтожить невосстанавливаемым способом. Ни у кого не должен быть оригинальный файл. Тут я рекомендую следующую методику: займитесь оцифровкой аналоговых носителей, пленки, грампластинок. Возьмите запись, которая вам нравится, и оцифруйте. Исходный файл до стеганографии следует хранить в памяти (ramfs), или в зашифрованном swap разделе, или на зашифрованном разделе жесткого диска, как вам нравится. Промежуточные результаты тоже должны быть зашифрованы и в последствии уничтожены.

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

    Не следует использовать WAV, восстановленный из mp3. Возможно появление методов, отделяющих звук, полученный из mp3 декодера от помех, которые были внесены стего-программой.

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

    От всего этого помогает способ, приведенный выше. Шум, который присутствует в любом аналоговом тракте, будет маскировать стеганографию.

    Опасайтесь перегрузки АЦП. Звуковой сигнал может колебаться в пределах допустимых значений, если подать на вход звуковой карты громкий сигнал, то в момент перегрузки в файл запишется последовательность одинаковых семплов, измененный бит будет заметен среди них.

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

    Программа избегает встраивания информации, если сигнал слабый. Других систем защиты в этой программе нет.

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

    Вот, пожалуй, все, о чем я хотел(а) написать. В будущем планирую написать еще несколько интересных статей и программ.
    Статья не моя, но очень полезная. Но я внес несколько коректировок. Жаль, не могу указать автора


     
    B3aver, Adolf, Koldyn1 и ещё 1-му нравится это.