INT 21h

Hi, I am Vladimir Smagin, sysadmin. Telegram Email

Python: Небольшой урок по стеганографии

№ 8500 В разделе "Программирование" от September 29th, 2017,

Вася и Петя, которые ранее обменивались шифрованными письмами с фотками своих жён и членов в сети, оказывается были агентами правительства СШП для проведения шпионажа в сфере технологий химоружия. Господин Джон хочет узнать секрет повышенной удушливости трусов товарища Дмитрия. Вася в течении года многократно соблазняет Дмитрия и узнает, что он их просто не стирает. Получив секрет Васе предстоит передать эту информацию Пете, который уже передаст её господину Джону, но как?! Ведь за Петей уже ведет слежку товарищ начальник Игорь, незаметно установивший троян ему в Windows вместе с новым элитным браузером интернета и самоотерженно читает их почтовую гей переписку в открытом виде.

Что делают одни крутые пацаны, когда хотят передать сообщение другим крутым пацанам? “Шифруются”, – скажете вы, но будете правы лишь отчасти. К сожалению, GPG шифрование работает только если ни один из компьютеров не скомпрометирован, а сам факт использования человеком криптографии с самого начала подразумевает привлечение к сообщению и персоне лишнего внимания. Для спецслужб это все равно, что кричать в пустой комнате: “придите и заберите меня в секретную тюрьму с пытками и злыми гомосексуалистами”. Вася и Петя как раз не дураки, чтобы попасться на этом и поэтому Вася пишет программу, маскирующую сообщение для господина Джона прямо внутри типичной для их переписки фотографии с подписью: “зацени член моей жены. покажи Джону, пусть тоже глянет”. Петя получает от Васи письмо с фотографией и пересылает ее господину Джону. Миссия выполнена, пацаны едут довольные домой в СШП за новыми моделями Audi TT, а Игорь лишается звезд с погонов потому, что установил слежку только за одним участником и просрал всю операцию.

История очень захватывающая и грустная потому, что Игорь был слишком самонадеянным. Но даже если бы у него получилось получить программу экстракции далеко не факт, что он смог бы прочитать сообщение. Чтобы не привлекать внимание информацию нужно сначала зашифровать, а потом замаскировать ее под что-то безобидное. Таким образом даже если сообщение будет извлечено оно все еще будет зашифровано. Сокрытие полезной информации называется стеганографией и может применяться в совершенно разных местах и часто в комбинации с другими средствами и уловками. Например, сокрытие текста в статье в городской газете или невидимые символы в документах Word. Можно даже отправить какой-нибудь легкий компромат на себя, но внутри отправленного файла замаскировать что-то еще более компрометирующее. Последний способ называется honey pot (горшочек мёда). Как вы уже поняли, я сегодня покажу как скрыть сообщение в графическом файле и это не будет тот дебильный детский сад с 200 мбайтным прицепом в конце жыпега. Сегодня будет тру хардкор с битовыми операциями.

Кстати, встраивание текста в графику использовали Blizzard для бана игроков, торгующих игровым барахлом. Ох, много тогда народа попало 😀

Я написал программу на Python 3. Первым делом создаем venv и ставим туда wheel и Pillow. Pillow это классная библиотека для работы с графикой. Теперь о выборе самой графики поговорим. Есть куча разных форматов, но при сжатии они теряют некоторое количество информации и этой информацией может быть как раз ваше сообщение. Формат PNG показал наилучший результат и я предпочел использовать его. Он отлично подходит для встраивания информации в скриншоты программ, графику с большим количеством одноцветных рядом стоящих пикселов и т.п.

Мы определились с контейнером для нашего сообщения и настало время узнать как именно будем делать инъекцию данных. Пиксел состоит из 3 цветов и координат. Я выбрал самый безопасный метод и меняю только последний младший бит в каждом цвете пиксела, по 3 полезных бита на каждый пиксел. Визуально это изменение не заметно вообще, а компьютерный анализ ничего не даст, если сообщение перед этим было зашифровано. Допустим, у нас есть 5 байт для передачи. Наша картинка это полноцветная иконка 16х16. Нам понадобится 40 бит (5 байт по 8 бит) из возможных 768 (256 пикселов с 3 цветами каждый), места вроде как дофигище получается. Начинаем перебор по каждому пикселу и меняем самый младший бит цвета на старший бит из первого байта вашей информации, по полезных 3 бита на каждый пиксел. И так пока не кончатся биты вашего 5 байтового сообщения.

Например, ваш байт для передачи 0b01101111, оригинальный цвет самого первого по счету пиксела F0F4F5 (серый со светло-голубым оттенком). В цикле перебора цветов меняем младший бит красного канала на 0 F0 -> F0, зеленого на 1 F4 -> F5 и голубого на 1 F5 -> F5. Новый цвет F0F5F5. Осталось еще 5 бит и поэтому мы берем следующий пиксел и аналогичным образом меняем младшие биты там. Пока сообщение не кончилось мы продолжаем менять младшие биты в пикселах. Аналогичным способом достаем данные из вашей картинки, также загружаете картинку в память, читаете младшие биты цветов каждого пиксела и складываете в память, а по окончанию сборки можно выгрузить на диск в какой-нибудь файл.

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

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

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

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

Полный код с примером можно забрать здесь https://bitbucket.org/21h/steganography/overview

Нет комментариев »

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Комментарии

  • 21h: нене ) без меня )
  • Серегй: Не совсем грабить)) если грабить можно и без рации, есть...
  • 21h: магазин грабить собрались? ) не, тут я не помощник ;)
  • Серегй: А что бы мне поймать чужую волну, что мне для этого нужно...
  • 21h: слушать никто не запрещает. нет закона, который запрещает...
  • Серегй: Я хотел узнать могу ли я просто прийти с данной рацией baofeng...
  • 21h: У меня есть только эти 2. По другим ничего не знаю. В интернете...

© Vladimir Smagin, 2005-2017. Копирование материалов без разрешения запрещено.
Яндекс.Метрика