Wireshark实战:从SMTP流量中快速定位与分析钓鱼邮件

1. 项目概述:从网络流量中狩猎钓鱼邮件

在日常安全运维和应急响应中,钓鱼邮件是绕不开的“老朋友”。攻击者花样百出,从伪装成老板的紧急转账指令,到模仿成银行、快递公司的密码重置链接,防不胜防。传统的邮件客户端过滤和终端安全软件固然重要,但它们有时会漏掉那些精心构造、极具迷惑性的邮件。这时候,换个视角,直接从网络层面去“看”邮件,往往能发现意想不到的线索。这就是我们今天要聊的:使用Wireshark,从最基础的SMTP流量中,像侦探一样快速定位并分析潜在的钓鱼邮件。

SMTP,简单邮件传输协议,是互联网上邮件发送的基石。当一封邮件从发件人服务器传到收件人服务器时,其内容(包括正文、附件、发件人信息)在网络上是以明文或某种编码形式传输的。Wireshark作为一款强大的网络协议分析工具,能够捕获并解析这些原始流量。通过分析SMTP流量,我们可以绕过邮件客户端可能存在的渲染或过滤,直接审视邮件的“原始面貌”,这对于识别那些使用了复杂HTML混淆、动态加载或特殊编码的钓鱼邮件尤其有效。

这个实战项目适合谁?如果你是网络安全工程师、系统管理员、安全分析师,或者是对网络协议和邮件安全感兴趣的开发者,那么掌握这项技能将为你打开一扇新的大门。它不仅能用于应急响应中的溯源分析,也能在日常的威胁狩猎和内部安全审计中发挥作用。即使你之前没有深入使用过Wireshark,只要对TCP/IP协议有基本了解,跟着步骤走,也能快速上手。我们的目标很明确:不依赖任何高级邮件安全网关的日志,仅凭一个抓包文件,快速找到可疑邮件,并利用Base64解码等技巧,揭开其伪装。

2. 核心思路与抓包策略设计

在开始动手抓包之前,我们必须先理清思路。盲目地在网络里抓取所有流量,无异于大海捞针,不仅效率低下,产生的海量数据也会让分析变得异常困难。因此,一个清晰的策略是成功的一半。

2.1 明确抓包场景与目标

首先,你需要明确分析的目标是什么。通常,钓鱼邮件分析会集中在以下几个场景:

  1. 出口邮件服务器监控:这是最经典的场景。在你的企业网络边界,部署Wireshark监控邮件服务器的出口流量(通常是TCP 25端口)。任何从内部发往外部的邮件都会经过这里。这对于检测内部主机是否被攻破后成为垃圾邮件/钓鱼邮件僵尸非常有效。
  2. 入口邮件服务器监控:监控接收外部邮件的服务器流量。这可以帮助你分析正在尝试进入你网络的钓鱼邮件,了解攻击者的手法和特征。
  3. 可疑终端抓包:如果怀疑某台特定电脑收到了钓鱼邮件,可以直接在该电脑上使用Wireshark进行抓包。需要结合邮件客户端的行为,比如在点击可疑链接或打开附件的同时进行抓包,但更常见的还是分析SMTP/POP3/IMAP的接收过程。
  4. 网络核心交换镜像:在核心交换机上配置端口镜像,将邮件服务器所在端口的流量复制一份到安装了Wireshark的分析机上。这是对生产环境影响最小、信息最全的方式。

对于本次以“定位钓鱼邮件”为目标,监控出口邮件服务器(TCP 25端口)的流量是最直接和高效的。因为很多内部爆发的安全事件,始作俑者就是一封从内部发出的钓鱼邮件,或者内部主机被控制后对外发送的钓鱼邮件。

2.2 精准过滤:缩小狩猎范围

Wireshark的过滤功能是我们的核心武器。直接捕获所有流量会包含大量无关的HTTP、DNS等数据,我们必须用过滤器精准定位SMTP流量。

  • 基础过滤器:tcp.port == 25这是最直接的过滤器,它会显示所有源端口或目标端口为25的TCP数据包。这能抓住绝大部分SMTP流量,但也可能包含一些其他使用25端口的服务(较少见)。

  • 更精确的过滤器:smtpWireshark内置了对SMTP协议的解码能力。直接使用显示过滤器smtp,它会筛选出所有被Wireshark识别为SMTP协议的数据包。这比端口过滤更智能,因为它基于协议内容而非单纯端口。

  • 组合过滤器,聚焦关键动作:

    • smtp.req.command == “DATA”:过滤出SMTP的DATA命令。在SMTP对话中,MAIL FROMRCPT TO之后,客户端会发送DATA命令,表示接下来要传输邮件正文内容。这是寻找邮件实际内容最关键的命令
    • smtp contains “From:”smtp contains “Subject:”:在邮件数据中搜索包含特定头字段的数据包。这常用于在已知部分信息(如可疑发件人地址或主题关键词)时进行快速定位。

实操心得:在实际调查中,我通常会先用tcp.port == 25进行初步捕获,确保不遗漏任何可能的流量。在分析时,则切换到smtp过滤器。当需要快速浏览所有邮件的发件人和主题时,我会在smtp过滤后的数据包列表里,直接查看Info列,Wireshark通常会解析出Response: 220...,MAIL FROM:...,RCPT TO:...等信息,非常直观。寻找具体邮件内容时,再使用smtp.req.command == “DATA”进行聚焦。

2.3 捕获配置要点

在Wireshark开始捕获前,有几个设置需要注意:

  1. 捕获过滤器(Capture Filter):在开始捕获前设置,用于在抓包时就直接丢弃不关心的流量,节省资源和磁盘空间。对于专注SMTP,可以设置为port 25。但注意,如果你不确定钓鱼邮件是否只走25端口(有些内部或特殊配置可能使用其他端口),初期可以不设或设置得宽泛一些(如tcp),避免漏报。
  2. 混杂模式(Promiscuous Mode):默认开启。确保你的网卡能捕获到流经网络的所有数据包,而不仅仅是发给本机的。这在监控交换机镜像端口或服务器流量时至关重要。
  3. 文件滚动与缓冲:如果计划长时间捕获,记得设置“捕获文件”选项,比如每100MB滚动一个新文件,或者环形缓冲,避免单个文件过大导致Wireshark分析时卡顿甚至崩溃。

3. SMTP流量解析与钓鱼特征定位

成功捕获到流量后,接下来就是细致的分析工作。我们需要在看似杂乱的协议交互中,找出那封“有问题”的邮件。

3.1 解读SMTP会话流程

一个标准的SMTP会话(这里以发送为例)通常遵循以下流程,理解它有助于我们快速定位关键阶段:

  1. TCP三次握手:建立连接。
  2. SMTP问候:服务器返回220代码,标识自己。
  3. 客户端问候:客户端发送EHLOHELO
  4. 认证与加密协商(如果启用):如STARTTLS
  5. 发件人声明MAIL FROM:<sender@example.com>这是第一个需要重点检查的地方。钓鱼邮件常使用伪造的发件人地址,比如伪装成内部高管或知名服务商。注意观察域名是否可疑,或者是否与RCPT TO的域名完全不相关(如从个人域名发往大量企业邮箱)。
  6. 收件人声明RCPT TO:<recipient@target.com>。观察收件人是否异常,例如同一发件人在短时间内向大量不同域名或同一域名下大量用户发送邮件。
  7. 数据传输DATA命令。这是核心阶段。客户端发送此命令后,服务器回应354,表示可以开始传输邮件数据。随后客户端发送的,就是完整的邮件原始内容(包括头部和正文),直到遇到单独一行的英文句点.结束。
  8. 结束与退出QUIT

在Wireshark的数据包列表面板,你可以清晰地看到这些命令和响应。我们的主要狩猎场,就是DATA命令之后传输的那些数据包。

3.2 定位并提取邮件原始数据

找到DATA阶段的数据包后,我们需要提取出完整的邮件内容。

  1. 跟随TCP流:这是最常用、最高效的方法。右键点击DATA命令之后任何一个包含邮件内容的数据包,选择“追踪流” -> “TCP流”。Wireshark会打开一个新窗口,将整个SMTP会话在这个TCP连接上的所有数据重组、排序并显示出来。
  2. 在TCP流窗口中,你会看到纯文本的对话。服务器端的响应通常以绿色显示,客户端的请求以红色显示(颜色可配置)。你需要找到从客户端发出的、DATA命令之后的那一大段文本,这就是邮件的完整原始内容。
  3. 保存原始数据:在TCP流窗口的底部,将“显示和保存数据为”的格式选择为“原始数据”(Raw)。然后点击“另存为…”,将其保存为一个.eml文件。.eml是标准的邮件原始格式文件,可以用文本编辑器查看,也可以用邮件客户端(如Outlook, Thunderbird)直接打开,方便后续分析。

3.3 识别钓鱼邮件的关键特征

现在,你有了邮件的“源代码”。如何判断它是不是钓鱼邮件?除了常规的检查发件人、链接、附件外,从流量和原始数据角度,可以关注这些点:

  • 可疑的发件人地址MAIL FROM字段与邮件头部From:字段不一致,这是典型的伪造。或者发件人域名是近期注册的、模仿正品的(如micr0soft-support.com)。
  • 邮件正文中的恶意链接:在原始数据中直接搜索http://https://。钓鱼链接常使用短链接服务(如bit.ly)、IP地址直接访问、或域名与声称的品牌不符。注意,链接可能被HTML标签包裹。
  • 异常的HTML与混淆技术
    • 大量Base64编码块:这是隐藏恶意内容(如链接、脚本、附件)的常见手段。邮件正文中可能出现一大段看似乱码的字符,以Content-Transfer-Encoding: base64开头。
    • HTML属性混淆:将链接的href属性拆分成多个部分,或用JavaScript动态生成。例如:<a href="javascript:window.location.href='h'+'ttp://evil.com'">点击这里</a>
    • 不可见字符与同形异义字:使用零宽字符、或利用某些字母外形相似(如拉丁字母a与西里尔字母а)来伪造链接,使其在邮件客户端里看起来是合法的,实际指向恶意网站。
  • 恶意附件:在原始数据中查找Content-Disposition: attachment部分。附件可能是一个可执行文件(.exe, .scr, .js)、带有宏的Office文档(.docm, .xlsm)或压缩包。注意其文件名是否具有诱惑性(如“发票详情.zip”、“薪资调整通知.docm”)。

注意事项:在TCP流中查看数据时,务必注意字符编码。有时非英文内容可能显示为乱码,但这不一定是编码问题,很可能就是Base64或其他编码。先检查邮件头部的Content-TypeContent-Transfer-Encoding字段,它们是解读正文格式的钥匙。

4. Base64解码实战与内容还原

正如前面提到的,Base64编码是钓鱼邮件作者最常用的“隐身衣”之一。它可以将二进制数据(如图片、可执行文件)或特殊格式文本(如HTML混淆代码)编码成由64个ASCII字符(A-Z, a-z, 0-9, +, /)组成的字符串,从而绕过一些简单的基于关键词的内容过滤。

4.1 识别Base64编码内容

在邮件的原始数据或TCP流中,如何识别Base64?

  1. 查看邮件头:检查Content-Transfer-Encoding头。如果其值为base64,那么该部分正文就是Base64编码的。
  2. 观察内容特征:Base64编码的字符串通常是一大段连续的、由上述64个字符组成的文本,每76个字符后会有一个换行(MIME规范)。末尾可能有1或2个=号作为填充。它看起来像这样:
    PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+...
  3. 在Wireshark中直接识别:Wireshark的高级之处在于,它对一些常见编码有初步的解码能力。当你追踪TCP流时,如果Wireshark识别出某段数据是Base64编码的邮件正文,它有时会在流窗口中以解码后的形式显示一部分。但更可靠的方法还是手动提取并解码。

4.2 使用Wireshark内置功能解码

Wireshark提供了一种快速解码少量Base64数据的方法,虽然不适合处理整个邮件正文,但对于解码一个关键的URL或一段文字很有用。

  1. 在数据包详情面板(Packet Details)中,找到包含Base64字符串的字段(例如,一个smpt协议下的Line-based text data字段)。
  2. 右键点击该字段的ASCII显示部分(或包含Base64的整个字段)。
  3. 选择“复制” -> “...作为Printable Text”。实际上,更直接的方法是选中Base64字符串本身。
  4. 将复制出来的字符串粘贴到一个文本编辑器。
  5. 然后,在Wireshark顶部菜单栏,点击“编辑” -> “粘贴Base64为文件…”。Wireshark会弹窗让你保存文件。如果你粘贴的是Base64编码的文本,保存为.txt后打开就是解码内容;如果是编码的图片或二进制文件,保存为相应格式即可。

这个方法巧妙利用了Wireshark将Base64字符串还原为二进制文件的功能。对于纯文本的Base64,解码后就是可读内容。

4.3 利用外部工具与脚本高效解码

对于完整的邮件正文或大型Base64块,使用外部工具更灵活。

  • Linux/macOS命令行base64命令是标配。

    # 解码并输出到屏幕 echo "SGVsbG8gV29ybGQh" | base64 -d # 解码文件 base64 -d encoded.txt > decoded.txt # 有时需要忽略非字母字符,使用 `-i` 选项 cat encoded_part.txt | tr -d '\n' | base64 -di > decoded.html
  • Windows PowerShell

    # 解码字符串 [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("SGVsbG8gV29ybGQh")) # 解码文件 $encoded = Get-Content -Path "encoded.txt" -Raw $decoded = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($encoded)) $decoded | Out-File -FilePath "decoded.txt"
  • 在线解码工具:对于快速检查,可以使用可靠的在线Base64解码网站。但务必注意:绝对不要将敏感的、可能包含恶意代码的邮件内容上传到不信任的第三方网站,最好在隔离环境中操作。

  • Python脚本:对于需要批量解码或复杂处理的情况,写个简单脚本最方便。

    import base64 import re # 从保存的 .eml 文件中提取并解码 Base64 部分 with open('suspicious_email.eml', 'r', encoding='utf-8', errors='ignore') as f: raw_email = f.read() # 简单查找 Content-Transfer-Encoding: base64 之后的内容(这是一个简化示例,实际解析需要更严谨的MIME解析库如email) # 这里假设我们手动找到了Base64块并存入变量 base64_str = """...你的Base64字符串...""" # 清理可能的换行和空格 base64_str_clean = re.sub(r'\s+', '', base64_str) try: decoded_bytes = base64.b64decode(base64_str_clean) # 尝试用UTF-8解码,如果是文本的话 decoded_text = decoded_bytes.decode('utf-8') print(decoded_text) except Exception as e: print(f"解码失败: {e}") # 可能是二进制文件,直接写入 with open('decoded_output.bin', 'wb') as out_f: out_f.write(decoded_bytes)

踩坑记录:Base64解码最常见的错误是“填充错误”(Incorrect padding)。这是因为Base64编码的字符串长度必须是4的倍数,不足的会用=填充。但在邮件中,Base64内容经常被折行(每76字符换行),解码前必须先移除所有换行符和空格。这就是上面命令和脚本中使用tr -d '\n're.sub(r'\s+', '', ...)的原因。另外,解码出的内容可能是HTML,记得用浏览器或文本编辑器查看其结构,重点检查<a>标签的href属性、<img>src属性(可能用于跟踪)以及任何内联的JavaScript。

5. 高级技巧:自动化筛选与威胁情报整合

手动分析一两封邮件是可行的,但在海量流量中,我们需要更高效的方法。结合Wireshark的显示过滤器、命令行工具tshark和简单的脚本,可以构建一个半自动化的分析流程。

5.1 使用TShark进行命令行批量提取

tshark是Wireshark的命令行版本,非常适合自动化处理。

  • 提取所有邮件的发件人和主题

    tshark -r capture.pcapng -Y "smtp.req.command == MAIL || smtp.req.command == RCPT || frame contains \"Subject:\"" -T fields -e smtp.req.parameter -e text

    这个命令会过滤出包含MAIL FROMRCPT TO命令以及数据帧中包含“Subject:”字样的行,并输出相关参数和文本。输出需要进一步整理,但能快速概览所有邮件的基本信息。

  • 提取特定邮件的完整DATA内容: 首先,你需要找到目标邮件所在的TCP流索引。可以在Wireshark GUI中查看,或者用更复杂的tshark命令组合来定位。一个相对直接的方法是先找到DATA命令包,然后提取其TCP流的所有数据:

    # 假设我们关注发送到 specific@victim.com 的邮件 tshark -r capture.pcapng -Y "smtp contains \"specific@victim.com\" and smtp.req.command == DATA" -T fields -e tcp.stream # 假设输出流索引是 12 tshark -r capture.pcapng -q -z follow,tcp,raw,12

    最后一个命令会输出该TCP流的原始数据,你可以将其重定向到文件,然后从中截取邮件内容。

5.2 结合威胁情报快速研判

当你提取出邮件中的链接(URL)、域名或附件哈希值(如MD5, SHA256)后,可以将其与威胁情报进行比对,快速判断其恶意性。

  1. 域名/IP信誉查询:使用whois命令查询域名注册信息(注册时间、注册商是否可疑)。将域名或IP提交到VirusTotal、AlienVault OTX、IBM X-Force等公开威胁情报平台进行查询。
  2. URL分析:使用curl或浏览器在隔离环境中(如虚拟机)尝试访问该URL,观察其最终跳转目标、下载的文件内容。或者直接使用URL扫描服务如urlscan.io
  3. 文件哈希比对:如果邮件带有附件,并成功提取出文件(如从Base64解码还原),计算其哈希值(sha256sum 文件名),然后在VirusTotal上搜索该哈希值,看是否有安全厂商已将其标记为恶意。

5.3 构建简易分析流水线

你可以将上述步骤串联成一个脚本,实现从抓包文件到初步威胁评级的半自动化:

  1. 使用tshark提取:从pcap文件中提取所有邮件的MAIL FROMRCPT TOSubject以及包含http的URL。
  2. 数据清洗与格式化:将提取出的信息整理成结构化的CSV或JSON文件。
  3. 自动查询:编写脚本,读取上一步的URL和发件人域名,调用威胁情报平台的API(如有)或进行whois查询,将结果附加到数据中。
  4. 生成报告:根据查询结果(如域名是否新注册、URL是否被标记为恶意),对邮件进行风险评分,并生成一份简要的分析报告,高亮显示高风险条目。

这个流水线可以极大地提升在大量邮件中筛选可疑目标的效率,让你能把精力集中在最有可能的威胁上进行深度手动分析。

6. 实战案例复盘与排查实录

理论讲得再多,不如一个真实案例来得深刻。下面我分享一个之前遇到的实际案例,并复盘整个分析过程。

场景:内部监控告警显示,公司一台普通办公主机在短时间内向外网多个不同域名发送了大量SMTP连接。安全团队立即在该主机和邮件服务器出口同时抓包。

第一步:快速定位异常会话在邮件服务器出口的抓包文件中,使用过滤器tcp.port == 25 && ip.src == <内部主机IP>,迅速锁定了来自该主机的所有SMTP流量。观察发现,会话模式异常:每个会话都非常短促,EHLO->MAIL FROM(发件人地址是随机生成的) ->RCPT TO(目标各异) ->DATA传输一小段内容 ->QUIT。这明显是垃圾邮件僵尸的行为。

第二步:提取并分析邮件内容随机选取一个会话,追踪其TCP流。发现DATA部分传输的邮件内容很短,且正文部分是一段Base64编码的字符串。复制这段Base64,在隔离环境中使用Python脚本解码。

解码后发现:邮件正文是一个极其简单的HTML,里面只有一个图片标签,src指向一个外部URL。图片URL的域名是几个小时前刚注册的。邮件的主题和正文纯文本部分(如果有)都是无关紧要的广告词,但图片链接是核心。

第三步:深挖图片链接访问该图片URL(在隔离沙箱中),发现它不是一个真正的图片,而是一个包含跟踪像素(1x1透明GIF)的网页,但网页中嵌入了另一段经过JavaScript混淆的代码。通过浏览器开发者工具调试,最终解混淆发现,其核心功能是尝试利用浏览器漏洞进行驱动式下载,下载一个伪装成PDF的恶意可执行文件。

第四步:关联分析与遏制

  1. 横向关联:用tshark批量提取所有来自该主机的邮件中的图片URL,发现虽然域名不同,但URL路径结构和最终指向的恶意文件哈希值相同,确认是同一波攻击。
  2. 源头排查:分析该办公主机的其他网络连接和进程,发现了一个可疑的、伪装成系统服务的进程,并将其查杀。
  3. 威胁情报提交:将涉及的域名、IP、URL及恶意文件哈希提交到内部威胁情报库和外部平台,更新防火墙和邮件网关规则,阻断后续相关流量。

常见问题排查表

问题现象可能原因排查步骤与解决方案
Wireshark捕获不到SMTP流量1. 抓包位置不对(未在流量路径上)。
2. 捕获过滤器设置过窄(如误设了host过滤)。
3. 邮件使用了加密(如SMTPS on 465, STARTTLS on 587)。
1. 确认网卡选择正确(监听所有接口或指定接口)。
2. 暂时禁用捕获过滤器,或改为tcp
3. 对于加密流量,需在客户端或服务器端配置RSA密钥才能解密。实战中,在边界监控明文25端口流量通常已足够。
追踪TCP流时邮件内容显示乱码1. 字符编码问题(如GBK, Big5)。
2. 内容本身是二进制附件或经过压缩。
3. 内容是Base64或其他编码未解码。
1. 在TCP流窗口尝试切换编码(ASCII,UTF-8等)。
2. 检查邮件头Content-TypeContent-Transfer-Encoding
3. 如果是base64,按前述方法解码。如果是quoted-printable,使用相应工具解码。
Base64解码失败,提示填充错误Base64字符串格式不规范,包含换行符、空格或长度非4的倍数。1. 解码前使用命令tr -d '\n\r\t '或脚本re.sub(r'\s+', '', string)清除所有空白字符。
2. 手动检查字符串末尾,确保填充=正确(0-2个)。有时需要尝试补=
提取的.eml文件无法用邮件客户端打开文件可能不完整或格式有误,缺少必要的邮件头结束标志(\r\n\r\n)。1. 用文本编辑器打开.eml文件,检查头部是否完整(应有From:,To:,Subject:,Date:等,并以空行结束头部)。
2. 确保从TCP流中保存时,包含了完整的邮件数据(从DATA后的第一行到单独一行的.)。可以尝试用专业的MIME解析库(如Python的email库)来验证和修复。
怀疑邮件使用了HTTPS链接逃避检测邮件中的链接是https://,且证书看起来有效。1. 不要只看域名,检查证书的颁发对象(Subject)和颁发机构(Issuer)是否可疑。
2. 访问该链接(在安全环境中),观察其最终跳转目标、页面内容是否与声称的服务相符。
3. 使用curl -Icurl -v查看HTTP头,注意Location跳转。

这个案例的关键在于,钓鱼的“钩子”不在邮件文本,而在一个经过Base64编码的图片链接中。如果不进行流量层面的深度解码分析,仅靠邮件客户端的预览或简单的文本过滤,很容易漏过。这也印证了从网络协议层面分析邮件的独特价值——你能看到最原始、最完整的信息,不受客户端渲染和过滤策略的干扰。