Атаки, связанные с десериализацией Java-объектов, при помощи Burp

Атаки, связанные с десериализацией Java-объектов, при помощи Burp

В этой статье будет рассказано о десериализации в Java и расширении Java Serial Killer Burp. Для тех, кто не хочет читать данный опус, а желает сразу скачать расширение и приступить к практике, в помощь соответствующая страница на Github.

Автор: Eric Gruber

Введение

В этой статье будет рассказано о десериализации в Java и расширении Java Serial Killer Burp. Для тех, кто не хочет читать данный опус, а желает сразу скачать расширение и приступить к практике, в помощь соответствующая страница на Github.

Недавняя атака, связанная с десериализацией в Java, предоставляет массу возможностей  пентестерам для получения доступа к системам, с которыми взаимодействуют Java-приложения. В большинстве случаев мы можем перенаправить соединения между приложением и сервером через прокси для того, чтобы обнаружить сериализованное тело HTTP-запроса во время ответа (предполагается, что при коммуникации используется HTTP-протокол). В этой статье рассматривается пример с HTTP, а в качестве прокси используется Burp.

Burp Proxy

Ниже показан пример, где HTTP-запрос с сериализованным Java-объектом проходит через Burp. Тело запроса выглядит так:


Рисунок 1: HTTP-запрос с сериализованным Java-объектом

Из рисунка выше видно, что сериализованный объект под названием State состоит из двух строк: capitol (написано неверно в данном примере) и nicknames. С этого момента мы можем манипулировать запросом при помощи пересылки во вкладку Repeater.

Генерирование сериализованных эксплоитов

Существует несколько утилит, способных генерировать сериализованные Java-объекты для эксплуатации уязвимостей в приложениях. Мне нравится ysoserial. На момент написания статьи ysoserial могла генерировать 9 типов полезных нагрузок. 

Запускаем jar-файл с указанием типа полезной нагрузки и команды для выполнения, после чего будет сгенерирован сериализованный объект. Не забудьте указать выходной файл:

java -jar ./ysoserial-0.0.4-all.jar CommonsCollections1 'ping netspi.com' > payload

Затем результат копируется в Burp через соответствующую команду контекстного меню:


Рисунок 2: Копирование сгенерированного объекта из файла

Генерирование сериализованных эксплоитов в Burp

Ysoserial работает стабильно, но в целях оптимизации своей деятельности по созданию эксплоитов, чтобы не переключаться между командной строкой и Burp, я создал расширение Java Serial Killer. Java Serial Killer является модифицированной версией вкладки Repeater, которая генерирует полезную нагрузку при помощи ysoserial.

Чтобы использовать расширение, кликните правой кнопкой мыши на POST-запросе с сериализованным Java-объектом и в контекстном меню выберите пункт Send to Java Serial Killer.


Рисунок 3: Отправка HTTP-запроса на обработку в расширение Send to Java Serial Killer

После выполнения команды выше в Burp появится новая вкладка со скопированным запросом.


Рисунок 4: Вкладка расширения Send to Java Serial Killer

Как видно из рисунка выше, во вкладке Java Serial Killer есть несколько кнопок, предназначенных для отсылки запросов, сериализации объекта, выбора типа полезной нагрузки и выбора команды для запуска.

Допустим, мы хотим выполнить пинг ресурса netspi.com при помощи полезной нагрузки с типом CommonsCollections1, поскольку знаем, что используется Commons-Collections 3.1. Вначале мы выделяем область, которая будет заменена на полезную нагрузку, выбираем тип полезной нагрузки в выпадающем списке, а затем указываем команду и нажимаем кнопку Serialize. При нажатии на кнопку со знаком вопроса выведется информации о типах полезных нагрузках и версиях приложений, для которых предназначены эти полезные нагрузки. После выделения области каждое последующее нажатие кнопки Serialize будет обновлять выделенное содержимое в запросе (при изменении команды, тип полезной нагрузки или кодировки).


Рисунок 5: Пример эксплоита с полезной нагрузкой

Также можно использовать кодировку Base64, если отметить соответствующий флажок.


Рисунок 6: Закодированный вариант полезной нагрузки

Если мы хотим изменить какой-либо параметр в запросе с полезной нагрузкой, просто выделяем область и нажимаем кнопку Serialize.



Рисунок 7: Замена параметра на полезную нагрузку

Скорее всего, нам понадобится кодирование полезной нагрузки как параметра в xml:


Рисунок 8: Закодированная полезная нагрузка, используемая в качестве параметра

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

Заключение

Я отправил написанное расширение в магазин приложений Burp и не думаю, что одобрение займет много времени. Однако если вы хотите попробовать Java Serial Killer прямо сейчас, можете скачать с Github (https://github.com/NetSPI/JavaSerialKiller). Для корректной работы необходима Java 8.

Если вам нравится играть в опасную игру, присоединитесь к нам - мы научим вас правилам!

Подписаться