March 7, 2019

Прячем стегосообщение в обложке альбома MP3 файла

Источник: t.me/hackportru

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

MP3 (более точно, англ. MPEG-1/2/2.5 Layer 3; но не MPEG-3) – это формат файла для хранения аудиоинформации. MP3-файл состоит из нескольких фрагментов (фреймов) MP3, которые, в свою очередь, состоят из заголовка и блока данных. В начале MP3-файла содержатся специальные теги – ID3-метаданные. Они являются ничем иным как метками в границах MP3-файла (в начале и/или в конце). В них может быть записана информация об авторстве, альбоме, годе выпуска, обложка альбома и текст песни и прочая информация о треке. Строки разделяются нулями или пробелами. Неиспользуемые поля заполняются как пустые строки.

Существуют следующие стандарты метаданных: ID1, ID2, ID3v1 и ID3v2. Стандарт ID3v2 определяет 84 типа фреймов, а также разрешает приложениям создавать свои фреймы. В числе стандартных имеются фреймы для хранения изображения обложки, числа ударов в минуту, информации об авторских правах и лицензии, текста песен, произвольного текста, ссылок и других данных.

Таким образом, MP3 файл посредством хранения информации в ID3v2 формате может содержать изображение обложки альбома, а также иную информацию, которую возможно использовать для сокрытия стего-сообщения.

В качестве обложки можно использовать любое изображение JPG/PNG. Стоит отметить особенность PNG изображений.

Вспомним структуру PNG формата:

  1. PNG сигнатура (89 50 4E 47 0D 0A 1A 0A)
  • 89 — non-ASCII символ. Препятствует распознаванию PNG, как текстового файла, и наоборот.
  • 50 4E 47 — PNG в ASCII записи.
  • 0D 0A — CRLF (Carriage-return, Line-feed), DOS-style перевод строки.
  • 1A — останавливает вывод файла в DOS режиме (end-of-file), чтобы вам не вываливалось многокилобайтное изображение в текстовом виде.
  • 0A — LF, Unix-style перевод строки

2. Фреймы (чанки) - это блоки данных, из которых состоит файл. Каждый чанк состоит из 4 секций.

Обязательные чанки:

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

PLTE — палитра, список цветов.

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

IEND — завершающий чанк, обязан быть последним в файле.

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

Стего-алгоритм будет следующим:

  • конвертируем текст ASCII в base16;
  • дописываем 16-ричных код после IEND чанка;
  • Перезаписываем обложку MP3 файла изображением со скрытым сообщением.

Разберем построение подобной программы на интерпретируемом языке Python 2.7

Нам понадобятся такие библиотеки и модули как sys, os.patch и "Mutagen"

Для того, чтоб установить "Mutagen" необходимо выполнить (1 или 2):

  1. sudo apt-get install python-mutagen python3-mutagen
  2. pip install mutagen

Также необходимо добавить в начало скрипта # -- coding: utf-8 -- чтобы не было проблем с кодировкой при выполнении скрипта в консоли:

import sys, os.path

from mutagen import File

from mutagen.mp3 import MP3

from mutagen.id3 import ID3, APIC, error

Недостатком библиотеки «Mutagen" является то, что при наличии в MP3 файле обложки альбома, перезапись его не осуществится, поэтому принудительно удаляем существующую обложку.

audio = MP3(mp3file, ID3=ID3)

audio.delete() #удаляем уже существующую обложку

audio.save()

Необходимо открыть, прочитать файл в переменную, обработать ID3 теги и сохранить полученный результат:

audio.tags.add(APIC( encoding=1, mime='image/png', type=3, data=open(filename).read() ) ) #изменяем

audio.save() #сохраняем

Извлечь стего-текст можно следующим кодом:

# -- coding: utf-8 --

import binascii

file = File(mp3file)

artwork = file.tags['APIC:'].data

with open('image.png', 'wb') as img:

img.write(artwork)

#Извлекаем из контейнера сообщение

IEND_chunk = "0049454e44ae426082"

filename = 'image.png'

with open(filename, 'rb') as f:

content = f.read()

fs = binascii.hexlify(content)

a = fs.split(IEND_chunk, 1)[1]

print a.decode("hex")

У данного способа есть минус, а именно рассмотрев HEX представление MP3 файла можно без труда обнаружить стегосообщение. Но нам ничего не мешает применить шифрование, либо простое конвертирование в base10 или base2, чтобы потом встроить в PNG.

Таким образом, мы рассмотрели с вами еще один способ тайной передачи сообщений посредством внедрения информации в PNG файл, который приклеили в качестве альбома MP3.

Дописал скрипты на python!