前言
之前扫出来一些.git泄露漏洞,在用git泄露工具下载恢复的时候,要不漏报,要不慢的要死,还有的扫一半工具直接挂了的。。。然后就开始研究起这些工具的原理来了。这里简单说一下比较流行的工具GitHack和Git_Extract
- GitHack:支持python2和python3,支持多线程,但只通过.git/index来提取文件hash,可能存在漏报
- Git_Extract:比GitHack有更多的发现方式,但只支持python2,还只能是单线程,遇到文件比较多或者网不好的网站,扫半天都结束不了。
git泄露恢复原理
简单来说,在使用git时,各种行为和文件都被标记了一个hash,然后记录在了.git/objects文件夹下,这个hash前两位是所在文件夹,后38位是文件夹内的文件。
利用.git泄露来恢复源码的本质就是去这个.git/objects文件夹下下载源码对应的hash文件并恢复成源文件。
但是这些都是hash,肯定是爆破不出来地址的,那么如何找到这些hash的准确值呢?
网上翻阅一下git原理相关文章,大概可概括为:
- objects文件夹内的hash文件内容主要为commit,blob,tag,tree四类,其中blob类型的就是可以恢复为源码的hash文件
- commit类型的文件中包含tree类型文件的hash值
- tree类型的文件包含blob类型文件的hash
- blob类型的问题件包含源码
由上可知,可以通过git泄露的固定地址找到commit类型的hash,再由commit类型文件找到tree类型的文件hash,之后通过tree类型找到blob类型hash,最后从blob类型文件中恢复源码。
(ps:以上是为了方便理解,并不严谨,详细查找git原理的相关文章)
哪些固定路径的文件可以找到hash?
这是从Git_Extract工具中拿到的地址:
‘/logs/HEAD’, ‘/logs/refs/heads/master’, ‘/packed-refs’, ‘/refs/remotes/origin/HEAD’, ‘/ORIG_HEAD’, ‘/FETCH_HEAD’, ‘/refs/wip/index/refs/heads/master’, # PlaidCTF 2020 magit wip mode ‘/refs/wip/wtree/refs/heads/master’,
因此,可以形成一个简单流程
固定路径提取hash===>commit文件提取hash===>tree文件提取hash===>blob文件恢复源码
pack文件提取源码
除了通过hash来恢复源码,/objects/info/packs存在(这个不是真正的pack文件,而是保存了pack文件的hash),那么也可以通过下载其对应的pack文件来恢复源码。
pack可以简单理解为所有.git/objects的压缩包,可以通过这个文件恢复所有的objects中的内容。
具体文件格式可查阅相关文档这里不做过多介绍。
git泄露工具
根据GitHack和Git_Extract拼凑改良的一个小工具,index解析取自GitHack,pack解析取自Git_Extract并修改为python3格式,整体框架重新编写。
- 支持python3
- 支持多线程
- 支持多种提取方式,能够提取其他分支和历史版本
- 增加进度提示
获取方法
公众号回复 gitdump 获取