
CVE-2022-30136 के लिए Windows नेटवर्क फ़ाइल सिस्टम दूरस्थ शोषण
लेखक: Ricardo Narvaja
यह केवल प्रदर्शन उद्देश्यों के लिए है। पूर्ण एक्सप्लॉइट संवेदनशील विंडोज सर्वर सिस्टम पर काम करता है।
लेख देखें Analysis of CVE-2022-30136 “Windows Network File System Vulnerability“।
मैं यह लेख उस विश्लेषण को प्रदर्शित करने के लिए लिखना चाहता था जो मैंने Core Impact एक्सप्लॉइट “Windows Network File System Remote” को विकसित करते समय किया था, जो CVE-2022-30136 भेद्यता का दुरुपयोग करता है।
Windows Network File System Remote Code Execution भेद्यता एक आकार गणना त्रुटि है जो NFS के संस्करण 4.1 का उपयोग करके COMPOUND REQUEST में सर्वर प्रतिक्रिया बनाते समय होती है।
सर्वर पूल आवंटित करने के लिए आवश्यक आकार से छोटे आकार की गणना करता है, और फिर प्रतिक्रिया उत्पन्न करने के लिए डेटा कॉपी करते समय बफर को ओवरफ्लो कर देता है।
nfssvr.sys में फंक्शन Nfs4SvrXdrpGetEncodeOperationResultByteCount प्रत्येक ऑपरेशन के लिए कॉल किया जाता है और आवश्यक आकार से छोटा आकार (प्रत्येक ऑपरेशन के लिए 4 बाइट कम) लौटाता है।
Nfs4SvrXdrpGetEncodeOperationResultByteCount के लिए एक पैच बनाया गया।
यह फंक्शन COMPOSE REQUEST के प्रत्येक OPERATION के दौरान कॉल किया जाता है ताकि OPCODE के आधार पर उनमें से प्रत्येक के लिए आवश्यक बाइट्स लौटाए। फिर इसे हेडर और प्रतिक्रिया के अन्य भागों में जोड़ा जाता है। इसके बाद, यह संपूर्ण प्रतिक्रिया के अंतिम आकार की गणना करता है ताकि आवंटित किया जा सके और फिर उत्तर देने के लिए उस पर कॉपी करता है।
प्रत्येक मामले में, हम देख सकते हैं कि प्रत्येक ऑपरेशन के लिए लौटाए गए आकार का मान संवेदनशील संस्करण में पैच किए गए संस्करण की तुलना में चार बाइट छोटा है।
मैंने Windows Server 2019 के लिए POC बनाया।
नीचे इस POC के लिए उपयोग किया गया nfssvr.sys का संवेदनशील संस्करण है, उसके बाद Windows Server 2019 के लिए पैच किया गया संस्करण है:

अगली छवि अंतर में CASE 26 दिखाती है:

CASE 26 के उदाहरण में, हम देख सकते हैं कि गणना मान में जोड़ा गया स्थिरांक संवेदनशील संस्करण में 0x2c है, और पैच किए गए संस्करण में 0x30 है।
यही बात प्रत्येक OPCODE के अनुरूप प्रत्येक मामले में देखी जा सकती है। संवेदनशील संस्करण हमेशा पैच किए गए संस्करण से चार बाइट छोटा आकार लौटाता है।
हम सभी मामलों को नहीं दिखाएंगे क्योंकि पैच सभी OPCODE के लिए समान है।
Nfs4SvrXdrpGetEncodeOperationResultByteCount का मूल Nfs4SvrXdrEncodeCompoundResults है। यह COMPOUND REQUEST में भेजे गए ऑपरेशनों की संख्या पढ़ता है।
इस POC में मान 0x34 (52d) है। जब मेरा POC पोर्ट 2049 (NFS के लिए डिफ़ॉल्ट पोर्ट) पर सर्वर से कनेक्ट होता है, तो मुझे रुकने के लिए एक सशर्त ब्रेकपॉइंट रखना होता है।


इस उदाहरण में, यह तब रुकता है जब number_of_operations=0x34।

टैग ARGS वाला पूल यहाँ आवंटित किया गया है।

फिर मैं फ़ील्ड्स को रिवर्स करने के लिए TAG_ARGS_0x10e0 नामक एक संरचना बनाऊंगा।

यह number_of_operations को r13 में कॉपी करता है और संवेदनशील फंक्शन में प्रति ऑपरेशन एक बार लूप करता है, जब तक काउंटर r13 के मान तक नहीं पहुंच जाता।

यह दिखाता है कि पहला package_OPCODE= 0x35 है, जो COMPOUND REQUEST में पहले अनिवार्य ऑपरेशन में SEQUENCE से मेल खाता है। नीचे दी गई छवि में, तीर मेरे पैकेज में इस OPCODE की ओर इशारा करता है।

यहाँ हम संवेदनशील फंक्शन के तर्क देख सकते हैं।


संवेदनशील फंक्शन के अंदर, यह OPCODE पढ़ता है और संबंधित CASE पर जाता है।

मूल OPCODE मान (53) में से तीन घटाया जाता है।

और CASE 50 पर जाता है, इस ऑपरेशन के लिए आवश्यक आकार के रूप में 0x28 लौटाता है।


हम अंतर में देख सकते हैं कि पैच किया गया संस्करण 0x2c कैसे लौटाता है।

यह लौटाया गया मान प्रतिक्रिया में अन्य फ़ील्ड्स के पिछले मान में जोड़ा जाता है ताकि ऑपरेशनों के आकार की गणना की जा सके। इस मामले में, यह मान 0X40c है।

नीचे हम जोड़े जा रहे मानों को देख सकते हैं:

जब यह लूप से बाहर निकलता है, तो कुल आकार की गणना की जाती है। इस मामले में, कुल आकार 0x1310 है।

हम आकार की गणना करके संवेदनशील संस्करण और पैच किए गए संस्करण के बीच अंतर का अनुमान लगा सकते हैं, सूत्र का उपयोग करके: number_of_operations * 4।
इस मामले में पैच किए गए संस्करण में आवंटन संवेदनशील संस्करण से 0x34 * 4 = 0x68 बड़ा होगा।

उसके बाद यह 0x24 जोड़ता है। यह मान संवेदनशील और पैच किए गए दोनों संस्करणों में समान तरीके से गणना किया जाता है।

फिर यह दोनों मामलों में स्थिरांक 0xf जोड़ता है।

इस बिंदु तक, इस उदाहरण में आकार 0x1340 हो गया है।

इसके बाद यह rpcxdr_OncRpcBufMgrpAllocate पर पहुंचता है।

फिर यह r15 पर जाता है।
