首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

git泄露(一篇文章就够了)

  • 25-04-24 15:01
  • 2261
  • 5221
blog.csdn.net

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 目录

    文章目录

    git泄露概述

    一、git简述

    1、git是什么

    2、git常用命令

    git status:

    git log:

    git diff:

    git remote -v:

    git pull:

    git push:

    git add && git commit:

    3.造成git泄露原因

    错误配置

    网站漏洞

    版本控制系统本身的特性

    人为因素

    工具使用不当

    开发流程问题

    二、git泄露在CTF中的应用

    1、git泄露类型

    常规 Git 泄露

    Git 回滚

    Git 分支

    Git 日志

    Git 配置文件

    Git 索引文件

    Git 钩子脚本

    Git 对象

    2、实际运用

    1.以CTFHUB的web-git泄露-log为例

    2.以CTFHUB的web-git泄露-stash为例

    3.以CTFHUB的web-git泄露-index为例

    三、总结


git泄露概述

当大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境,这就引起了git泄露漏洞。

通过git泄露,我们可以获取到源代码、提交历史、分支信息、配置信息、开发者信息和一些其他敏感信息。

一、git简述

1、git是什么

Git是分布式版本控制系统(Distributed Version Control System,简称 DVCS) ,分为两种类型的仓库:本地仓库和远程仓库。(通俗来讲,git就是多名开发人员共同开发所使用的代码库)

本地仓库:是在开发人员自己电脑上的Git仓库
远程仓库:是在远程服务器上的Git仓库

 Clone:克隆,就是将远程仓库复制到本地
Push:推送,就是将本地仓库代码上传到远程仓库
Pull:拉取,就是将远程仓库代码下载到本地仓库

2、git常用命令

git status:

显示当前工作目录的状态,列出哪些文件有变更,哪些文件已经暂存,哪些文件没有被跟踪。

git log:

查看当前Git仓库的提交历史。Git会显示每次提交的哈希值、作者信息、提交日期和提交信息。

git diff:

显示工作目录与暂存区之间的差异,或者暂存区与最后一次提交之间的差异。它是用来查看文件改动的详细内容。

git remote -v:

显示当前项目的远程仓库信息,包括远程仓库的名称(通常为origin)和URL地址。

git pull:

从远程仓库拉取最新的更改并自动合并到本地当前分支。如果没有冲突,Git会自动合并。

git push:

将本地分支的提交推送到远程仓库。确保本地分支与远程分支一致后,执行推送操作。

git add && git commit:

添加文件和提交文件

3.造成git泄露原因

错误配置

部署错误:开发人员将.git文件夹错误地放置在网站根目录下,导致它被暴露在公网上。

权限错误:网站服务器的权限设置不当,使得.git文件夹可以被公开访问。

网站漏洞

文件上传漏洞:攻击者可以利用漏洞上传恶意文件,并将其写入网站根目录下,从而创建.git文件夹。

目录遍历漏洞:攻击者可以通过目录遍历漏洞访问到.git文件夹。

版本控制系统本身的特性

本地存储:Git是一个分布式版本控制系统,每个开发者的机器上都有完整的代码库副本。如果开发者的机器被攻击,攻击者可能会获取到.git文件夹中的敏感信息。

历史记录:Git会记录所有的提交历史,包括敏感信息的修改记录。如果.git文件夹被泄露,攻击者可以通过查看历史记录获取到敏感信息。

人为因素

误操作:开发人员在操作Git时,可能会误将.git文件夹暴露在公网上。

安全意识不足:开发人员对Git的安全配置和使用不够了解,没有采取必要的安全措施。

工具使用不当

使用了存在漏洞的Git客户端或插件:这些工具可能存在安全漏洞,被攻击者利用来获取.git文件夹中的敏感信息。

服务器配置错误 服务器没有正确配置访问权限:导致.git文件夹可以被公开访问。

开发流程问题

在开发过程中,开发者有时会将数据库凭据等敏感信息直接硬编码到源代码中,这些文件通常会被版本控制系统跟踪,因此一旦.git目录被公开访问,攻击者可以通过检索这些文件获取敏感信息

二、git泄露在CTF中的应用

1、git泄露类型

常规 Git 泄露

原理:在执行 git init 初始化目录时,会在当前目录下自动创建一个 .git 目录,用来记录代码的变更记录等。如果在发布代码的时候,没有把 .git 这个目录删除,就直接发布到了服务器上,攻击者就可以通过它来恢复源代码。

检测与利用:可以使用 scrabble (githack)工具查看网站源码,命令为 ./scrabble url(python GitHack.py URL   )。

Git 回滚

原理:git 作为一个版本控制工具,会记录每次提交(commit)的修改,所以当题目存在泄露时,flag(敏感)文件可能在修改中被删除或被覆盖了,这时我们可以利用 git 的 git reset 恢复到以前的版本。

检测与利用:先利用 scrabble 工具获取源码,再通过“git reset --hard HEAD^”命令跳到上一个版本,(HEAD^ 是指上一个版本名),即可获取到源码。除了使用“git reset”,更简单的方式是通过“git log -stat”命令查看每个 commit 修改了哪些文件,再用“git diff commit-id1 commit-id2”比较在当前版本与想査看的 commit 之间的变化。

Git 分支

原理:在每次提交时,git 都会自动把它们串成一条时间线,这条时间线就是一个分支。而 git 允许使用多个分支,从而让用户可以把工作从开发主线上分离出来,以免影响开发主线。如果没有新建分支,那么只有一条时间线,即只有一个分支,git 中默认为 master 分支。因此,我们要找的 fag 或敏感文件可能不会藏在当前分支中,这时使用“git log”命令只能找到在当前分支上的修改,并不能看到我们想要的信息,因此需要切换分支来找到想要的文件。现在大多数现成的 git 泄露工具都不支持分支,如果需要还原其他分支的代码,往往要手工进行文件的提取。

检测与利用:这里就需要用到 GitHack 工具了。GitHack 是一个 .git 泄露利用脚本,通过泄露的 .git 文件夹下的文件,还原重建工程源代码。虚拟机安装的 GitHack 需要用到 Python2 的版本,而且需要先进入 GitHack 目录下,否则找不到 GitHack.py 文件。命令为 python2 GitHack.py -u url(此时的 url 末尾不要忘记 /.git),扫描完成后会在 GitHack 文件夹下生成一个 dist 文件夹。进入文件夹后执行“git log -all”或“ git branch -v”命令,只能看到 master 分支的信息。如果执行“git reflog”命令,可以看到一些 checkout 的记录,在 checkout 记录中我们可能会发现其他分支,此时工具是无法还原其他分支的信息的,需要先手动下载其他分支的 head 信息保存到 .git/refs/heads/secret 中(执行命令 wget http://127.0.0.1:8000/.git/refs/heads/secret)。回复 head 信息后就可以在用一次 githacak,此时分支的信息就被还原了。

Git 日志

原理:Git 的日志中包含了每次提交的详细信息,包括提交者、提交时间、提交内容等。如果这些日志被泄露,攻击者可以通过分析日志来了解项目的开发历史、敏感信息的变化等。

检测与利用:可以通过访问 .git/logs/HEAD 或 .git/logs/refs/heads/master 来查看日志内容,从中寻找可能的敏感信息。

Git 配置文件

原理:.git/config 文件中包含了仓库的配置信息,如远程仓库地址、用户信息等。如果该文件被泄露,攻击者可以获取到这些配置信息,进而可能利用这些信息进一步入侵远程仓库或进行社工攻击。

检测与利用:可以通过访问 /.git/config 文件来查看配置信息。

Git 索引文件

原理:.git/index 文件是暂存区,记录了哪些文件被添加到了暂存区以及它们的状态。如果该文件被泄露,攻击者可以通过分析索引文件来了解哪些文件可能包含敏感信息,以及它们的版本状态。

检测与利用:可以通过分析 .git/index 文件来获取相关信息。

Git 钩子脚本

原理:.git/hooks 目录中存放了一些钩子脚本,这些脚本可以在特定的 git 操作时被触发执行。如果这些脚本被泄露,攻击者可以分析脚本内容,了解项目在特定操作时的执行逻辑,可能发现其中存在的安全隐患或敏感信息。

检测与利用:可以通过访问 .git/hooks 目录来查看钩子脚本内容。

Git 对象

原理:Git 通过对象来存储数据,包括提交对象、树对象和 Blob 对象等。如果这些对象被泄露,攻击者可以通过分析对象内容来获取项目的代码、配置文件等敏感信息。

检测与利用:可以通过访问 .git/objects 目录来查看对象内容,每个对象的哈希值的头两位会变为文件夹,剩下的变为文件名,保存在这里。需要知道目标文件的哈希值,才能在 objects 下找到目标文件,下载后可以用 python 的 zlib 库解码。

2、实际运用

1.以CTFHUB的web-git泄露-log为例

首先使用dirsearch进行网站扫描,命令如下:

dirsearch.py -u URL -e*

扫描结果中.git/HEAD目录响应状态为200,可以推断存在git泄露的可能

然后使用githack来恢复源代码:

python2 GitHack.py http://challenge-3af067339f2e185f.sandbox.ctfhub.com:10800/.git

这里推荐使用kali下载githack,因为windows实在太麻烦了,下载链接GitHack在kali Linux环境下的下载与安装_kali安装githack-CSDN博客

然后会在githack的dist目录下生成一个所获取的网站源码

然后进入获取的文件夹在里面运行终端

使用git log 查看提交历史,

可以看到在版本hash为62a06bc17a444943221427e24b873a868769f636时加入了flag,

在版本hash为8680523ff38c06e3407f519a6ffddc79d4b34a93时删除了flag

现在有三种方法:

1.直接使用git show查看最近一次提交(仅适用于修改数据量较小时使用)

可以看到删除了flag。

(在遇见最后一次操作不是删除flag时,使用git show <添加flag时的版本hash>即可查看修改)

2.使用git diff比较不同版本的差异(推荐)

语法为git diff

git diff 62a06bc17a444943221427e24b873a868769f636 8680523ff38c06e3407f519a6ffddc79d4b34a93

3.使用git回滚,将版本回退至删除flag之前的版本

语法:

git reset --hard <commit>

这时版本会回到刚刚增加flag的版本,打开获取网站的文件夹会发现新增了一个文本文件,打开就是flag

2.以CTFHUB的web-git泄露-stash为例

正常拉取网站资源,完成后使用上题的方法1,结果如下:

方法2,结果如下:

这道题使用上道题的方式1、2均不行,因为这道题的环境并没有增加flag信息进文件,而是把flag信息放入了暂存的工作区,并没有进行保存操作。

这时不得不提到git stash功能,这个功能可以在开发过程中进行中断,在中断完毕后再进行之前的开发工作。

例:

假设我们正在开发一个名为 feature-a 的新功能,并在 dev 分支上进行开发工作。然而,突然间,我们接到了一个紧急的 bug 修复任务,并且需要切换到 hotfix 分支上进行工作。

此时,我们不能提交我们在 feature-a 分支上的更改,因为它们还没有被完全实现和测试。

在这种情况下,我们可以使用 git stash 命令来保存我们在 feature-a 分支上的更改。

执行以下命令:

git stash:保存当前工作目录的更改。

git checkout hotfix:切换到 hotfix 分支。

进行紧急的 bug 修复工作。

完成后,切换回 feature-a 分支:git checkout feature-a。

恢复之前保存的更改:git stash pop

现在这道题思路已经很明了,使用git stash pop或git回滚来恢复未保存的操作即可

git stash pop

或

git reset --hard <添加flag信息时的版本hash>

注:如果版本过多使用git回滚不好判断在哪个版本把flag放入暂存工作区。(题中的add flag为误导信息,实际添加的修改为“where is flag”)

3.以CTFHUB的web-git泄露-index为例

这个是最简单也是最常见的类型,使用dirsearch命令扫描发现存在git泄露后直接爬取

python2 GitHack.py http://challenge-3af067339f2e185f.sandbox.ctfhub.com:10800/.git

可以看到直接就出现了


三、总结

git泄露在ctf中的应用绝大部分是和代码审计一起出的,往往是ctfweb题中的第一步,所以至关重要。

注:本文转载自blog.csdn.net的m0_67170526的文章"https://blog.csdn.net/m0_67170526/article/details/145101563"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

132
搜索
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top