Конечно, угроза безопасности звучит очень пафосно, тем более для милого котика, смотрящего на вас с JPEG изображения, но среди его байт легко мог затеряться вредоносный скрипт. Давайте разберёмся, что к чему.
Что такое полиглоты и как они работают
Файл-полиглот - это файл, который меняет свой тип в зависимости от контекста использования. Чтобы лучше понять суть можно привести следующий пример — файл JPEG изображения, который также содержит в себе эксплоит для сканирования информации о компьютере на Линуксе. И в зависимости от способа использования данного полиглота изменится и его тип, это достигается за счет сохранение сигнатурных байтов, с помощью которых различные системы способны определить расширение файла.
Некоторые примеры сигнатурных байтов:
JPEG файлы — начинаются с
FF
D8
и кончаютсяFF
D9
PDF файлы — начинаются с “%PDF” (в hex формате —
25
50
44
46
)
Основное множество полиглотов содержит в себе код, написанный на одном языке программирования. Чаще всего они используются для обхода защиты, которая основана на расширении файлов — пользователю скорее представится возможность загрузить файл с расширением JPEG, PNG и PDF, нежели с потенциально опасными JS, SH и HTML.
Прочитать больше про полиглоты можно например здесь или здесь.
Принципы создания полиглотов различных форматов
Так как каждое расширение файлов имеет уникальную структуру и ключевые, важные элементы, которые должны обязательно присутствовать, значит для каждого типа существует свой способ инъекции эксплоитов. Я не буду рассматривать структуры форматов, а лишь затрону как происходит внедрение кода, но если кому-то все же станет интересно, как они работают, вот отличные статьи на хабре о некоторых из них:
- Декодирование JPEG для чайников
- PNG — not GIF!
Формат JPEG
При сокрытии эксплоитов в JPEG используется метод изменения структуры, который заключается в изменении значение длины (length) на необходимое количество байтов.
Первичная структура файла:
После изменения значения в файле появляется дополнительное место, в которое можно поместить эксплоит:
Формат PNG
Из-за того, что структура PNG файла представляет из себя последовательность чанков, то в основном, для сокрытия нужной информации, используется метод добавления нового чанка после IHDR. Первичная структура файла:
Необходимо добавить чанк tEXt, позволяющий записать в него скрываемую информацию, в нашем случае JS + HTML эксплоит:
Формат PDF
Часто используются различные методы редактирования строк. Обычно, каждая строка заключена в круглые скобки, но злоумышленнику ничего не мешает записать ее в виде “столбика” или заменить каждый символ строки его восьмеричным или шестнадцатеричным представлением, причем числа можно разделять пробелами неограниченное количество раз.
Также, в PDF можно «прятать» JS эксплоиты с помощью /JavaScript /JS объектов, которые сами могут содержать исполняемый код, так и могут отсылать на другой JS объект.
В дополнение к выше перечисленным способам для скрытия эксплойтов можно запутать код с помощью hex последовательностей, в которых, например, /JavaScript может превратиться в /J#61#76#61Script. (При конвертации из hex в текст получим a = 61, v = 76, a = 61)
Работа с полиглотами
После краткой теоретической части можно перейти к захватывающей практике.
Сейчас мы попробуем создать и открыть полиглоты различными способами, а также проанализируем файлы на наличие полиглотных сигнатур.
Для наглядности и понятности глава разделена по пунктам с названиями объединённых расширений, внутри которых присутствуют шаги по созданию*, запуску и обнаружению* полиглотов.
* - В ходе создания и обнаружения полиглотов будет использована утилита powerglot
PDF + Bash
Создание полиглота
Первый шаг – работа со скриптом. Выбираем необходимый эксплоит на основе Bash языка (я буду использовать скрипт - Local Linux Enumeration & Privilege Escalation Script, он есть в файлах утилиты powerglot), кодируем его с помощью base64 и записываем в исполняемый файл формата .sh.
base64 ./расположение/скрипта -w 0 > b64.sh
Теперь нам нужно отредактировать содержимое файла так, чтобы base64 код мог раскодироваться в исходный код и выполниться командой bash. Для этого нам нужно обернуть закодированную цепочку в следующие команды:
echo “здесь располагается скрипт в base64“ | base64 -d | bash;
echo – отправка содержимого в терминал;
base 64 -d – произвести декодинг из base64;
bash – запустить скрипт.
Вот такой должен получиться результат:
Второй шаг – объединение отредактированного скрипта и PDF. Это действие осуществляется с помощью функции утилиты Powerglot:
python3 powerglot.py -o ./путь_1/b64.sh ./путь_2/test.PDF OUTPUT
ключ -o – функция кодирования скрипта в файл;
./путь_1/b64.sh – путь до скрипта;
./путь_2/test.PDF – путь до файла, в который кодируется скрипт, в данном случае, с расширением PDF;
OUTPUT – название файла, с закодированным в него скриптом (результат),
его расширение зависит от файла, в который производилась кодировка.
После этого мы получаем готовый полиглот, который уже кое-что умеет.
Проверка и запуск полиглота
На рисунке можно увидеть, что при открытии PDF файла и просмотре его с помощью команд в терминале никаких аномалий не обнаружено.
Срабатывание скрипта из полиглота вызывается открытием его в терминале (предварительно дав файлу разрешение на запуск).
Срабатывание эксплоита выводит в консоль детальную информацию о хосте —
ОС, файловая система, установленные программы и так далее.
В довесок ко всему выше проделанному, утилита Powerglot имеет функцию обнаружения полиглотов, проверяя определенные байты информации по известным шаблонам, в которых может оказаться подозрительное содержимое, а также способна отделять стегосплоиты (stegosploit — тема для отдельной статьи) от обычных полиглотов, функция продемонстрирована на рисунке ниже. Но в случае проверки директории после создания PDF полиглота программа не фиксирует его за вредоносный файл, хотя сама его и создала.
ключ -d – функция обнаружения полиглотов;
JPEG + Bash
Создание полиглота
Первый шаг – аналогично процессу по созданию PDF полиглота, необходимо подготовить эксплоит. Создадим простой исполняемый файл, который подключает хост, открывший наш полиглот, к серверу и дает возможность отправки сообщений между ними. Это возможно благодаря утилите командной строки netcat. Она позволяет передавать и получать данные по сетевым соединениям используя сетевые протоколы.
Перейдем к созданию эксплоита:
echo "nc 127.0.0.1 4444" > netcat.sh
echo – отправка содержимого в терминал;
nc 127.0.0.1 4444 – подключение с помощью утилиты netcat (nc) к серверу, в данном случае к самому себе, через порт номер 4444;
ключ > – перенаправляет отправку содержимого командой echo из терминала в файл;
netcat.sh – результат создания файла, содержащего эксплоит.
Второй шаг – объединение полученного эксплоита с JPEG файлом. Как и при создании PDF полиглота, воспользуемся утилитой Powerglot:
python3 powerglot.py -o ./путь_1/nc.sh ./путь_2/cat.jpg OUTPUT
ключ -o – функция кодирования скрипта в файл;
./путь_1/nc.sh – путь до скрипта;
./путь_2/cat.jpg – путь до файла, в который кодируется скрипт, в данном случае, с JPEG расширением;
OUTPUT – название файла, с закодированным в него скриптом (результат), его расширение зависит от файла, в который производилась кодировка.
Проверка и запуск полиглота
Видно, что получившиеся изображение не имеет помех или аномалий.
Для проверки результата нужно запустить простенький «сервер» для приема и отправки сообщений на 4444 порту:
nc -nvlp 4444
Теперь, запустив полиглот в терминале, мы получаем связность между хостом и сервером, и можем обмениваться сообщениями. Это не приносит большого вреда, но сама концепция и принцип работы показывает на что могут быть способны полиглоты.
На этот раз, программа по обнаружению полиглотов, отметила наш только что созданный полиглот, как подозрительный.
Заключение
Полиглоты являются интересным концептом угрозы безопасности информации. Они точно способны воспользоваться не бдительными пользователями, но скорее всего современные средства защиты не позволят им широко разгуляться.
С полиглотами можно долго экспериментировать и даже постараться найти им полезное применение, которое не будет светить вам 273 статьей. ;)
В продолжение данной темы можно рассмотреть stegosploit'ы, это полиглоты, созданные благодаря тому, что браузерный эксплоит стеганографически кодируется в JPG или PNG изображение, затем полученный файл «сливается» с HTML страницей, содержащей JS декодер закодированного в изображение эксплойта, превращая файл в HTML+Image полиглот....
Но это уже совсем другая история!
Комментарии (9)
anzay911
20.06.2023 17:16+7предварительно дав файлу разрешение на запуск
Вот досада-то какая.
vovobot Автор
20.06.2023 17:16+1К сожалению все так(
Но если интересно, можете почитать про стегосплоиты, о которых я упомянул.
Они запускаются автоматически, как только пользователь загружает страницу браузера, на которой находится стегосплоит, так как на сайте картинка перестает быть JPEG файлом, а становится HTML элементом. (это, конечно, если стегосплоит является JPEG + HTML полиглотом)Getequ
20.06.2023 17:16Допустим права на файлик выдали - а как он запустится то? Это же не исполняемый файл. Или он просто носитель кода и что бы его выполнить нужна инфраструктура которая ищет в "посылке" код и выполняет его?
Nurked
20.06.2023 17:16Линукс очень медленно и неверно шагает на десктоп. Так что можно ванговать картинки типа "Вы близко! Разрешите исполнение этого файла чтобы получить $unlimited прямо сейчас!"
AlexeyK77
Не очень понятно, как этот эксплоит, даже зашитый в недра картинки или пдф-ника все-же запустится, даже с учетом назначения файлу признака исполнимости.
Другое дело, что для обхода ДЛП-систем этот метод хорош, т.к. даже продвинутая длп система максимум может применить OCR на графический образ, в котором будут котики.
vilgeforce
Для обхода DLP полиглот-то не нужен. Попробуйте добавить зашифрованные данные без спецфических заголовков в конец любого файла