Wireshark 流量取证实战:从 Wfuzz 路径探测到 Git Object 还原

admin 发布于 8 天前 7 次阅读


一、实验声明

本文内容仅用于本地授权靶场环境下的网络流量取证学习。实验流量包来自本人 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.13380

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...blobLaravel 命令入口脚本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=falseCookie 会话加密配置未开启,需结合实际配置评估
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.137192.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

此作者没有提供个人介绍。
最后更新于 2026-04-27