Gitlab CVE-2018-14364 压缩包上传getshell 漏洞复现分析
0x00 前言
该漏洞属于登录后的任意文件写入漏洞,该漏洞可以通过写入公钥复现该漏洞需要注意版本问题,一开始用vulhub起的环境发现复现不了,于是到网上找了一个docker镜像搭建起来才复现成功。
0x01 漏洞复现
首先搭建环境,不建议手动从头搭起,除了gitlab以外还有其他组件,相对麻烦,这里可以直接借助docker上的image进行搭建。
//拉取镜像
sudo docker pull gitlab/gitlab-ce:11.0.3
//映射同期端口80到本地的10081
docker run -d -p 10081:80 beginor/gitlab-ce:11.0.1-ce.0
访问10081端口,并设置密码,设置完成后,进入登录,使用“root/刚刚设置的密码”进行登录
新建项目
选择导入项目
选择从gitlab export导入
选择生成步骤一中的压缩包1,项目名称填一个新的名称,这里为test2,选择导入项目
选择删除该项目
再次按照上面的步骤新建项目导入
填入跟上面的步骤同名的项目名test2,并导入第二个压缩包,选择导入项目
可以看到该文件已被写入
0x02 漏洞分析
关键漏洞修补代码地址,如下。在导入gitlab压缩包之后,走这个流程
接着会试图解压该压缩包并检查压缩包中的内容是否存在软链接并删除软链接
该匹配的正则表达式为
$符号表示匹配到一行的最末尾,该表达式被绕过,若以\n开头也是末尾,而\n表示换行放开软链接名字的开头,则该软链接不被列出进行检测。
第一步上传为上传包含软链接的压缩包,解压后该压缩包中的软链接指向gitliab根目录
第二部上传文件解压后解压到软链接当中,而软件链接指向安装的根目录,则会重定下至固定目录。
0x03 参考
https://gitlab.com/gitlab-org/gitlab-foss/-/compare/v11.0.3...v11.0.4