Shirouuu/CVE-2025-8110-gogs-poc

GitHub: Shirouuu/CVE-2025-8110-gogs-poc

CVE-2025-8110 的 PoC 利用脚本,通过符号链接绕过 Gogs 仓库边界实现任意文件写入。

Stars: 5 | Forks: 0

# CVE-2025-8110 — Gogs 任意文件写入 (PoC) [Gogs](https://gogs.io/) 中经过身份验证的任意文件写入的概念验证。 通过推送一个包含指向仓库外部符号链接的仓库,然后通过 API 更新该链接的内容, 经过身份验证的用户可以利用运行 Gogs 的账户权限覆盖主机上的文件。 ## 工作原理 1. 使用现有账户对 Gogs 进行身份验证。 2. 从用户设置中生成一个 application (API) token。 3. 创建一个仓库。 4. 添加一个 symlink (`malicious_link -> /path/on/host`) 并将其推送。 5. 向 Contents API 发送一个 `PUT` 请求来更新 `malicious_link`。Gogs 会跟随 symlink 并以自身的权限将提供的内容写入目标路径。如果 Gogs 以 root 权限运行,这就是一个直接的权限提升原语(例如,将一个规则放入 `/etc/sudoers.d/` 中)。 API `PUT` 请求才是实际触发写入的操作;而推送仅用于放置 symlink。 ## 环境要求 - Python 3.8+ - PATH 中可用 `git` - 一个现有的 Gogs 账户(目标实例上可能已禁用注册功能) ``` pip install -r requirements.txt ``` ## 使用方法 ``` python3 exploit.py \ -u http://127.0.0.1:3000 \ --user \ --password '' \ --target /etc/sudoers.d/pwned \ --payload ' ALL=(ALL) NOPASSWD: ALL' ``` 省略 `--password` 参数将会以安全方式提示输入,而不是在命令行中明文传递。 ### 访问内部 Gogs 实例 目标上的 Gogs 通常绑定到 localhost。使用 SSH 本地端口转发将其暴露给您的机器(根据目标情况调整端口): ``` ssh -L 3000:127.0.0.1:3000 user@target # 然后将 exploit 指向 http://127.0.0.1:3000 ``` ### 验证写入 成功运行后,在主机上检查(以相关用户身份): ``` cat /etc/sudoers.d/pwned sudo -l ``` 如果您写入的是 sudoers 规则,请注意 `/etc/sudoers.d/` 中的文件必须是有效的,并且要具有适当的权限,`sudo` 才会生效。 ## 注意事项 / 故障排除 - **`auto_init` 返回 HTTP 500** — 脚本将回退到创建一个空仓库,并通过本地 `git init` + 推送来填充内容。 - **推送被拒绝 (non-fast-forward)** — 脚本会与远程仓库进行同步并重试;它也能处理 `master` 与 `main` 的情况。 - **未找到 CSRF token** — 通常意味着目标/端口错误(您访问的是其他服务)或者会话未通过身份验证。 ## 缓解措施 升级到会在 Contents API 中验证 symlink 的 Gogs 版本。作为纵深防御,请避免以 root 身份运行 Gogs,并对仓库存储进行隔离。 ## 许可证 MIT — 见 `LICENSE`。
标签:Gogs, PoC, Python, 无后门, 暴力破解, 网络安全研究, 逆向工具