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)