一道 Misc 题 , 从比赛官网点击比赛链接后跳转到了一个 Web 页面 , 从这里可以下载一个流量包
下载之后 WireShark 分析 , HTTP协议流量包
跟踪 TCP 流后发现 , 流量包的场景应该是攻击者利用扫描器对某一个网站进行 git 源码泄露的扫描
1. 根据 HTTP 请求头的 URL (请求的文件是常见的 git 配置文件)
2. 根据不断变化 User-Agent 头部 (爬虫防止目标网站有反爬虫策略而进行的随机化)
3. 根据相应码大量为 404
这里已经获取了某一些配置信息
如果之前还不是很确实是 git 源码泄露 , 那么通过下面这个数据包就可以肯定了
/.git/HEAD 这个文件在 git 仓库中保存着当前分支的指针
这里应该是出题人将 .git 重命名为了 .nijiakadaye
回过头来想想 , 这是一道 Misc 题目 , 流量包为什么不是从比赛的主站直接下载 , 而是从一个新的 web 站去下载 ?
而且流量包是攻击者对某一个目标网站的扫描流量 , 是不是攻击者扫描的事实上就是这个网站呢 ?
验证一下即可
访问该网站的 ./nijiakadaye/HEAD 文件 , 发现与流量包中一致 , 这也充分验证了我们刚才的猜想
注意这里直接访问 ./nijiakadaye/ 目录的话是会 Forbidden 的
有一些开发(运维)人员了解 git 源码泄露的危害性
因此他们对此做出了一些保护措施 , 例如 :
禁用 apache 的目录索引功能 , 具体方法如下 :
编辑 /etc/apache2/apche2.conf
在网站目录的配置项下 :
170
171 Options FollowSymLinks Indexes
172 AllowOverride ALL
173 Require all granted
175 DirectoryIndex index.php index.html index.htm
176
177
修改为 :
170
171 Options FollowSymLinks
172 AllowOverride ALL
173 Require all granted
175 DirectoryIndex index.php index.html index.htm
176
177
也就是去掉 Indexes 这个 Options
注意这里如果配置了 Apache 的虚拟主机 , 配置起来也是同样的道理
这样用户在访问某一个目录的时候 , 如果这里目录下面没有 DirectoryIndex 这个配置项中定义的文件
例如 index.html index.php
apache 就是直接返回 403 Forbidden
但是这样的配置防止攻击者在不知道目标网站目录结构的情况
或者说这个配置项并不是是一个为了安全考虑的配置项
当攻击者知道目标目录的结构的时候 , 那么这个配置项事实上是并没有什么用处的
我们这里 .git 源码泄露就属于上述的情况 , .git 文件夹的目录结构基本上是固定的 , 所以说
这里 403 Forbidden 事实上只能阻挡误操作点击进来的用户 , 还有一些不明所以的攻击者
但是似乎有大量的网站正在使用这样所谓的防护措施 , 这也是非常危险的
一般情况下 , 我们建议将 .git 目录放置于网站根目录的上层
也就是说在创建 git 仓库的时候就直接在网站根目录的上层去创建
这样就将 .git 目录限制在了客户端不能访问到的位置 (但是也不排除 cgi 层出现任意文件读取漏洞)
我们可以通过已知的目录结构轻松地访问到目标主机的敏感文件
我们现在已经搜集到了足够多的信息 , 这个时候可以直接利用现成的工具进行攻击了
这里我使用了之前写的多线程的 .git 源码泄露利用脚本 , 这个脚本可以直接恢复目标主机的整个 .git 目录
也就是说我们可以使用
git reflog
来查看开发者所有的历史操作以及提交信息 , 从而掌握整个后台开发的流程
甚至在某些情况下 , 当开发者的安全意识淡薄 , 甚至有可能获取到网站的后台密码或者用于发送注册邮件的邮箱的密码
上面说到的工具已开源 :
可以直接使用 :
git clone https://github.com/WangYihang/GitHacker.git
cd GitHacker
python GitHacker.py
进行使用
目标网站的 .git 目录非常大 , objects 文件非常多 , 因此之前写过的脚本速度很慢 , 当我使用
git fsck | cat -n
查看还有多少 objects 文件需要下载的时候 , 居然显示有两千多个
然后就这个脚本就产生了多线程的版本
50 个线程大概用了一分钟左右
利用完成 , 进入文件夹
git reflog 查看历史操作信息
git reflog > log
使用 git diff [COMMIT_ID] [COMMIT_ID]
来对两个版本逐个进行比较
发现以下比较有用的信息
很容易想到这里的密文应该是这里的加密算法对 flag 进行加密得到的
这里就只需要对算法求逆即可
事实上这里的算法非常简单 , 由于只使用了异或操作 , 其实加密算法也是解密算法
这里的加密算法涉及到一个密码 , 由于在 git 的日志中提到了 :
wodegea
这个字符串 , 导致当时一直在纠结加密算法的密码是什么
花费了较长的时间 , 导致失去了一血 , 不开心...
SSCTF{give you flag,can you accept?"}
SSCTF{xsL3HOvFlV+H40s0mhszc5t1x38EU0ZIFJHZ/h2sC3U=}
var_dump(wtf(base64_decode('xsL3HOvFlV+H40s0mhszc5t1x38EU0ZIFJHZ/h2sC3U='), 'ssctf'));