🌟 想系统化学习 Web 渗透?看看这个:[Web 安全] Web 安全攻防 · 学习手册
在上一章中我们讲了 Google Hacking,即如何利用搜索引擎精确定位目标敏感信息或者脆弱资产。那么本节我们将使用 Git Hacking 技术继续对目标的敏感信息进行收集。
0x01:Git Hacking —— 技术简介
Git Hacking 的名称可能不如 Google Hacking 那么响亮,但是这并不妨碍它在实战中的地位。在笔者看来 Git Hacking 主要包括两个部分:
-
目标源码仓库的泄露: 通过对 GitHub 等代码仓库的筛选,获取目标的项目源码。
-
目标站点泄露的 .git 文件利用: 通过泄露的 .git 目录还原目标的整个项目源码。
进阶思考:Git Hacking 仅仅是
.git
文件泄露嘛?其它版本控制系统的工作原理 ...
0x0101:理论基础 — 版本控制系统 · Git 工具简介
Git 工具学习资料 🚀:版本控制系统 —— Git · 使用手册
笔者上面一直 .git
、git
的,相信有些小伙伴只是听过 GitHub 但是不了解 Git,所以笔者这里对 Git 工具做一个简单的介绍(如果你想更深入的了解 Git 可以参考上面提供的链接)。
Git 是当前非常流行的一款开源的分布式版本控制系统,它被广泛用于协同开发和代码管理。许多网站和应用程序都使用 Git 作为其代码管理系统,并将其部署到生成环境中以维护其代码库。
简而言之,Git 能帮你管理文件的版本变更。它能够告诉你,你在哪天修改了哪个地方,你的写作者在哪天修改了哪个地方等等,它还能让你回退到文档某次被修改前的状态。其实这个功能现在很多笔记类软件都提供了,比如 “语雀”:
看左边,就是它自动记录的关于这个文档的更迭历史,通过时间,你就可以定位某天你做的修改,将文档还原回被修改前的样子,然后继续修改,Git 也是用来干这个事情的。
0x0102:理论基础 — Git 信息泄露原理
https://zhuanlan.zhihu.com/p/64231227https://zhuanlan.zhihu.com/p/64231227
Git Hacking 其实就是目标 .git
文件的泄露,在讲解 .git
文件泄露的利用前,我们先来探讨一下,什么是 .git
文件夹,.git
文件夹泄露的危害有哪些以及什么情况下会泄露 .git
文件。
1. 什么是 .git 文件夹
Git 的本质其实就是一个文件夹,当你通过 git init
(Git 工具的一个小命令)声明了这是个被 Git 管理的文件夹后,这个文件夹就会变为上图的 “本地仓库”(因为这个文件夹在你本地啦):
运行完 git init
后最大的变化,就是这个文件夹中会多一个 .git
文件夹,这个文件夹,就是 Git 用来跟踪你本地仓库文件变化的管理库,这个就是 .git
文件夹的由来和基本作用。下面是 Git 的工作区图:
上图中 “工作区” 你可以理解为一个普通的项目文件夹,程序员们在这个文件夹中进行日常代码的编写。编写完代码后,程序员需要通过 git add
方法,将工作区中的修改(注意哦,不是文件,是修改哦)提交到 .git
文件夹的暂存区,但是暂存区只是暂存修改,当你一天工作完成,或者某个模块完成,你想要保存这个更改,就需要通过 git commit
命令将本次修改提交到 .git
文件夹的某个分支上,直到此时,这个 .git
文件夹都还在你个人电脑上,别人是访问不到的。
如果你们是一个团队,共同开发一个项目,此时就需要用到 “远程仓库”,我们熟知的就是 GitHub、GitCode、Gitee 这几个平台。团队领导会在这些平台上创建一个公共的仓库,然后团队中的每个人都可以将自己本地写的代码推送到这个平台上,由于这个平台是在公网上的,所以每个人都可以通过浏览器访问,每个人都可以通过 Git 提供的 pull
命令拉取最新的修改,和 push
命令将自己本地的修改推送到该公共仓库中,如此,就完成了团队的协同开发。
2. .git 文件夹泄露危害
下面,我们根据 Git 管理文件的流程,来大致理一下,可能产生危害的地方。
首先,Git 作为一个版本控制工具,它里面的 .git
文件夹肯定是存放了你当前项目的副本的,不然它是没办法给你还原某个时期的代码版本的。那这是不是说明,如果我攻击者有办法拿到你的 .git
文件夹中的内容,我就可以尝试还原出你的整个项目文件?哪怕你把 “工作区” 的文件全部删除了也没用。
这就是最大的一个危害,攻击者通过 .git
文件夹还原你整个项目,然后通过对项目进行代码审计,挖掘你产品中存在的漏洞,再进行攻击,这种一打一个准,还非常容易出现危害极大的 0 day 漏洞。
其次我们在开发某个软件的时候,大部分都会用到数据库,或者其他第三方平台的密钥,如果你不小心把这些东西写到了项目中,这个项目又被 Git 进行管理,那危害是不是又来了,.git
文件夹里铁有你的账号密码 !!
3. .git 文件夹泄露的途径
.git
文件泄露的途径一般也就分本地仓库泄露和远程仓库泄露。
本地的,比如你的系统存在任意文件读取漏洞,或者你权限控制没做好(当然也可能是你项目打包的时候,直接顺手就把 .git
文件夹一起打包了进去),直接能让其它用户访问你项目的 .git
文件夹,这都会造成泄露(攻击者跑你现场拿 U 盘拷贝何尝不是一种泄露呢?)。
远程的,属于是员工安全意识不足,直接把私密项目源码推送到公共仓库中,针对这种情况,有没有 .git
文件夹都无所谓,因为你源码公开了嘛(其实默认情况下,Git 做了安全限制,你不特意配置,你本地的 .git
文件夹一般是推送不上去的)。
0x0103:理论基础 — Git 信息泄露基础利用流程
下面笔者介绍一个常见的 Git 信息泄露利用链:
1. 找到目标泄露的 .git
文件夹
在对目标定点渗透前,攻击者通常会对目标进行信息收集,信息收集中的目录扫描阶段,是最有可能直接扫描出 .git
文件夹的(其它版本控制器的文件夹后续操作流程类似)。
除了定点渗透,我们其实还可以通过前面介绍的 “Google Hacking” 去通过目录遍历漏洞来查找 .git
文件夹,目录遍历漏洞通常长下面这样(页面都给你了,Google Hacking 还不会构造,就回去补补基础吧):
2. 把目标的 .git
文件夹下载到本地
自动利用工具 🚀:敏感信息泄露利用工具 —— GitHack · 使用手册
找到了目标泄露的 .git
文件夹,此时我们就需要把该文件夹下的所有内容都下载到我们本地。我们自己一个一个手动下是不可能的,此时可以利用笔者上面提供的那个工具,进行一键下载。
3. 利用 Git 相关命令获取所需信息
拿到了目标的 .git
文件夹,此时,我们就可以通过 Git 自带的一些命令,来收集有关目标项目的一些敏感信息了,比如项目源码,项目曾经提交过的记录等等,笔者这里列举几个命令:
git log # 获取提交的历史记录
git reset --hard <coomid_id> # 恢复项目到某个提交的版本
git diff # 查看工作区和暂存区差异,通过携带参数可以对比各版本差异
不会命令也没事,笔者同样找到了懒人工具给你(这个工具笔者实测感觉其实一般):
自动利用工具 🚀:敏感信息泄露利用工具 —— GitExtract · 使用手册
0x02:Git Hacking —— 案例演示
Git Hacking Test:GitHackingTest.zip
上面这个是笔者自己写的一个小案例(非常简单),来演示一下 Git Hacking 实战中的简单用法。
0x0201:GitHackingTest 环境搭建
首先从上面提供的地址下载并解压 GitHackingTest.zip,解压后长下面这样:
然后通过 Python 使用下面的命令在当前目录下开放一个临时的 Web 服务器即可:
python -m http.server 80
我们访问下面的路径,只要能现实 Web 路径就证明环境搭建 OK 了(界面好看吧,其实和我们做题没啥关系 😏):
http://localhost/
0x0202:GitHakcingTest 实战流程
首先,访问靶场首页,我们第一步是不是应该做个信息收集?先来个目录爆破(笔者使用的是 dirsearch):
python dirsearch.py -u http://localhost/
如上,发现靶场中存在 .git
文件夹,那么下一步是不是就是把文件夹 down 下来,这里我们使用 GitHack(BugScanTeam 版):
python2 GitHack.py http://172.16.0.1/.git/
程序运行完成后,会在 dist 目录中生成对应的结果:
然后我们进入这个 172.16.0.1(是我本地的靶场地址 IP,你的可能不太一样),输入下面的命令,看看里面有啥:
ls -al
如上,啥也没有,但有一个 .git
文件夹,有这个就行了,我们就可以还原出任意版本的原始项目了。输入下面的命令,查看一下目标的历史提交信息:
git log
如上,是不是有一次提交叫 “add flag.txt“ ?我们尝试还原这个版本(这里涉及了 Git 的时间法则):
Git 工具学习资料 🚀:版本控制系统 —— Git · 使用手册
git reset --hard HEAD^^
如上,通过回滚,我们成功利用 .git
文件夹回溯了项目的某个历史版本并拿到了 Flag !!
在本次练习中,它是 Flag,而在实战中,它可能就是后端数据库的连接密码、第三方的认证密钥以及整个项目的原始代码 !!!
0x03:Git Hacking —— 拓展内容 · GitHub 搜索技巧
在针对某个目标进行渗透前,我们可以去像 GitHub、Gitee、GitCode 等这些在线平台上搜索与目标相关的信息、代码库,如果运气好,碰到某个员工安全意识不足,直接把数据库配置上传了,那么恭喜你,直接捡到了一个漏洞(如果是公网数据库,直接高危走起)。
0x0301:GitHub 搜索技巧 — 官方文档
那么如何进行高效的收集呢?其实 GitHub 也和 Google 等这些搜索引擎一样,提供了一套自己的语法库,下面是官方文档(虽然有中文版,但中文版翻译有点不对劲,凑合着看吧):
GitHub 搜索技巧
英文版:如何在 GitHub 上进行搜索
中文版:如何在 GitHub 上进行搜索
0x0302:GitHub 搜索技巧 — 手动收集
下面是笔者收集的一些常用的 GitHub 手动搜索的语法(其实有了语法还不够,你还得有用于搜索的敏感词,这个呢,就得靠诸位的积累了):
示例 | 含义 |
---|---|
in:name baidu | 搜索标题中含有关键字 baidu 的内容 |
in:description baidu | 搜索仓库描述中包含 baidu 的内容 |
in:readme baidu | 搜索 Readme.md 文件中包含 baidu 的内容 |
starts:>3000 baidu | starts 数量大于 3000 的仓库中搜索关键字 |
starts:100..200 baidu | starts 数量大于 100 小于 200 的仓库中搜索关键字 |
forks:>100 baidu | forks 数量大于 100 的仓库中搜索关键字 |
size:>=5000 baidu | 指定仓库大于 5000k (5M) 的搜索关键字 |
pushed:>2024-02-12 baidu | 发布时间大于 2024-02-12 的搜索关键字 |
created:>2019-02-12 baidu | 创建时间大于 2019-02-12 的搜索关键字 |
user:name | 按照用户名搜索 |
license:apache-2.0 baidu | 明确仓库的 LICENSE 搜索关键字 |
language:java baidu | 在 java 语言的代码中搜索关键字 |
user:baidu in:name baidu | 组合搜索,用户名 baidu 的标题含有 baidu 的 |
in:file kali | 搜索文件中包含 kali 的代码 |
in:path kali | 搜索路径中包含 Kali 的代码 |
in:path,file kali | 搜索路径、文件中包含 Kali 的代码 |
filename:config.php | 搜索包含文件名 config.php 的 |
topics:>=5 kali | 标签数量大于等于 5 的 |
kali forks:>100 -language:java | 搜索包含 kali 关键字,且 forks > 100 并且开发语言不包含 java 的仓库 |
0x0303:GitHub 搜索技巧 — 搜索示例
在上一节中笔者列举了一些手动收集的示例,那么本节笔者简单做个演示。比如,我们要搜索包含 Git Hacking
的仓库:
"Git Hacking"
然后你看那个 jcesarstef
不顺眼,此时就可以用下面这个语法把他排除在外:
"Git Hacking" -user:jcesarstef
如上,可以看到,结果数量从 76 变成了 75,且 jcesarstef 这个用户的仓库没了。OK,一次简单的 GitHub 高级搜索就结束了(其余的语法就靠你自己练习啦)。
我们网安最喜欢的就是自动化了,其实 Git Hakcing 也有一堆自动化项目,感兴趣的读者可以去 GitHub 上搜搜(找到好用的项目记得私聊笔者分享一下 😏)。