Новая уязвимость в Oracle WebLogic позволяет выполнять произвольные команды на целевой системе любому атакующему без какой-либо авторизации. Разберемся, что именно должен делать атакующий и почему это работает.
Сервер приложений WebLogic, как и большинство продуктов Oracle, широко распространен в энтерпрайз-среде и используется крупными компаниями по всему миру. Проблемы, подобные этой, могут грозить огромными убытками и повлечь за собой утечки приватных данных.
Продукты компании PeopleSoft, производящей ПО для управления базами клиентов, финансового планирования и управления персоналом, тоже подвержены этой уязвимости, поскольку один из компонентов — это сервер WebLogic.
Проблема заключается в некорректной фильтрации данных при парсинге пользовательского запроса в XML перед передачей его в XMLDecoder. Отвечает за это модуль WLS Security. Уязвимость получила номер CVE-2017-10271 — это логическое продолжение не до конца запатченной CVE-2017-3506 в модуле Web Services. Баг затрагивает версии WebLogic до 10.3.6.0.0, 12.1.3.0.0, 12.2.1.1.0 и 12.2.1.2.0.
Сначала поднимем и настроим наш первый в 2018 году стенд для тестирования уязвимости. Я сижу на винде и поэтому буду использовать win-версию сервера WebLogic.
Для того чтобы загрузить сам дистрибутив, тебе понадобится рабочий аккаунт Oracle. Если у тебя его нет, то можешь зарегистрироваться тут. Далее переходим в раздел загрузок, принимаем лицензионное соглашение и выбираем нужную версию дистрибутива для загрузки.
Рекомендую использовать ветку 10.3.6, так как там сразу работает уязвимый модуль. Windows Oracle WebLogic распространяется в виде инсталлятора, в котором уже имеется JDK, ведь дистрибутив написан на Java и требует Development Kit для работы.
Сразу после завершения установки тебе предложат запустить и настроить рабочее окружение. Не вижу смысла отказывать в этом.
После всех настроек мы получаем готовую рабочую среду для тестирования уязвимости.
Если ты используешь Linux, то рекомендую поднять окружение через Docker, благо в репозитории ты уже можешь найти готовые сборки WebLogic. Вот, например, одна из них.
Давай сразу же проверим работу эксплоита. Загрузить один из вариантов PoC можно отсюда.
Для корректной работы в качестве параметра нужно указать адрес сервера WebLogic. По умолчанию скрипт отправляет запрос с эксплоитом к роуту /wls-wsat/CoordinatorPortType
.
54: url_in = sys.argv[1] 55: do_post(url_in, command_in)
42: def do_post(url_in, command_in): 43: payload_url = url_in + "/wls-wsat/CoordinatorPortType"
После запуска PoC будет предложено ввести команду, которую нужно выполнить на удаленной системе.
53: command_in = raw_input("Enter your command here: ")
Поскольку это логическое продолжение уязвимости CVE-2017-3506, сначала взглянем, что делает патч, который Oracle выпустила для нее. Нужные нам файлы находятся в файле /lib/weblogic.jar
, поэтому его нужно декомпильнуть, например с помощью Java Decompiler.
Нас интересует файл WorkContextXmlInputAdapter.java
. Вместе с апрельским патчем разработчики добавили метод validate
.
21: public final class WorkContextXmlInputAdapter 22: implements WorkContextInput 23: { 24: private final XMLDecoder xmlDecoder; 25: 26: public WorkContextXmlInputAdapter(InputStream is) ... 47: private void validate(InputStream is) 48: { 49: WebLogicSAXParserFactory factory = new WebLogicSAXParserFactory(); 50: try 51: { 52: SAXParser parser = factory.newSAXParser(); 53: parser.parse(is, new DefaultHandler() 54: { 55: public void startElement(String uri, String localName, String qName, Attributes attributes) 56: throws SAXException 57: { 58: if (qName.equalsIgnoreCase("object")) { 59: throw new IllegalStateException("Invalid context type: object"); 60: } 61: } 62: }); 63: }
Он проверяет переданный XML-запрос на наличие элементов Object, и если такой встречается, то скрипт кидает исключение Invalid context type: object
.
Однако не Object’ом единым живет RCE. Существует еще множество способов проэксплуатировать уязвимость в десериализации XML. Посмотрим на этот же файл, но уже из последней версии, где уязвимость исправлена.
Cтатьи из последних выпусков журнала можно покупать отдельно только через два месяца после публикации. Чтобы читать эту статью, необходимо купить подписку.
Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке
1 год5690 р. Экономия 1400 рублей! |
1 месяц720 р. 25-30 статей в месяц |
Уже подписан?
Читайте также
Последние новости