前言

github用户 5alt,给gogs和gitea提的issus中指出,gogs中存在远程命令执行漏洞。因为自己也是gitea用户,所以分析一下。

影响

Gogs 0.11.66及之前的版本

Gitea 1.5.3及之前的版本

漏洞利用分析

根据issues描述,5alt能够登陆管理员账户,然后通过git钩子来任意命令执行

查看commit记录

添加了检测sid中是否存在”./“,猜测可能是目录穿越,然后包含了管理员账号的session

gitea使用go-macaron/session这个第三方模块来管理session,默认使用文件作为session存储容器

可以看到sid从cookie“i_like_gogits”中获得,跟进m.provider.Exist函数(gogs-0.11.66\vendor\github.com\go-macaron\session\file.go)

继续跟进p.filepath()函数

与rootPath跟sid第一位和第二位和sid拼接形成一个文件路径,判断是否为文件

所以从cookie中获得sid长度不为0,拼接后如果文件存在,就会去读这个session文件

接下来就是找可以控制文件的点了

在gogs的release中,可以上传文件,并且保存在data/attachments/uuid[0]/uuid[1]/uuid中,文件名就是uuid,前台就可以看到

所以使用p神文章中的代码生成管理员的session文件,注册用户后创建一个仓库,发布release并把这个文件上传,然后在cookie中输入路径进行包含

获得管理员账号后,就创建一个仓库,利用git钩子来执行命令

成功执行命令

最后

管理员的用户名和ID,这个可能需要猜。但其实我们也没必要必须伪造管理员的session,我们可以伪造任意一个用户的session,然后进入网站后再找找看看有没有管理员所创建的项目,如果有的话,就可以得知管理员的用户名了。

因为没有漏洞细节,所以我就根据issues的截图和commit记录猜测,可能还有更加简单的利用方式。如果文章中有错误,请师傅们随便喷,一定改正。

参考

https://www.leavesongs.com/PENETRATION/gitea-remote-command-execution.html

https://github.com/gogs/gogs/issues/5469

https://github.com/gogs/gogs/commit/b93079f1c1a71238ab3bd8fd33ceecedf3b6c46f