№ 8500 В разделе
Programming
от September 29th, 2017,
В подшивках: Privacy, Python, Security
Вася и Петя, которые ранее обменивались шифрованными письмами с фотками своих жён и членов в сети, оказывается были агентами правительства СШП для проведения шпионажа в сфере технологий химоружия. Господин Джон хочет узнать секрет повышенной удушливости трусов товарища Дмитрия, разработчика секретного химического оружия. Вася в течении года многократно соблазняет Дмитрия и узнает, что он их просто не стирает. Получив секрет Васе предстоит передать эту информацию Пете, который уже передаст её господину Джону, но как?! Ведь за Петей уже ведет слежку товарищ начальник Игорь, незаметно установивший троян ему в 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 бит и поэтому мы берем следующий пиксел и аналогичным образом меняем младшие биты там. Пока сообщение не кончилось мы продолжаем менять младшие биты в пикселах. Аналогичным способом достаем данные из вашей картинки, также загружаете картинку в память, читаете младшие биты цветов каждого пиксела и складываете в память, а по окончанию сборки можно выгрузить на диск в какой-нибудь файл.
Результат экстракции сообщения из картинки. Полезно иметь эскейп символ, обозначающий конец сообщения, но вдруг вы хотите пересылать бинарные данные? Тогда надо контроллировать окончание сообщения совпадением CRC, переданной в самом начале сообщения.
А теперь о возможностях. Алгоритм можно модифицировать под собственные нужды:
Специально для ленивых студентов не стал ничего этого делать и тупо вывалил код на битбукет. Забирайте и пытайтесь в нем разобраться сами, а если ниче не поняли можно дать мне денег 🙂 Ну или не будет у вас этого вашего диплома погромиста. Муахахахаха!
Борьба с таким беспределом в корпоративных сетях обычно происходит с помощью пережатия любой пересылаемой графики. При пережатии пересылаемая информация скорее всего значительно пострадает. Определить наличие включений проблематично и даже если анализ нейросетью выявит битовые флуктуации там где их быть не должно (например, пересылается скриншот программы на котором есть больше белое поле), то изъять информацию не получится, если она зашифрована.
Полный код с примером можно забрать здесь https://git.blindage.org/21h/steganography
"Генерация GPG ключей для шифрования штатными средствами Ubuntu и общие принципы шифрования с открытым и закрытым ключем"
Fortune cookie: Spam del giorno: Qui sarai sempre vero Risparmio!
Leave a Reply