SMB共享+Wireshark:内网渗透中提取与修复被篡改的传输载荷

发布时间:2026/9/15 12:41:06
SMB共享+Wireshark:内网渗透中提取与修复被篡改的传输载荷 1. 场景设定与拆题思路1.1 这道题到底在考什么最近在复盘一个靶场题场景是内网的一台 Windows 服务器开了 SMB 共享共享目录里躺着一个 pcap 流量包。攻陷入口之后顺手把流量包拖回来用 Wireshark 一路追下去最后在某个 TCP 流里找到了攻击者篡改过的传输载荷需要把它提取出来并修复成原始可用的状态。先说结论这类题看着只是“连 SMB → 下包 → 打开 Wireshark → 找 flag/载荷”实际上链路非常长任何一个环节没做对都会卡壳。比如最常见的坑是 SMB 挂载成功后看不到东西或者 pcap 里过滤条件写错导致关键流被淹没再或者用 Wireshark 导出对象时选错了流。这些都是我在实战场上踩过的所以这篇文章不打算写一个标准答案式的 walkthrough而是把这个靶场题拆成“思路 实操 避坑”三个维度尽量把每一步的判断依据和操作细节都讲透。适合看这篇文章的人有三类一类是准备打 CTF 流量分析题的选手一类是做内网渗透时需要对流量做溯源的工程师还有一类是纯粹想把 Wireshark 用熟练的运维同学。前三章侧重基础操作和协议原理后面的提取与修复部分会更深入一些直接可以当作排查模板来用。1.2 靶场环境与前置准备先交代一下靶场的基本组成攻击机Kali Linux用于挂载 SMB 共享、远程操作目标机Windows Server 虚拟机开启了 SMB 1.0/2.0 共享共享目录里存放了流量包和少量干扰文件分析机Windows 或 Linux 都行装好 Wireshark 4.x流量包test.pcap大小一般在几 MB 到几十 MB 之间里面模拟了一次完整的攻击过程扫描、漏洞利用、传输 Payload、回连。因为题目本身是模拟内网环境靶场里已经预设了一个可以读取共享目录的账号。实际工作中你不会轻易拿到这种账号通常需要先通过钓鱼、弱口令爆破、漏洞利用等方式拿到一台内网主机的权限再横向移动到文件服务器上找东西。所以你在靶场里看到的“直接给账号密码”其实是对真实链路的一种简化重点是考察你在拿到访问权之后怎么处理流量证据。环境准备方面我建议提前在 Kali 里装好这几个工具apt install smbclient cifs-utils wireshark tshark -yWireshark 的图形界面在 Kali 里可能要以非 root 身份运行否则打开 pcap 时会提示无法加载接口这些细节后文会展开。1.3 解题路径的整体规划把整条链路拆开看大致是四步连接 SMB 共享定位 pcap 文件并下载到本地用 Wireshark 打开流量包通过统计功能和过滤表达式快速锁定可疑流量在可疑流量中定位攻击者实际发送的传输载荷通常是 HTTP POST 体、SMB 写入数据或 TCP 负载需要准确提取对提取出的载荷做完整性分析并修复还原出攻击者的最终意图。这几步每一环都有不少细节比如 SMB 协议不同版本对挂载参数的影响、pcap 中多会话并发时如何用过滤器缩小范围、导出载荷后又怎么判断它被改过。下面我会按这个顺序逐一展开把我实际的操作命令和判断过程都贴出来。2. 通过 SMB 共享获取流量包2.1 SMB 协议简述与靶场视角SMBServer Message Block 是 Windows 环境下最常用的文件共享协议Linux 下访问它主要通过 Samba 套件里的smbclient、mount.cifs、smbget等工具。靶场里为什么把流量包放在 SMB 共享里而不是直接用 FTP 或 HTTP 传给你这里面是有讲究的第一SMB 是内网横向移动中最容易遇到的协议攻下一台机器后批量扫描/24网段的 445 端口往往能找到大量开放共享的服务器。第二SMB 共享常常存放备份包、调试日志、临时目录这些文件里有安全分析师需要的关键证据。第三从攻防对抗的角度看攻击者拿到权限后往外传数据SMB 也是一个非常隐蔽的通道因为它跟正常办公流量混在一起不像 HTTP 那样容易被审计设备重点盯防。所以这类题本质上是在模拟“攻击者把战果放在受害者内网某处你需要再进一次把这个证据带出来”的场景。如果你只知道用smbclient列目录、下载文件但不知道该关注哪些共享名、哪个目录可疑仍然会浪费大量时间。2.2 Kali 下挂载 SMB 共享的完整流程拿到目标 IP 和凭证后我习惯先做两件事探测共享列表、尝试匿名访问。# 探测共享列表 smbclient -L //192.168.10.20 -U username%password # 尝试匿名访问 smbclient -L //192.168.10.20 -N有输出后逐一尝试进共享。靶场里通常会有名为share、files或backup的共享目录里面放着题目素材。进入共享后先列目录smbclient //192.168.10.20/share -U username%password smb: \ ls smb: \ cd capture smb: \ ls smb: \ get test.pcap smb: \ exit这种操作方式比较直接但如果文件很大或者目录层级很深效率不高。我更推荐直接在 Kali 里挂载整个共享然后像操作本地文件一样去翻mkdir /mnt/smb_share mount -t cifs //192.168.10.20/share /mnt/smb_share -o usernameusername,passwordpassword,vers2.0这里有几个关键参数要重点说明vers2.0指定 SMB 协议版本。靶场旧机器可能只支持 SMB 1.0你就需要改成vers1.0但注意很多 Linux 发行版出于安全考虑默认禁用了 SMB 1.0需要额外加vers1.0且目标机也要开对应功能如果登录账号是域用户需要加上域名参数domainyourdomain挂载报mount error(13): Permission denied时先检查是不是密码错误再检查共享名是否真实存在最后再考虑权限问题如果提示CIFS VFS: cifs_mount failed w/return code -13八成是 SMB 版本不匹配换个vers参数试就行。挂载成功后的操作就跟本地文件一样了直接用cp拷回来cp /mnt/smb_share/capture/test.pcap /root/analysis/顺带提一个经验不要只盯着.pcap后缀的文件干扰项里可能会放.pcapng、.cap、.gz压缩包甚至包含密码的 hint 文件。关键流量包往往藏在多层目录之下所以ls -laR递归查看很有必要。2.3 下载前的快速判断文件元信息与流量包大小在下载 pcap 之前有一个步骤很多人会忽略先看一下文件的大小和修改时间。一个正常的全流量抓包文件可能几百 MB而靶场里刻意设计的流量包通常只有几 MB 到几十 MB目的是让你能迅速定位。如果共享目录里有大量文件优先关注那些修改时间与“攻击时间窗口”吻合的文件这在溯源场景里非常有价值。拿到小文件后还可以先做一个快速判断用file命令确认文件类型防止它是伪装后缀的压缩包或恶意脚本。file test.pcap # 输出类似test.pcap: pcap capture file, microsecond ts (little-endian) - version 2.4如果是pcapng格式Wireshark 也能直接打开但某些旧脚本只支持 pcap 格式后续转换时需要注意。至于大小pcap 文件的结构决定了它是一个“按包存储”的容器如果你用纯文本工具打开会看到一堆乱码这是正常的不要误以为文件损坏。2.4 Windows 端的等效做法虽然 Kali 是常用攻击机但不少分析人员习惯在自己的 Windows 机器上完成流量分析这时候怎么拿 SMB 文件两种方式直接用资源管理器访问共享路径\\192.168.10.20\share\capture\输入账号密码后像操作本地目录一样把 pcap 拖到桌面。这种方式对单文件最省事但前提是当前 Windows 开启了对 SMB 客户端协议的兼容支持用命令行工具net use Z: \\192.168.10.20\share /user:username password映射为本地盘符后后续操作跟本地盘一样。现代 Windows 10/11 默认禁用了 SMB 1.0如果目标机只支持老协议你可能会遇到连接失败的情况。此时需要在“启用或关闭 Windows 功能”里勾选“SMB 1.0/CIFS 文件共享支持”但仅限靶场场景生产环境强烈不建议开这个功能SMB 1.0 的漏洞实在太老了。我把常见挂载方式整理成了速查表方式典型命令/操作适用场景smbclient 交互smbclient //IP/share -U user%pass快速列目录、下载单个文件mount.cifs 挂载mount -t cifs //IP/share /mnt -o username...,vers2.0需要批量浏览/递归操作Windows 资源管理器\\IP\share\图形化操作单文件省事Windows 命令行映射net use Z: \\IP\share /user:user pass习惯 Windows 工作流的人smbget 递归下载smbget -R smb://IP/share/ -U user%pass递归下载整个共享目录3. Wireshark 追查攻击者完整链路3.1 先摸清流量的整体轮廓拿到 pcap 之后别急着翻包先用 Wireshark 的统计功能快速建立全局视图。开幕雷击的做法是Statistics → Capture File Properties查看包总数、时间跨度、平均包速率。如果流量包有明确的时间戳结合题目给的攻击时间能快速判断窗口期Statistics → Protocol Hierarchy看协议分布。正常内网流量中占比最大的往往是 TCP、TLS、SMB、HTTP 等如果看到奇怪的协议出现在列表里比如非标准端口的未知协议、异常的 ICMP 大量包这就是重点排查方向Statistics → Conversations列出所有会话按字节数排序。攻击者传输载荷时涉及到的会话数据量通常异常偏大这种“尖峰”就是线索。在 Protocol Hierarchy 里如果发现SMB和SMB2协议有大量包不要直接跳过它可能不只是文件共享那么简单也可能是攻击者用 SMB 协议做了数据回传。同理HTTP 的 POST 请求、异常大的 HTTP 响应体都要重点标记。3.2 顺着 TCP Stream 还原攻击路径流量溯源的核心逻辑是“找流”而不是“找包”。一个完整的 TCP 连接里有 SYN、ACK、数据包、FIN如果只按协议过滤来查看往往会看到碎片化的信息。Wireshark 里最实用的功能就是右键任意一个包 →Follow → TCP Stream它能把整个连接的数据拼接成一个完整会话。我在实际分析时一般这么用先按时间排序找到最早出现异常行为的包。比如某个 IP 对目标机发起了大量扫描或者某一段时间 IP 段内出现密集的连接请求针对这些可疑连接逐个跟进 TCP Stream看看载荷内容到底是什么。如果是明文 HTTP直接在数据区就能看到请求方法和参数列表如果是加密流量则看握手包里的证书信息、SNI 域名等把每个可疑流的起点记录下来整理成时间线。很多时候一个攻击行为不是单条流而是一连串流扫描 → 利用 → 下载载荷 → 回连。在这个靶场里攻击者走的路径大致是先对内网某台机器做端口扫描接着通过一个漏洞拿到了初始权限然后从远程服务器下载了一段经过编码或改写的载荷最后写入到目标机器的某个目录里。这些行为在 pcap 里都会留下痕迹只是协议不一样扫描阶段是密集的 TCP SYN 包利用阶段可能是一个大 POST 包载荷传输阶段则表现为异常的大流量。3.3 我常用的一组筛选表达式Wireshark 的过滤器分两类捕获过滤器和显示过滤器。这里主要靠显示过滤器因为它不改变原始包数据只是筛选显示。下面这些表达式是我反复在用的# 只看 HTTP 请求 http.request # 只看 POST 方法 http.request.method POST # 只看 SMB2 写操作 smb2.cmd 6 # 按 IP 筛选 ip.addr 192.168.10.100 # 按端口筛选 tcp.port 445 # 混合筛选某 IP 发起的 HTTP 请求 ip.src 192.168.10.100 http.request # 查找含有特定字符串的 TCP 流 tcp contains flag # 查找含有可执行文件头的流 tcp contains MZtcp contains MZ这个非常实用。Windows 可执行文件的文件头是MZ当攻击者通过 HTTP、SMB 传输 exe 文件时TCP 流里必然会有这个特征。靶场里如果传输载荷是一个 PE 文件或者带MZ头的数据块用这个过滤器能瞬间定位。类似地如果传输的是压缩包可以搜PKZIP 文件头如果是图片隐写先搜 JPEG 的FF D8 FF。但要注意tcp contains只对 TCP 载荷有效如果载荷被编码了如 Base64这个办法就不灵了需要先解码再搜索。3.4 借助 tshark 快速定位可疑流图形界面的 Wireshark 适合交互分析但有些场景下手敲命令更快。tshark是 Wireshark 自带的命令行工具我经常用它做第一轮粗筛# 列出所有 HTTP 请求的方法、URI 和源目地址 tshark -r test.pcap -Y http.request -T fields -e frame.time -e ip.src -e ip.dst -e http.request.method -e http.request.uri # 列出所有 SMB2 写请求及其长度 tshark -r test.pcap -Y smb2.cmd 6 -T fields -e frame.time -e ip.src -e ip.dst -e smb2.write_length # 按会话统计流量 tshark -r test.pcap -q -z conv,tcp如果 pcap 文件很大上百 MB全量载入 Wireshark 会卡用 tshark 先做一轮过滤能把范围缩到很小然后再把过滤结果喂给 Wireshark 细看效率会高很多。这也是为什么我建议 Kali 里装 tshark 的原因。4. 提取被篡改的传输载荷4.1 找到载荷的存放位置在这个靶场里可疑的传输载荷藏在一个 HTTP POST 请求里数据体看起来是一段 Base64 编码的内容。怎么判断它“可疑”HTTP 请求的 URI 很怪比如/upload.php、/api/checkPOST 体却是一个超长的字符串载荷内容的编码特征明显比如连续大小写字母与数字混合末尾带填充会话的数据量与其他正常请求差异极大几百字节的请求在整体流量中特别扎眼。定位到具体包之后右键 → Follow → HTTP Stream就能看到完整的请求和响应。如果载荷是 Base64 编码的需要先解码再检查echo base64字符串 | base64 -d payload.bin file payload.bin如果 file 命令显示data而不是预期的 PE 文件那就说明载荷可能被二次处理过或者是提取时多粘或少粘了字符。此时需要对照 Wireshark 里的十六进制视图逐段复制确保编码串没有遗漏。4.2 完整导出与校验提取载荷时最容易犯的错是“只复制了数据面板里的 ASCII 内容忽略了两侧 Truncated 的内容”。当包载荷较大时Wireshark 默认只显示部分数据你需要在左下角调整长度或者直接导出原始字节。推荐的做法在 TCP Stream 窗口里把数据从client → server方向完整展开复制到文本编辑器里使用 Python 脚本去掉所有换行和多余字符再进行 Base64 解码解码后的数据用十六进制工具检查文件头是否符合预期如果载荷被设计为需要修复的坏文件需要用xxd、010 Editor、binwalk等工具分析结构。我用一个简单脚本完成 Base64 解码和头校验import base64 with open(payload_b64.txt, r) as f: data f.read().strip() decoded base64.b64decode(data) with open(payload.bin, wb) as f: f.write(decoded) print(decoded[:16].hex())如果输出开头是4d 5a 90 00那这是一个有效的 PE 文件头MZ如果是50 4b 03 04则是 ZIP 压缩包如果是7f 45 4c 46则是 ELF 文件。只有确认了文件类型才能进行下一步的修复工作。靶场里常见的处理方式是把 PE 文件的关键字节故意篡改比如把文件头改坏、把中间某段数据替换成无关内容或者修改校验值你需要手工修复后才能让它正确运行或解出最终明文。5. 修复载荷的实操过程5.1 修复思路与理论依据拿到一个被篡改的二进制文件后大多数人的第一反应是这能修吗会不会很难答案是大部分可以修但前提是你得先判断它被改了什么。靶场里常见的篡改方式有这么几类文件头损坏MZ 头被改成其他字符或者 PE 头里的某个关键字段被置零数据块被替换中间的某段字节被替换成相同长度的随机数据导致文件结构错乱校验字段失效比如 ZIP 文件的 CRC 值跟实际内容不匹配导致解压报错尾部追加数据在文件末尾追加了多余字节导致解析失败或程序无法启动。修复的逻辑也很简单先通过文件结构分析推断出原始值再手工 patch。比如 PE 文件头部结构非常固定MZ后两个字节通常是90 00这是 DOS 可执行文件头的魔数部分ZIP 文件每个条目都有固定的本地文件头签名50 4B 03 04PNG 图片则有固定的 8 字节签名89 50 4E 47 0D 0A 1A 0A。只要格式已知就能根据结构推导出哪些地方被动过。5.2 手动 patch 的几种工具修复字节的工具有很多我按使用场景分成三组1. 快速修改单个字节xxddd# 把 payload.bin 的第 0x3C 偏移处改成 0x80 printf \x80 | dd ofpayload.bin bs1 seek$((0x3C)) convnotrunc这种方案适合修改点很少且你明确知道偏移地址的情况。缺点是如果修改点很多命令会特别长容易出错。2. 交互式十六进制编辑器hexedit或wxHexEditorhexedit payload.bin我比较喜欢hexedit按CtrlS保存按CtrlX退出操作路径清晰还可以直接跳转到指定偏移。对于几十处修改的场景图形界面比命令行方便得多。3. 二进制模板分析010 Editor010 Editor 带了很多二进制模板PE、ZIP、PNG 等打开文件后能自动解析结构字段偏移一目了然。它不仅能定位损坏点还能直接修改并重新计算校验和非常适合复杂的文件修复。唯一的问题是需要授权但靶场练习用试用版也够。5.3 验证修复是否成功修复不是“改完就完事”必须验证三个层面文件头校验修复后的文件能被file命令正确识别类型结构校验用对应格式工具检查比如 PE 文件用upx -t或直接运行测试ZIP 文件用unzip -tPNG 文件用图片查看器打开最终明文/Flag 提取修复后的文件能完整运行或解压出最终结果。举一个我实际修复过的例子。当时 payload.bin 是一段 Base64 解码后的数据file命令识别为data用xxd看头部发现前两个字节是4d 7a而不是4d 5a第二字节从5a变成了7a。这个差异很小但直接导致文件无法解析。我通过上下文判断原始字节应为5a于是把偏移 0x01 处的值改为0x5A保存后再用file识别就正确显示为一个 PE32 可执行文件了。再比如有一次是一个 ZIP 包文件头正常但unzip -t报 CRC 错误。我用binwalk分析了压缩包结构发现中央目录里的 CRC 值和本地文件头里的 CRC 不一致明显是被人为修改过。这种情况有两种修法一是直接改回正确的 CRC 值需要用到zip工具重新打包二是跳过 CRC 检查强制解压用unzip -o -y或者 Python 的zipfile模块手动解压。靶场中如果只是为了拿最终的 flag后者往往更快。5.4 其他格式载荷的修复补充文件不一定是 PE 或 ZIP也可能是图片、脚本、数据库文件。针对性补充几个经验图片文件PNG 的签名和 IHDR 块之间有固定的文件头规范如果被篡改用pngcheck能直接提示具体到哪个块出错。JPG 的修复则需要确认FF D8开头和FF D9结尾是否完整图片中间如果有断裂可以用foremost或scalpel做文件雕刻。脚本文件如果载荷是一个被混淆的 Python 或 PowerShell 脚本篡改点通常发生在注释里或字符串中间。修复的方式是对比上下文还原人类可读的语义或者用语法检查工具逐步定位。数据库文件或日志文件这类文件的结构依赖头部魔数与页结构修复时一般用专门的工具比如 SQLite 文件用PRAGMA integrity_check来检测。总之修复工作没有统一的万能工具核心是对文件格式本身要有足够的了解同时善于用十六进制视图去对比正常文件的差异。6. 常见问题与排查技巧实录6.1 Wireshark 导入/打开 pcap 的异常问题 1打开 pcap 提示“The capture file appears to be damaged or corrupt”这种情况通常不是文件真的损坏而是文件格式与扩展名不一致。先用file确认真正的格式如果是 pcapng 却命名为 pcap直接用 Wireshark 打开是可以识别的但如果后缀全不对就需要用 editcap 转换editcap -F pcap input.pcapng output.pcap问题 2打开后只能显示少量包Wireshark 默认有一个显示过滤器有时候上一步操作的下钻条件没有清空导致新打开的包也要经过这个过滤器。看看顶部过滤器栏里是否有表达式把它清空即可。还有一种情况是时间显示格式问题表现为看起来包很少实际上只是时间跨度被压缩了调整时间显示格式即可。问题 3包内容全是乱码这是正常现象pcap 本身就是二进制格式你需要通过协议解析来看内容而不是把它当文本打开。如果刻意想用文本方式查看可以用tshark -T fields提取特定字段。6.2 SMB 挂载与访问的常见问题报错信息原因解决方案mount error(13): Permission denied凭证错误或 SMB 版本不匹配检查密码尝试vers1.0/2.0/3.0切换mount error(112): Host is down目标 445 端口不可达确认防火墙规则、服务状态NT_STATUS_ACCESS_DENIED账号对共享目录无权限换账号或检查共享 ACLNT_STATUS_LOGON_FAILURE用户名或密码错误核对凭证域用户需加域名NT_STATUS_CONNECTION_REFUSEDSMB 服务未启动在目标机启动 Server 服务这里要特别提醒一个问题很多用户在 Kali 里挂载 SMB 共享时默认没加vers参数而系统自带的cifs-utils在不同内核版本上的默认协议不一致可能导致连不上。靶场环境里老旧 Windows 虚拟机经常只支持 SMB 1.0这时必须明确指定vers1.0才能挂载成功。6.3 提取载荷时的坑与心得坑 1Base64 字符串里混入了换行符有的 pcap 中载荷在传输时被分片导致 Base64 字符串中插入\r\n或其他 HTTP 头字段。直接base64 -d会报错。解决方法是先用正则把非 Base64 字符过滤掉import re with open(raw.txt) as f: data f.read() clean re.sub(r[^A-Za-z0-9/], , data)坑 2导出的文件里多了 HTTP 头使用 Wireshark 的 Export Objects 功能时导出的文件有时候是 HTTP 响应的完整内容包含了状态行和头部信息。需要先判断导出结果的开头如果是HTTP/1.1 200 OK之类的文本要把头部的空行之前的内容全部去掉剩下的才是真正的载荷。坑 3修复时改了字节但文件还是跑不起来可能在修复文件头之后文件内部的相对偏移也需要同步调整。比如 PE 文件的 DOS 头里有一个指向 PE 头的偏移字段e_lfanew如果这里也被改了即使 MZ 头正常Windows 仍然无法解析。排查时不止看 MZ 和PE\0\0签名还要对照e_lfanew的值与实际偏移是否一致。6.4 我自己常用的排查流程做一个简单的流程总结方便边看边操作先file确认 pcap 格式与大小再打开 Wireshark用 Protocol Hierarchy 和 Conversations 建立全局印象标记可疑 IP用tcp contains或http.request快速定位载荷流右键 Follow TCP Stream完整复制载荷数据用脚本清洗并解码file验证产物类型对异常文件做十六进制分析定位篡改点手工 patch反复验证修复结果直到能运行或解出最终目标。这套流程不仅适用于这个 SMB pcap 的靶场题换到任何流量分析场景基本都通用。区别只是具体协议和文件格式不同主导思路完全一致。我个人在多次处理这类问题后的最大感受是分析流量这事耐心比技术本身更重要。大多数坑都不是协议难而是你漏看了某个包的字段或者选错了流的视角。一旦你建立了自己的分析流程照着流程一步一步走再复杂的 pcap 也能啃下来。