Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
ds3-nrssr-rce — CVE-2022-24125 और CVE-2022-24126 के लिए दस्तावेज़ीकरण और प्रूफ ऑफ कॉन्सेप्ट कोड। | Kitploit
उपकरण/GitHubGitHub/tremwil/ds3-nrssr-rce
शोषण फ्रेमवर्कभेद्यता विश्लेषणशोषणरिवर्स इंजीनियरिंगशेलकोडपेनिट्रेशन टेस्टिंगलर्निंग और शिक्षारेड टीमिंगशेलकोड जनरेशनपेलोड डेवलपमेंटबाइनरी शोषण
169854 साल पहलेKitploit द्वारा समीक्षित
GitHub
tremwil/ds3-nrssr-rce

ds3-nrssr-rce

CVE-2022-24125 और CVE-2022-24126 के लिए दस्तावेज़ीकरण और प्रूफ ऑफ कॉन्सेप्ट कोड।

रिपॉजिटरी देखें

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

अद्यतन: डार्क सोल्स III 1.15.1

डार्क सोल्स III के लिए 2022/08/25 को एक नया गेम अपडेट, 1.15.1 जारी किया गया है, साथ ही ऑनलाइन सेवाओं की बहाली भी की गई है। इस अपडेट ने CVE-2022-24125 और CVE-2022-24126 दोनों को ठीक किया, साथ ही गेम के P2P नेटवर्किंग में मौजूद अन्य संभावित सुरक्षा कमजोरियों (OOB reads/writes) की एक विस्तृत श्रृंखला को भी ठीक किया। इसके अलावा, अन्य खिलाड़ियों की सेव को भ्रष्ट करने की अनुमति देने वाले सभी ज्ञात शोषणों को ठीक कर दिया गया है। कई सामान्य छोटे-मोटे धोखे (जैसे "कर्स नाइफ") जो अक्सर ऑनलाइन मल्टीप्लेयर के दौरान सामने आ सकते थे, उन्हें भी पैच कर दिया गया है।

ds3-nrssr-rce

इस रिपॉजिटरी में FROM SOFTWARE गेम्स को प्रभावित करने वाले सबसे हालिया RCE शोषण, CVE-2022-24126 के लिए प्रूफ ऑफ कॉन्सेप्ट कोड और दस्तावेज़ीकरण शामिल है। हालांकि सैद्धांतिक रूप से अन्य गेम्स में संभव है, ध्यान डार्क सोल्स III पर है क्योंकि यह वह गेम है जिस पर मेरा शोध किया गया है। अब तक प्रूफ ऑफ कॉन्सेप्ट कोड केवल डार्क सोल्स III के लिए मौजूद है, इस कमजोरी की उपस्थिति की पुष्टि की गई है:

  • डार्क सोल्स 1 PTDE (क्रेडिट: LukeYui)
  • डार्क सोल्स रीमास्टर्ड (क्रेडिट: metal-crow)
  • डार्क सोल्स 2 (Scholar सहित) (क्रेडिट: LukeYui)
  • डार्क सोल्स 3 (1.15.0 तक) (क्रेडिट: tremwil)

कमजोर कोड सेकिरो में भी मौजूद है (क्रेडिट: LukeYui), हालांकि इसे ट्रिगर करने का कोई तरीका नहीं है। डेमन्स सोल्स में उपस्थिति की पुष्टि नहीं हुई है लेकिन बहुत संभावना है। जबकि बंद नेटवर्क टेस्ट इससे प्रभावित था, एल्डन रिंग का रिलीज़ संस्करण प्रभावित नहीं है। वास्तव में, नेटवर्क क्रैश, आउट-ऑफ-बाउंड्स रीड्स/राइट्स और शोषणों की एक बड़ी सूची जो खिलाड़ियों को साथियों के गेम डेटा को संशोधित करने की अनुमति देती थी, जो डार्क सोल्स III में मौजूद थे, एल्डन रिंग में पैच कर दिए गए हैं। इस सूची को संकलित करने के लिए और तुरंत कार्रवाई करने के लिए FROM SOFTWARE को बधाई! मुझे यह कहते हुए खुशी हो रही है कि

LukeYui
एल्डन रिंग निस्संदेह हैकर्स जो नुकसान पहुंचा सकते हैं उसकी सीमा के मामले में सबसे सुरक्षित FROM SOFTWARE शीर्षक है।

गलत धारणाओं को दूर करना

आम धारणा के विपरीत, यह कोई पीयर-टू-पीयर नेटवर्किंग शोषण नहीं है। यह मैचमेकिंग सर्वर से संबंधित है और इसलिए बहुत अधिक गंभीर है, क्योंकि एक अन्य मैचमेकिंग सर्वर कमजोरी (CVE-2022-24125) के कारण असुरक्षित होने के लिए आपको किसी भी मल्टीप्लेयर गतिविधि में भाग लेने की आवश्यकता नहीं है।

डार्क सोल्स III में, इसका दुरुपयोग करने वाला एक दुर्भावनापूर्ण हमलावर सेकंडों में प्रत्येक ऑनलाइन खिलाड़ी की मशीन पर 1.3MiB1 तक के शेलकोड का पेलोड विश्वसनीय रूप से निष्पादित करने में सक्षम होता।

सर्वर बंद होने से पहले के महीनों में लगभग 20,000 खिलाड़ियों के औसत समवर्ती खिलाड़ी आधार वाले गेम के साथ, यह स्पष्ट रूप से एक ऐसा मुद्दा था जिसे तत्काल ठीक करने की आवश्यकता थी, विशेष रूप से एल्डन रिंग में इसके होने की संभावना के साथ। चूंकि FROM SOFTWARE ने प्रूफ ऑफ कॉन्सेप्ट वीडियो और विस्तृत शोषण दस्तावेज़ीकरण (जिस पर इस रीडमी का एक बड़ा हिस्सा आधारित है) के साथ मेरी प्रारंभिक रिपोर्ट के 40 दिनों से अधिक समय बाद भी कार्रवाई नहीं की थी, मैंने डेवलपर्स द्वारा इसे संबोधित करने के लिए ध्यान आकर्षित करने की उम्मीद में सार्वजनिक रूप से एक सौम्य तरीके से शोषण के अस्तित्व को प्रदर्शित करने का फैसला किया, और यह काम कर गया।

विषयसूची

  • शोषण सारांश (CVE-2022-24126)
  • वितरण वेक्टर (CVE-2022-24125)
  • सभी गेम्स के लिए सामान्य शोषण रणनीति
    • बग #1: एंट्री लिस्ट पार्सर में कोई बाउंड्स चेक नहीं
    • बग #2: NRSessionSearchResult पार्सर में बफर ओवररन
    • ROP श्रृंखला के लिए रास्ता साफ करना
  • डार्क सोल्स III प्रूफ ऑफ कॉन्सेप्ट कोड
    • PoC कोड चलाना
    • हमला वेक्टर
    • वर्चुअल कॉल रीडायरेक्शन श्रृंखला
    • अतिरिक्त जानकारी

शोषण सारांश (CVE-2022-24126)

NRSessionSearchResult मैचमेकिंग डेटा के पार्सिंग के दौरान स्टैक बफर और डेटा साइज़ फील्ड पर अनुचित बाउंड्स चेकिंग एक हमलावर को मनमाना कोड निष्पादित करने की अनुमति देती है। स्टैक ओवरफ्लो स्ट्रीम रीडर द्वारा आंतरिक रूप से उपयोग किए जाने वाले DLMemoryInputStream ऑब्जेक्ट के निचले दो बाइट्स vftable_ptr को ओवरराइट करने की अनुमति देता है, जिससे निष्पादन सावधानीपूर्वक चुने गए पड़ोसी कोड पर रीडायरेक्ट हो जाता है। DLMemoryInputStream ऑब्जेक्ट की संरचना और डेटा साइज़ फील्ड का चतुर शोषण तब मनमाना कोड रीडायरेक्शन प्राप्त करने की अनुमति देता है, जिसमें RCX हमारे पैकेट के पते की ओर इशारा करता है। वहां से, विभिन्न ऑफ़सेट वाले वर्चुअल कॉल के माध्यम से कोड रीडायरेक्शन की एक श्रृंखला (जो अब उन पतों पर कूद जाएगी जो हमने पैकेट बफर में लिखे थे) का उपयोग मनमाना कोड निष्पादन प्राप्त करने के लिए किया जा सकता है।

वितरण वेक्टर (CVE-2022-24125)

वितरण वेक्टर ही इस विशेष RCE को विशेष रूप से गंभीर बनाते हैं (पहले से ही RCE होने के अलावा)। शोषण NRSessionSearchResult जानकारी वाले मैचमेकिंग पुश अनुरोधों के माध्यम से प्रेषित होता है। इसका मतलब है कि हमलावर उन सभी को लक्षित कर सकता है जो उनके ऑनलाइन सत्र में शामिल होते हैं। विशेष रूप से, DS3 के लिए:

  • समन्स (PushRequestSummonSign)
  • डार्क स्पिरिट आक्रमणकारी (PushRequestAllowBreakInTarget)
  • वाचा के माध्यम से शामिल होने वाले खिलाड़ी (PushRequestVisit)
  • अखाड़ा लड़ाके (PushRequestAcceptQuickMatch)

यह पहले से ही काफी बुरा है, लेकिन वास्तविक क्षमता RequestSendMessageToPlayers अनुरोध द्वारा अनलॉक की गई है:

root@kitploit:~
message RequestSendMessageToPlayers { 
    repeated uint32 player_ids = 1; 
    required bytes push_message = 2;
}

होस्ट इस अनुरोध का उपयोग आक्रमणकारियों को सीधे PushRequestAllowBreakInTarget पुश संदेश भेजने के लिए करता है ताकि वे स्पॉन निर्देशांक प्राप्त कर सकें और अपने P2P सत्र में शामिल हो सकें। बस इतना ही। गेम द्वारा इस अनुरोध का उपयोग करने का यही एकमात्र तरीका है।

फिर भी यह किसी भी क्लाइंट को सैकड़ों हजारों विशिष्ट खिलाड़ियों को मनमाना पुश संदेश भेजने की अनुमति देता है।

मैं इस बात पर पर्याप्त जोर नहीं दे सकता कि यह कितना भयानक रूप से असुरक्षित है। कोई भी खिलाड़ी मूल रूप से मैचमेकिंग सर्वर का रूप धारण कर सकता है। PushRequestVisit के माध्यम से शोषण भेजने के लिए इस अनुरोध का उपयोग करके, किसी भी ऑनलाइन खिलाड़ी को हमलावर द्वारा दूरस्थ रूप से लक्षित किया जा सकता है, जब तक उनका खिलाड़ी आईडी ज्ञात हो। हमलावर कई अनुरोध भेजकर, प्रत्येक में संभावित खिलाड़ी आईडी का एक बड़ा टुकड़ा शामिल करके, पूरे ऑनलाइन खिलाड़ी आधार को बहुत जल्दी शोषण भेज सकता है।

सभी गेम्स के लिए सामान्य शोषण रणनीति

जबकि RCE हर गेम में बिल्कुल वैसा ही पोर्ट नहीं होता, शोषण का मुख्य विचार जो हमलावर को मनमाना कोड रीडायरेक्शन देता है वही है। यदि यह प्राप्त किया जा सकता है, तो बहुत संभावना है कि गेम-विशिष्ट वर्चुअल कॉल श्रृंखला या ROP श्रृंखला पाई जा सकती है। यह "पहला कदम" निम्नलिखित कमजोरियों का उपयोग करता है:

बग #1: एंट्री लिस्ट पार्सर में कोई बाउंड्स चेक नहीं

सत्र जुड़ने की जानकारी वाले मैचमेकिंग पुश अनुरोध उक्त जानकारी को एक कस्टम बाइनरी प्रारूप में संग्रहीत करते हैं जिसमें लंबाई-सीमांकित डेटा प्रविष्टियों की एक श्रृंखला होती है। प्रत्येक प्रविष्टि का निम्नलिखित प्रारूप है:

root@kitploit:~
struct Entry
{
    uint32_t type_or_id; // पक्का नहीं, लेकिन शायद एक प्रकार (निश्चित लंबाई = 2, चर लंबाई = 1 ?)
    uint32_t size;
    uint8_t data[size];
}

इन प्रविष्टियों के डेटा को कॉपी करने के लिए जिम्मेदार गेम फ़ंक्शन आँख बंद करके साइज़ फील्ड पर भरोसा करता है, जो एक आउट-ऑफ-बाउंड्स रीड बनाता है। एक दुर्भावनापूर्ण क्लाइंट साइज़ फील्ड को 0x7FFFFFFF जैसे मानों पर सेट करके इसका दुरुपयोग कर सकता है, जिससे मेमोरी आवंटन विफल हो जाता है और पीड़ित का गेम क्रैश हो जाता है। बाद में, यह साइज़ DLMemoryInputSteam के कंस्ट्रक्टर को भी पास किया जाता है, जो शोषण का एक सहायक हिस्सा है।

बग #2: NRSessionSearchResult पार्सर में बफर ओवररन

ऊपर वर्णित डेटा संरचना में प्रविष्टियों में से एक एक सीरियलाइज़्ड NRSessionSearchResult ऑब्जेक्ट है। इस डेटा के लिए पार्सर पहले गुणों की एक सूची पार्स करता है। ये गुण 4 बाइट इंट्स, 8 बाइट इंट्स या नल-टर्मिनेटेड वाइड स्ट्रिंग्स हो सकते हैं। इस गुण सूची के बाद होस्ट का Steam persona नाम एक नल-टर्मिनेटेड वाइड स्ट्रिंग के रूप में और कुछ अतिरिक्त डेटा आता है जो शोषण के लिए महत्वपूर्ण नहीं है। यह फ़ंक्शन और गुण सूची पार्सर दोनों स्ट्रिंग्स को पढ़ने के लिए एक निश्चित आकार के स्टैक बफर का उपयोग करते हैं, और दोनों मामलों में बफर पर कोई बाउंड्स चेक नहीं किया जाता है। यहाँ होस्ट नाम को कॉपी करने के लिए जिम्मेदार गेम कोड है (Ghidra डीकंपाइलर का उपयोग करके उत्पादित और फिर साफ किया गया):

root@kitploit:~
size_t idx = 0;
wchar_t wchr = 0;
do {
  // DLEndianStreamReader के vftable इंडेक्स 17 पर read_wchar() फ़ंक्शन
  wchr = stream_reader->read_wchar();
  player_name_buff[idx] = wchr;
  idx++;
} while (wchr != 0);

यह एक बफर ओवररन शोषण की ओर ले जाता है, जो हमलावर को स्टैक को भ्रष्ट करने की अनुमति देता है।

वर्चुअल कॉल / ROP श्रृंखला के लिए रास्ता साफ करना

मनमाना कोड रीडायरेक्शन प्राप्त करने के लिए, हम इसका और पार्सर को कॉल करने वाले फ़ंक्शन द्वारा स्टैक पर इंस्टेंटिएटेड DLMemoryInputStream ऑब्जेक्ट के मेमोरी लेआउट का उपयोग करते हैं, जिसका उपयोग स्ट्रीम रीडर द्वारा आंतरिक रूप से किया जाता है:

root@kitploit:~
struct DLMemoryInputStream {
    uintptr_t* vftable_ptr; // ऑफसेट 0
    size_t data_size;       // ऑफसेट 4 (32bit) / 8 (64bit)
    uint8_t* data_buffer;   // ऑफसेट 8 (32bit) / 16 (64bit)
    // बफर के बाद की प्रविष्टियाँ शोषण के लिए महत्वपूर्ण नहीं हैं
}

चूंकि हम data_size फील्ड (बग #1) को नियंत्रित करते हैं, इसे data_buffer फील्ड के स्टैक मेमोरी पते पर सेट किया जा सकता है। यह सफल होगा बशर्ते पता स्थिर हो और बहुत बड़ा न हो (DS3 उन आवश्यकताओं को पूरा करता है)। चूंकि कंपाइलर स्टैक बफर को फ्रेम के शीर्ष पर रखता है, हमलावर तब बग #2 का उपयोग DLMemoryInputStream के vftable_ptr के निचले दो बाइट्स को ओवरराइट करने के लिए कर सकता है। इसलिए जब DLEndianStreamReader द्वारा अगला कैरेक्टर पढ़ा जाता है, तो यह आंतरिक रूप से DLMemoryInputStream को कॉल करेगा और कोड रीडायरेक्ट हो जाएगा। 2 बाइट्स DLEndianStreamReader vftable में 22वें फ़ंक्शन पर कूदने के लिए पर्याप्त छूट देते हैं, जो अपने पहले फील्ड द्वारा इंगित ऑब्जेक्ट की 6वीं वर्चुअल विधि को कॉल करता है। 64-बिट प्रक्रिया (अर्थात डार्क सोल्स III) में, निम्नलिखित निर्देश निष्पादित होंगे:

root@kitploit:~
MOV       RCX,qword ptr [RCX + 0x8]
MOV       RAX,qword ptr [RCX]
JMP       qword ptr [RAX + 0x40]

चूंकि RCX DLMemoryInputStream ऑब्जेक्ट का एक पॉइंटर है, पहला निर्देश data_size फील्ड को लिखता है, जिसे हमलावर ने बग #1 का उपयोग करके data_buffer फील्ड की ओर इशारा करने वाले स्टैक पते पर सेट किया है, RCX में। अगले दो निर्देश इस प्रकार निष्पादन को उस मेमोरी पते पर रीडायरेक्ट करेंगे जो हमलावर ने डेटा बफर में ऑफसेट 0x40 पर लिखा है। मनमाना कोड रीडायरेक्शन अब प्राप्त हो गया है! वहां से हमलावर कोड रीडायरेक्शन की एक श्रृंखला स्थापित कर सकता है जो उनके पेलोड को एक उपयुक्त मेमोरी क्षेत्र में कॉपी करती है और विभिन्न ऑफ़सेट वाले वर्चुअल कॉल के करीब कोड चुनकर इसे निष्पादित करती है, क्योंकि बफर अब एक वर्चुअल मेथड टेबल के रूप में कार्य करता है। डार्क सोल्स III प्रूफ ऑफ कॉन्सेप्ट के लिए मुझे एक सेटअप मिला जिसमें RCE प्राप्त करने के लिए केवल 3 गैजेट की आवश्यकता है:

  • 0x18: 140e97700
  • 0x40: 1422be020
  • 0x68: 140e40f15

इन 3 गैजेट के बारे में अधिक जानकारी के लिए यहाँ देखें। यदि किसी अन्य गेम के लिए यह वर्चुअल कॉल विधि एक व्यवहार्य दृष्टिकोण नहीं है, तो मनमाना कोड रीडायरेक्शन का उपयोग अभी भी अधिक पारंपरिक ROP शोषण स्थापित करने के लिए किया जा सकता है।

डार्क सोल्स III प्रूफ ऑफ कॉन्सेप्ट कोड

PoC कोड चलाना

प्रूफ ऑफ कॉन्सेप्ट कोड चलाने के लिए, आपके पास पहले कनेक्ट करने के लिए एक सर्वर होना चाहिए। जबकि आधिकारिक सर्वर शोषण के कारण अक्षम कर दिए गए हैं, आप ds3os का उपयोग करके एक निजी सर्वर स्थापित कर सकते हैं। ds3os को रिटेल सर्वर व्यवहार का जितना संभव हो उतना करीब से अनुकरण करने के लिए डिज़ाइन किया गया है, लेकिन इस शोषण को ठीक करने के लिए इस प्रोजेक्ट में पहले से ही सुरक्षा पैच तैनात किए जा चुके हैं। हालाँकि आप BuildConfig.h में SEND_MESSAGE_TO_PLAYERS_SANITY_CHECKS और NRSSR_SANITY_CHECKS स्थिरांकों को false पर सेट करके स्वयं प्रोजेक्ट का निर्माण करके अभी भी एक परीक्षण वातावरण स्थापित कर सकते हैं। यह असुरक्षित रिटेल सर्वर व्यवहार का अनुकरण करता है। गेम शुरू करने और अपने सर्वर से कनेक्ट करने के लिए ds3os द्वारा प्रदान किए गए निर्देशों का पालन करें।

एक बार ऐसा हो जाने और आपका गेम सर्वर से कनेक्ट हो जाने के बाद, PoC कोड बनाएं और Injector.exe निष्पादन योग्य प्रारंभ करें। यह डार्क सोल्स III प्रक्रिया में शोषण कोड वाली एक DLL इंजेक्ट करेगा। यह DLL फिर आपके स्वयं के क्लाइंट को शोषण पहुंचाने के लिए FRPG संदेशों को सर्वर को भेजने वाले गेम फ़ंक्शन का उपयोग करेगी।

हमला वेक्टर

प्रूफ ऑफ कॉन्सेप्ट के लिए मैंने RequestSendMessageToPlayers का उपयोग करके भेजे गए PushRequestVisit संदेश का उपयोग करने का निर्णय लिया। यह शोषण का सबसे शक्तिशाली संस्करण है इस अर्थ में कि लक्ष्य का गेम इसे प्राप्त करने के तुरंत बाद सभी स्थितियों में (मुख्य मेनू में भी) असुरक्षित डेटा को पार्स कर लेगा।

वर्चुअल कॉल रीडायरेक्शन श्रृंखला

ऑफसेट 0x18: 140e97700

root@kitploit:~
LEA       RAX,[DAT_144786150]
RET

यह गैजेट 0x68 वाले में उपयोग किया जाता है। हमें RAX में 144786998 से कम लेकिन काफी करीब एक पता डालने की आवश्यकता है; यह सबसे करीबी है।

ऑफसेट 0x40: 1422be020

root@kitploit:~
MOV       RDX,RAX
MOV       R8,qword ptr [RCX]
CALL      qword ptr [R8 + 0x68]

ऑफ़सेट 0x68 पर गैजेट का उपयोग करने में सक्षम होने के लिए हमें डेटा बफर पता RDX में संग्रहीत होना चाहिए और RCX समान रहना चाहिए। यह ठीक यही प्राप्त करता है।

ऑफसेट 0x68: 140e40f15

root@kitploit:~
; ऑफसेट 0x40 पर गैजेट से यहां कूदना
MOV       RBX,RDX
CMP       R9,R8

 ; कभी नहीं कूदता, R9 != R8
JZ        LAB_140e40f7a
MOV       RAX,qword ptr [RCX]
MOV       R8,qword ptr [RSP + 0x50]
MOV       RDX,R9
MOV       qword ptr [RSP + 0x30],RSI

; ऑफसेट 18 (140e97700) पर कॉल गैजेट। 144786150 को RAX में लोड करता है
CALL      qword ptr [RAX + 0x18]
MOV       RSI,RAX
TEST      RAX,RAX

; कभी नहीं कूदता, RAX डेटा बफर addr है।
JZ        LAB_140e40f4d 
CMP       RBP,RDI
MOV       RDX,RBX
MOV       RCX,RAX
CMOVC     RDI,RBP
MOV       R8,RDI ; RDI 14F3B0 के करीब एक स्टैक पता है, इसलिए memcpy सफल होता है
CALL      memcpy

LAB_140e40f4d:
TEST      RBX,RBX
; कभी नहीं कूदता क्योंकि RBX == RDX == डेटा बफर addr, गैर-शून्य।
JZ        LAB_140e40f62 

; अब हमारे पास memcpy के कारण 144786150 पर इस RWE मेमोरी क्षेत्र का पूर्ण नियंत्रण है। RCE प्राप्त हो गया है!
MOV       RCX,qword ptr [DAT_144786998]
MOV       RDX,RBX
MOV       RAX,qword ptr [RCX]
CALL      qword ptr [RAX + 0x68]

यह गैजेट लगभग सब कुछ हमारे लिए करता है। यह memcpy गंतव्य पॉइंटर प्राप्त करने के लिए ऑफ़सेट 0x18 को कॉल करता है, हमारे पैकेट को वहां कॉपी करता है और फिर स्थिर ऑब्जेक्ट 144786998 पर ऑफ़सेट 0x68 पर वर्चुअल फ़ंक्शन को कॉल करता है, जिसे अब हम memcpy कॉल के कारण पूरी तरह से नियंत्रित करते हैं। चूंकि memcpy द्वारा भ्रष्ट की गई मेमोरी की मात्रा बड़ी है और कुछ क्षेत्र लगातार अन्य गेम थ्रेड्स द्वारा लिखे जा रहे हैं, शोषण पहले एक "सेटअप" पेलोड लोड करता है जिसे एक सुरक्षित स्थान पर कॉपी किया जाता है, अन्य सभी थ्रेड्स को निलंबित करता है और उस पर कूदने से पहले हमारे वास्तविक पेलोड को फिर से कॉपी करता है। अधिक जानकारी के लिए rce.h देखें।

अतिरिक्त जानकारी

मैं प्रूफ ऑफ कॉन्सेप्ट कोड के स्रोत कोड को देखने की सलाह देता हूं क्योंकि इसमें पैकेट की संरचना का विवरण देने वाली कई टिप्पणियां हैं। यदि आप वास्तविक समय में प्रत्येक चरण में क्या होता है यह देखना चाहते हैं (आपको चाहिए, यह बहुत अच्छा है!), तो आप डीबगर के तहत गेम चलाते समय प्रूफ ऑफ कॉन्सेप्ट DLL को इंजेक्ट कर सकते हैं, जिसमें रुचि के निम्नलिखित पतों पर ब्रेकपॉइंट हों:

140ca5960

मूल रूप से जहां शोषण शुरू होता है। यह फ़ंक्शन PushRequestVisit संदेश के आकार-सीमांकित एंट्री सूची डेटा को पार्स करने के लिए जिम्मेदार है। यह पहले सूची की प्रत्येक प्रविष्टि को विभिन्न वेक्टरों में निकालता है:

root@kitploit:~
0x140ca59f8:
    player_data_cpy_ptr = (std_vector *)VectorCopy2_140ca4ef0(&player_data_cpy,player_data);
    FUN_140ca5010(player_data_cpy_ptr,&spawn_data,0x1c);
    FUN_140ca5010(player_data_cpy_ptr,&unk,4);
    FUN_140ca4fa0(player_data_cpy_ptr,&nrssr_data);

फ़ंक्शन 140ca5010 एंट्री आकारों की जाँच करता है, लेकिन 140ca4fa0 चर आकार की प्रविष्टियों के लिए है और आकार फील्ड पर सैनिटी चेक नहीं करता है (बग #1)। ऊपर वर्णित मनमाना कोड रीडायरेक्शन शोषण प्राप्त करने के लिए हमें इसे 14F3B0 पर सेट करने की आवश्यकता है। यह लगभग 1.3MiB का आउट-ऑफ-बाउंड्स रीड का कारण बनेगा लेकिन मेमोरी पेज एक्सेस उल्लंघन से बचने के लिए पर्याप्त बड़ा होना चाहिए।

140ca56b0

यह फ़ंक्शन पिछले वाले द्वारा nrssr_data को तर्क के रूप में कॉल किया जाता है। स्टैक पर DLMemoryInputStream ऑब्जेक्ट बनाता है जो तब NRSSR पार्सर को तर्क के रूप में पारित किया जाता है।

141955f50: ParseNRSessionSeachResult

NRSessionSearchResult पार्सर। NRSSR हस्ताक्षर और संस्करण संख्याओं को सत्यापित करता है (14196a0f0), गुण सूची पार्स करता है (14196a260), होस्ट नाम (14195603a) और कुछ और जानकारी (rce.h देखें)

14195603a

उपरोक्त फ़ंक्शन में लूप जो होस्ट नाम को असुरक्षित रूप से कॉपी करता है (बग #2)। यहां कुछ पते हैं जो बफर ओवरफ्लो के दौरान क्या हो रहा है, इस पर नज़र रखने में मदद कर सकते हैं:

  • पार्सर स्टैक बफर पता: 14F128
  • DLMemoryInputStream स्टैक पता: 14F3A0
  • ओवरराइट के बाद DLMemoryInputStream vtable पॉइंटर: 1439e8b30
  • DLInputStreamReader द्वारा उपयोग किए जाने वाले DLMemoryInputStream में वर्चुअल फ़ंक्शन का ऑफसेट: 0x18

1439e8b48

root@kitploit:~
MOV       RCX,qword ptr [RCX + 0x8]
MOV       RAX,qword ptr [RCX]
JMP       qword ptr [RAX + 0x40]

जहां हम ओवरराइटेड मेमोरी स्ट्रीम vftable के कारण पहले कोड रीडायरेक्शन के बाद पहुंचते हैं। यहीं से वर्चुअल कॉल रीडायरेक्शन की श्रृंखला शुरू होती है।

Footnotes

  1. डार्क सोल्स III Ver. 1.15 के लिए। अधिकतम सैद्धांतिक पेलोड आकार स्टैक लेआउट पर निर्भर करता है और इस प्रकार गेम और संस्करण के अनुसार भिन्न होगा। ↩

टूल डाउनलोड करें