一、实验声明
本文内容仅用于本地授权靶场环境下的网络流量取证学习。实验流量包来自本人 VMware Workstation 中的 Kali 虚拟机与本地靶机环境,分析目标为学习 Wireshark 流量分析方法,识别 Web 路径探测行为,验证 Git 仓库文件暴露风险,并进行取证还原。
本文不针对任何第三方真实系统,不包含未授权攻击行为,所有操作均在本人可控的安全实验环境中完成。
二、实验目标
本次实验的目标是通过 Wireshark 对一个 HTTP 流量包进行完整分析,完成以下内容:
1. 学习 Wireshark 基础使用方法
2. 使用“协议分级”判断流量整体类型
3. 使用“会话统计”定位通信双方
4. 使用过滤器分析 HTTP 请求
5. 判断是否存在目录扫描/路径探测行为
6. 识别扫描工具特征
7. 分析敏感路径命中情况
8. 导出 HTTP 对象
9. 还原 Git object
10. 恢复部分 Laravel 项目文件
11. 提取关键配置项并进行脱敏展示
12. 给出防护修复建议
三、工具入门:Wireshark 是什么?
Wireshark 是一款常用的网络协议分析工具,可以打开 .pcap、.pcapng 等抓包文件,并对网络通信进行逐层解析。
在安全分析、应急响应、网络取证中,Wireshark 经常用于:
1. 分析主机之间的通信关系
2. 判断是否存在扫描、爆破、下载、上传等行为
3. 还原 HTTP 请求与响应
4. 查看 DNS、TCP、HTTP、TLS 等协议细节
5. 导出 HTTP 对象
6. 追踪 TCP 流
7. 提取攻击证据
简单来说,Wireshark 就是网络世界里的“显微镜”。
它不能凭空告诉我们谁是攻击者,但它可以把通信过程完整展示出来,让我们从数据包里找证据。
四、Wireshark 分析三板斧
拿到一个流量包后,不建议一开始就乱点。比较稳的分析方法是:
第一板斧:看整体
第二板斧:找对象
第三板斧:追细节
4.1 第一板斧:看整体协议
菜单位置:
统计 → 协议分级
英文界面是:
Statistics → Protocol Hierarchy
这个功能可以快速判断流量包里主要是什么协议。
本次实验中,协议分级结果显示:
IPv4:10423 个包
TCP:10423 个包
HTTP:9244 个包
HTTP 占比约 88.7%
这说明该流量包的主体是 HTTP 明文 Web 流量。
HTTP 明文流量的好处是可以直接看到:
请求方法
请求路径
Host
User-Agent
Cookie
响应状态码
响应内容
文件下载对象
因此,本次实验可以继续深入分析 HTTP 请求和响应内容。
4.2 第二板斧:找通信对象
菜单位置:
统计 → 会话
英文界面是:
Statistics → Conversations
在 Conversations 中,重点查看:
IPv4
TCP
本次实验中,主要通信双方为:
| 角色 | IP | 端口 |
|---|---|---|
| 客户端 / 访问方 | 192.168.38.137 | 随机高端口 |
| Web 服务端 | 192.168.38.133 | 80 |
TCP 会话数量为 60 条,说明两台主机之间在短时间内建立了大量 HTTP 连接。
这通常可能是:
网页资源加载
目录扫描
路径探测
爬虫访问
批量请求
结合后续 HTTP 请求内容,本实验最终判断为 字典式路径探测行为。
4.3 第三板斧:过滤与追踪流
Wireshark 最核心的能力之一就是显示过滤器。
常用过滤器如下:
http.request
用于查看所有 HTTP 请求。
http.response
用于查看所有 HTTP 响应。
http.response.code == 200
用于查看返回成功的 HTTP 响应。
http.request.uri contains ".git"
用于查看访问 Git 仓库路径的请求。
http.user_agent contains "Wfuzz"
用于查找 Wfuzz 工具产生的请求。
如果想还原一次完整通信,可以右键数据包:
追踪流 → TCP 流
英文界面是:
Follow → TCP Stream
追踪 TCP 流后,可以看到完整的 HTTP 请求和响应内容。
五、HTTP 请求分析
5.1 查看所有 HTTP 请求
使用过滤器:
http.request
可以看到大量 GET 请求,例如:
/.bashrc
/.cvsignore
/.listings
/_admin
/_dummy
/_db_backups
/_database
/_config
/_cache
/.git/index
/.git/objects/...
/robots.txt
这些路径不是正常用户浏览网页时会连续访问的路径,而是典型的字典路径。
其中包括:
| 类型 | 示例 |
|---|---|
| 隐藏文件探测 | /.bashrc、/.cvsignore |
| 后台目录探测 | /_admin |
| 数据库备份探测 | /_db_backups、/_database |
| 配置文件探测 | /_config、/config |
| Git 仓库探测 | /.git/index、/.git/objects/* |
| 常见公开文件 | /robots.txt |
因此可以初步判断,该流量存在 Web 目录扫描或路径探测行为。
六、扫描工具识别
通过追踪 TCP 流,可以看到大量请求头中包含:
User-Agent: Wfuzz/3.1.0
这说明访问方使用了 Wfuzz 3.1.0 工具进行路径探测。相关追踪流中可见多个请求均带有 User-Agent: Wfuzz/3.1.0,并且连续请求大量字典路径,大多数返回 404 Not Found。
Wfuzz 是常见的 Web Fuzzing 工具,常用于:
目录探测
文件路径探测
参数 fuzz
接口枚举
隐藏资源发现
本次实验中,Wfuzz 请求了大量路径,例如:
/printable
/productquestion
/processform
/privs
/public
/router
/robots.txt
/signin
/sql
/sitemap.xml
其中大多数路径返回:
HTTP/1.1 404 Not Found
Server: nginx/1.15.11
这说明多数路径不存在,但扫描行为本身非常明确。
七、目标站点指纹识别
在追踪首页 / 的 HTTP 流时,可以看到客户端访问:
GET / HTTP/1.1
Host: 192.168.38.133
服务器返回:
HTTP/1.1 200 OK
Server: nginx/1.15.11
X-Powered-By: PHP/8.2.9
页面内容显示:
<title>Laravel</title>
页面底部还暴露:
Laravel v11.45.1 (PHP v8.2.9)
由此可以判断目标站点为:
| 项目 | 结果 |
|---|---|
| Web 服务 | nginx/1.15.11 |
| 后端语言 | PHP/8.2.9 |
| Web 框架 | Laravel v11.45.1 |
| 首页状态 | 200 OK |
| 页面类型 | Laravel 默认欢迎页 |
这些信息说明目标站点暴露了较明显的技术栈指纹。
八、响应状态码分析
为了判断扫描是否命中真实资源,使用过滤器:
http.response.code == 200
结果显示,大量路径返回 404,但有少量请求返回 200。
其中 /robots.txt 返回:
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 24User-agent: *
Disallow:
这说明 /robots.txt 文件存在,但其中没有暴露禁止访问的敏感目录。
随后继续筛选敏感路径:
http.request.uri contains ".env" || http.request.uri contains ".git" || http.request.uri contains "config" || http.request.uri contains "backup"
发现多数配置、备份相关路径返回 404,但 Git 相关路径返回了 200。
关键路径包括:
/.git/index
/.git/objects/0d/...
/.git/objects/8e/...
/.git/objects/e3/...
这说明目标 Web 目录中存在 Git 仓库文件暴露问题。
九、Git Object 访问确认
其中一个关键请求如下:
GET /.git/objects/0d/c396a5ac5abcc71dd7145a5fd9b3b846434f86 HTTP/1.1
Host: 192.168.38.133
服务器返回:
HTTP/1.1 200 OK
Content-Type: application/octet-stream
Content-Length: 647
响应正文为二进制压缩内容。这是 Git object 的典型特征。
Git 的 loose object 通常是 zlib 压缩后的二进制文件,因此在 Wireshark 中看到类似乱码的内容是正常现象。
这一步说明:
Git object 文件真实存在
Git object 文件可以通过 HTTP 获取
目标存在项目文件被还原的风险
十、导出 HTTP 对象
10.1 Wireshark 图形界面导出
菜单位置:
文件 → 导出对象 → HTTP
英文界面是:
File → Export Objects → HTTP
可以将 HTTP 响应中的对象导出到本地。
10.2 使用 tshark 命令导出
在 Kali 中使用:
mkdir -p exported_httptshark -r traffic.pcapng --export-objects http,exported_http
导出后查看文件:
find exported_http -type f | sort
因为 HTTP 对象很多,所以需要筛选疑似 Git object:
find exported_http -type f -exec file {} \; | grep -i "zlib"
本次实验中发现 3 个 zlib 压缩对象:
exported_http/04b42240fb2ac3c7dc55039927d6f806448ce6: zlib compressed data
exported_http/c396a5ac5abcc71dd7145a5fd9b3b846434f86: zlib compressed data
exported_http/2a8628b7a7e218538502ff66630a099b7a62ae: zlib compressed data
十一、Git Object 还原
Git object 的路径规则是:
完整 hash 前两位作为目录名
剩余 38 位作为文件名
例如:
0dc396a5ac5abcc71dd7145a5fd9b3b846434f86
对应路径为:
.git/objects/0d/c396a5ac5abcc71dd7145a5fd9b3b846434f86
11.1 初始化还原目录
cd ~/git-restore-labrm -rf recovered-sitemkdir recovered-site
cd recovered-sitegit init
11.2 创建对象目录并复制文件
mkdir -p .git/objects/8e
mkdir -p .git/objects/0d
mkdir -p .git/objects/e3
cp ../exported_http/04b42240fb2ac3c7dc55039927d6f806448ce6 \
.git/objects/8e/04b42240fb2ac3c7dc55039927d6f806448ce6cp ../exported_http/c396a5ac5abcc71dd7145a5fd9b3b846434f86 \
.git/objects/0d/c396a5ac5abcc71dd7145a5fd9b3b846434f86cp ../exported_http/2a8628b7a7e218538502ff66630a099b7a62ae \
.git/objects/e3/2a8628b7a7e218538502ff66630a099b7a62ae
十二、验证 Git Object 类型
执行:
git cat-file -t 8e04b42240fb2ac3c7dc55039927d6f806448ce6
git cat-file -t 0dc396a5ac5abcc71dd7145a5fd9b3b846434f86
git cat-file -t e32a8628b7a7e218538502ff66630a099b7a62ae
输出结果均为:
blob
blob
blob
说明这 3 个 Git object 都是文件内容对象。
继续查看内容:
git cat-file -p 8e04b42240fb2ac3c7dc55039927d6f806448ce6
git cat-file -p 0dc396a5ac5abcc71dd7145a5fd9b3b846434f86
git cat-file -p e32a8628b7a7e218538502ff66630a099b7a62ae
最终还原出 3 个文件内容:
| Hash | 类型 | 还原内容 | 建议文件名 |
|---|---|---|---|
8e04b422... | blob | Laravel 命令入口脚本 | artisan |
0dc396a5... | blob | 环境配置文件 | .env |
e32a8628... | blob | 前端依赖配置 | package.json |
十三、保存还原文件
将 Git object 内容保存为文件:
git cat-file -p 8e04b42240fb2ac3c7dc55039927d6f806448ce6 > artisangit cat-file -p 0dc396a5ac5abcc71dd7145a5fd9b3b846434f86 > .envgit cat-file -p e32a8628b7a7e218538502ff66630a099b7a62ae > package.json
查看文件:
ls -la
结果:
artisan
.env
.git
package.json
识别文件类型:
file artisan .env package.json
输出:
artisan: a php script, ASCII text executable
.env: ASCII text
package.json: JSON text data
说明文件恢复成功。
十四、关键配置项提取与脱敏
为了避免在报告中展示具体敏感值,可以只提取配置项名称:
grep -E '^[A-Z0-9_]+=' .env | cut -d= -f1
也可以提取关键配置并脱敏保存:
grep -E '^(APP_KEY|APP_DEBUG|APP_ENV|DB_|REDIS_|MAIL_|AWS_|SESSION_|CACHE_|QUEUE_)' .env | \
awk -F= '
{
key=$1;
val=$2;
if (val == "" || val == "null") {
print key"="val;
} else if (key ~ /KEY|PASSWORD|SECRET|TOKEN/) {
print key"=***REDACTED***";
} else {
print key"="val;
}
}' > extracted_secrets_redacted.txtcat extracted_secrets_redacted.txt
脱敏后的结果包括:
APP_ENV=local
APP_KEY=***REDACTED***
APP_DEBUG=true
DB_CONNECTION=sqlite
SESSION_DRIVER=cookie
SESSION_LIFETIME=120
SESSION_ENCRYPT=false
QUEUE_CONNECTION=database
CACHE_STORE=database
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=log
MAIL_HOST=127.0.0.1
MAIL_PORT=2525
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
14.1 风险点分析
| 配置项 | 风险说明 |
|---|---|
APP_KEY | 应用运行密钥存在实际值,暴露后需要立即轮换 |
APP_DEBUG=true | 调试模式开启,可能暴露异常栈、路径、配置等信息 |
APP_ENV=local | 生产环境不应使用本地环境配置 |
DB_CONNECTION=sqlite | 暴露数据库类型 |
SESSION_DRIVER=cookie | 暴露会话存储方式 |
SESSION_ENCRYPT=false | Cookie 会话加密配置未开启,需结合实际配置评估 |
REDIS_HOST=127.0.0.1 | 暴露内部组件配置 |
AWS_ACCESS_KEY_ID= | 字段存在但为空,暂未发现云访问凭据 |
AWS_SECRET_ACCESS_KEY= | 字段存在但为空,暂未发现云密钥 |
十五、完整证据链总结
本次实验形成的证据链如下:
1. 使用 Wireshark 打开 traffic.pcapng
2. 协议分级确认主要为 HTTP 明文流量
3. 会话统计确认 192.168.38.137 访问 192.168.38.133:80
4. HTTP 请求分析发现大量字典路径访问
5. TCP 流中发现 User-Agent: Wfuzz/3.1.0
6. 判断存在字典式路径探测行为
7. 首页响应显示目标为 Laravel 应用
8. 响应头暴露 nginx 与 PHP 版本信息
9. /robots.txt 返回 200 OK,但未暴露敏感目录
10. /.git/index 与 /.git/objects/* 返回 200 OK
11. 导出 HTTP 对象
12. 识别出 3 个 zlib Git object
13. 按 Git object 目录结构重建对象文件
14. 使用 git cat-file 成功解析 3 个 blob
15. 还原出 artisan、.env、package.json
16. 对环境配置文件进行关键配置项提取
17. 生成脱敏证据文件 extracted_secrets_redacted.txt
18. 最终判断为 Git 仓库文件暴露导致项目文件和关键配置项泄露
十六、最终结论
通过 Wireshark 对流量包进行分析,确认 192.168.38.137 对 192.168.38.133:80 发起了大量 HTTP 请求。
请求中存在 User-Agent: Wfuzz/3.1.0,说明访问方使用 Wfuzz 工具进行字典式路径探测。扫描过程中,大量路径返回 404,但 Git 仓库相关路径返回 200 OK。
随后通过导出 HTTP 对象并还原 Git object,成功恢复出 Laravel 项目的部分文件,包括:
artisan
.env
package.json
其中环境配置文件包含应用运行密钥、调试开关、数据库连接类型、会话配置、缓存配置、Redis 配置、邮件配置和云服务配置字段。报告展示时已对密钥类字段进行脱敏处理。
因此,本次事件可以定性为:
Web 目录中存在 Git 仓库文件暴露问题,导致项目文件和关键配置项可被还原,风险等级为高危。
十七、修复建议
17.1 Nginx 禁止访问 .git
# 禁止访问 Git 仓库目录,防止项目文件暴露
location ~ /\.git {
deny all; # 拒绝所有访问 .git 的请求
return 403; # 返回 403 Forbidden
}
17.2 禁止访问隐藏文件
# 禁止访问常见隐藏文件,例如 .env、.svn、.htaccess
location ~ /\.(?!well-known) {
deny all; # 拒绝访问隐藏文件或隐藏目录
return 403; # 返回 403 Forbidden
}
17.3 Laravel 部署建议
1. Web 根目录必须指向 Laravel 项目的 public 目录
2. 线上环境不要保留 .git 目录
3. 关闭 APP_DEBUG
4. APP_ENV 设置为 production
5. 轮换已暴露的应用运行密钥
6. 检查数据库、Redis、邮件、云服务等凭据是否需要轮换
7. 检查 Web 访问日志中是否存在 /.git/objects/* 请求
8. 对报告和截图中的关键配置值进行脱敏处理
十八、常用 Wireshark 过滤器汇总
http.request
查看所有 HTTP 请求。
http.response
查看所有 HTTP 响应。
http.response.code == 200
查看成功响应。
http.response.code == 404
查看不存在路径。
http.user_agent contains "Wfuzz"
查看 Wfuzz 请求。
http.request.uri contains ".git"
查看 Git 仓库路径访问。
http.request.uri contains ".env"
查看环境配置文件探测。
http.request.uri contains "config" || http.request.uri contains "backup"
查看配置和备份路径探测。
ip.addr == 192.168.38.137
查看某个主机的所有流量。
tcp.stream == 59
查看指定 TCP 流。
十九、常用命令汇总
导出 HTTP 对象
mkdir -p exported_httptshark -r traffic.pcapng --export-objects http,exported_http
查找 zlib Git object
find exported_http -type f -exec file {} \; | grep -i "zlib"
初始化还原目录
mkdir recovered-site
cd recovered-site
git init
复制 Git object
mkdir -p .git/objects/0dcp ../exported_http/c396a5ac5abcc71dd7145a5fd9b3b846434f86 \
.git/objects/0d/c396a5ac5abcc71dd7145a5fd9b3b846434f86
查看 Git object 类型
git cat-file -t 0dc396a5ac5abcc71dd7145a5fd9b3b846434f86
查看 Git object 内容
git cat-file -p 0dc396a5ac5abcc71dd7145a5fd9b3b846434f86
保存还原文件
git cat-file -p 8e04b42240fb2ac3c7dc55039927d6f806448ce6 > artisan
git cat-file -p 0dc396a5ac5abcc71dd7145a5fd9b3b846434f86 > .env
git cat-file -p e32a8628b7a7e218538502ff66630a099b7a62ae > package.json
提取配置项名称
grep -E '^[A-Z0-9_]+=' .env | cut -d= -f1
生成脱敏证据
grep -E '^(APP_KEY|APP_DEBUG|APP_ENV|DB_|REDIS_|MAIL_|AWS_|SESSION_|CACHE_|QUEUE_)' .env | \
awk -F= '
{
key=$1;
val=$2;
if (val == "" || val == "null") {
print key"="val;
} else if (key ~ /KEY|PASSWORD|SECRET|TOKEN/) {
print key"=***REDACTED***";
} else {
print key"="val;
}
}' > extracted_secrets_redacted.txt
Comments NOTHING