
CVE-2025-2825 के लिए विस्तृत विश्लेषण और PoC एक्सप्लॉइट, जो CrushFTP में एक प्रमाणीकरण बाईपास है। इसमें nuclei टेम्पलेट, मल्टी-थ्रेडेड स्कैनर, और पैठ परीक्षण के लिए उपयोगकर्ता निर्माण स्क्रिप्ट शामिल हैं।
इस दस्तावेज़ में CrushFTP के सर्वर घटक को प्रभावित करने वाली भेद्यता CVE-2025-2825 का शोध प्रस्तुत किया गया है - जो फ़ाइल स्थानांतरण और भंडारण (FTP, SFTP, HTTP/S, S3-जैसे इंटरफ़ेस आदि) के लिए एक वाणिज्यिक समाधान है।
दोष को प्रमाणीकरण बाईपास के रूप में वर्गीकृत किया गया है, जो दूरस्थ अप्रमाणित हमलावर को व्यवस्थापक अधिकार प्राप्त करने की अनुमति देता है। सफल शोषण crushadmin विशेषाधिकारों तक पहुँच, फ़ाइलों को देखने और संशोधित करने, खातों का प्रबंधन करने और CrushFTP वेब इंटरफ़ेस और API के माध्यम से व्यवस्थापकीय संचालन करने की अनुमति देता है।
रिपोर्ट किए गए प्रभावित संस्करण (सार्वजनिक सलाहकार और शोधकर्ताओं की रिपोर्ट के अनुसार):
⚠️ नोट: कुछ प्रकाशनों में CVE पहचानकर्ताओं के डुप्लिकेट और ओवरलैप हैं (जैसे, CVE-2025-31161)।
भेद्यता का चरण-दर-चरण विश्लेषण करना और अनुसंधान का पूरा चक्र प्रदर्शित करना, जिसमें शामिल हैं:
सार्वजनिक रिपोर्टों के अनुसार, भेद्यता का महत्वपूर्ण जोखिम है:
निम्नलिखित संकेतों वाले इंस्टेंस महत्वपूर्ण हैं:
CrushFTP (वेब इंटरफ़ेस वाला कोई भी संस्करण)।CrushFTP S3-जैसे API के लिए समर्थन लागू करता है। प्रमाणीकरण के लिए Authorization हेडर का उपयोग किया जाता है:
Authorization: AWS4-HMAC-SHA256 Credential=<AccessKey>/<Date>/<Region>/s3/aws4_request, SignedHeaders=<Headers>, Signature=<Signature>
सर्वर क्रेडेंशियल से AccessKey निकालता है और हस्ताक्षर सत्यापित करना चाहिए। हालाँकि, कोड में lookup_user_pass फ़्लैग के साथ काम करते समय एक त्रुटि हुई:
// ServerSessionHTTP.java, method loginCheckHeaderAuth()
if (this.headerLookup.containsKey("AUTHORIZATION") &&
this.headerLookup.getProperty("AUTHORIZATION").trim().startsWith("AWS4-HMAC")) {
boolean lookup_user_pass = true; // ← महत्वपूर्ण त्रुटि
if (s3_username3.indexOf("~") >= 0) {
user_pass = user_name.substring(user_name.indexOf("~") + 1);
user_name = user_name.substring(0, user_name.indexOf("~"));
lookup_user_pass = false;
}
if (this.thisSession.login_user_pass(
lookup_user_pass,
false,
user_name,
lookup_user_pass ? "" : user_pass)) {
// सफल प्रमाणीकरण
}
}
फ़्लैग lookup_user_pass सीधे anyPass के रूप में पारित किया जाता है:
if (anyPass && user.getProperty("username").equalsIgnoreCase(the_user)) {
return user; // पासवर्ड सत्यापन के बिना प्रमाणीकरण
}
इस प्रकार:
संस्करण 11.3.1 और उसके बाद में डेवलपर्स ने:
s3_auth_lookup_password_supported (डिफ़ॉल्ट false) जोड़ा, जो कमजोर परिदृश्य को अवरुद्ध करता है।lookup_user_pass → anyPass का प्रतिस्थापन समाप्त हुआ।s3_auth_lookup_password_supported को बंद करके वर्कअराउंड लागू करें।CVE-2025-2825 का शोषण काफी सरल है और जटिल तैयारी की आवश्यकता नहीं है। हमलावर को केवल एक विशेष रूप से तैयार HTTP अनुरोध भेजने की आवश्यकता है जिसमें दो प्रमुख तत्व मौजूद हों:
Authorization हेडर, जिसमें मौजूदा उपयोगकर्ता का सही नाम हो (Credential फ़ील्ड में AccessKey/username)।CrushAuth कुकी अपेक्षित प्रारूप में और URL/अनुरोध बॉडी में c2f पैरामीटर, जिनके मान तार्किक रूप से मेल खाते हों (कुकी प्रारूप सर्वर द्वारा अपेक्षित संरचना के अनुरूप होना चाहिए)।यदि सर्वर कमजोर है (संस्करण रेंज 10.0.0—10.8.3 या 11.0.0—11.3.0 और सुधारात्मक पैच लागू नहीं किया गया है), तो ऐसा संयोजन प्रमाणीकरण हैंडलर को कमजोर पथ पर जाने का कारण बनता है, जहाँ पासवर्ड खोज फ़्लैग (lookup_user_pass) को 'कोई भी पासवर्ड स्वीकार्य' के रूप में व्याख्यायित किया जाता है, और उपयोगकर्ता बिना पासवर्ड सत्यापन के केवल नाम से प्रमाणित हो जाता है।
महत्वपूर्ण नोट:
इस भेद्यता के शोषण के लिए आमतौर पर दो क्रमिक अनुरोध भेजने की आवश्यकता होती है। पहला, तथाकथित 'वार्म-अप' अनुरोध, सर्वर पर कमजोर प्रमाणीकरण प्रक्रिया शुरू करता है। सर्वर के सही स्थिति में प्रवेश करने का विशिष्ट संकेत प्रतिक्रिया में
502 Bad Gatewayत्रुटि प्राप्त करना या बस टाइमआउट होना है। इसके तुरंत बाद दूसरा, मुख्य अनुरोध भेजा जाता है, जो उपयोगी कार्रवाई (जैसे, उपयोगकर्ता बनाना) करता है, जबकि सर्वर हमले के लिए कमजोर स्थिति में होता है।
GET /WebInterface/function/?command=getUserList&serverGroup=MainUsers&c2f=1111 HTTP/1.1
Host: target-server:8080
Cookie: CrushAuth=1743113839553_vD96EZ70ONL6xAd1DAJhXMZYMn1111
Authorization: AWS4-HMAC-SHA256 Credential=crushadmin/
परीक्षण के लिए, मैंने HTB पर हाल ही में जारी लैब—Soulmate ली, जहाँ वास्तव में CrushFTP के शोषण की आवश्यकता है।

इस भेद्यता के कारण, setUserItem कमांड का उपयोग करके एडमिन अधिकारों वाला एक नया उपयोगकर्ता जोड़ा जा सकता है। ऐसा करने के लिए new_user.py चलाएँ:
python3 new_user.py --target_host http://ftp.soulmate.htb/ --port 80 --target_user crushadmin --new_user literide --password literide
Authorization हेडर का पार्सिंग: जब सर्वर S3-जैसे प्रारूप (AWS4-HMAC...) में प्राधिकरण हेडर देखता है, तो वह क्रेडेंशियल फ़ील्ड से क्लाइंट आइडेंटिफ़ायर (AccessKey / username) निकालता है। इस चरण पर, सर्वर को एक स्ट्रिंग मिलती है जिसे वह उपयोगकर्ता नाम मानता है—यह पहचान मान है जिसका उपयोग प्रमाणीकरण तर्क में आगे किया जाता है।
lookup_user_pass फ़्लैग और इसकी भूमिका:
कोड में एक बूलियन फ़्लैग lookup_user_pass है, जो इंगित करना चाहिए कि सत्यापन के दौरान पासवर्ड कहाँ से लेना है:
कॉल श्रृंखला के माध्यम से फ़्लैग का स्थानांतरण:
अनुमानित पथ: ServerSessionHTTP.loginCheckHeaderAuth() → Session.login_user_pass(...) → UserTools.ut.verify_user(...)। इनपुट पर फ़्लैग व्यवहार को परिभाषित करता है, और verify_user में यह नाम मेल खाने पर पासवर्ड तुलना के बिना पाए गए उपयोगकर्ता ऑब्जेक्ट की शीघ्र वापसी की ओर ले जाता है। यही प्रमाणीकरण जाँच को बायपास करता है—सर्वर उपयोगकर्ता को नाम से 'पहचानता' है और उसे प्रमाणित मानता है।
संबंधित तत्व (cookie / c2f): सार्वजनिक विश्लेषणों में यह बताया गया है कि हैंडलर अनुरोध को सत्र/संदर्भ से मिलाने के उद्देश्य से कुकी/पैरामीटर के सही प्रारूप की अपेक्षा करता है। हालाँकि, मुख्य दोष lookup_user_pass के प्रसंस्करण में तार्किक त्रुटि है; अन्य तत्व केवल अनुरोध को प्रसंस्करण की मानक शाखाओं से गुज़रने में मदद करते हैं।
मुख्य कारण:
Credential के सरलीकृत पार्सिंग के साथ मिलकर यह सुनिश्चित करता था कि सही उपयोगकर्ता नाम की उपस्थिति पासवर्ड सत्यापन के बिना उपयोगकर्ता क्रेडेंशियल प्राप्त करने के लिए पर्याप्त थी।निष्क्रिय टेम्पलेट:
चूंकि अधिकांश वेब सेवाओं में Crushftp के सटीक संस्करण का निर्धारण संभव नहीं है, यह टेम्पलेट केवल यह जाँचता है कि सेवा Crushftp का उपयोग कर रही है या नहीं।
सक्रिय टेम्पलेट के साथ संयोजन में उपयोग करना सबसे अच्छा है
सक्रिय टेम्पलेट:
सक्रिय टेम्पलेट जाँचता है कि getUserList कमांड संभव है या नहीं।

मल्टीथ्रेडेड स्क्रिप्ट
स्क्रिप्ट लगभग सक्रिय टेम्पलेट की तरह ही काम करती है, लेकिन बहुत तेज़ है और एक साथ कई होस्ट की जाँच करने की क्षमता का समर्थन करती है।
python3 scan.py -t http://ftp.soulmate.htb/ -p 80 -u crushadmin

CVE-2025-31161 से जुड़े जोखिमों को कम करने के लिए, निम्नलिखित कदम उठाने की अनुशंसा की जाती है:
तत्काल अद्यतन:
कार्यसमाधान लागू करना (यदि अद्यतन संभव नहीं है):
s3_auth_lookup_password_supported को false पर सेट करें। यह पूरे उत्पाद को अपडेट किए बिना कमजोर प्रमाणीकरण तर्क को अक्षम कर देगा।जोखिम कम करने के उपाय:
Authorization हेडर में AWS4-HMAC-SHA256 वाले संदिग्ध अनुरोधों का पता लगाया जा सके, विशेषकर यदि आप S3 एकीकरण का उपयोग नहीं कर रहे हैं।Authorization हेडर वाले अनुरोधों को अवरुद्ध करने के लिए WAF कॉन्फ़िगर करें।