[ИНТЕРЕСНО] Стеганография для новичков: как надёжно прятать/передавать файлы, маскируя их в фото/музыку + БОНУС: инет бесплатно везде [HOWTO]
Давайте представим себе гипотетическую ситуацию, что в России всё-таки запретили криптовалюты - а у вас как-раз хранится 2 биткоина, пара эфиров и ещё 10 зеков. Ну или запретили доступ к вашему любимому сайту, архив или часть которого вы предусмотрительно сохранили себе. Или вам на самом деле нечего скрывать, но вы предпочитаете пользоваться своим конституционным правом на неприкосновенность частной жизни.
Шифрование файла
Традиционные способы шифрования файлов вроде запароленных архивов - слишком явная цель. Это то, что будут искать в первую очередь, или даже что могут найти совершенно случайно. Зашифрованный зип-архив определенно может вызвать подозрения.
Конечно, можно усложнить задачу, набросав пару сотен зашифрованных файлов, все с разными паролями, в одну папку, запрятав в них обыкновенные фотографии, а в одном из них будет необходимый вам файл. Причем вам нет нужны запоминать пароли от файлов - нужно помнить только один пароль и имя необходимого вам файла.
Другое дело, что большой архив запароленных файлов сам по себе так и просит: "ну расшифруй же нас" и привлекает к себе внимание. Конечно, можно запихнуть все эти файлы в один архив, но тогда мы возвращаемся к первой проблеме - и так по кругу.
Так как же зашифровать необходимые нам файлы - например, файл wallet.dat от криптовалютного кошелька, файл с бэкапом вашей сид-фразы, архив вашего любимого сайта, или любой другой желаемый контент?
Стеганография
Если вы смотрели сериал Mr. Robot (если нет - рекомендую, не смотря на то что я не люблю сериалы!), то могли видеть, как Элиот записывает важные бэкапы на диски, подписывая болванки названиями групп. Нет, это не просто диск с данными - на диске реально музыка, причём именно тех указанных групп. Но с ней не всё так просто...
Давайте на минутку отвлечёмся от профессионального софта для стеганографии (Элиот пользовался таким) и попробуем сделать элементарный эксперимент аналогичного характера за вашим ПК. Здесь вам понадобиться только любой Linux, впрочем, подойдет и FreeBSD, Solaris и любая другая система, где в базовых инструментах есть утилиты zip/unzip и cat (архивирование файлов и вывод файлов на экран). Никакого спец-софта, никакой настройки, всё работает в любом Linux сразу из коробки. Поехали
Прячем файл внутри музыки
- Имеем вводную - скачанный музыкальный файл music.mp3 в текущей папке адекватного объема (например, 4-5 мб).
- Давайте не будем экспериментировать с реальным файлом для шифровки, для начала, создадим экспериментальный текстовый файл с содержимым, а в конце эксперимента убедимся, что мы смогли получить обратно текст. Итак, создаем файл:
echo "PutinIsThief123" > secret.txt
. Готово, у нас есть текстовый файл secret.txt с содержимым "PutinIsThief123". Проверить содержимое можно, открыв файл, можете например сделать это через графику или простоcat secret.txt
выведет содержимое на экран. - Запакуем файл в ZIP:
zip --encrypt file.zip secret.txt
- командой zip мы запустим архиватор, --encrypt этот флаг нужен для установки пароля на архив, первый аргумент - file.zip - имя итогового архива, второй аргумент - secret.txt - файл (или список файлов), который (-ые) необходимо положить в архив. После нажатия enter, архиватор попросит вас придумать пароль. После успешной архивации можете открыть file.zip любым (например, графическим) архиватором и, введя пароль, убедится, что нужный файл внутри. - Давайте соединим два файла последовательно: вначале нам нужен музыкальный файл, а затем - файл с секретной информацией. Для этого есть встроенная системная команда, поддерживающаяся 99.99% операционными системами из мира свободного ПО: cat (сокращение от слова concatenate, т.е. "сцеплять"). Вот так просто мы можем "сцепить" файлы по порядку, побайтово, в третий файл:
cat music.mp3 file.zip > newmusic.mp3
. - Готово! Если теперь вы попробуете воспроизвести файл newmusic.mp3 любым плеером (совершенно не важно, графическим, консольным или вообще физическим), то он будет играть от начала и до конца. Но если вы обратите внимание на размер файлов music.mp3 и newmusic.mp3, то увидите, что второй файл чуть-чуть больше. Так как же забрать и расшифровать скрытый файл обратно? Всё архи-просто!
- unzip newmusic.mp3 - нажимаете Enter и вводите пароль. В результате вы получите обратно файл secret.txt и его содержимое. Просто? Конечно! Быстро? Очень!
Но ограничивается ли это лишь MP3-файлами? Вовсе нет! Это работает и с картинками: cat image.jpg file.zip > newimage.jpg картинка будет работать, как обычно, и у неё будет рендериться превьюшка. Всё будет идеально - главное, не забрасывайте эту картинку на фото-хостинги, которые пережимают картинки =) Иначе, плакал ваш секретный файл-бэкап.
Но это же слишком явно!
Да, конечно, если у спец. служб, предположим, есть чёткая информация о том, что вы спрятали в MP3 файле или картинке некую секретную информацию, то они могут достаточно быстро проанализировать файлы, или просто грубой силой найти этот файл. Но есть довольно простые способы в разы усложнить им жизнь:
- Найдите коллекцию фотографий из 50-100 или более фотографий, где каждая фотография весит хотя бы 4-10 мегабайт (можно и больше). Например, фотографии красивых закатов, цветов, тусовка на прошлой неделе, да чего угодно. В такие файлы вы можете на 99% незаметно спрятать до 50% контента. Вот как это сделать:
- Выберите конкретную фотографию, например из 100 это будет 65, в которой будет ваш файл. Этот файл номер IMG0065.jpg мы пока не трогаем, а возьмем все остальные. Откройте каждый фоторедактором и добейтесь визуального ухудшения качества фотографий в 2 раза, при этом сохраняя разрешение и размер фотографии неизменным. Т.е., вам нужно уменьшить разрешение вдвое, а затем - увеличить его вдвое, в результате возникнет интерполяция (в данном конкретном случае это будет удвоение пикселей). Как результат - фотографии чуть-чуть худшего качества при таком же солидном весе. Это понадобиться нам для дальнейшего шага. Действия эти можно не проделывать вручную 99 раз, а воспользоваться программой phatch, которая позволяет делать массовые операции с фотографиями.
- Теперь давайте поработаем с основной фоткой, в которую будет спрятан файл. Она должна быть примерно такого же размера, как и все. Для начала, мы не будем менять её разрешение - вместо этого, мы увеличим сжатие до такой степени, чтобы фотография стала весить настолько меньше, насколько нам нужно спрятать шифруемый архив. Т.е., если мы прячем файл размером в 5 мегабайт внутри фотографии в 10 мегабайт, вам нужно уменьшить размер фотографии до 10 мегабайт, увеличив сжатие, пока она не будет весить 5 мегабайт.
- Проверьте визуально схожее качество целевой фотографии и всех остальных. Если она сильно отличается в лучшую или худшую сторону, подправьте её и/или остальные.
- Зашейте зашифрованный архив нужного вам объема в целевую фотографию: `cat IMG0065.jpg secret.txt > IMG0065_2.jpg' - не забудьте удалить исходную IMG0065 после проверки и переименовать _2 в основную.
- В результате, у вас папка с 100 фотографий приличного качества, среди которых одна единственная с необходимым архивом. Но ведь можно пройтись скриптом по всем файлам, и найти быстро ваш архив, а потом перебирать к нему пароль. Это не годится. Что делать?
- Подготовьте небольшие мусорные архивы с какой-нибудь чушью и очень небольшими размерами. Например, файл может весить 512 байт или 1 килобайт. С помощью простого скрипта вы можете нагенерировать кучу таких файлов и сделать из них кучу зашифрованных архивов буквально за пару секунд. ВАЖНО - в файлах должны быть разные данные, и на них должны стоять разные пароли, причем лучше - очень длинные и совершенно неповторимые, например,
#&$(*@#&$*&@#(WDnjadnwnjakwjd7843&*743643768^76387#$736(&^
. Теперь, также сделайте скрипт, который зашьет в каждую фотографию эти небольшие файлы в конец. В результате, у вас 100 фоток, которые выглядят и работают как фотки, в каждой из которых есть секретный запароленный архив, но только один из них настоящий. Как другой вариант эксперимента - можно все фотографии сделать поменьше, и во все зашить большие файлы, примерно необходимого вам размера, но они будут фейковые - все, кроме одного. Это будет чуть-чуть дольше, зато будет ещё тяжелее вычленить отличающийся файл.
Ещё идеи для увеличения безопасности:
- Удалите метаданные ZIP-архива, сообщив получателю по безопасному каналу или лично начальный адрес ZIP-архива, чтобы он смог вырезать нужный кусок и разархивировать его, но при попытке unzip mypicture.jpg сторонних хакеров архиватор сообщал, что данные другого формата и ZIP-архив не найден
- Используйте несколько уровней шифрации и архивирования
- Спрячьте внутри архива что-то, что вы действительно стали бы прятать, но что не делает вас преступником. Например, коллекцию порно-снимков. Расшифровав ваш архив и обнаружив в нём порно, врядли кто-то станет проводить дальнейшее исследование и тщательно выискивать внутри этих файлов зашифрованные архивы или файлы. Особенно, если порно будет достаточно много ;)
- Также, можно использовать приём отвлечения внимания. Например, вы можете оставить в зашифрованном архиве фотографию с надписью, вроде: "ахаха, ну вот ты и попался, это был honeypot". Ханипот - это специальная ловушка, создаваемая для поимки хакера. Когда он попадает в неё, думает, что взломал какую-то систему, а на самом деле взломал систему-приманку и скоро может быть пойман. Увидев, что вы в курсе, что ваш архив вскрыт, человек как минимум будет удивлён. Вероятность того, что он будет искать дальше, уменьшается, особенно если в архиве кроме этой надписи ещё будут всякие идиотские мемчики. =)
- Разделите файл на большое количество маленьких архивов и спрячьте каждый в фото/музыке/где угодно
- Используйте специальный софт для стеганографии
- Придумайте свою, гибридную или другую методику (только не используйте шифр цезаря ;)
Передача данных (+БОНУС)
Ну а как достаточно безопасно передавать данные, воспользовавшись методиками стеганографии и есть ли более изощренные методики?
Для стеганографии при передачи файлов вам нужно сделать следующее: спрятать трафик определенного вида или типа внутри другого трафика так, чтобы он казался именно таким, как вам нужно. И для этого, о чудо - есть готовое клиент-серверное приложение. И называется оно Iodine (йод) - гуглить можно как "Iodine DNS". Вариант максикровки трафика под DNS-трафик не единственный - есть другой софт для маскировки трафика под скайп, веб-браузер и многое, многое другое. Но это выходит за пределы статьи, если попросите в комментариях, напишу об этом отдельный пост.
Суть этого приложения довольно проста - оно прячет ваш трафик внутри DNS-трафика. Т.е., вы можете пользоваться интернетом там, где доступен только DNS-трафик (а он доступен почти всегда), или передавать через DNS-трафик вашу особо секретную, конфеденциальную инфу.
Вот как это сделать:
- Для начала, вам нужен сервер, который 24/7/365 подключен к интернету и доступен с внешним белым IP либо с прикрепленным DNS именем (читай, постоянным адресом). Можете воспользоваться, например, https://freedns.afraid.org для того чтобы дать вашему серверу постоянный адрес. На это сервер нужно, соответственно, установить сервер Iodine. Вот репозиторий проекта Iodine на гитхабе проекта: https://github.com/yarrick/iodine (установка и настройка сервера выходит за пределы этой статьи, если вам необходима помощь - напишите комментарий, сделаю отдельный пост). После установки iodine запустите сервис:
./iodined -f myip mydomain
- заменив, соответственно, myip на ip вашего сервера и mydomain на его собственный адрес. После нажатия на enter нужно будет задать пароль и снова подтвердить enter'ом. - Затем, вам нужно также установить iodine на ПК, с которого вы хотите осуществить доступ в интернет через DNS (на этом шаге вам всё ещё нужен "традиционный" интернет с обычным трафиком).
- Теперь, имея два компа с установленным Iodine софтом, вы можете уходить с одним ПК прочь от интернета. Например, подключитесь к публичному Wi-Fi, где нужно авторизовываться через СМС, но не проходите авторизацию. Или найдите кабель от интернета, который вы давно не оплачивали и подключите его к компу - нужно лишь чтобы работал DNS (можно, к примеру, пингануть ya.ru чтобы проверить, вернётся ли IP яндекса - если да, значит DNS работает). И теперь без полноценного доступа в интернет сделайте следующее - выполните
./iodine -f -r serverip serverdomain
- заменив serverip на публиный IP сервера и serverdomain на домен последнего. Кстати, по-моему, IP в обеих командах опциональные, но точно уже не помню - надо тестить. После ввода команды нужно будет также ввести пароль (если ваш ПК сумел "добраться" до вашего DNS туннеля) - тот самый пароль, что вы задли при запуске сервера. - Готово! Если всё правильно, теперь ваш ПК использует DNS-туннель. Сразу же предупреждаю: DNS-сервис не подходит для передачи большого объема данных. У вас, скорее всего, не получится загрузить даже 1 картинку весом в 0.5 мегабайта. Однако, вполне приемлимо должны работать текстовые сайты, сайты новостей, погода, мессенджеры, и другие минимальные вещи, которые не требуют огромной скорости, чтобы загружаться.
Вот вам и реальный пример маскировки одного трафика под другой, который, по сути, позволяет даже обходить биллинг-системы провайдеров и системы авторизации Wi-Fi точек через всякие SMS. Вы просто подключаетесь и начинаете работать. В текстовом варианте, скорее всего - но это лучше, чем ничего, ведь правда? :)
А в чём же БОНУС?
В том, что таким методом вы можете обходить блокировки вашего провайдера за неуплату, выходить в интернет без авторизации через публичные Wi-Fi точки, и вообще пользоваться интернетом только в тех средах, где работает DNS-трафик, а всё остальное по той или иной причине запрещено (например, вы забыли заплатить за домашний интернет)
Другие методики
Но есть и другие способы маскировки трафика. Расскажу об одном, который приходит на ум.
Предположим, у вас есть не очень большой объем данных для передачи - считанные биты. У вас есть на 100% скомпрометированный канал, который слушают, и поверх которого невозможно использовать никакие существующие системы шифрования, но этот канал - единственный. Что же делать? Как воспользоваться им, и не быть скомпрометированным "Большим Папой"? И ещё - как можно передавать дополнительную информацию поверх существующей, НЕ добавляя к существующей ни одного бита?
Всё достаточно просто. Думайте в сторону TTL. Технари уже могут понять меня на этом этапе. Не совсем TTL, на самом деле, принцип чуть другой. Но вот суть. Вам нужно взять либо уже передающийся в сети трафик, либо самим начать генерировать какой-нибудь мусорный трафик, который и будет прослушан нашим условным противником. Итак, у вас есть трафик - не важно, чужой или ваш мусорный сгенерированный трафик.
Теперь давайте просто добавлять к нему задержки. Вот этот пакет в 1 кб пройдет за 1 секунду, затем пакет в 512 байт за 2 секунды, затем такой же - снова за 2 секунды. Поняли, о чём я? Вы не вмешиваетесь в содержимое трафика, не меняете там ни байта - не важно, этот трафик чей-то или ваш, мусорный сгенерированный трафик. Он остается таким же, и доходит до адресата. И его читают. Но в нём нет ничего ценного. Вместо этого, передаваемая вами информация скрыта в задержках. Здесь, само собой, на обеих сторонах у вас должны быть симметричные алгоритмы шифрования и дешифрования этих задержек. Кроме того, краеугольным камнем такого способа будет то, что у сети Интернет, к большому сожалению, нет такого показателя как "гарантированное время доставки сообщения" - ведь передаваемые пакеты могут начать проходить по другому каналу, если маршрутизаторы в пути посчитают, что так передавать эффективнее - и время доставки изменится. Пакеты также могут теряться, поэтому вам понадобится очень серьезные алгоритмы по восстановлению утерянных данных. В конце концов, у такого канала будет не очень большая пропускная способность - а если вы захотите повысить эту пропускную способность, скорее всего резко увеличится количество ошибок, или же вы рискуете вообще быть обнаруженными (речь здесь, конечно, не о наших спецслужбах). Тем не менее, такой вид софта кажется мне интересным. Если вы знаете, как называется данная методика шифрования (что-нибудь вроде Time-Assigned Encoding? Time-Encapsuled Encoding, TimeFrame Encoding) - напишите об этом в комментариях!
Ещё немного софта
Есть довольно старый, но открытый и кроссплатформенный софт - Steghide (последняя версия вышла аж в 2003 году, но софт до сих пор в репозиториях убунту и ставится одной командой sudo apt install steghide
и работает как положено). Согласно заверениям на сайте, последняя версия проги делает скрытый файл необнаружимым при помощи специализированного софта по анализу частот и цветов. Предлагаю изучить :) Также есть более свежий софт, всего трёхлетней давности, но он рассчитан только на сокрытие внутри аудиофайлов: https://github.com/danielcardeenas/AudioStego. Кроме этого софта, есть ещё SilentEye для работы с JPEG/BMP/WAVE форматами, и напоследок - OpenStego, также интересный и качественный продукт с интересным функционалом скрытых вотермарков.
Ещё один секрет шифропанков
Расскажу вам ещё один лайфхак от шифропанков... Ух, нет. Передумал. Не буду вам его рассказывать. Дам только подсказку: смотрите в прямой адрес этой статьи. Если не поймёте, о чём я, расскажу в будущих постах - так что подписывайтесь (: Удачи.
Feedback
Надеюсь, вам была интересна и полезна статья. Жду ваших комментариев и мыслей на этот счёт =)
P.S. Вдохновлено этой статьей
Всегда ваш шифропанк и криптогик,
Den Ivanov aka @SXIII from Random City