GitLab 远程命令执行漏洞复现(CVE-2021-22205)
漏洞描述
GitLab 没有正确验证传递给文件解析器的图像文件,这导致远程命令执行,可执行系统命令。这是一个严重的问题。它现在在最新版本中得到缓解,漏洞编号CVE-2021-22205。
影响范围
以下版本范围内的 GitLab(CE/EE)受到漏洞影响:
1 |
|
环境搭建
获取镜像
我们找到在影响范围内的Gitlab
包,对其进行下载,我们此处采用Kali Linux
进行攻击
我们需要首先搭建Docker
环境,使用pull
对Docker Hub
上的Kali
镜像进行拉取
1 |
|
在下载完后我们可以得到一个什么工具都没有的纯净版本的Kali
,接下来就是换源、下载工具等操作了
换源与工具安装
因为我们刚下载完一个纯净版Kali
,系统是肯定没有vim
编辑器的,我们先对其一些工具进行安装
1 |
|
此处可能会出现一些问题,当我们安装
Python
时,它可能会提示你已经安装有Python2
,此时我们在Python
后加一个3
变成apt-get install python3
即可
在下载完成后我们使用Vim
对系统的源进行修改:
1 |
|
之后我们在里面添加以下源:
1 |
|
完成之后我们需要安装Kali的工具包:
1 |
|
新版本中可能需要将
kali-linux-all
替换为kali-linux-everything
GITLAB获取-Win
因为相关的版本的GitLab
环境较难寻找,此处使用Windows
本地的Docker
进行搭建
1 |
|
在执行完后我们可以进行访问相应端口,会出现如下界面:
GitLab获取-CentOS
首先我们需要安装 ssh
1 |
|
并将其设置开机自启动
1 |
|
启动ssh服务
1 |
|
我们找到对应的源,进行下载安装即可
1 |
|
安装成功后出现如下图
此时我们便安装成功了,在Linux
上安装完成
我们修改其配置文件,将其部署到本地localhost
上
1 |
|
将第六行中的external_url
进行修改并保存
之后我们执行以下命令,将gitlab
更新并重启
1 |
|
我们便可以见到和Win
上一样的界面了
尝试攻击
现成脚本
下载地址
1 |
|
我们将其git
克隆到本地,因为命令执行无回显,可以使用DNS
解析来进行判断是否有对其的网页解析
漏洞检测
1 |
|
手动复现
我们此处启动对应的服务项,注册一个新用户,登录之后的界面如下
我们在个人主页里找到Snippets
,新建一个
之后出现如下界面:
箭头所指的方向即为我们要上传DjVu
格式的图片,即EXP
注意一下,上传到
GitLab
的图片格式任然要求是.jpg
,不要修改为了.djvu
DjVu 格式图片制作
下载安装DjVuLibre
地址
1 |
|
准备好将要压缩图片的文本
1 |
|
生成 EXP
1 |
|
我们将其进行上传
我们可以看到如下:
此时我们的攻击已经完成,证明该漏洞的存在
在授权的情况下,我们可以直接通过BP对发送的请求包进行抓取,然后修改请求,进而实现对应的远程代码执行
我们也便不用再次生成对应的DjVu
格式文件,可以直接修改传递参数来重复发包,达到攻击目的
修复建议
当GitLab
中的ExifTool
处理图像文件时,会检查文件扩展名是否为jpg
、jpeg
、tiff
,符合条件的文件会交由ExifTool
进行处理。但ExifTool
会尝试通过文件内容确定文件格式,当其解析DjVu
文件注释时,tok
将被转换为 C 转义序列。攻击者可以在DjVu
文件中插入恶意perl
代码,并将其扩展名改为jpg
、jpeg
或tiffd
以绕过GitLab
中的检查,从而在ExifTool
中触发漏洞,最终在GitLab CE/EE
服务器上远程执行代码。
此漏洞源于Exiftool
自身的另一个漏洞CVE-2021-22204
。
所以本质上需要修复的是Exiftool
的转换方式,在新版本中我们可以看到更新后采用了硬编码的形式去搜索和替换,来对 C 转义字符进行处理,同时删除eval
函数,进而修复该漏洞。
则对于我们GitLab平台则是更新到影响范围外的版本即可。
参考链接
GitLab 远程命令执行漏洞复现(CVE-2021-22205) - FreeBuf网络安全行业门户
CVE-2021-22205 GitLab未授权RCE复现 - 腾讯云开发者社区-腾讯云 (tencent.com)
ExifTool CVE-2021-22204 - Arbitrary Code Execution | devcraft.io
CVE-2021-22204 GitLab RCE 之 exiftool 代码执行漏洞深入分析(二) (seebug.org)