CTF中的几种git泄露

git泄露是常见的ctf题型,来看几个例子

Hello World (i春秋 第二届春秋欢乐赛 web)

这里只说git利用的点


由上可知有git泄露
之后尝试使用常用工具GitHack
https://github.com/BugScanTeam/GitHack

这里应该是通过.git/refs/heads/master中存储的commit的object来提取了master分支

但是这并不够,因为本题的考点原意是.git/logs/HEAD文件的利用,而githack并没有对其中的hash提取,因此遗漏了部分的object,即下图中的部分hash

这里使用JGitHack是可以获取到这些遗漏的object的

之后需要手动提取object
这里使用git的底层命令,cat-file和ls-tree
看一下logs中的提交记录

可以发现有两个commit,并且hash值是不一样的,说明有文件出现改动
于是这里手动查看一下

可见他们的tree的hash也是不一样的,说明其中有文件改变,这里继续看两个tree

由此可见其中的flag.js是变动了,他们的hash值不一样,说明文件不一样,分别是
f2b45f1e5af6dc1a8607c11e4ddc5fd077276c45
04bb09bb63fe48e6cab3e1c72a7ef51dda9634b8
所以flag应该就是在这其中
之后可以使用git cat-file命令提取文件

之后再sublime中diff一下这两个文件

会发现有不同,很明显的区别就是flag了,这前三个差异的字符分别是f,l,a,再往后看便是flag了
到这里,这题做完了,但是过程有些繁琐,而且是可以自动完成的
原先我的想法是使用几个git命令自动完成这个,但发现效率有些低
于是我写了这个工具
https://github.com/gakki429/Git_Extract
我们试试这个工具

看下获取到的文件,与之前的对比

GitHack

JGitHack
Git_Extract

之后直接diff其中的flag.js和f2b45f_flag.js就可以了


登录 (百度杯CTF比赛 十月场 web)

前面是注入
最后可以得到用户
username: bctf3dm1n
password: adminqwe123666
登录之后如下



可见.bctfg1t,应该是git泄露
这题的主要考点是.git/refs/stash



stash是一个用于保存git工作进度的文件
之后利用Git_Extract获取
这里获取了master分值,之后也解析了stash中的存的hash的object


由此可获得提示信息

之后打开这个71ec9d5ca5580c58d1872962c596ea71.php
就可以看到flag了



如果这里使用GitHack也是可以完成的

image.png

之后我们手动查看stash中的object就可以了

从这个commit中的tree继续获取

Backdoor (百度杯CTF比赛 十月场 web)

依旧是git的logs/HEAD,但是这里的commit有些多



使用Git_Extract会帮助你自动解析提取这些commit




查看这几个flag文件可以发下如下提示,之后继续做就好了

如果使用GitHack也可以完成,但是这些commit需要你手动提取,相当的难受

Git常见的利用

.git/index中会缓存git add的文件,这里在没有commit的情况下,也是存在的
https://github.com/lijiejie/GitHack lijiejie的这个就是获取的这个
.git/refs/heads/master 记录了master的commit的hash,由此可以解析出这个commit的所有文件
.git/logs/HEAD其中存储了git的log信息,可以找到历史的commit项
.git/refs/stash 工作进度的临时保存
最后说一个pack的问题,这个好像还没看见有ctf中考到,这里也做了恢复
.git/info/packs packs文件提取恢复

更新

去除了原本的不存在文件的下载失败的提示
增加对windows字体颜色输出的支持,并同步默认背景色,linux中背景色也修改为与默认同步
更换了帅气的Logo(手动滑稽)
觉得好用的话就给个star吧

下载地址
https://github.com/gakki429/Git_Extract

image.png

推荐阅读更多精彩内容