☰
流量分析实战:从pcap到通话录音,一文掌握VoIP与RTP音频还原
2026/9/29 7:28:38 网站建设 项目流程

1. 流量分析,到底在分析什么

先把这个事情说透:流量分析不是一个需要高深数学基础的“高冷技能”,它的本质就是把网络上传输的数据包抓下来,然后搞清楚这些数据包在说什么、在干什么。你平时刷网页、聊语音、传文件,所有这些行为都会变成一串一串的数据包在网络里跑。流量分析要做的事情,就是把这些包一个个解开,把里面的信息还原出来。

这个技能在CTF(网络安全竞赛)里几乎是必考的,最常见的出题方式就是给你一个pcap文件(数据包捕获文件),让你从里面找flag。而“流量分析”这个热词之所以能火起来,很大程度上就是因为CTF的流量分析题里出现过一类很有意思的考法——拿到一个包含VoIP通话流量的pcap文件,最后还原出来的是一段通话录音。这类题目一开始让很多人懵圈:流量分析不是找字符串、找文件吗,怎么还能跟语音扯上关系?

实际上,VoIP(Voice over IP,基于IP网络的语音通话技术)流量分析的考点并不算冷门。SIP协议负责建立通话、RTP协议负责传输实际的声音数据,抓包抓到的这些协议,最终是可以把“声音数据”从包里提取出来,重新拼成一段能播放的音频文件的。换句话说,流量分析不仅能还原文件、图片、网页内容,连“谁在什么时间给谁打了电话、说了什么”也能还原出来。

这篇文我不会去给你背一遍协议栈的教科书内容,而是按照我实际做流量分析的经验,把一个完整、可上手的流程讲清楚。包括流量分析整体的思路框架、常见协议的识别方法、wireshark的关键用法,以及大家最关心的“流量还原音频”“从pcap里提取文件”这类实操,最后附上我在做题和实际工作中踩过的一些坑。无论你是刚接触CTF的新手,还是做安全运维想补这块短板,按这个流程走一遍,应该能少走不少弯路。

2. 上手之前,先把思路框架搭起来

2.1 流量分析解决的是哪几类问题

我在带新人时发现,很多人拿到一个pcap文件之后,第一反应就是一顿乱点,看看这个包、看看那个流,抓了半天也找不到头绪。问题的根源不在于不会用工具,而在于脑子里没有一个“先干什么、再干什么”的框架。

根据我做题和做事的经验,流量分析要解决的问题基本可以归成这四类:

问题类型典型场景关键突破口
找明文字符串登录框、搜索框、通信消息里直接传了flag搜索协议、跟踪TCP流、过滤关键字
还原传输文件图片、压缩包、文档被传输过但没落地追踪HTTP流、导出对象、binwalk分析
分析攻击行为扫描、爆破、注入、木马回连协议统计、异常流量模式、时间线梳理
还原多媒体内容VoIP通话、视频流被捕获SIP会话分析、RTP流提取、音频重组

我见过太多人只知道“找字符串”这一种玩法,一旦题目里没有明文flag就卡死。而实际上,像VoIP还原音频这种题,如果你心里没有“流量里还能藏音频”这个概念,给你一天时间也找不到正确的方向。

所以,拿到pcap之后第一件事不是双击点开,而是先自问一句:这份流量是哪类场景下产生的?是Web访问产生的、是文件传输产生的,还是语音通话产生的?场景判断对了,后面的一切动作才会有方向。

2.2 判断场景的核心依据

怎么快速判断场景?我从不用那种“一层层点界面”的笨办法,直接看统计结论。

打开pcap之后,第一时间我会看两个地方:

  • 菜单栏的Statistics(统计)→ Protocol Hierarchy(协议分级),这里一眼就能看出这份流量里都有哪些协议、每个协议的包数量和占比。
  • 菜单栏的Statistics → Conversations(会话),这里可以看到有哪些IP在通信、端口是什么、数据量多大。

这两个面板看完,基本上就能给流量“画像”了。比如:

  • 看到HTTP、TCP、DNS为主,多半是网页浏览流量。
  • 看到FTP、TCP(数据连接端口20/21),多半是文件上传下载。
  • 看到SIP、RTP/UDP成规模出现,那基本可以确定是VoIP通话流量。
  • 看到ICMP大量出现且数据包不规则,可能要怀疑是隧道或探测行为。

尤其是VoIP场景,你在Protocol Hierarchy里一下就能认出那个标志性的组合:SIP协议负责“打电话的动作”,RTP协议负责“说话的声音”。这两类协议一出现,脑子里就要立刻弹出“这个题可能要还原音频”的预判。

2.3 工具选型:Wireshark外的组合拳

流量分析的主力工具是Wireshark,这个没得说。但在大量CTF题和真实场景里,只靠Wireshark一个有UI的工具,效率和深度都不够。我给新人的建议是准备一套组合工具,按需取用:

  • wireshark:交互式深挖流量、协议解析、流重组的第一选择,尤其是可视化操作它最顺手。
  • tshark:Wireshark的命令行版本,擅长批量处理、快速筛选、从大包里提取字段信息。
  • tcpdump:主要用于实时的抓包,拿到现成pcap后我也会用它做一些快速过滤和切割。
  • strings:Linux下的一个极简命令,直接从二进制数据里抽出可打印字符串,找明文flag时效率极高。
  • binwalk / foremost:做文件提取和隐写分析时要用,能从数据里分段拆出隐藏文件。
  • audacity:处理音频还原时使用,剥出原始语音数据后要在这里做格式整理、降噪、播放。

这些工具不要求一次全装,但至少tshark、strings和binwalk我建议提前装好,因为它们会在后面几个实操环节里频繁登场。

3. 核心环节:流量里的“找”和“还原”

3.1 从pcap里捞明文信息

最基础的玩法,从一个pcap文件里直接捞字符串和明文通信内容。这类题目考的是“你知不知道流量分析要关注哪些地方”,不需要太高深的技巧。

第一步:用strings快速扫一遍。在命令行里执行:

strings capture.pcap | grep -i "flag\|ctf\|key\|secret"

这个命令能把pcap里所有可读字符串提出来,然后筛含有关键字的行。之所以先跑这个命令,是因为很多新手题就直接把flag放在某个HTTP请求的URL参数里、或者放在某个登录请求的POST数据里,strings一次就能筛出来。即便筛不出来,也能对这份流量里有没有明文内容有一个整体感觉。

第二步:用Wireshark的“跟踪流”功能做完整还原。在Wireshark里随便选中一条HTTP或TCP包,右键选择追踪流 → TCP流 / HTTP流,Wireshark会把整个会话的数据按顺序拼起来展示。比如HTTP登录请求,你在这里能看到完整的请求头和请求体,flag往往就藏在username或password字段里。

关于这一步有一个习惯我必须强调:不要只看第一个包,更不要只盯着数据包列表的Bytes区域死磕。把流的完整内容展开看,很多线索在分片后的单一包里是看不全的,只有把整个流拼接起来才能看到全貌。

3.2 从流量里还原文件

如果明文里找不到flag,接下来要想到的是:这段流量里是不是传过文件?典型场景是HTTP下载、FTP上传下载,还有一些压缩包是通过邮件附件走的SMTP协议。

以最常见的HTTP传输文件为例,在Wireshark里用菜单栏的文件 → 导出对象 → HTTP,会弹出一个列表,里面列出了所有通过HTTP传输过的文件对象。直接勾选保存就能把文件导出来。导出之后,对文件做进一步分析,比如解压、查看图片、检查文件尾部的附加信息等。

这里有一个很关键的细节:有些题目会把flag藏在图片或压缩包的尾部附加字节里。比如一张正常的图片文件,你用strings或者xxd看它的末尾,会发现一段不相关的字符串——这往往就是隐藏信息。还有一种情况:导出的文件不是标准格式(比如扩展名被改过,或者文件头被抹掉了),就需要用binwalk或者010 Editor检查文件特征。

用binwalk检查文件特征和提取附加数据的方法:

binwalk flag.jpg

如果binwalk提示文件里有压缩包,或者出现“Zlib compressed data”之类的字样,说明这个图片里还塞了别的东西,再用binwalk -e自动化提取。

3.3 VoIP通话录音的提取与还原

说完了文件和字符串,到这篇博文的重头戏:怎么从流量里把VoIP通话内容还原成可听的录音。

先说一个背景,VoIP系统里负责“打电话”的是SIP协议,它负责呼叫的建立、转发、挂断,默认跑在UDP的5060端口。而实际的声音数据走的是RTP协议,RTP通常使用UDP的偶数端口(常见的范围在16384到32768之间)。RTP包传的是编码后的音频数据,比如G.711编码,编码规则是把模拟声音信号转成数字的PCM数据块,再封装成RTP包发送。我们要做的,就是把这些RTP载荷里的数据块按顺序提取出来、拼接起来,再还原成音频文件。

第一步:确认流量里有VoIP通话。在Wireshark的Protocol Hierarchy里看到SIP和RTP,就说明通话流量存在。接着在Wireshark的菜单栏里找到Telephony(电话)→ VoIP Calls,这里会列出捕获到的所有VoIP会话,包括主叫、被叫、时间、状态等信息。看到这里,思路就可以闭环了:有通话、有RTP流,目标就是把通话内容抽出来当证据/flag。

第二步:用Wireshark内建的“播放/导出音频”功能。在VoIP Calls列表里双击一条通话记录,Wireshark会自动弹出RTP流分析窗口。点击“Play Stream”可以直接听通话内容,点击“Export”可以把通话的音频数据导成文件。听起来很简单对吧?但对新手来说坑就在这,Wireshark默认导出的是原始RTP载荷,格式不一定能被普通播放器直接打开,需要在导出时选对格式(一般选“.au”或“.wav”比较稳),或者在导出后用Audacity做格式转换。

提示:如果导出的音频播放出来是“哔哔”的噪声或速度不对,先别急着怀疑数据有问题。大概率是导出时没有去除RTP头部,或是编码格式选错了。Wireshark在Telephony → RTP → RTP Streams里有“Analyze”选项,分析之后再生成为WAV,会比纯手工拼接靠谱很多。

第三步:tshark手工提取RTP载荷做兜底。Wireshark的UI一步到位在多数情况下很香,但有些场景下(比如RTP流被分片切碎、或者流量不止一路通话)它就显得笨拙。这时候我用tshark命令手工提取,反而更可控。核心思路是把RTP包的载荷(payload)提取出来,去掉RTP头,只保留音频数据,然后拼接成一个原始PCM文件,再用Audacity打开。

大致命令流程如下:

# 先过滤出某一通电话的RTP流,查看载荷格式 tshark -r capture.pcap -Y "rtp && udp.port==40000" -T fields -e rtp.payload # 提取RTP载荷,存成原始数据文件 tshark -r capture.pcap -Y "rtp && udp.port==40000" -T fields -e rtp.payload | tr -d '\n' > rtp_audio.raw # 用xxd把十六进制文本转成二进制 xxd -r -p rtp_audio.raw rtp_audio.pcm

生成了.pcm文件之后,用Audacity打开,导入时选择“Raw Data”,编码选择适合G.711的“Unsigned 8-bit PCM”(如果载荷是64kbps的G.711 u-law或A-law,可能需要先做u-law/A-law到线性PCM的转换,Audacity里有对应的滤波选项)。设置好采样率(一般是8000Hz或16000Hz),就能播放通话内容了,flag往往就以两位数口令或一段文本的形式出现在录音里。

3.4 编码格式与静默音频的坑

在多人一起做VoIP题目时,我观察到大家最容易卡住的有两点:一是导出的音频“全是噪声”,二是音频“只听到半句,后半段没声了”。

关于噪声,原因往往是RTP载荷里不只包含语音数据,还可能包含了编码器的一些冗余信息,或者你的解码方式不匹配。G.711有两种变体——u-law和a-law,如果把a-law的载荷按照u-law去播,出来的基本都是噪声。处理办法是在Audacity导入后,用“Effect → Filter Curve”或直接换解码方式试一遍,直到听出人声为止。

关于后半段没声,通常是因为RTP流里存在**静音抑制(VAD,语音活动检测)**机制。说话停了,RTP包就不发了,但这些“空白档”在时间线上是存在的。如果在提取时没有按时间戳把空白补上,直接拼接数据,就会导致音频时间轴缩短、后半段与字幕或文本对不上。处理这类问题,要回到Wireshark里看RTP的Marker和时间戳字段,确认丢包和静音的位置,做到“按时间戳重组”而不是“按包顺序硬拼”。

4. 实操流程:一次完整的CTF流量分析题演示

讲到现在可能还有些抽象,我拿一个典型的CTF流量分析题来完整走一遍流程。这个题是我根据常见出题思路模拟的,但步骤和手法完全是我实际做题时的那一套。

假设你拿到一个名为phone.pcap的文件,题目提示说“flag是一串电话号码,藏在通话中”。我们按完整流程走一遍。

4.1 第一步:全局观察给出预判

打开文件,先看Protocol Hierarchy。如果表格里出现SIP和RTP的统计条目,立刻判定这是VoIP场景。此时的目标已经变了:不是去翻HTTP请求,而是要重建通话音频。

接着看VoIP Calls列表,找到活动通话。我的习惯是把每通电话的主叫号码、被叫号码、时间戳记下来,因为号码本身就是重要的线索,有时候flag直接就是“拨打的主叫号”。

4.2 第二步:用Wireshark导出通话音频

在Telephony → VoIP Calls中双击通话记录,等待RTP Stream Analysis窗口加载。点击“Export”时我推荐选“.au”格式,因为后面还要导入Audacity做处理,.au的兼容性和原始PCM的还原度更好。导出后文件大约是几十KB到几百KB,取决于通话时长。

4.3 第三步:Audacity清洗与播放

把导出的音频拖进Audacity。通常会出现两种情况:

  • 直接就能听到清晰的语音,这是最简单的情况,照着念出flag即可。
  • 播放是“机器人声音”或“水下声音”,这是因为导出的是压缩域格式。这时选择整段音频,执行“Effect → Noise Reduction”先降底噪,再观察波形确定人声频段,必要时用“Effect → Equalization”做频段补偿。还有一种更暴力的方案是直接在Audacity里转换样本格式(底部状态栏的Sample Rate处点击,可切换8kHz/16kHz/32kHz),循环试听即可。

4.4 第四步:tshark手工提取作为兜底

如果Wireshark导出失败,或者题目故意设置了多路通话干扰,就走tshark手工提取路线。先看RTP流有哪些:

tshark -r phone.pcap -Y "rtp" -T fields -e rtp.ssrc -e rtp.payload | head -20

选定一路目标SSRC后,用前面的提取命令把该路载荷全部转成PCM,再用Audacity导入。值得一提的小技巧:在命令行提取时,先用-e rtp.timestamp把时间戳也导出来,比较时间戳的跳变,如果发现严重不连续,说明中间有丢包,这时需要在拼接时按时间戳补零,否则还原出来的语音会断断续续。

4.5 第五步:把“结果”整理成可提交格式

CTF里最后的flag可能是一串电话号码、一句口令或者一个名字。我在听到音频之后,会先写一遍听到的内容,然后倒回去再听一遍校验发音是否清楚。曾经有一次我听成“five”,结果答案是“nine”,因为录音里说话人口音很重,第二遍仔细听才纠正过来。多听一遍校验,虽笨但有用。

5. 干货速查:常见问题与排查手册

最后把这些年做流量分析遇到的高频问题整理成一张表,给新人当“排障手册”用。每条都是实际踩过的坑,不是理论猜测。

问题现象可能原因排查与解决
打开大pcap卡死pcap文件过大,单个包数量超百万先用tshark按IP或端口过滤导出子集,再导入Wireshark;或改用tshark批处理
能导出文件但打不开文件头损坏或扩展名错误用file命令识别真实类型;用binwalk或010 Editor手工修复文件头
HTTP对象列表为空文件不是通过HTTP明文传输的转查FTP(端口21)或SMTP(端口25/110/143),搜关键字“filename”“attachment”
TCP流跟踪出来是乱码流量经过了压缩或加密协议查看是否为HTTPS(TLS),若是则寻找有没有会话密钥;或关注是否有zip类压缩传输,先导出后解压
导出音频全噪声RTP载荷的编码格式判断错误在Audacity里切换a-law/u-law;逐段试听不同采样率
语音断断续续RTP流中有丢包或有静音抑制回到RTP Streams分析看丢包率;提取时按时间戳拼接,丢失段补零
同一pcap有多个SIP通话题中故意录制了多路干扰通话逐条在VoIP Calls里试听,或根据SIP的Call-ID精确过滤出一路RTP再处理
strings扫不到flag传输内容编码过或藏在非文本协议里换binwalk拆文件,检查每个导出的附件;关注DNS查询字段、ICMP载荷等“低频”位置
时间线混乱,不知道从哪看起捕获的流量跨度大、无关流量多在Wireshark里用时间显示格式(View→Time Display Format)调成相对时间,以首包为0起点,按时间顺序切分分析
协议分级里看不到SIP/RTP用的端口非默认端口编辑→首选项→Protocols→SIP/RTP,自定义端口重新解析;或者直接看UDP载荷中SIP方法字段(INVITE/REGISTER)

上面这些坑,大多不是某一个动作导致的,而是“前面选错了方向”累积出来的。所以我的核心建议仍然是:拿到pcap先定场景、再看统计、最后才动手挖细节,这个顺序能帮你跳过一大半的坑。

提示:做流量分析时,我建议每做一个关键动作都做一个书面记录,比如“看到什么协议、导出了什么文件、结论是什么”。很多流量分析题的pcap里不止一条线索,写下来能让思路清晰很多,也避免重复劳动。

6. 个人经验:流量分析要“先理解,再点工具”

最后分享一点我个人的体会。

流量分析这个技能,如果只停留在“会用Wireshark”的层面,遇到没见过的题很容易慌。但如果你把底层逻辑理顺了——数据包是分层的、协议是有状态的、信息是可以重组的——那不管出题人把flag藏在明文、文件、图片还是通话录音里,你的应对思路都能自然生成。

我在带新人时反复强调一个观点:工具只是放大器,理解才是杠杆。你按这篇文里说的流程练过两三次之后,建议我不给详细步骤,只给场景标题,让脑子先想“应该怎么做”,再看实操步骤对不对。这样训练出来的“场景→动作”反射,比记住一百条菜单栏路径都管用。

再分享一个小技巧:处理任何pcap之前,先用tshark输出一份“精简清单”,只包含时间、协议、源目IP、长度这几个字段:

tshark -r capture.pcap -T fields -e frame.time_relative -e ip.src -e ip.dst -e frame.len -e protocol | head -100

这份清单能让你在一分钟内快速浏览整份流量的骨架,有助于发现问题、提取线索、定位目标。很多人一上来就陷入数据包的“森林”里,这份骨架清单就是你的地图。

流量分析这门功夫,练的就是“把看不见的信息语言翻译成人话”。从找字符串到还原文件,再到把通话录音变成一句口令,技能维度其实是一个逐步上升的路径。顺着路径走,多踩几次坑、多回头看几次数据包的结构,时间长了,你也会形成那种一看到协议列表就能脱口而出“这题要干嘛”的直觉。

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

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

立即咨询