目录
(1) GitHack是一个.git泄露利用脚本,通过泄露的.git文件夹下的文件,还原重建工程源代码。渗透测试人员、攻击者,可以进一步审计代码,挖掘:文件上传,SQL注射等安全漏洞。
当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。请尝试使用BugScanTeam的GitHack完成本题
一、前提知识
1.git泄漏原理
开发人员在开发时,常常会先把源码提交到远程托管网站(如github、gitee),最后再从远程托管网站把源码pull到服务器的web目录下,如果忘记把.git文件删除,就造成此漏洞。利用.git文件恢复网站的源码,而源码里可能会有数据库的信息。
在一个目录中初始化一个仓库以后 , 会在这个目录下产生一个名叫 .git
的隐藏文件夹(版本库)这个文件夹里面保存了这个仓库的所有版本等一系列信息
git init
以我的SpringBoot项目为例,当输入这个指令时就会生成 .git隐藏文件夹和.gitignore文件
2.git文件泄漏造成后果
一般情况下 , 开发人员为了让版本控制和网站部署比较方便 , 在开发的时候就会走这样的流程
1.初始化仓库 , 并将仓库托管在Coding或者Github上 , 便于远程协作/备份/部署
2.在本地进行网站开发 , 并定时提交commit , push到远程托管网站
3.当一个阶段的开发差不多的时候 , 需要远程登陆服务器 , 通过托管网站再将发行版网站pull到Web目录下
4.网站正常运行
这里当网站维护(开发)人员在从托管网站pull代码的时候 , 也会将这个储存了所有的版本信息的.git文件夹下载到服务器的Web目录下 , 这样的话 , 攻击者就可以利用这个目录 , 去下载git文件夹 , 就可以利用其中储存的版本控制信息。
1.完全恢复网站后台的代码和目录结构
2.当然 , 一般网站都会涉及到数据库操作 , 而一般来说 , 需要链接数据库就需要用户名/密码/端口/库名等信息 , 而这些信息肯定会在网站后台的源码里面又体现 , 因此这种情况是极其危险的 , 还有 , 一旦服务器开放了数据库的远程连接功能 , 攻击者就可以利用从源码中找到的数据库用户名和密码对远程数据库进行登陆 , 危险性不言而喻。
3.利用方法
(1) GitHack是一个.git泄露利用脚本,通过泄露的.git文件夹下的文件,还原重建工程源代码。渗透测试人员、攻击者,可以进一步审计代码,挖掘:文件上传,SQL注射等安全漏洞。
脚本的工作原理:
解析.git/index文件,找到工程中所有的: ( 文件名,文件sha1 )
去.git/objects/ 文件夹下下载对应的文件
使用zlib解压文件,按原始的目录结构写入源代码
.git泄露利用工具GitHack
.git 泄漏利用工具,可还原历史版本
使用前需确保 git 在 环境变量中
使用方法
python GitHack.py http://www.example.com/.git/ #别忘了最后的.git
还原后的文件在 dist/ 目录下
(2) 爬虫爬取整个git目录 (这个方法比较原始 , 需要具有一定的Git经验 , 这里先重点介绍这种方法 , 但是这种方法和使用githack这个工具相比 , 有一个比较好的地方就是 , 可以完全模拟服务器上的代码环境 , 可以跟踪到git的每一次提交 , 但是githack好像只可以将源码恢复到最近的一次提交,这里的好处还有可以去查看git的提交日志 , 这个日志信息中会有开发人员对每一次commit的描述 , 比如某个BUG的修复等等 , 对于这些和BUG相关的地方 , 可以有针对性地进行白盒审计 , 有可能这个BUG修复了还不如没修复 , 可能会造成更大的漏洞)
具体利用思路 :
利用爬虫递归下载.git目录的所有文件
利用git命令对网站的commit历史进行查看
利用git命令对网站的源码进行恢复
具体操作 :
演示网站 : http://www.xxx.com/.git/
1.在虚拟机中利用wget对该目录进行递归下载(-r)wget -r -p -np -k http://www.xxx.com/.git/ --recursive(递归) -k, --convert-links(转换链接) -p, --page-requisites(页面必需元素) -np, --no-parent(不追溯至父级)
2.下载完成后 , 进入下载的网站目录
3.利用命令 : git log 查看网站的提交记录
4.利用命令 : git reset --hard [log hash] 恢复到指定版本号 (一般如果只需要得到源码的话就恢复到最近的一次提交)
4.漏洞修复
对.git目录的访问权限进行控制
在每次pull到web目录下之后删除.git文件夹
二、解题过程
使用dirsearch扫描
使用dirb扫描
方法一:使用GitHack扫描
python2 GitHack.py http://challenge-1d1b871ce8ce68eb.sandbox.ctfhub.com:10800/.git
进入GitHack的dist目录 ,使用git log命令
使用git diff 查看版本差异,他们之间差别就flag,如下图所示
方法二: Git_Extract工具
工具下载https://github.com/gakki429/Git_Extract
使用方法与GitHack一样
python2 git_extract.py http://challenge-1d1b871ce8ce68eb.sandbox.ctfhub.com:10800/.git