
1. 项目概述从网络流量中狩猎钓鱼邮件在日常安全运维和应急响应中钓鱼邮件是绕不开的“老朋友”。攻击者花样百出从伪装成老板的紧急转账指令到模仿成银行、快递公司的密码重置链接防不胜防。传统的邮件客户端过滤和终端安全软件固然重要但它们有时会漏掉那些精心构造、极具迷惑性的邮件。这时候换个视角直接从网络层面去“看”邮件往往能发现意想不到的线索。这就是我们今天要聊的使用Wireshark从最基础的SMTP流量中像侦探一样快速定位并分析潜在的钓鱼邮件。SMTP简单邮件传输协议是互联网上邮件发送的基石。当一封邮件从发件人服务器传到收件人服务器时其内容包括正文、附件、发件人信息在网络上是以明文或某种编码形式传输的。Wireshark作为一款强大的网络协议分析工具能够捕获并解析这些原始流量。通过分析SMTP流量我们可以绕过邮件客户端可能存在的渲染或过滤直接审视邮件的“原始面貌”这对于识别那些使用了复杂HTML混淆、动态加载或特殊编码的钓鱼邮件尤其有效。这个实战项目适合谁如果你是网络安全工程师、系统管理员、安全分析师或者是对网络协议和邮件安全感兴趣的开发者那么掌握这项技能将为你打开一扇新的大门。它不仅能用于应急响应中的溯源分析也能在日常的威胁狩猎和内部安全审计中发挥作用。即使你之前没有深入使用过Wireshark只要对TCP/IP协议有基本了解跟着步骤走也能快速上手。我们的目标很明确不依赖任何高级邮件安全网关的日志仅凭一个抓包文件快速找到可疑邮件并利用Base64解码等技巧揭开其伪装。2. 核心思路与抓包策略设计在开始动手抓包之前我们必须先理清思路。盲目地在网络里抓取所有流量无异于大海捞针不仅效率低下产生的海量数据也会让分析变得异常困难。因此一个清晰的策略是成功的一半。2.1 明确抓包场景与目标首先你需要明确分析的目标是什么。通常钓鱼邮件分析会集中在以下几个场景出口邮件服务器监控这是最经典的场景。在你的企业网络边界部署Wireshark监控邮件服务器的出口流量通常是TCP 25端口。任何从内部发往外部的邮件都会经过这里。这对于检测内部主机是否被攻破后成为垃圾邮件/钓鱼邮件僵尸非常有效。入口邮件服务器监控监控接收外部邮件的服务器流量。这可以帮助你分析正在尝试进入你网络的钓鱼邮件了解攻击者的手法和特征。可疑终端抓包如果怀疑某台特定电脑收到了钓鱼邮件可以直接在该电脑上使用Wireshark进行抓包。需要结合邮件客户端的行为比如在点击可疑链接或打开附件的同时进行抓包但更常见的还是分析SMTP/POP3/IMAP的接收过程。网络核心交换镜像在核心交换机上配置端口镜像将邮件服务器所在端口的流量复制一份到安装了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 FROM和RCPT 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开始捕获前有几个设置需要注意捕获过滤器Capture Filter在开始捕获前设置用于在抓包时就直接丢弃不关心的流量节省资源和磁盘空间。对于专注SMTP可以设置为port 25。但注意如果你不确定钓鱼邮件是否只走25端口有些内部或特殊配置可能使用其他端口初期可以不设或设置得宽泛一些如tcp避免漏报。混杂模式Promiscuous Mode默认开启。确保你的网卡能捕获到流经网络的所有数据包而不仅仅是发给本机的。这在监控交换机镜像端口或服务器流量时至关重要。文件滚动与缓冲如果计划长时间捕获记得设置“捕获文件”选项比如每100MB滚动一个新文件或者环形缓冲避免单个文件过大导致Wireshark分析时卡顿甚至崩溃。3. SMTP流量解析与钓鱼特征定位成功捕获到流量后接下来就是细致的分析工作。我们需要在看似杂乱的协议交互中找出那封“有问题”的邮件。3.1 解读SMTP会话流程一个标准的SMTP会话这里以发送为例通常遵循以下流程理解它有助于我们快速定位关键阶段TCP三次握手建立连接。SMTP问候服务器返回220代码标识自己。客户端问候客户端发送EHLO或HELO。认证与加密协商如果启用如STARTTLS。发件人声明MAIL FROM:senderexample.com。这是第一个需要重点检查的地方。钓鱼邮件常使用伪造的发件人地址比如伪装成内部高管或知名服务商。注意观察域名是否可疑或者是否与RCPT TO的域名完全不相关如从个人域名发往大量企业邮箱。收件人声明RCPT TO:recipienttarget.com。观察收件人是否异常例如同一发件人在短时间内向大量不同域名或同一域名下大量用户发送邮件。数据传输DATA命令。这是核心阶段。客户端发送此命令后服务器回应354表示可以开始传输邮件数据。随后客户端发送的就是完整的邮件原始内容包括头部和正文直到遇到单独一行的英文句点.结束。结束与退出QUIT。在Wireshark的数据包列表面板你可以清晰地看到这些命令和响应。我们的主要狩猎场就是DATA命令之后传输的那些数据包。3.2 定位并提取邮件原始数据找到DATA阶段的数据包后我们需要提取出完整的邮件内容。跟随TCP流这是最常用、最高效的方法。右键点击DATA命令之后任何一个包含邮件内容的数据包选择“追踪流” - “TCP流”。Wireshark会打开一个新窗口将整个SMTP会话在这个TCP连接上的所有数据重组、排序并显示出来。在TCP流窗口中你会看到纯文本的对话。服务器端的响应通常以绿色显示客户端的请求以红色显示颜色可配置。你需要找到从客户端发出的、DATA命令之后的那一大段文本这就是邮件的完整原始内容。保存原始数据在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 hrefjavascript:window.location.hrefhttp://evil.com点击这里/a。不可见字符与同形异义字使用零宽字符、或利用某些字母外形相似如拉丁字母a与西里尔字母а来伪造链接使其在邮件客户端里看起来是合法的实际指向恶意网站。恶意附件在原始数据中查找Content-Disposition: attachment部分。附件可能是一个可执行文件.exe, .scr, .js、带有宏的Office文档.docm, .xlsm或压缩包。注意其文件名是否具有诱惑性如“发票详情.zip”、“薪资调整通知.docm”。注意事项在TCP流中查看数据时务必注意字符编码。有时非英文内容可能显示为乱码但这不一定是编码问题很可能就是Base64或其他编码。先检查邮件头部的Content-Type和Content-Transfer-Encoding字段它们是解读正文格式的钥匙。4. Base64解码实战与内容还原正如前面提到的Base64编码是钓鱼邮件作者最常用的“隐身衣”之一。它可以将二进制数据如图片、可执行文件或特殊格式文本如HTML混淆代码编码成由64个ASCII字符A-Z, a-z, 0-9, , /组成的字符串从而绕过一些简单的基于关键词的内容过滤。4.1 识别Base64编码内容在邮件的原始数据或TCP流中如何识别Base64查看邮件头检查Content-Transfer-Encoding头。如果其值为base64那么该部分正文就是Base64编码的。观察内容特征Base64编码的字符串通常是一大段连续的、由上述64个字符组成的文本每76个字符后会有一个换行MIME规范。末尾可能有1或2个号作为填充。它看起来像这样PCFET0NUWVBFIGh0bWwCjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ...在Wireshark中直接识别Wireshark的高级之处在于它对一些常见编码有初步的解码能力。当你追踪TCP流时如果Wireshark识别出某段数据是Base64编码的邮件正文它有时会在流窗口中以解码后的形式显示一部分。但更可靠的方法还是手动提取并解码。4.2 使用Wireshark内置功能解码Wireshark提供了一种快速解码少量Base64数据的方法虽然不适合处理整个邮件正文但对于解码一个关键的URL或一段文字很有用。在数据包详情面板Packet Details中找到包含Base64字符串的字段例如一个smpt协议下的Line-based text data字段。右键点击该字段的ASCII显示部分或包含Base64的整个字段。选择“复制” - “...作为Printable Text”。实际上更直接的方法是选中Base64字符串本身。将复制出来的字符串粘贴到一个文本编辑器。然后在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.htmlWindows 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, encodingutf-8, errorsignore) 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 FROM、RCPT TO命令以及数据帧中包含“Subject:”字样的行并输出相关参数和文本。输出需要进一步整理但能快速概览所有邮件的基本信息。提取特定邮件的完整DATA内容 首先你需要找到目标邮件所在的TCP流索引。可以在Wireshark GUI中查看或者用更复杂的tshark命令组合来定位。一个相对直接的方法是先找到DATA命令包然后提取其TCP流的所有数据# 假设我们关注发送到 specificvictim.com 的邮件 tshark -r capture.pcapng -Y smtp contains \specificvictim.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后可以将其与威胁情报进行比对快速判断其恶意性。域名/IP信誉查询使用whois命令查询域名注册信息注册时间、注册商是否可疑。将域名或IP提交到VirusTotal、AlienVault OTX、IBM X-Force等公开威胁情报平台进行查询。URL分析使用curl或浏览器在隔离环境中如虚拟机尝试访问该URL观察其最终跳转目标、下载的文件内容。或者直接使用URL扫描服务如urlscan.io。文件哈希比对如果邮件带有附件并成功提取出文件如从Base64解码还原计算其哈希值sha256sum 文件名然后在VirusTotal上搜索该哈希值看是否有安全厂商已将其标记为恶意。5.3 构建简易分析流水线你可以将上述步骤串联成一个脚本实现从抓包文件到初步威胁评级的半自动化使用tshark提取从pcap文件中提取所有邮件的MAIL FROM、RCPT TO、Subject以及包含http的URL。数据清洗与格式化将提取出的信息整理成结构化的CSV或JSON文件。自动查询编写脚本读取上一步的URL和发件人域名调用威胁情报平台的API如有或进行whois查询将结果附加到数据中。生成报告根据查询结果如域名是否新注册、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的恶意可执行文件。第四步关联分析与遏制横向关联用tshark批量提取所有来自该主机的邮件中的图片URL发现虽然域名不同但URL路径结构和最终指向的恶意文件哈希值相同确认是同一波攻击。源头排查分析该办公主机的其他网络连接和进程发现了一个可疑的、伪装成系统服务的进程并将其查杀。威胁情报提交将涉及的域名、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流窗口尝试切换编码ASCIIUTF-8等。2. 检查邮件头Content-Type和Content-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 -I或curl -v查看HTTP头注意Location跳转。这个案例的关键在于钓鱼的“钩子”不在邮件文本而在一个经过Base64编码的图片链接中。如果不进行流量层面的深度解码分析仅靠邮件客户端的预览或简单的文本过滤很容易漏过。这也印证了从网络协议层面分析邮件的独特价值——你能看到最原始、最完整的信息不受客户端渲染和过滤策略的干扰。