从SMB共享到恶意载荷:Wireshark流量溯源与提取修复全解析
2026/9/15 12:19:39 网站建设 项目流程

先交代一个背景:我经常在自建的靶场环境里做“找出证据”类的推演,这次模拟的场景是一家企业内网里有一台文件服务器,SMB共享权限配得稀烂,匿名或者弱口令就能连。进共享以后我发现一个有意思的东西——一份pcap流量包,就静悄悄躺在logs共享目录里。这个场景在真实应急响应里太常见了:攻击者横向移动之后,流量被某个蜜罐或者被动抓包设备记录下来,等蓝队去捞。

这篇文章就把我这次完整的操作链路拆开讲:怎么通过SMB共享把流量包弄到手、用Wireshark从pcap里把攻击者的整个动作还原出来、最后再把流量里传输的恶意载荷提取并修复到可分析状态。整条链路覆盖了内网枚举、流量分析和样本提取三块,适合正在学应急响应、打CTF或者想搞明白Wireshark到底怎么用的朋友,照着做基本能复现。

1. 场景复盘:SMB共享里的这份pcap,要回答的三个问题

1.1 靶场环境和攻击链假设

先说清楚靶场里发生了什么。我搭的环境是这样一个拓扑:一台Windows Server扮演文件服务器,IP是10.10.10.5,开放了135、139、445端口,开了好几个共享目录;一台攻击者机器10.10.10.66,这台机器在模拟一个已经打进内网的攻击者;另外还有一台普通客户端10.10.10.88作为环境里的正常机器,方便做流量对照。

文件服务器的logs共享目录里放了capture.pcap这个文件,约18MB。从命名和时间戳看,像是某台被抓包的机器把一段时间内的流量记录下来了。蓝队拿到场景后的任务是:搞清楚这份pcap里到底藏着谁、干了什么、留下什么。这也是整篇文章的主线——一切操作都围绕这份抓包文件展开。

如果你之前没接触过这种“共享目录藏东西”的套路,我解释一下为什么靶场会这么设计。真实内网里,SMB共享经常是信息集中地:备份、日志、临时文件、脚本都存在一起。攻击者一旦拿到一个共享的写权限,很乐意把工具、脚本、抓包结果往里面塞。反过来,防守方或者蜜罐系统也会把抓到的流量放到某个共享目录,等分析员去取。所以“通过SMB共享拿pcap”并不是一个凭空捏造的路径,它同时练了SMB枚举能力和流量分析能力两条线。

1.2 本场景下我们要保住的三条核心线索

拿到题目之后,我习惯先在心里列一个“问题清单”,后面所有分析动作都围绕这些问题展开:

  • 这份pcap是谁抓的、抓了多长时间的流量?
  • 流量里有没有攻击者的真实行为,攻击者是从哪个IP发起连接的?
  • 攻击者在流量里传了什么东西,能不能把传输的恶意载荷还原出来?

这三个问题分别对应标题里的三个动作:通过SMB共享获取pcap流量包、Wireshark溯源攻击者、提取修复传输载荷。在做任何操作之前先把目标明确下来,能避免打开Wireshark以后被几万个包淹没,这是一个很重要的分析习惯。

1.3 分析环境的准备

工欲善其事,必先利其器。我用的分析机是Kali虚拟机,主要工具包括:

工具用途为什么选它
smbclient / smbmap枚举SMB共享、连接共享目录轻量、Kali自带,不需要额外安装
mount.cifs把SMB共享挂载到本地后面要用filesha256sum检查文件,挂载后最方便
Wireshark打开pcap做深度协议分析图形化、过滤器灵活、导出对象功能强大
tshark命令行提取流量字段很多自动化提取操作比鼠标点来点去更快
xxd / python3查看和修复十六进制字节提取载荷出来以后,剩下的事基本都是二进制层面的事

环境准备就绪以后,进入第一阶段:把pcap从SMB共享里弄出来。

2. 取包阶段:从SMB共享拖出pcap的正确姿势

2.1 先枚举共享,别急着连

很多新手拿到一个SMB服务就急着用smbclient //10.10.10.5/share去连,结果密码不对或者共享名不对,白白浪费时间。正确做法是先枚举共享列表,搞清楚目标机器到底开放了哪些目录。

我的第一步是匿名枚举:

smbclient -L //10.10.10.5 -N

-N表示不输入密码,直接以匿名身份尝试。如果对方开了guest或者空会话,这一步就能看到共享列表。结果里出现了ADMIN$C$这类系统管理共享,还有一个logs共享,这个明显是人工创建的。接着用smbmap再确认一下共享的权限:

smbmap -H 10.10.10.5 -u "" -p ""

看到logs共享是READ ONLY,说明匿名或guest至少能读文件。这已经足够把pcap拖下来了。我先记下这个共享名,然后尝试连接。

2.2 挂载共享到本地,检查文件的完整性

连接SMB共享有几种方式,我这次选择挂载到本地,因为接下来要检查文件类型、计算哈希、拷贝下载,挂载以后这些操作都能用标准Linux命令来做:

mount -t cifs //10.10.10.5/logs /mnt/smb_logs -o username=guest

如果这条命令因为SMB协议版本不匹配报错,可以追加-o vers=2.0或者vers=3.0,视对端Windows版本而定。挂载成功后,在/mnt/smb_logs下看到capture.pcap,还有一个readme.txt。先看一眼明文文件,再对pcap做完整性确认:

cat /mnt/smb_logs/readme.txt file /mnt/smb_logs/capture.pcap sha256sum /mnt/smb_logs/capture.pcap

file命令告诉我是pcap capture file,字节序标记是d4 c3 b2 a1,也就是little-endian的标准pcap格式,libpcap版本2.4。sha256sum算出哈希值后记录下来,后面分析完可以对比,确保复制过程中文件没有损坏。

2.3 把文件拉回本地,注意两个容易出问题的地方

确认无误后把pcap复制到本地分析目录:

mkdir ~/analysis cp /mnt/smb_logs/capture.pcap ~/analysis/ umount /mnt/smb_logs

这里有两个实际经验。第一个经验是:大文件通过SMB复制过程中,尽量用cp而不是直接挂载后双击打开。有人喜欢直接在挂载目录里用Wireshark打开远程文件,一旦网络抖动,Wireshark会读取到不完整的文件,分析时会出现“文件截断”或者大量错误解析包。先拉到本地再分析,出问题也好排查。

第二个经验是:拿到文件后立刻做哈希。如果不做哈希,等分析到一半才发现文件损坏,前面的时间全白费了。尤其靶场里文件大、链路不稳定,哈希比对就是给自己买个保险。

3. Wireshark开局三板斧:先看统计,再做过滤,后建时间线

3.1 用统计菜单建立全局视图

现在打开Wireshark,加载capture.pcap。很多人一上来就盯着包列表滚动,几万包看得头晕眼花。我自己的固定动作是先看三个统计视图:

  • Statistics -> Protocol Hierarchy,看协议分层。
  • Statistics -> Conversations,看节点之间的会话。
  • Statistics -> Endpoints,看所有出现的IP地址。

Protocol Hierarchy里,我注意到SMB2的占比不小,HTTP的请求也有,DNS流量也不少。这说明流量里既有Windows文件共享的通信,也有正常的Web浏览协议,比较符合一个普通内网环境。Conversations里按照字节数排了一下,最大的一对会话是10.10.10.66 -> 10.10.10.5,端口是49175 -> 445,传输了大约4.6MB的数据。另一个比较显眼的会话是10.10.10.66 -> 192.168.88.130的HTTP流量,来回请求了好几次。

仅仅是这样还不够,还需要把这三个统计结果放在一起横向对比。Endpoints10.10.10.66这个地址在IPv4列表里出现得非常频繁,我基本可以确定它是整个pcap里的“主角”。接下来的分析思路就很清楚了:以10.10.10.66为线索,逐条梳理它和其他节点之间发生了什么事。

3.2 用显示过滤器圈定攻击流量

Wireshark里最常用的功能就是显示过滤器。针对这个场景,我建议按以下顺序依次过滤,每步都能排除掉一批无关流量:

ip.addr == 10.10.10.66 smb2 http.request smb2.cmd == 5 smb2.cmd == 9

先看smb2过滤器,能快速了解攻击者访问过哪些共享和文件。smb2.cmd == 5是SMB2 CREATE请求,表示打开或创建文件;smb2.cmd == 9是SMB2 WRITE请求,表示写入文件。这两个过滤器可以回答“攻击者动过哪些文件”的问题。

实际过滤后,我看到10.10.10.66在这段时间里通过SMB创建、读取了好几个文件,既有readme.txt,也有capture.pcap,还有一个路径比较可疑的tools/scan.exe。这个scan.exe就是后面要重点关注的载荷。

HTTP方面,http.request过滤器显示10.10.10.66曾经向192.168.88.130发送过几次POST请求,路径是/upload。这里面极有可能藏着文件上传行为,顺手把响应包里的状态码也看了一眼,是200 OK。这意味着攻击者确实往那个Web服务上传过东西,而且成功了。

3.3 从时间的角度建立分析时间线

只看某个IP还不够,流量分析一定要有时间观念。Wireshark默认时间显示是从抓包开始后的相对秒数,我建议改成View -> Time Display Format -> UTC Date and Time of Day,这样能对应真实时间。

我用frame.time配合筛选,把整个抓包窗口切成三段:第一段是攻击者与SMB文件服务器交互,时间集中在12:13到12:16;第二段是HTTP上传行为,发生在12:18;第三段是后续的SMB读取,发生在12:21到12:23。这三段时间放在一起,一个粗略的行为链条已经出来了:先访问共享,再向某个Web服务上传文件,最后又回来读取结果。

有了这个时间线,后续的溯源分析就不用大海捞针。分析流量包和过日子一样,时间顺序永远是最好的导航。

4. 溯源分析:谁在什么时间通过什么手段访问了共享

4.1 从SMB会话中抠出用户名和主机名

溯源的第一步,是搞清楚流量里的身份信息,而不仅是IP地址。SMB协议本身就是个“话痨”,它会很主动地汇报自己的用户名、域名、操作系统版本。

我构造了这样一个过滤器,专门看SMB2的认证过程:

smb2.cmd == 1

SMB2命令1SESSION_SETUP,里面携带了安全令牌。跟踪这个包的详情,在Session Setup Request下找到Security Blob -> GSS-API -> NTLMSSP -> NTLMSSP_AUTHENTICATION,能看到:

  • User name:admin
  • Domain:LAB
  • Host name:ATTACKER-PC

到这里,“攻击者是谁”就有了第一层答案:一个叫admin的域用户,主机名ATTACKER-PC。这个信息在真实应急响应里非常关键,因为IP地址可以伪造、可以换,但是主机名和用户名往往是攻击者忘记改或者懒得改的痕迹。

4.2 顺着SMB2命令还原文件访问行为

身份信息拿到后,继续往深挖。我要还原攻击者到底碰了哪些文件,于是用SMB2的CREATE、READ、WRITE命令组合过滤:

smb2.cmd == 5 || smb2.cmd == 8 || smb2.cmd == 9

过滤结果按时间排序后,能看到这样一个序列:

  1. CREATE请求访问readme.txt
  2. READ请求读取了这个文件
  3. CREATE请求打开capture.pcap
  4. READ请求分段读取了capture.pcap
  5. CREATE请求打开tools/scan.exe
  6. WRITE请求向tools/scan.exe写入数据

这个行为链很有意思。攻击者先是读取了readme.txt,然后读取了capture.pcap,最后把一个scan.exe写入到tools目录。这说明攻击者不仅看了日志,还在共享里放了工具,典型的“先踩点、后投放工具”的操作。

如果要更直观地看某个文件传输的全部内容,可以对对应的TCP流做Follow -> TCP Stream。右键选中某个SMB2 WRITE请求所在的包,选择跟踪TCP流,Wireshark会把整个流的内容以可读的方式展示出来。这里要注意,SMB协议本身有头部和元数据,流里会混入很多不可读的二进制内容,不要指望直接看到文件明文,但至少能看到文件路径的结构。

4.3 分辨加密流量与明文流量中的线索

这个pcap里还有一部分HTTP流量。HTTP是明文协议,溯源价值极高。我在HTTP请求里看到了攻击者机器上传文件的POST请求,请求头部带的User-Agent是Mozilla/5.0 (Windows NT 10.0; Win64; x64) curl/7.79.1

这就暴露了一个非常经典的矛盾点:User-Agent前半段伪装成浏览器,后半段却是curl版本号。说明攻击者是用curl命令行工具发的HTTP请求,只不过简单地改了一下UA字符串。这种“伪浏览器”特征在当前攻防演练里很常见,识别它不需要什么高端技巧,多瞟一眼UA就够了。

同时我也注意了一下是否有TLS流量。如果这里用的是192.168.88.130:443,那我只能看到TLS握手和SNI,看不到明文载荷。这个pcap里TLS流量很少,主要HTTP都走80端口,对于分析来说是运气好,但实战里遇到全加密流量时,就要考虑配置tls.handshake.extensions_server_name过滤器,先看SNI确定访问了哪个域名,再决定要不要做密钥提取。

4.4 汇总结论:攻击者的行动链

把上面所有线索串起来,我对这次攻击的溯源结论是:攻击者来自10.10.10.66,以admin用户身份通过SMB访问了10.10.10.5logs共享,阅读了说明文件和抓包文件,随后向共享目录写入了一个名为scan.exe的工具。接下来,还通过HTTP把数据POST到了192.168.88.130/upload。攻击者的整体画像已经比较清晰了。

到这里,“Wireshark溯源攻击者”这件事算是完成了大半。但流量分析不能只停留在“看”,更关键的是把传输的载荷弄出来——也就是scan.exe

5. 载荷提取:把藏在流量里的恶意文件完整抠出来

5.1 第一选择:Wireshark的Export Objects

针对SMB传输的文件,Wireshark提供了一个非常直接的功能:File -> Export Objects -> SMB。这是我在提取载荷时的第一个选择,因为它能在图形界面里列出所有通过SMB协议传输的命名对象,按文件名、大小、MD5排序。

打开以后能看到几个条目,其中一个就是tools/scan.exe,大小约321KB。选中它,点击Save,Wireshark会根据SMB协议解析出的元数据把文件还原成磁盘上的scan.exe

注意,Export Objects是从协议解析结果中提取的,如果pcap里对应文件所在的TCP流有丢包,或者Wireshark的SMB解析器没有正确处理分片,提取出来的文件可能不完整。所以无论用哪种方式提取,都要做一次完整性验证。我提取完立刻在终端里执行:

file scan.exe sha256sum scan.exe

file命令返回PE32 executable (GUI) Intel 80386, for MS Windows,确认这是一个32位的Windows图形界面程序。说明提取成功了。

5.2 当Export Objects失效时的手工提取方法

不要总是依赖图形界面。实战中有很多情况会导致Export Objects不好使,比如协议解析器没识别出对象、或者文件根本没有走SMB的正常命名流程。这时候就需要tshark手动把TCP流里的应用层数据导出来。

假设我跟踪到tools/scan.exe所在的TCP流编号是18,我可以这样操作:

tshark -r capture.pcap -Y "tcp.stream eq 18" -T fields -e data | tr -d '\n' > stream18.hex xxd -r -p stream18.hex > stream18.bin

第一条命令把TCP流18里的所有payload数据提取出来,输出为十六进制文本;第二条命令把十六进制文本还原成二进制文件。这种方法的本质是把一个TCP流里的所有数据按顺序拼接,不关心上层是SMB还是HTTP,相当于“暴力”提取。

手工提取最大的问题,是提取结果里会保留大量协议元数据。SMB2的WRITE请求里,数据字段往往嵌在SMB头部之后的Write Channel部分,直接-T fields -e data拿到的是整个TCP载荷,里面既有SMB头又有文件内容。所以手工提取以后需要再多一步:识别出文件数据在流里的偏移位置,然后裁剪。

这里分享一个比较实用的定位技巧:用frame contains "MZ"过滤器搜索包,MZ是PE文件固定的开头。定位到之后,Follow TCP Stream,在Follow窗口里选择Show data as -> Raw,另存为原始二进制文件。保存下来的文件头部可能会有SMB协议残留,但MZ标记通常能直接帮我们找到起点。保存后,再用十六进制编辑器去头就行。

5.3 提取对象时的“伪成功”陷阱

提取这个环节最让人头疼的不是没文件,而是文件提取出来看起来存在,但实际是坏的。常见原因有三个:

第一,TCP流有重传和乱序,直接拼接导致数据错位。这种情况可以回到Wireshark里确认有没有大量的[TCP Retransmission]标记。

第二,文件在传输时被base64编码过。比如攻击者为了规避检测,把二进制内容先base64后再POST到HTTP接口,pcap里看到的全是ASCII字符。这种需要先把提取出来的字符串做base64解码,才能还原真正的二进制样本。

第三,SMB协议的分片机制。SMB2 WRITE请求会把文件内容切片传输,每个包只携带一部分内容。Wireshark在正常解析时会自动重组,但如果你手工提取,就必须按包的顺序把所有切片拼起来。有一个小技巧:在Follow TCP Stream时,看数据右侧的内容,如果内容明显是连续的文件字节,那基本不用处理;如果中间夹杂大量协议头,就要小心了。

6. 载荷修复:让残缺样本重新变成可分析的目标

6.1 判断坏在哪:magic number 和文件结构体检

我把提取出来的scan.exe放到Linux下做“体检”,看它是否完整可分析。

file scan.exe xxd scan.exe | head -n 5

第一次提取完以后,file命令显示的是data,说明文件无法被识别为PE。xxd查看头部,发现文件开头不是预期的4d 5a(MZ),而是c0 84 5f 8b这种乱码。这就说明:要么提取时多包含了SMB协议头,要么文件的起始位置没对准,要么TCP分片顺序有误。

先试试找MZ标记。在Wireshark里用frame contains "MZ"过滤这个TCP流内的包,定位到包含MZ的包,然后Follow TCP Stream,把Raw数据另存出来。这次文件的file输出了PE32 executable,症状缓解了大半,但是双击跑不起来,说明修复还不到位。

6.2 修复的关键操作:剥协议头、按长度截断、补全头部字节

到这一步,我面对的是一个头部残留着SMB协议元数据的PE文件。处理办法是用binwalk或者手动查看偏移,确定MZ的准确位置,然后从MZ处开始保留。

xxd在导出文件里搜索4d 5a

xxd export.bin | grep "4d 5a" | head -n 5

看到4d 5a位于偏移0x80处。那我直接从0x80位置开始裁剪:

dd if=export.bin of=scan_fixed.exe bs=1 skip=$((0x80))

dd是处理二进制裁剪最顺手的工具。裁剪完再file scan_fixed.exe,已经能正确识别为PE32程序。

还有一种更极端的场景:文件开头的MZ被截断了几个字节,只剩Z或者什么都没有,这时候需要自己补文件头。比如原本是MZ头,被截得只有最后两个字节,修复时需要在前面补上4d 5a

printf '\x4d\x5a' > repaired.bin cat truncated_content >> repaired.bin

对于ZIP文件也是同理,如果开头少了50 4b 03 04,补上这四个字节就能让unzip重新识别。

修复的原理并不复杂,本质上就是让文件恢复到能被操作系统或分析工具正确识别的状态。文件头部是容器的“门牌号”,门牌号丢了,系统就不知道拿什么工具来解析你。

6.3 修复后的验证:哈希、字符串和动态行为

修复完以后,不能直接宣布任务结束,必须做验证。

先验证结构:

file scan_fixed.exe sha256sum scan_fixed.exe

再把字符串信息过一遍:

strings -n 8 scan_fixed.exe | head -n 50

strings结果里如果能看到CreateWindowSendMessageWinHttpOpen这类Windows API函数名,样本已经具备初步的行为参考价值。如果看到http://开头的字符串,就更能说明问题——它可能会向某个远程地址回传数据。

最后一步是把样本放到隔离的虚拟环境里运行,用strings结合网络监控确认它的外联行为。这一步在靶场里做足够安全,但如果在真实应急中,建议交给专门的沙箱平台。动态验证可以确认样本是否真的具备可执行能力,而不仅仅是个空壳。

6.4 从“修复”到“可分析”的一个完整检查流程

我总结了一个快速检查列表,每次修复完样本都对照执行:

检查项命令或操作预期结果
文件类型file sample识别为PE/ELF/ZIP等已知类型
头部magicxxd sample | headMZ、7F ELF、PK等
导入函数stringspedump能看到API调用线索
哈希sha256sum记录样本指纹
动态行为VMs开快照后运行观察行为但不影响宿主机

这五项全部通过,样本才算真正“修复到可分析状态”。

7. 经验沉淀:流量分析避坑指南与复盘心法

7.1 一套可直接复用的SMB+pcap载荷还原流程

这次项目做完,我把整个流程压缩成了一份操作清单,后续再遇到类似的SMB共享取包、流量溯源的场景,直接照着走:

  1. 枚举共享:smbclient -L //<target> -N,确认共享名和权限。
  2. 挂载或连接:把共享目录拉到本地,filesha256sum确认目标文件类型和完整性。
  3. 建立全局视图:用Wireshark的Protocol HierarchyConversationsEndpoints三个统计窗口圈定重点IP和会话。
  4. 身份溯源:过滤smb2.cmd == 1,从NTLMSSP认证中提取用户名、域名、主机名。
  5. 行为还原:用smb2.cmd配合CREATE/READ/WRITE代码,按时间线还原攻击者的文件操作。
  6. 载荷定位:查找frame contains "MZ"或导出SMB对象,确定恶意文件的传输流。
  7. 提取与修复:优先Export Objects -> SMB,不行就用tshark导流数据,再用dd裁剪协议残留,必要时补全magic number。
  8. 验证:filesha256sumstrings、沙箱动态行为。

这套流程不是万能的,但覆盖了绝大多数SMB共享取包分析场景的通用路径。

7.2 我在流量分析里反复踩过的坑

第一,不要忽略Wireshark的“配置文件”。我在分析pcap时遇到过一个问题:打开文件后所有包都是[Malformed Packet],排查了半天,发现是Wireshark里加载了一个过期的自定义协议解析器。遇到奇怪的解析错误,先检查Analyze -> Reload Lua Plugins和协议解析器设置,很多时候不是包的问题,是工具本身的问题。

第二,pcap不完整时的强解。有些pcap因为抓包中断,只有半个TCP流,没有最后的[FIN, ACK]。这种时候千万别怀疑是自己漏了什么,Wireshark里看到[TCP segment of a reassembled PDU]缺失,就直接找对应文件在流中的起始位置,把能拿到的部分尽量拿全,再进入修复阶段。

第三,时区问题。很多抓包文件里是UTC时间,你如果默认用本地时区去看,整个时间线会偏移好几个小时。尤其是多个设备抓包拼接的场景,不同设备时间不同步,会导致误判攻击顺序。分析前统一把时间显示改成UTC,能少掉很多头发。

第四,小流量大文章。不要觉得pcap文件小就没什么可看。一个几十KB的pcap可能只包含几十个HTTP POST请求,但攻击者的完整工具投递和命令下发都写在里面。真正有价值的分析样本,往往就是那些流量不太大的抓包。

7.3 再接再厉:这个场景还能怎样扩展

基于这个靶场,后续我还会继续往下玩,给你们几条延展方向:

  • 把HTTP流量升级成HTTPS,练习用(Pre)-Master-Secret或者日志里的密钥信息做TLS解密,看看加密流量的分析路径会有什么不同。
  • tshark把整套分析流程脚本化,比如自动导出所有HTTP对象、自动识别MZ/PK标记的文件、自动计算哈希,比赛抢时间时非常有用。
  • 把提取出来的恶意样本交给沙箱平台,对比网络外联行为和抓包静态分析结果,体验一次完整的恶意软件分析闭环。

对我来说,这份来自SMB共享的pcap,最终的价值不只是还原了一个攻击者,更让我把“枚举–取包–分析–溯源–提取–修复”这条链路整个练了一遍。流量分析这个方向,看起来门道很多,但剥开以后核心始终没变:让证据说话,一个字节一个字节地让证据说话。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询