全网首发!Golang实现的Githack与原理详解
字数 1747 2025-08-10 08:28:04

Golang实现Githack工具与Git源码泄露原理详解

前言

Githack是一个利用Git源码泄露漏洞的工具名称。Git源码泄露漏洞指的是由于服务器配置不当,导致客户端可以通过HTTP/HTTPS协议直接访问服务器本地.git文件夹中的内容。.git文件夹是Git版本控制工具存储代码信息的核心目录,包含完整的版本历史记录和文件信息。

实验:通过.git文件夹恢复文件

  1. 将一个代码仓库的.git文件夹单独复制到另一个文件夹
  2. 执行git status命令,可以看到被删除的文件仍然可见
  3. 执行git checkout -- .恢复最后一次commit时的状态

这个实验证明:只要能下载.git文件夹,就相当于下载了完整的源代码

Githack原理

Githack的核心目标是下载目标网站的.git文件夹。下载方式主要有两种:

  1. 直接目录遍历:当中间件(Apache/Nginx)配置不当时,可以直接通过wget -r或编写脚本递归下载
  2. 基于Git内部原理的下载:当无法直接目录遍历时,需要深入了解Git内部工作原理

Git内部原理详解

Git目录结构

执行git init后,.git目录包含以下核心文件和目录:

HEAD
config*
description
hooks/
info/
objects/
refs/

重点关注:

  • HEAD文件:保存当前所在分支
  • index文件:保存暂存区信息(初始时不存在)
  • objects目录:存储所有数据内容
  • refs目录:存储指向数据的指针

数据对象(blob object)

Git是一个内容寻址文件系统,核心是一个键值对数据库:

  1. 使用hash-object命令存储数据:

    echo 'test content' | git hash-object -w --stdin
    

    返回SHA-1哈希值:d670460b4b4aece5915caf5c68d12f560a9fe3e4

  2. 存储后在objects目录下生成文件:

    .git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4
    
  3. 使用cat-file读取内容:

    git cat-file -p d670460b4b4aece5915caf5c68d12f560a9fe3e4
    

树对象(tree object)

树对象解决文件名保存问题,组织多个文件:

  1. 使用update-index创建暂存区:

    git update-index --add --cacheinfo 100644,d670460b4b4aece5915caf5c68d12f560a9fe3e4,test.txt
    
  2. 使用write-tree创建树对象:

    git write-tree
    

    返回树对象哈希值:80865964295ae2f11d27383e5f9c0b58a8ef21da

  3. 查看树对象内容:

    git cat-file -p 80865964295ae2f11d27383e5f9c0b58a8ef21da
    

提交对象(commit object)

提交对象解决多个树对象的记忆问题:

  1. 使用commit-tree创建提交对象:

    echo 'first commit' | git commit-tree 80865964295ae2f11d27383e5f9c0b58a8ef21da
    

    返回提交对象哈希值:97147cdc4915da7d51e98cd99cea5705e5e98045

  2. 查看提交对象内容:

    git cat-file -p 97147cdc4915da7d51e98cd99cea5705e5e98045
    

提交对象会形成链表结构,每个提交指向其父提交。

Githack实现方法

在Yaklang中实现的Githack使用了go-git依赖库,基本执行流程:

  1. 尝试下载.git/index文件获取文件列表
  2. 下载.git/logs/HEAD获取提交历史
  3. 下载.git/refs/heads/*获取分支引用
  4. 根据获取的信息递归下载objects目录中的对象
  5. 重建完整的Git仓库

使用案例

以CTF题目"ctfhub-技能树-Web-信息泄露-Git泄露-Log"为例:

  1. 靶场地址:http://challenge-9615288119a7b693.sandbox.ctfhub.com:10800/

  2. 在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请求选项
  3. 恢复成功后,检查Git日志:

    git log
    
  4. 发现最新commit删除了flag,切换到添加flag的commit:

    git checkout <commit-hash>
    
  5. 查看文件即可找到flag

防御措施

  1. 禁止直接访问.git目录(Nginx配置示例):

    location ~ /\.git {
        deny all;
    }
    
  2. 在生产环境部署时删除.git目录

  3. 使用.gitignore文件避免敏感信息被提交

  4. 定期进行安全审计,检查配置漏洞

总结

Githack工具利用Git源码泄露漏洞,通过下载.git目录重建完整的代码仓库。了解Git内部对象模型(blob、tree、commit)是理解该工具工作原理的关键。防御此类攻击需要正确配置服务器并遵循安全最佳实践。

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 文件:保存当前所在分支 index 文件:保存暂存区信息(初始时不存在) objects 目录:存储所有数据内容 refs 目录:存储指向数据的指针 数据对象(blob object) Git是一个内容寻址文件系统,核心是一个键值对数据库: 使用 hash-object 命令存储数据: 返回SHA-1哈希值: d670460b4b4aece5915caf5c68d12f560a9fe3e4 存储后在objects目录下生成文件: 使用 cat-file 读取内容: 树对象(tree object) 树对象解决文件名保存问题,组织多个文件: 使用 update-index 创建暂存区: 使用 write-tree 创建树对象: 返回树对象哈希值: 80865964295ae2f11d27383e5f9c0b58a8ef21da 查看树对象内容: 提交对象(commit object) 提交对象解决多个树对象的记忆问题: 使用 commit-tree 创建提交对象: 返回提交对象哈希值: 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中执行: 可选参数: git.threads(10) :指定线程数 git.useLocalGitBinary(true) :使用本地git命令进行兜底检查 git.httpOpts(poc.redirectTimes(10), poc.https(true)) :指定HTTP请求选项 恢复成功后,检查Git日志: 发现最新commit删除了flag,切换到添加flag的commit: 查看文件即可找到flag 防御措施 禁止直接访问.git目录(Nginx配置示例): 在生产环境部署时删除.git目录 使用.gitignore文件避免敏感信息被提交 定期进行安全审计,检查配置漏洞 总结 Githack工具利用Git源码泄露漏洞,通过下载.git目录重建完整的代码仓库。了解Git内部对象模型(blob、tree、commit)是理解该工具工作原理的关键。防御此类攻击需要正确配置服务器并遵循安全最佳实践。