提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
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题中的第一步,所以至关重要。
评论记录:
回复评论: