Golang实现Githack工具与Git源码泄露原理详解
前言
Githack是一个利用Git源码泄露漏洞的工具名称。Git源码泄露漏洞指的是由于服务器配置不当,导致客户端可以通过HTTP/HTTPS协议直接访问服务器本地.git文件夹中的内容。.git文件夹是Git版本控制工具存储代码信息的核心目录,包含完整的版本历史记录和文件信息。
实验:通过.git文件夹恢复文件
- 将一个代码仓库的.git文件夹单独复制到另一个文件夹
- 执行
git status命令,可以看到被删除的文件仍然可见 - 执行
git checkout -- .恢复最后一次commit时的状态
这个实验证明:只要能下载.git文件夹,就相当于下载了完整的源代码。
Githack原理
Githack的核心目标是下载目标网站的.git文件夹。下载方式主要有两种:
- 直接目录遍历:当中间件(Apache/Nginx)配置不当时,可以直接通过
wget -r或编写脚本递归下载 - 基于Git内部原理的下载:当无法直接目录遍历时,需要深入了解Git内部工作原理
Git内部原理详解
Git目录结构
执行git init后,.git目录包含以下核心文件和目录:
HEAD
config*
description
hooks/
info/
objects/
refs/
重点关注:
HEAD文件:保存当前所在分支index文件:保存暂存区信息(初始时不存在)objects目录:存储所有数据内容refs目录:存储指向数据的指针
数据对象(blob object)
Git是一个内容寻址文件系统,核心是一个键值对数据库:
-
使用
hash-object命令存储数据:echo 'test content' | git hash-object -w --stdin返回SHA-1哈希值:
d670460b4b4aece5915caf5c68d12f560a9fe3e4 -
存储后在objects目录下生成文件:
.git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4 -
使用
cat-file读取内容:git cat-file -p d670460b4b4aece5915caf5c68d12f560a9fe3e4
树对象(tree object)
树对象解决文件名保存问题,组织多个文件:
-
使用
update-index创建暂存区:git update-index --add --cacheinfo 100644,d670460b4b4aece5915caf5c68d12f560a9fe3e4,test.txt -
使用
write-tree创建树对象:git write-tree返回树对象哈希值:
80865964295ae2f11d27383e5f9c0b58a8ef21da -
查看树对象内容:
git cat-file -p 80865964295ae2f11d27383e5f9c0b58a8ef21da
提交对象(commit object)
提交对象解决多个树对象的记忆问题:
-
使用
commit-tree创建提交对象:echo 'first commit' | git commit-tree 80865964295ae2f11d27383e5f9c0b58a8ef21da返回提交对象哈希值:
97147cdc4915da7d51e98cd99cea5705e5e98045 -
查看提交对象内容:
git cat-file -p 97147cdc4915da7d51e98cd99cea5705e5e98045
提交对象会形成链表结构,每个提交指向其父提交。
Githack实现方法
在Yaklang中实现的Githack使用了go-git依赖库,基本执行流程:
- 尝试下载
.git/index文件获取文件列表 - 下载
.git/logs/HEAD获取提交历史 - 下载
.git/refs/heads/*获取分支引用 - 根据获取的信息递归下载objects目录中的对象
- 重建完整的Git仓库
使用案例
以CTF题目"ctfhub-技能树-Web-信息泄露-Git泄露-Log"为例:
-
靶场地址:
http://challenge-9615288119a7b693.sandbox.ctfhub.com:10800/ -
在Yakit中执行:
err = git.GitHack("http://challenge-9615288119a7b693.sandbox.ctfhub.com:10800/", "C:\\Users\\xxx\\Desktop\\git\\gittest") die(err)可选参数:
git.threads(10):指定线程数git.useLocalGitBinary(true):使用本地git命令进行兜底检查git.httpOpts(poc.redirectTimes(10), poc.https(true)):指定HTTP请求选项
-
恢复成功后,检查Git日志:
git log -
发现最新commit删除了flag,切换到添加flag的commit:
git checkout <commit-hash> -
查看文件即可找到flag
防御措施
-
禁止直接访问.git目录(Nginx配置示例):
location ~ /\.git { deny all; } -
在生产环境部署时删除.git目录
-
使用.gitignore文件避免敏感信息被提交
-
定期进行安全审计,检查配置漏洞
总结
Githack工具利用Git源码泄露漏洞,通过下载.git目录重建完整的代码仓库。了解Git内部对象模型(blob、tree、commit)是理解该工具工作原理的关键。防御此类攻击需要正确配置服务器并遵循安全最佳实践。