跳转至

Git泄漏找Flag思路总结

概述

Git泄漏是CTF中常见的Misc/Web题型,通过分析.git目录或git仓库历史记录来寻找隐藏的flag。


核心思路分类

1. Git Stash(储藏区检查)⭐

原理: 开发者使用git stash临时保存未提交的修改,flag可能被储藏后删除

检查命令:

# 列出所有stash
git stash list

# 查看特定stash的详细内容
git stash show -p stash@{0}

# 应用stash查看文件
git stash apply stash@{0}

实战示例:

$ git stash list
stash@{0}: WIP on master: c35bb3e add flag

$ git stash show -p stash@{0}
diff --git a/file.txt b/file.txt
-where is flag
+ctfhub{68ad8199f5c4734638a08f6a}


2. Git Log & Reflog(历史记录分析)⭐⭐

原理: 查看完整的提交历史,包括已删除的提交

检查命令:

# 查看提交历史
git log --all --oneline
git log --all --graph --decorate

# 查看详细的引用日志(包括被删除的提交)
git reflog

# 查看所有分支的提交历史
git log --all --full-history --source --

关键点: - 查找包含"flag"、"add"、"remove"等关键词的提交 - reflog能显示被reset/rebase删除的提交 - 使用--all参数查看所有分支


3. Git Show(查看特定提交)⭐⭐

原理: 检查特定提交的详细内容

检查命令:

# 查看特定提交的完整内容
git show <commit-hash>

# 查看特定提交的特定文件
git show <commit-hash>:path/to/file

# 列出提交中修改的所有文件
git show --name-only <commit-hash>

实战技巧:

# 遍历所有提交查找flag
for commit in $(git log --all --format=%H); do
    echo "=== $commit ==="
    git show $commit | grep -i "flag\|ctf"
done


4. Git Diff(差异对比)⭐

原理: 对比不同版本之间的差异,找到被删除的flag

检查命令:

# 对比两个提交
git diff <commit1> <commit2>

# 查看工作区与最新提交的差异
git diff HEAD

# 查看暂存区差异
git diff --cached

# 对比所有历史更改
git log -p


5. 分支检查(Branch Analysis)⭐

原理: flag可能在其他分支或已删除的分支中

检查命令:

# 查看所有分支(包括远程)
git branch -a

# 查看已删除分支的记录
git reflog | grep "checkout:"

# 恢复已删除的分支
git checkout -b <branch-name> <commit-hash>

# 检查所有分支的文件
git log --all --source -- <filename>


6. Git Objects直接分析⭐⭐⭐

原理: 直接检查.git/objects目录中的所有对象

检查命令:

# 查看所有git对象
find .git/objects -type f

# 遍历所有对象查找内容
for obj in $(find .git/objects -type f | sed 's/\.git\/objects\///g' | tr -d '/'); do
    git cat-file -p $obj 2>/dev/null | grep -i "flag\|ctf"
done

# 查看松散对象
git fsck --lost-found

# 检查未被引用的对象
git fsck --unreachable


7. .git目录泄漏利用(Web场景)⭐⭐⭐

场景: Web应用泄漏.git目录,需要下载并重建仓库

工具1: GitHacker

githacker --url http://target.com/.git/ --output-folder result
cd result
git log --all
git stash list

工具2: git-dumper

git-dumper http://target.com/.git/ result
cd result
git checkout .
git log --all

工具3: GitTools

# 下载.git目录
./gitdumper.sh http://target.com/.git/ result

# 提取器
./extractor.sh result extract
cd extract

手动下载关键文件

# 关键文件列表
.git/HEAD
.git/config
.git/index
.git/logs/HEAD
.git/refs/heads/master
.git/objects/xx/xxxxxx...

8. 特殊场景检查

8.1 配置文件检查

# 查看git配置
cat .git/config

# 查看用户信息
git config --list

8.2 标签检查

# 查看所有标签
git tag

# 查看标签详情
git show <tag-name>

8.3 忽略文件检查

# 查看.gitignore
cat .gitignore

# 查找被忽略但存在的文件
git status --ignored

8.4 子模块检查

# 查看子模块
cat .gitmodules
git submodule status

自动化脚本

综合检查脚本

#!/bin/bash

echo "[*] Git Repository Flag Hunter"
echo "================================"

# 1. Stash检查
echo -e "\n[+] Checking stashes..."
git stash list
for i in {0..10}; do
    git stash show -p stash@{$i} 2>/dev/null | grep -i "flag\|ctf"
done

# 2. 提交历史检查
echo -e "\n[+] Checking commit history..."
git log --all --oneline | grep -i "flag\|add\|remove\|delete"

# 3. Reflog检查
echo -e "\n[+] Checking reflog..."
git reflog | head -20

# 4. 遍历所有提交查找flag
echo -e "\n[+] Searching in all commits..."
for commit in $(git log --all --format=%H); do
    git show $commit | grep -iE "flag\{|ctf\{|flag:" && echo "Found in: $commit"
done

# 5. 检查所有分支
echo -e "\n[+] Checking all branches..."
git branch -a

# 6. 检查未引用对象
echo -e "\n[+] Checking unreachable objects..."
git fsck --unreachable

# 7. 搜索所有对象
echo -e "\n[+] Searching in all objects..."
find .git/objects -type f | while read obj; do
    hash=$(echo $obj | sed 's/\.git\/objects\///g' | tr -d '/')
    git cat-file -p $hash 2>/dev/null | grep -iE "flag\{|ctf\{" && echo "Found in object: $hash"
done

echo -e "\n[*] Scan complete!"

常见Flag位置

位置 概率 检查方法
git stash ⭐⭐⭐⭐⭐ git stash list && git stash show -p
历史提交 ⭐⭐⭐⭐ git log --all -p
已删除提交 ⭐⭐⭐⭐ git reflog
其他分支 ⭐⭐⭐ git branch -a
git objects ⭐⭐⭐ 遍历.git/objects
提交信息 ⭐⭐ git log --all --oneline
标签 ⭐⭐ git tag
配置文件 cat .git/config

快速检查清单

  • git stash list - 检查储藏区
  • git log --all --oneline - 查看所有提交
  • git reflog - 查看引用日志
  • git branch -a - 查看所有分支
  • git tag - 查看标签
  • git fsck --unreachable - 查看未引用对象
  • 遍历所有提交内容查找flag字符串
  • 遍历.git/objects查找flag
  • 检查.git/config配置文件
  • 使用自动化工具扫描

工具推荐

Web Git泄漏工具

  1. GitHacker - Python工具,自动化下载和分析
  2. git-dumper - 快速下载.git目录
  3. GitTools - 包含dumper和extractor
  4. dvcs-ripper - 支持多种版本控制系统

本地分析工具

  1. git命令 - 原生强大
  2. tig - 交互式git查看器
  3. gitk - 图形化历史查看
  4. grep/rg - 内容搜索

实战技巧

技巧1: 关键词搜索

# 搜索所有提交中的敏感词
git log --all -S "flag" -S "password" -S "key"

# 搜索提交信息
git log --all --grep="flag\|password"

技巧2: 时间线分析

# 按时间查看提交
git log --all --since="2024-01-01" --until="2024-12-31"

# 查看特定作者的提交
git log --all --author="admin"

技巧3: 文件历史追踪

# 追踪特定文件的所有历史
git log --all --full-history -- <filename>

# 查看文件的所有版本
git log --all --follow -p -- <filename>

技巧4: 二进制文件检查

# 查找所有二进制文件
git log --all --numstat | grep "^-"

# 提取特定提交的二进制文件
git show <commit>:<file> > extracted_file

防御建议(了解攻击方式)

  1. 生产环境禁止.git目录
  2. Nginx: location ~ /\.git { deny all; }
  3. Apache: RedirectMatch 404 /\.git

  4. 使用.gitignore

  5. 添加敏感文件到.gitignore
  6. 但注意:已提交的文件不会自动删除

  7. 清理敏感历史

    # 从所有历史中删除文件
    git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
    
    # 使用git-filter-repo(推荐)
    git filter-repo --path passwords.txt --invert-paths
    

  8. 使用环境变量

  9. 敏感信息不要硬编码
  10. 使用.env文件(加入.gitignore)

总结

Git泄漏找flag的核心思路: 1. 优先检查stash - 最常见的隐藏点 2. 完整历史分析 - log + reflog组合 3. 对象遍历 - 全面但耗时 4. 自动化工具 - 提高效率 5. 关键词搜索 - grep是好帮手

记住: Git的设计初衷是永久保存历史,"删除"往往只是引用删除,数据仍在.git/objects中。