Wireshark数据包分析实战(第3版)

978-7-115-49431-3
作者: [美]克里斯 ▪ 桑德斯(Chris Sanders)
译者: 诸葛建伟 陆宇翔 曾皓辰
编辑: 陈聪聪

图书目录:

详情

Wireshark是最流行的一款网络嗅探软件,本书在上一版的基础上针对Wireshark 2.0.5和IPv6进行了更新,并通过大量真实的案例对Wireshark的使用进行了详细讲解,旨在帮助读者理解Wireshark捕获的PCAP格式的数据包,以便对网络中的问题进行排错。

图书摘要

版权信息

书名:Wireshark数据包分析实战(第3版)

ISBN:978-7-115-49431-3

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

著    [美] 克里斯•桑德斯(Chris Sanders)

译    诸葛建伟 陆宇翔 曾皓辰

责任编辑 陈聪聪

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315


Copyright © 2018 by No Starch. Title of English-language original: Practical Packet Analysis: Using Wireshark to Solve Real-World Network Problems(3rd Edition), ISBN 978-1-59327-802-1, published by No Starch Press. Simplified Chinese-language edition copyright © 2018 by Posts and Telecom Press. All rights reserved.

本书中文简体字版由美国No Starch出版社授权人民邮电出版社出版。未经出版者书面许可,对本书任何部分不得以任何方式复制或抄袭。

版权所有,侵权必究。


Wireshark是一款流行的网络嗅探软件,本书在上一版的基础上针对Wireshark 2.0.5和IPv6进行了更新,并通过大量真实的案例对Wireshark的使用进行了详细讲解,旨在帮助读者理解Wireshark捕获的PCAP格式的数据包,以便对网络中的问题进行排错。

本书共13章,从数据包分析与数据包嗅探器的基础知识开始,循序渐进地介绍Wireshark的基本使用方法及其数据包分析功能特性,同时还介绍了针对不同协议层与无线网络的具体实践技术与经验技巧。在此过程中,作者结合大量真实的案例,图文并茂地演示使用Wireshark进行数据包分析的技术方法,使读者能够顺着本书思路逐步掌握网络数据包嗅探与分析技能。附录部分列举了数据包分析工具,以及其他数据包分析的学习资源,并对数据包的表现形式展开讨论,介绍如何使用数据包结构图查看和表示数据包。

本书适合网络协议开发人员、网络管理与维护人员、“不怀好意的”的黑客、选修网络课程的高校学生阅读。


本书内容丰富,设计巧妙又通俗易懂。老实说,这本数据包分析的图书让我倍感兴奋。

——TechRepublic

强烈建议初级网络分析师、软件开发人员和刚刚取得CSE/CISSP等认证的人员阅读本书。读完本书后,你们只需要卷起袖子,就可以动手排除网络(和安全)问题了。

——Gunter Ollmann, IOActive前首席技术官

下一次再排查网络变慢的问题时,我将求助本书。对任何技术图书来说,这或许是我能给的最好的评价。

——Michael W. Lucas,Absolute Free BSD and Network Flow Analysis作者

无论你负责多大规模的网络管理,本书都必不可少。

——Linux Pro Magazine

本书写作精良、简单易用、格式良好,相当实用。

——ArsGeek.com

如果你想要熟练掌握数据包分析的基本知识,那么本书是一个不错的选择。

——State Of Security

本书内容丰富,紧扣“实战”主题。它向读者提供了进行数据包分析所需的信息,并借助于真实的实例演示了Wirshark的用途。

——LinuxSecurity.com

网络中有未知的主机之间在互相通信吗? 我的机器正在与陌生的主机通信吗? 你只需要一个数据包嗅探器就可以找到这些问题的答案,Wireshark是完成这项工作的最佳工具之一,而本书是了解该工具的最佳方法之一。

——Free Software Magazine

本书是数据包分析初学者和进阶者的理想之选。

——Daemon News

“天赐恩宠!多么甜美的声音! 

这挽救了像我这样的可怜人!

我曾经迷失过,但是现在我找到了方向;

我曾经盲目过,但是现在我看到了光明。”


对支持我和本书的所有人表示由衷的感谢。

Ellen,感谢你对我无条件的爱,在过去的这段时间里,我占用了你大量的休息时间。

妈妈,即使是在天堂,您树立的善良的榜样也将一直激励我。爸爸,我从您那里知道了什么是艰苦的工作,如果没有你,也就不会有这本书的诞生。

Jason Smith,你就像我的兄弟一样,我非常感谢你一直以来愿意给我提供宝贵的建议。

感谢我过去和现在的同事,能够与那些让我变得更聪明、更善良的人一起工作是我的荣幸。篇幅所限,我不能列举所有人的名字,但真诚地感谢Dustin、Alek、Martin、Patrick、Chris、Mike和Grady支持我并提供了大量的帮助。

感谢担任本书技术主编的Tyler Reguly。我有时会犯愚蠢的错误,是你帮助我避免了这些错误的发生。此外,感谢David Vaughan为本书所做的额外审读工作,感谢Jeff Carrell帮我编辑了IPv6的内容,感谢Brad Duncan提供了在安全章节中使用的捕获文件,并且感谢QA Café团队提供了Cloudshark许可证,我用它组织了本书中用到的那些捕获的数据包。

当然,我还要感谢Gerald Combs和Wireshark开发团队。这是Gerald和数百名其他开发人员的奉献,他们使Wireshark成为了一个如此优秀的分析平台。如果没有他们的努力,信息技术和网络安全将无从谈起。

最后,感谢Bill、Serena、Anna、Jan、Amanda、Alison和No Starch Press的其他工作人员,感谢你们在编辑和制作本书的3个版本时所付出的努力。


本书从2015年底开始编写,在2017年早期完成,总计历时一年半。而在本书出版之日,距离本书第2版发布的时间已经有6年,距离第1版则长达10年之久。本书对内容进行了大量的更新,具有全新的网络捕获文件和场景,并新添了一章内容来讲解如何使用TShark和Tcpdump通过命令行进行数据包分析。如果你喜欢前两个版本,那么相信你也会喜欢这本书。它延续了之前的写作风格,以一种简单易懂的方式来分析解释。如果你因为缺少关于网络或Wireshark更新的最新信息而不愿意尝试之前的两个版本,那么你可以阅读本书,因为这里包含了新的网络协议扩展内容和关于Wireshark 2.x的更新信息。

你一定很想知道为什么应该买这本书,而不是关于数据包分析的其他书籍。答案在于本书的书名:《Wireshark数据包分析实战》。让我们面对这样的现实——没有比实际经验更加重要的了。你可以通过真实场景中的实际案例来掌握书中的内容。

本书的前半部分介绍了理解数据包分析和Wireshark所需的知识,而后半部分则将重心放在了实践案例上,你在日常的网络管理中经常会遇到这些案例中出现的情况。

无论你是网络技术人员、网络管理员、首席信息官、桌面工程师,还是网络安全分析师,在理解并使用本书中讲解的数据包分析技术时,都会让你受益匪浅。

我是一个非常随意的人,所以,当我教授你一个概念时,我也会尝试用非常随意的方式来进行解释。而本书的语言也会同样随意,虽然晦涩的技术术语很容易让人迷失,但我已经尽我所能地保持行文的一致与清晰,让所有的定义更加明确、直白,没有任何繁文缛节。然而我终究是从伟大的肯塔基州来的,所以我不得不收起我们的一些夸张语气,但如果你在本书中看到一些粗野的乡村土话,请务必原谅我。

如果你真的想学习并精通数据包分析技术,你应该首先掌握本书前几章中介绍的概念,因为它们是理解本书其余部分的前提。本书的后半部分将是纯粹的实战内容,或许你在工作中并不会遇到完全相同的场景,但在学习本书后你应该可以应用所学到的概念与技术,来解决你所遇到的实际问题。

接下来让我们快速浏览本书各章的主要内容。

我期待本书按照如下两种方式进行使用。

本书使用的所有捕获文件都可以在异步社区下载,为了将本书的价值最大化,强烈建议下载这些文件,并在学习每个真实案例时使用它们。

在这里,我必须介绍一下由本书而衍生出的美好事物。在本书第1版出版后不久,我创办了一个501(c)(3)的非营利性组织——乡村科技基金会(Rural Technology Fund)。

比起城市与市郊的学生们,乡村的学生即使拥有很优秀的成绩,仍然很少有机会能够接触到最新的科技。创办于2008年的乡村科技基金会(RTF)是我的终极理想。RTF致力于能够减少乡村学生与城市同龄学生们之间的数字鸿沟,为此它有针对性地发起了奖学金项目、社区参与计划、教育技术资源捐赠,以及一些在乡村和贫困地区的科技推广和宣传项目。

2016年,RTF为美国乡村和贫困地区的1万多名学生提供了技术教育资源。我很高兴地宣布,本书作者的所有收入都直接交给RTF来支持这些目标。如果你想了解更多关于农村科技基金的信息或者想知道能为它做些什么,请访问我们的网站或者关注我们的Twitter @RuralTechFund。


本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。

本书提供如下资源:

本书配套资源请到异步社区本书购买页处下载。

要获得以上配套资源,请在异步社区本书页面中点击 ,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。

如果您是教师,希望获得教学配套资源,请在社区本书页面中直接联系本书的责任编辑。

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。

当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,点击“提交勘误”,输入勘误信息,点击“提交”按钮即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

我们的联系邮箱是contact@epubit.com.cn。

如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。

如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/selfpublish/submission即可)。

如果您是学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。

如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。

“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。

“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。

异步社区

微信服务号


在第1章中,我们介绍了几种可以进行网络分析的数据包嗅探工具软件,但在这本书中我们将只使用Wireshark,并在此章进行简要的介绍。

Wireshark的历史相当久远丰富,其最初的版本叫作Ethereal,由毕业于密苏里大学堪萨斯城分校计算机科学专业的Gerald Combs出于项目需要而开发,并于1998年以GNU Public Licence(GPL)开源许可证发布。

在Ethereal发布八年之后,Combs辞职并另谋高就,但是在那个时候他的雇主公司掌握着Ethereal的商标权,而Combs也没能和其雇主就取得Ethereal商标达成协议。于是Combs和整个开发团队在2006年年中的时候将这个项目重新冠名为Wireshark。

Wireshark随后迅速地取得了大众的青睐,而其合作开发团队也壮大到500人以上,然而Ethereal项目却再没有前进过一步。

Wireshark在日常应用中具有许多优点,无论你是初学者还是数据包分析专家,Wireshark都能通过丰富的功能来满足你的需要。在第1章中,我们为挑选数据包嗅探工具提出过一些重要的判断特征,让我们来检查一下Wireshark是否具有这些特征。

支持的协议:Wireshark在支持协议的数量方面是出类拔萃的——于本书截稿时Wireshark已提供了超过1000种协议的支持。这些协议从最基础的IP协议和DHCP协议到高级的专用协议,比如DNP3和BitTorrent等。由于Wireshark是在开源模式下进行开发的,因此每次更新都会增加一些对新协议的支持。

注意

 

在一些特殊情况下,如果Wireshark并不支持你所需要的协议,那么你还可以自己编写代码提供相应的支持,并提供给Wirshark的开发者,以便他们考虑是否将之包含在以后的版本中。你可以在Wireshark的项目网站上找到更多的相应信息。

用户友好度:Wireshark的界面是数据包嗅探工具中一种很容易理解的界面。它基于GUI,并提供了清晰的菜单栏和简明的布局。为了增强实用性,它还提供了类似于不同协议的彩色高亮,以及通过图形展示原始数据细节等不同功能。与类似于Tcpdump使用复杂命令行的那些数据包嗅探工具相比,Wireshark的图形化界面对于那些数据包分析的初学者而言,是十分方便的。

价格:由于Wireshark是开源的,因此它在价格上面是无以匹敌的。Wireshark是遵循GPL协议发布的自由软件,任何人无论出于私人还是商业目的,都可以下载并且使用。

注意

 

虽然Wireshark是免费的,但是仍然会有一些人不小心去“付费”购买它。如果在eBay搜索“数据包嗅探”,你会惊讶地发现会有如此多的人想以$39.95的跳楼价向你出售Wireshark的“专业企业级许可证”。显而易见,这些都是骗人的把戏。但是如果你执意想要购买这些所谓的“许可证”,不如给我打个电话,我正好有些肯塔基的海边别墅要以跳楼价出售。[1]

软件支持:一个软件的成败取决于其后期支持的好坏。虽然像Wireshark这样自由分发的软件很少会有官方正式的支持,它依赖于开源社区的用户群提供帮助。但幸运的是,Wireshark社区是最活跃的开源项目社区之一。Wireshark网站上给出了很多种软件帮助的相关链接,包括在线文档、支持与开发wiki、FAQ。很多顶尖的开发者也都注册并关注着Wireshark的邮件列表。Riverbed Technology也提供了对Wireshark的付费支持。

源码访问:因为Wireshark是开源软件,所以你可以在任何时间访问到其源码。这对查找程序的Bug、理解协议解释器的工作原理或自己贡献代码都有很大帮助。

支持的操作系统:Wireshark对主流的操作系统都提供了支持,其中包括Windows、Mac OS X以及基于Linux的系统。你可以在Wireshark的主页上查询所有Wireshark支持的操作系统列表。

Wireshark的安装过程极其简单,但在安装之前要确保你的机器满足如下要求。

WinPcap驱动是Windows对于pcap数据包捕获的通用程序接口(API)的实现,简单来说就是这个驱动能够通过操作系统捕捉原始数据包、应用过滤器,并能够让网卡切入或切出混杂模式。

虽然你也可以单独下载安装WinPcap,但一般最好使用Wireshark安装包中的WinPcap。因为这个版本的WinPcap经过测试,能够和Wireshark一起工作。

通过测试的当前Wireshark版本,能够在微软仍维护的Windows操作系统上运行,于本书截稿时包括Windows Vista、Windows 7、Windows 8、Windows 10 和 Windows Servers 2003/2008/2012。虽然Wireshark 也可以在一些其他版本的Windows 中运行(比如Windows XP),但这些版本不被官方支持。

在Windows中安装Wireshark的第一步就是在Wireshark的官方网站上找到Download页面,并选择一个镜像站点下载最新版的安装包。在下载好安装包之后,遵照如下步骤实装。

(1)双击.exe文件开始进行安装,在介绍页面上单击Next。

(2)阅读许可证条款,如果同意接受此条款,单击I Agree。

(3)选择你希望安装的Wireshark组件,如图3-1所示。在本书中接受默认设置即可,然后单击Next。

图3-1 选择你想要安装的Wireshark组件

(4)在Aditional Tasks窗口中单击Next。

(5)选择Wireshark的安装位置并单击Next。

(6)当弹出是否需要安装WinPcap的对话框时,务必确保Install WinPcap选项已被勾选,如图3-2所示,然后单击Install。安装过程便会随即开始。

图3-2 将安装WinPcap驱动的选项选中

(7)Wireshark的安装过程进行了大约一半的时候,会开始安装WinPcap。在介绍页面单击Next之后,请阅读许可协议并单击I Agree。

(8)你将选择是否安装 USBPcap选项。这是一个从USB设备中收集数据的工具。勾选你想要的复选框并单击Next。

(9)WinPcap和USBPcap(如果你在上一步勾选了的话)应该已经安装到你的计算机上了,在安装完成之后,单击Finish。

(10)Wireshark应该已经安装到你的计算机上了,在安装完成之后,单击Finish。

(11)在安装确认界面中,单击Finish。

Wireshark可以在大部分基于UNIX的系统中运行。你可以通过系统包管理器下载,并安装针对你的系统所适用的发行版本。我们在这里只介绍几个常见的Linux发行版本的安装步骤。

一般来说,如果作为系统软件安装,你需要具有root权限;但如果你通过编译源代码安装成为本地软件,那么通常就不需要root权限了。

1.基于RPM的系统

对于类似红帽Linux(Red Hat Linux)等使用RPM的Linux发行版,比如 CentOS,很可能系统默认安装了Yum包管理器。如果是这样的话,你可以从发行版本的软件源中获取并快速安装Wireshark。你需要做的是打开一个控制台窗口,并输入以下命令:

$ sudo yum install wireshark

如果需要依赖组件,那么你将通过提示来安装它们。如果一切成功执行,你将可以使用命令行启动它并通过GUI 来操作它。

2.基于DEB的系统

对于类似于Debian和Ubuntu等使用DEB的Linux发行版,你可以使用APT 包管理工具安装Wireshark。要从系统软件源中安装 Wireshark,可打开一个控制台窗口并键入如下命令:

$ sudo apt-get install wireshark wireshark-qt

如果需要依赖组件,那么你将通过提示来安装它们。

3.使用源代码编译

因为操作系统架构和Wireshark 功能的改变,所以从源码安装的方法可能也会随之变化,这也是建议从系统包管理器安装的一个原因。然而,如果你的Linux发行版没有自动安装包管理工具,那么安装Wireshark的一种高效的方法就是使用源代码编译。下面的步骤给出了安装方法。

(1)从Wireshark网站下载源代码包。

(2)键入下面的命令将压缩包解压(将文件名替换成你所下载的源代码包的名称):

$ tar -jxvf <file_name_here>.tar.bz2

(3)在安装和设置 Wireshark之前,可能需要安装一些依赖组件。比如,Ubuntu 14.04需要一些额外的软件包才能让 Wireshark 工作。这些依赖组件可以用以下的命令进行安装(你可能需要使用root权限,你可以在命令前面添加sudo):

$ sudo apt-get install pkg-config bison flex qt5-default libgtk-3-dev 
libpcap-dev qttools5-dev-tools

(4)进入解压缩后创建的文件夹。

(5)root级别的用户使用./configure命令配置源代码以便于其能正常编译。如果你不想使用默认的设置,那么你可以在这时指定安装选项;如果缺少相关软件支持,那么你应该会得到相关错误信息;如果安装成功了,那么你应该可以得到成功提示,如图3-3所示。

图3-3 由./configure命令得到的成功输出

(6)键入make命令将源代码编译成二进制文件。

(7)使用sudo make install命令完成最后的安装。

(8)运行sudo/sbin/ldconfig来结束安装。

注意

 

如果你按照以上步骤操作时出现了错误,那么你可能需要安装额外的软件包。

在OS X系统中安装Wireshark,请依照以下步骤操作。

(1)从Wireshark网站上下载针对 Mac OS X 系统的软件包。

(2)运行安装程序并按照指导依次安装。只有接受了用户使用许可规定,你才能继续安装。

(3)完成安装指引。

在成功地在系统中装好了Wireshark之后,你就可以开始学习使用它了。当你终于打开了这个功能强大的数据包嗅探器时,会发现你什么都看不见!

好吧,Wireshark在刚打开的时候确实不太好玩,只有在拿到一些数据之后事情才会变得有趣起来。

为了能让Wireshark得到一些数据包,你可以开始第一次数据包捕获实验了。你可能会想:“当网络什么问题也没有的时候,怎么能捕获数据包呢?”

第一,网络总是有问题的。如果你不相信,那么请给你网络上所有的用户发一封邮件,告诉他们一切都工作得非常好。

第二,数据包分析并不一定要等到有问题的时候再做。事实上,大多数的数据包分析员在分析没有问题的网络流量上花费的时间要比解决问题的时间多。为了能高效地解决网络问题,你也同样需要得到一个基准来与之对比。举例来说,如果你想通过分析网络流量来解决关于DHCP的问题,那么你至少需要知道DHCP在正常工作时的数据流是什么样子的。

更广泛地讲,为了能够发现日常网络活动的异常,你必须对日常网络活动的情况有所掌握。当你的网络正常运行时,以此作为基准,就能知道网络流量在正常情况下的样子。

闲言少叙,让我们来捕获一些数据包吧!

(1)打开Wireshark。

(2)从主下拉菜单中选择Capture,然后是Interface。

这时你应该可以看到一个对话框,里面列出了你可以用来捕获数据包的各种设备,以及它们的IP地址。

(3)选择你想要使用的设备,如图3-4所示,然后单击Start,或者直接单击欢迎画面中Interface List下的某一个设备。随后数据就会在窗口中呈现出来。

图3-4 选择你想要进行数据包捕获的端口

(4)等上l min左右,当你打算停止捕获并查看你的数据的时候,在Capture的下拉菜单中单击Stop按钮即可。

当你做完了以上步骤并完成了数据包的捕获时,Wireshark的主窗口中应该已经呈现了相应的数据,但此时你可能对于那些数据的规模感到头疼,这也就是我们把Wireshark一整块的主窗口进行拆分的原因。

Wireshark的主窗口将你所捕获的数据包拆分并以更容易使人理解的方式呈现出来,它也将是你花费时间较多的地方。我们使用刚刚捕获的数据包来介绍一下Wireshark的主窗口,如图3-5所示。

主窗口的3个面板之间有着互相的联系。如果希望在Packet Details面板中查看一个单独的数据包的具体内容,那么你必须在Packet List面板中单击选中那个数据包。在选中了数据包之后,你可以在Packet Details面板中选中数据包的某个字段,从而在Packet Bytes面板中查看相应字段的字节信息。

注意

 

图3-5中的Packet List面板中列出了几种不同的协议,但这里并没有使用不同的层次来对不同的协议进行视觉上的区分,所有的数据包都是按照其在链路上接收到的顺序排列的。

图3-5 Wireshark主窗口的设计使用了3个面板

下面介绍了每个面板的内容。

Packet List(数据包列表):这个最上面的面板用表格显示了当前捕获文件中的所有数据包,其中包括了数据包序号、数据包被捕获时的相对时间、数据包的源地址和目标地址、数据包的协议以及在数据包中找到的概况信息等列。

注意

 

当文中提到流量的时候,我通常是指Packet List面板中所有呈现出来的数据包,而当特别地提到DNS流量时,我指的是Packet List面板中DNS协议的数据包。

Packet Details(数据包细节);这个中间的面板分层次地显示了一个数据包中的内容,并且可以通过展开或是收缩来显示这个数据包中所捕获到的全部内容。

Packet Bytes(数据包字节);这个最下面的面板可能是最令人困惑的,因为它显示了一个数据包未经处理的原始样子,也就是其在链路上传播时的样子。这些原始数据看上去一点都不舒服而且不容易理解。

Wireshark提供一些首选项设定可以让你根据需要进行定制。如果需要设定Wireshark首选项,那么需要在主下拉菜单中选择Edit并单击Preferences,然后你便可以看到一个首选项的对话框,里面有一些可以定制的选项,如图3-6所示。

图3-6 你可以使用Preferences对话框中的选项自定义Wireshark的配置

Wireshark首选项分为6个主要部分,外加1个高级选项。

Appearance(外观):这些选项决定了Wireshark将如何显示数据。你可以根据个人喜好对大多数选项进行调整,比如是否保存窗口位置、3个主要窗口的布局、滚动条的摆放、Packet List面板中列的摆放、显示捕获数据的字体、前景色和背景色等。

Capture(捕获):这些选项可以让你对于自己捕获数据包的方式进行特殊设定,比如你默认使用的设备、是否默认使用混杂模式、是否实时更新Packet List面板等。

Filter Expressions(过滤器表达式):在之后的章节里我们将探讨 Wireshark 是如何让你基于设定标准去过滤流量的。这个部分中的选项可以让你生成和管理这些过滤器。

Name Resolutions(名称解析):通过这些设定,你可以开启Wireshark将地址(包括MAC、网络以及传输名称解析)解析成更加容易分辨的名字这一功能,并且可以设定并发处理名称解析请求的最大数目。

Protocols(协议):这个部分中的选项可以让你调整关于捕捉和显示各种Wireshark解码数据包的功能。虽然并不是针对每一个协议都可以进行调整,但是有一些协议的选项可以进行更改。除非你有特殊的原因去修改这些选项,否则最好保持它们的默认值。

Statistics(统计):这一部分提供了Wireshark中统计功能的设定选项。在第5章节我们会对之进行更深入的学习。

Advanced(高级):在以上6个部分中没有做的设置会被归类到这里。通常这些设置只有Wireshark的高级用户才会去修改。

如果你像我一样喜欢五颜六色的物体,那么你应该会对Packet List面板中那些不同的颜色感到兴奋。如图3-7所示(虽然图示是黑白的,但你应该可以理解的),那些颜色看上去就像是随机分配给每一个数据包的,但其实并不是这样的。

图3-7 Wireshark的彩色高亮有助于快速标识协议

每一个数据包的颜色都是有讲究的,这些颜色对应着数据包使用的协议。举例来说,所有的DNS流量都是蓝色的,而HTTP流量都是绿色的。将数据包进行彩色高亮,可以让你迅速将不同协议的数据包分开,而不需要查看每个数据包的Packet List面板中的协议列。你会发现这样做在浏览较大的捕获文件时,可以极大地节省时间。

如图3-8所示,Wireshark通过Coloring Rules(着色规则)窗口可以轻松地查看每个协议所对应的颜色。如果想要打开这个窗口,那么可以在主下拉菜单中选择View并单击Coloring Rules。

你可以创建你自己的着色规则,或者修改已有设置。举例来说,使用下列步骤可以将HTTP流量绿色的默认背景改成淡紫色。

(1)打开Wireshark,并且打开Coloring Rules窗口(View->Coloring Rules)。

(2)在着色规则的列表中找到HTTP着色规则并单击选中。

(3)单击Edit按钮,你会看到一个Edit Color Filter窗口,如图3-9所示。

图3-8 你可以在Coloring Rules窗口中查看并更改数据包的着色

图3-9 在编辑着色过滤器时,前景色和背景色都可以进行更改

(4)单击Background Color按钮。

(5)使用颜色滚轮选择一个你希望使用的颜色,然后单击OK。

(6)再次单击OK来应用改变,并回到主窗口。主窗口此时应该已经重载,并使用了更改过的颜色样式。

当在网络上使用Wireshark时,可能会发现你处理某个协议的工作要比其他协议多得多。这时彩色高亮的数据包能让你的工作更加方便。举例来说,如果你觉得你的网络上有一个恶意的DHCP服务器在分发IP,那么你可以简单地修改DHCP协议的着色规则,使其呈现明黄色(或者其他易于辨认的颜色)。这可以使你更快地找出所有DHCP流量,并让你的数据包分析工作更具效率。你还可以通过基于定制的过滤器创建着色规则,来扩展这些着色规则的使用。

注意

 

就在前不久,我在给本地一群学生展示Wireshark的着色规则时,有一名学生是色盲,但他通过修改着色规则分辨出了以前无法分辨出的协议。这说明了修改着色规则的功能对视觉残障人士提供了一定程度上的可用性。

当我们想直接修改设置时,明确Wireshark 在哪里储存配置文件是很有帮助的。要想找到该文件,你可以在主下拉菜单中单击Help并选择About Wireshark,然后单击Folders标签卡。该窗口如图3-10所示。

图3-10 定位Wireshark配置文件的位置

Wireshark个性化设置最重要的两个位置是个人和全局设置目录。全局设置目录包含着所有默认的配置选项。个人设置目录只包含了针对你账户的配置选项。任何你所做的新配置都将会使用你提供的名字并储存在个人配置文件夹的子目录里。

全局和个人配置目录的区别是重要的,因为任何有关全局设置的改变都将会影响到每一个在该系统中使用Wireshark的用户。

学习了Wireshark 的参数配置后,有些时候会发现你在使用一种配置方案但很快又要切换到另一种配置方案的应用场景。其实我们没必要每次都重新手动设置这些选项,Wireshark 引入了个性化配置方案,让用户可以保存一组配置。

一个配置方案储存了下面的设置。

要查看配置方案列表,可以在主下拉菜单单击Edit,并选择 Configuration Profiles 选项。另一种办法是在屏幕的右下角单击右键并选择Manage Profiles选项。当处在配置方案的那个窗口时,你将会看到Wireshark的预设配置方案,它包含了如图3-11所示的“缺省”、“蓝牙”和“经典”方案。其中“Latency Investigation”方案是我自定义的方案,它被显示为正体,而其他系统全局或默认的方案被显示为斜体。

图3-11 查看配置方案

配置方案窗口可以让你创建、复制、删除和应用配置方案。创建一个新的配置方案是非常简单的。

(1)把Wireshark设置成你想要储存的配置。

(2)在主下拉菜单单击 Edit,并选择 Configuration Profiles 选项,以调出配置方案窗口。

(3)单击加号(+)按钮并且给该方案取名。

(4)单击 OK。

当你想切换配置方案时,在配置方案窗口下选择方案名,然后单击 OK 即可。有一种更快的方法,就是在屏幕的右下角单击配置文件,然后直接选择你想要的那个方案,如图3-12所示。

图3-12 快速转换配置方案

其中一个特别有用的特性就是,每个配置方案都会储存在单独的目录中,这意味着你可以方便地备份和共享给其他人。在图3-10所示的 folders 标签卡下提供了全局和个人配置文件的路径。你只要把那个配置方案的整个目录复制到相同的路径下,就可以把当前配置共享给其他计算机了。

当继续往下读这本书的时候,你也许会需要去创建一些特别的配置方案,来解决常见问题、查找网络延迟的源头和调查安全问题。别被频繁切换配置方案吓着。恰恰相反,这可是很省时间的技巧。我知道很多高手有一堆不同的配置方案用来应对不同的场景。

现在你的Wireshark应该已经安装好并运行起来了,你已经准备好进行数据包的分析了。在下一章中,我们将详细讲述如何处理你所捕获的数据包。

[1] 肯塔基州是美国的一个内陆州。——译者注


虽然使用GUI就能解决大部分问题,但是在有些时候需要使用命令行工具——TShark或Tcpdump。以下列举了可能需要使用命令行工具而不是Wireshark的一些情况。

本章我会展示数据包分析领域常用的两个命令行工具——TShark和Tcpdump。在我看来最好两个工具你都能掌握,但我发现自己在Windows系统上通常使用TShark,而在UNIX系统中则使用Tcpdump。如果你只用Windows系统,那么你也许可以跳过Tcpdump的部分。

TShark是基于终端的Wireshark,它是能够提供大量和Wireshark功能相同的数据包分析应用,但仅限于没有GUI的命令行界面。如果你安装了Wireshark,那么你应该也安装了TShark,除非你在Wireshark安装过程中明确反选了安装TShark。你可以按照以下步骤确认TShark是否安装。

(1)在Windows系统中打开一个命令提示窗口。单击开始菜单,输入cmd,然后单击命令行提示符。

(2)打开Wireshark的安装目录。如果选择默认安装,那么你可以在命令提示符里输入cd C:\Program Files\Wireshark。

(3)输入tshark -v来运行TShark并且打印出版本信息。如果没安装TShark,那么你会收到一个错误消息,提示你这个工具没有安装;如果TShark装好了,你会收到类似下面的版本信息:

C:\Program Files\Wireshark>tshark –v
TShark (Wireshark) 2.0.0 (v2.0.0-0-g9a73b82 from master-2.0
--snip--

如果没安装TShark但你现在又想使用它,那么你可以直接回到Wireshark的安装向导重新安装,并确保默认的TShark安装选项被勾选。

如果想立马开始学习TShark的功能,那么你可以在命令后面加上-h参数。我们在本章之后的小节还会介绍这样的命令。

C:\Program Files\Wireshark>tshark -h

TShark就像Wireshark那样可以在多种操作系统上运行。但是因为它不依赖于操作系统的图形库,所以不同操作系统的用户体验会更趋于一致。正因为如此,TShark在Windows、Linux和OS X上的操作基本相同。然而Tshark在不同平台上的操作有时候也有不同。在本书中,我们把重点放在Windows平台上的TShark,因为TShark主要被设计在Windows上工作。

如果说Wireshark是世界上最流行的图形化数据包分析应用,那么Tcpdump就是世界上最流行的命令行数据包分析应用。因为Tcpdump被设计在基于UNIX的系统上运行,所以它非常易于通过包管理器来安装,甚至可以预装在很多Linux发行版本中。

虽然这本书所讲的大部分内容都针对于Windows,但是关于Tcpdump的章节还是针对UNIX用户的。具体地说,我们会用Ubuntu 14.04 LTS来演示。如果你想在Windows上使用Tcpdump,那么你可以下载安装WinDump。虽然Tcpdump和WinDump的使用体验不完全一样,但是它们的功能基本一样。在WinDump中一些Tcpdump的功能可能会缺失甚至可能会有安全漏洞(我们不会在本书讲WinDump)。

Ubuntu没有预装Tcpdump,但我们可以通过APT包管理系统来简单安装。要安装Tcpdump,请按照以下步骤操作。

(1)打开一个终端窗口并且运行sudo apt-get update,来确保你的软件仓库与最新的软件版本保持同步。

(2)执行命令sudo apt-get install tcpdump。

(3)你会被提示需要安装一些依赖才能够运行Tcpdump。按Y来允许这些依赖的安装,并且当提示时按回车键

(4)一旦安装完成,就可以运行命令Tcpdump -h来执行Tcpdump,并打印出当前版本信息。如果该命令执行成功,则说明你现在可以开始使用Tcpdump了。

sanders@ppa:~$ tcpdump -h
tcpdump version 4.5.1
libpcap version 1.5.3
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqRStuUvxX#] [ -B size ] [ -c count ]
            [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
            [ -i interface ] [ -j tstamptype ] [ -M secret ]
            [ -Q metadata-filter-expression ]
            [ -r file ] [ -s snaplen ] [ -T type ] [ --version ] [ -V file ]
            [ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z command ]
            [ -Z user ] [ expression ]

你可以通过调用man tcpdump,来查看Tcpdump所有可用的命令,就像这样:

sanders@ppa:~$ man tcpdump

我们将介绍其中一些命令的用法。

首先要学习的是如何把当前流量捕获下来并把它们打印到屏幕上。要在TShark里捕获,仅需执行命令tshark。这条命令会从网卡开始抓取当前流量,并会在你的终端窗口上实时显示抓取的结果,如下所示:

C:\Program Files\Wireshark>tshark
  1   0.000000 172.16.16.128 -> 74.125.95.104 TCP 66 1606      80 [SYN]
Seq=0 Win=8192 Len=0 MSS=1460 WS=4 SACK_PERM=1
  2   0.030107 74.125.95.104 -> 172.16.16.128 TCP 66 80      1606 [SYN, ACK]
Seq=0 Ack=1 Win=5720 Len=0 MSS=1406 SACK_PERM=1 WS=64
  3   0.030182 172.16.16.128 -> 74.125.95.104 TCP 54 1606      80 [ACK]
Seq=1 Ack=1 Win=16872 Len=0
  4   0.030248 172.16.16.128 -> 74.125.95.104 HTTP 681 GET / HTTP/1.1
  5   0.079026 74.125.95.104 -> 172.16.16.128 TCP 60 80      1606 [ACK]
Seq=1 Ack=628 Win=6976 Len=0

要在Tcpdump里抓取流量,可执行tcpdump命令。一旦执行这条命令,你的终端窗口就会出现如下所示的内容:

sanders@ppa:~$ tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
21:18:39.618072 IP 172.16.16.128.slm-api > 74.125.95.104.http: Flags [S],
seq 2082691767, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK],
length 0
21:18:39.648179 IP 74.125.95.104.http > 172.16.16.128.slm-api:
Flags [S.], seq 2775577373, ack 2082691768, win 5720, options [mss
1406,nop,nop,sackOK,nop,wscale 6], length 0
21:18:39.648254 IP 172.16.16.128.slm-api > 74.125.95.104.http: Flags [.],
ack 1, win 4218, length 0
21:18:39.648320 IP 172.16.16.128.slm-api > 74.125.95.104.http: Flags [P.],
seq 1:628, ack 1, win 4218, length 627: HTTP: GET / HTTP/1.1
21:18:39.697098 IP 74.125.95.104.http > 172.16.16.128.slm-api: Flags [.],
ack 628, win 109, length 0

注意

 

因为在UNIX系统里抓包需要管理员权限,所以你要以root账户运行Tcpdump,或者在命令前加上sudo。但在很多情况下,你在类UNIX系统上只有受限的普通用户权限。如果你遇到权限方面的问题,那么这可能就是原因所在。

根据你的系统配置,TShark和Tcpdump可能不会默认从你设想的网卡抓取流量。如果这种情况发生了,你就需要手动去明确它。你可以使用TShark的-D参数来列出当前所有可用的网卡,系统会以数字列表的形式打印出网卡信息,如下所示:

C:\Program Files\Wireshark>tshark -D
1.\Device\NPF_{1DE095C2-346D-47E6-B855-11917B74603A} (Local Area Connection*
2)
2.\Device\NPF_{1A494418-97D3-42E8-8C0B-78D79A1F7545} (Ethernet 2)

要使用其中一个网卡,可以在命令后面添加-i参数和上网卡的标号,如下所示:

C:\Program Files\Wireshark>tshark –i 1

这个命令会让TShark只抓取针对Local Area Connection 2网卡的流量,该网卡在列表里被标注为1号。我建议始终明确要从哪个网卡抓取流量,因为虚拟软件和VPN软件会在系统中添加自己的网卡,而且你也需要知道你捕获的网络流量来自哪里。

在Linux或者OS X系统运行Tcpdump的话,请使用ifconfig命令来列出可用的网卡。

sanders@ppa:~$ ifconfig
eth0      Link encap:Ethernet HWaddr 00:0c:29:1f:a7:55
          inet addr:172.16.16.139 Bcast:172.16.16.255 Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe1f:a755/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
          RX packets:5119 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3088 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:876746 (876.7 KB) TX bytes:538083 (538.0 KB)

指明网卡也是用-i参数实现:

sanders@ppa:~$ tcpdump –i eth0

这个命令会让Tcpdump只从eth0网卡中捕获流量。

一旦设置完成,你就可以开始捕获流量了。如果你监听的网卡非常繁忙,那么在你屏幕上所打出的信息可能会滚动得飞快,以至于你来不及去查看它们。这时候我们可以把抓取的包存成文件,然后只从文件中读取我们想要的数据包。

要把抓到的包存为文件,可使用-w参数加上要保存的文件名。抓包进程会持续进行,除非你按下Ctrl-C组合键。流量文件会直接保存到当前执行命令的目录下,除非另指明路径。

下面就是使用TShark命令的一个例子:

C:\Program Files\Wireshark>tshark –i 1 –w packets.pcap

这个命令会把从1号网卡捕获的流量全部写到以packets.pcap命名的文件中。

使用Tcpdump时,类似的命令如下:

sanders@ppa:~$ tcpdump –i eth0 –w packets.pcap

要想从保存的文件中回读数据包,可使用-r参数加上文件名:

C:\Program Files\Wireshark>tshark –r packets.pcap

这个命令会读取packets.pcap中的所有数据并把它们打印到屏幕上。

使用Tcpdump差不多是一样的命令。

sanders@ppa:~$ tcpdump –r packets.pcap

你也许会注意到,如果你要读取的文件包含了太多的数据包,那么你会遇到之前讲过的情况,一大堆的信息在屏幕飞快滚动以至于什么都看不清。这时你可以使用-c参数来限制在屏幕上显示的数据包数量。

比如,使用TShark下面的命令只会显示在捕获文件中最开始的10个包。

C:\Program Files\Wireshark>tshark –r packets.pcap –c10

在Tcpdump里用的是一样的参数:

sanders@ppa:~$ tcpdump –r packets.pcap –c10

抓包的时候也可以使用-c参数,这表明只会抓取前10个包。当和-w参数一起使用时,可以把结果存成文件。

下面是在TShark中此命令的示例:

C:\Program Files\Wireshark>tshark –i 1 –w packets.pcap –c10

还有Tcpdump下的类似命令:

sanders@ppa:~$ tcpdump –i eth0 –w packets.pcap –c10

使用命令行工具的另一个优点是可以自定义输出。一般GUI应用会把所有的信息都告诉你,然后你可以自行寻找所需的内容。命令行工具通常只会显示最简输出,并强制你使用额外的命令参数来挖掘更高级的用法,TShark和Tcpdump也不例外。默认情况下它们只会为一个数据包显示一行输出。如果你想看到协议细节或者单独字节这些更深的内容,就需要使用额外的命令参数了。

在TShark的输出里,每一行代表一个数据包,每一行输出的格式取决于数据包使用的协议类型。TShark底层使用和Wireshark一样的解析器来分析数据包,所以TShark的输出和Wireshark的包列表窗口很像。正因为TShark可以解析七层协议,所以它能够比Tcpdump提供更多的有关包头信息的内容。

Tcpdump中每行也代表一个数据包,根据不同的协议来规范每行的输出格式。因为Tcpdump不依赖于Wireshark的协议解析器,所以第7层的协议信息无法被解码。这也是Tcpdump的最大限制之一。取而代之的是,Tcpdump单行数据包只会根据传输层协议(TCP或UDP)进行解码(我们会在第8章里着重讲解)。

TCP包使用以下格式:

[Timestamp] [Layer 3 Protocol] [Source IP].[Source Port] > [Destination IP].
[Destination Port]: [TCP Flags], [TCP Sequence Number], [TCP Acknowledgement
Number], [TCP Windows Size], [Data Length]

UDP包使用以下格式:

[Timestamp] [Layer 3 Protocol] [Source IP].[Source Port] > [Destination IP].
[Destination Port]: [Layer 4 Protocol], [Data Length]

这种简单的单行总结对快速分析很有帮助,但最终你还是要对一个数据包进行深入分析。在Wireshark中,你会在包列表窗口里选择一个数据包,它将在下方的包细节和包字节窗口显示一些细节内容。使用命令行的命令也可以达到类似效果。

一个获取更多细节的简单方法是增加输出的冗余程度。

在TShark中,使用大写的V来增加冗余:

C:\Program Files\Wireshark>tshark –r packets.pcap –V

这会提供类似Wireshark打开packets.pcap后包细节窗口里的内容。这里展示了一具具有正常冗余(基本总结)和扩展冗余(使用-V参数获取)的包的示例。

首先正常输出:

C:\Program Files\Wireshark>tshark -r packets.pcap -c1
  1   0.000000 172.16.16.172 -> 4.2.2.1      ICMP Echo (ping) request
id=0x0001, seq=17/4352, ttl=128

现在使用更大的冗余选项来显示更多的内容:

C:\Program Files\Wireshark>tshark -r packets.pcap -V -c1
Frame 1: 74 bytes on wire (592 bits), 74 bytes captured (592 bits) on
interface 0
    Interface id: 0 (\Device\NPF_{C30671C1-579D-4F33-9CC0-73EFFFE85A54})
    Encapsulation type: Ethernet (1)
    Arrival Time: Dec 21, 2015 12:52:43.116551000 Eastern Standard Time
     [Time shift for this packet: 0.000000000 seconds]
--snip--

在Tcpdump,小写的v是用来增加冗余的。这点跟TShark略有不同,Tcpdump允许每个数据包显示不同层级的冗余信息。你可以通过增加v参数的数量来增加显示层级,至多到第3层,如下所示:

sanders@ppa:~$ tcpdump –r packets.pcap –vvv

下面是在相同数据包下,Tcpdump使用默认冗余选项和更高一级的冗余选项之间的比较。即便使用最大冗余选项,输出的信息也很难达到TShark那样的丰富度。

sanders@ppa:~$ tcpdump -r packets.pcap -c1
reading from file packets.pcap, link-type EN10MB (Ethernet)
13:26:25.265937 IP 172.16.16.139 > a.resolvers.level3.net: ICMP echo request,
id 1759, seq 150, length 64
sanders@ppa:~$ tcpdump -r packets.pcap -c1 -v
reading from file packets.pcap, link-type EN10MB (Ethernet)
13:26:25.265937 IP (tos 0x0, ttl 64, id 37322, offset 0, flags [DF], proto
ICMP (1), length 84)
    172.16.16.139 > a.resolvers.level3.net: ICMP echo request, id 1759, seq
150, length 64

可以显示出多少细节取决于你当前分析数据包的协议类型。虽然高冗余级别是有用的,但是有时也很难让我们看清所有的内容。TShark和Tcpdump储存了每个包的所有内容,你可以以十六进制字节或它的ASCII表示形式来查看。

在TShark里,你可以使用-x参数来查看数据包的ASCII形式或十六进制字节形式,同时结合-r参数把捕获文件读取到TShark里并显示出来。

C:\Program Files\Wireshark>tshark –xr packets.pcap

显示结果很像Wireshark的包字节窗口,如图6-1所示。

图6-1 在TShark里以十六进制字节形式或ASCII形式表示原始数据包

类似地在Tcpdump里,你可以使用-X参数,来查看数据包的ASCII形式或十六进制字节形式,同时结合-r参数把捕获文件读取到Tcpdump里并显示出来,就像这样:

sanders@ppa:~$ tcpdump –Xr packets.pcap

这条命令的输出结果如图6-2所示。

图6-2 在Tcpdump里以十六进制字节形式或ASCII形式表示原始数据包

如果你需要的话,Tcpdump还允许你获得更多的粒度。你可以使用-x(小写)参数只查看十六进制输出或者使用-A参数只输出ASCII形式。

如果你添加了这些增加冗余的选项,则当数据输出在屏幕上飞快滚动时你会容易感到眼花缭乱。我以为,要做到最有效率的分析就要在命令行使用最少的信息显示你最关心的内容。我建议从默认的输出格式开始,当你有特别的包需要深入分析时,再使用更详细的输出选项。这种策略会避免你被大量数据所淹没。

类似Wireshark,TShark和Tcpdump也会尝试名称解析,即把地址和端口号转换为名称。如果你注意之前的例子,也许已经发现这一过程已默默地发生了。就像之前提到的,我通常会把它关掉来避免产生更多网络流量的可能。

你可以通过-n参数来禁用TShark的名称解析。这个参数可以和其他参数一起使用来增强可读性。

C:\Program Files\Wireshark>tshark –ni 1

你可以通过-N参数来启用或禁用一些名称解析的特定功能。如果使用-N参数,则所有的名称解析功能将会被禁用,除非你明确指定一些功能的启用。举例来说,下面的命令仅会启用传输层(端口服务名称)的解析。

C:\Program Files\Wireshark>tshark –i 1 –Nt

你可以结合多个值,下面这个命令会启用传输层和MAC层的解析。

C:\Program Files\Wireshark>tshark –i 1 -Ntm

当使用该选项时可能参考以下值。

m:MAC地址解析。

n:网络地址解析。

t:传输层(端口服务名称)解析。

N:使用外网解析服务。

C:使用当前DNS解析。

在Tcpdump下,使用-n会禁用IP名称解析,使用-nn也会禁用端口服务解析。

这个参数也可以和其他命令相结合使用,就像这样:

sanders@ppa:~$ tcpdump –nni eth1

下面的例子展示了一个捕获的数据包先启用端口解析,然后再禁用(-n)。

sanders@ppa:~$ tcpdump -r tcp_ports.pcap -c1
reading from file tcp_ports.pcap, link-type EN10MB (Ethernet)
14:38:34.341715 IP 172.16.16.128.2826 > 212.58.226.142.❶http: Flags [S], seq
3691127924, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
sanders@ppa:~$ tcpdump -nr tcp_ports.pcap -c1
reading from file tcp_ports.pcap, link-type EN10MB (Ethernet)
14:38:34.341715 IP 172.16.16.128.2826 > 212.58.226.142.❷80: Flags [S], seq
3691127924, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0

这些命令仅从捕获文件tcp_ports.pcap中读取了第一个包。在第一个命令里,80端口被解析为http。但在第二个命令,端口仅以数字形式表示。

TShark和Tcpdump的过滤器是非常灵活的,因为它们都遵从BPF捕获过滤器语法。TShark也可以使用Wireshark的显示过滤器表达式。就像Wireshark一样,TShark的捕获过滤器可以边捕获边过滤,也可以在捕获完成后过滤显示结果。我们从TShark的捕获过滤器开始讲起。

使用-f参数来应用捕获过滤器,在双引号内请遵从BPF的语法。下面这条命令仅会抓取和储存目的端口号是80的TCP流量:

C:\Program Files\Wireshark>tshark –ni 1 –w packets.pcap –f "tcp port 80"

使用-Y来应用显示捕获器,请在双引号内使用Wireshark的过滤器语法。在抓取流量的过程中,你可以使用像下面的命令:

C:\Program Files\Wireshark>tshark –ni 1 –w packets.pcap –Y "tcp.dstport == 80"

使用类似的命令显示过滤器可以应用在已经捕获的文件中。以下命令会显示packets.pcap中所有符合过滤表达式的包:

C:\Program Files\Wireshark>tshark –r packets.pcap –Y "tcp.dstport == 80"

在Tcpdump中你可以在单引号里构造过滤表达式,然后附到命令的最后。以下的命令依然会捕获和存储目的端口号是80的TCP流量:

sanders@ppa:~$ tcpdump –nni eth0 –w packets.pcap 'tcp dst port 80'

当读取捕获文件时你也可以构造过滤器。以下命令会显示packets.pcap中所有符合过滤表达式的包:

sanders@ppa:~$ tcpdump –r packets.pcap 'tcp dst port 80'

需要牢记的一点是,如果没有在抓包的时候指明过滤器,那么你的捕获文件里通常会含有其他数据包。读取这个捕获文件后,你仅仅在屏幕上限制了所打出来的内容。

那么如果你有一个包含大量各种类型数据包的捕获文件,而你又想把需要的数据包过滤出来另存为一个文件,这时候怎么办呢?你可以结合使用-w和-r参数来解决:

sanders@ppa:~$ tcpdump –r packets.pcap 'tcp dst port 80' –w http_packets.pcap

这个命令会先读取packets.pcap,过滤出目的TCP端口为80的数据包(http用的端口),最后把这些数据包写入一个名叫http_packets.pcap的新文件里。当你既想把大型原文件.pcap保存起来,又想在某时专注于分析其中一小部分时,这是个很常见的技巧。我经常使用这个技巧,特别是当我要把很大的捕获文件用Tcpdump切小,然后再放到Wireshark里分析时。毕竟小文件更加容易处理。

除了在一行命令后面直接加上过滤表达式,Tcpdump还允许你指定一个包含一系列过滤器的BPF文件。这在有些情况下十分方便,特别是当你要应用一个极其复杂的过滤器表达式,且长度不能和Tcpdump的命令保持在同一行时。你可以使用-F参数来指派一个BPF过滤器文件,就像这样:

sanders@ppa:~$ tcpdump –nni eth0 –F dns_servers.bpf

如果你的BPF文件太大,那么你也许会加一些注释,以帮助你理解每个部分的过滤表达式的功能和结构。值得注意的是,在BPF文件里直接加注释是非法的,如果不是BPF语法的话就会报错。但又因为注释对于解密大型BPF文件是非常有帮助的,所以我通常会使用两份BPF文件,一份不包含任何注释,是载入到tcpdump里的;另一份含有注释以供参考。

TShark里一个经常让新手们感到困惑的问题就是默认的时间戳。它显示从数据包捕获开始的相对时间戳。有些时候这种时间戳格式还比较有用,但在很多情况下你想看到的是包捕获的实际时间,而这是Tcpdump所使用的时间戳默认值。要想和Tcpdump的输出格式一样,你可以使用-t参数再加上值ad以显示绝对时间。

C:\Program Files\Wireshark>tshark –r packets.pcap –t ad

这里是一个基于同样的捕获文件使用默认的相对时间戳❶和绝对时间戳❷之间的比较:

❶ C:\Program Files\Wireshark>tshark -r packets.pcap -c2
     1 0.000000 172.16.16.172 -> 4.2.2.1       ICMP Echo (ping)
   request id=0x0001, seq=17/4352, ttl=128
     2 0.024500 4.2.2.1 -> 172.16.16.172       ICMP Echo (ping)
   reply id=0x0001, seq=17/4352, ttl=54 (request in 1)
❷ C:\Program Files\Wireshark>tshark -r packets.pcap -t ad -c2
     1 2015-12-21 12:52:43.116551 172.16.16.172 -> 4.2.2.1 ICMP Echo (ping)
   request id=0x0001, seq=17/4352, ttl=128
     2 2015-12-21 12:52:43.141051 4.2.2.1 -> 172.16.16.172 ICMP Echo (ping)
   reply id=0x0001, seq=17/4352, ttl=54 (request in 1)

通过使用-t参数,你可以自定义时间显示格式,就像你在Wireshark里看到的那样。这些格式值的含义都在表6-1中。

表6-1 TShark中可用的时间显示格式

时间戳

示例

a

包被捕获的绝对时间(在您的时区)

15:47:58.004669

ad

包被捕获的带日期的绝对时间(在您的时区)

2015-10-09 15:47:58.004669

d

自之前捕获的数据包以来的增量(时差)

0.000140

dd

之前显示的数据包

0.000140

e

亿元时间(1970年1月1日以来的秒数)

1444420078.004669

r

第一个数据包和当前数据包之间的运行时间

0.000140

u

捕获数据包的绝对时间(UTC)

19:47:58.004669

ud

带日期的捕获数据包的绝对时间(UTC)

2015-10-09 19:47:58.004669

然而Tcpdump不提供这样多层面时间戳格式的控制。

TShark的另一个有用的功能(也是比Tcpdump先进的功能),是它可以从捕获的文件中生成统计的一个子集。很多这些统计功能在Wireshark中都能找到影子,但是TShark提供了简单的命令方式来进行访问。使用-z参数加上输出的名字可以生成统计信息。你可以使用以下命令查看所有可用的统计:

C:\Program Files\Wireshark>tshark –z help

很多我们之前学过的功能都可以用-z参数实现。这其中包括了输出端点和会话的命令:

C:\Program Files\Wireshark>tshark -r packets.pcap –z conv,ip

这个命令从packets.pcap中打印出了有关IP会话的信息的统计图表,如图6-3所示。

图6-3 使用TShark来查看会话统计

你也可以使用这个参数来查看特定协议的信息,如图6-4所示。你可以使用http, tree选项,以表的形式来分解HTTP的请求和返回数据包。

C:\Program Files\Wireshark>tshark -r packets.pcap –z http,tree

另一个非常有用的功能是查看已完成排序的输出流,就像之前我们在Wireshark里先右键单击一个数据包然后选择“跟随TCP流”一样。要想获得这个输出,我们需要使用follow选项,并且指明流的类型、输出模式和我们想显示出的流。你可以通过会话统计最左列的序号来表示一段流,类似命令如下所示:

C:\Program Files\Wireshark>tshark -r http_google.pcap -z follow,tcp,ascii,0

图6-4 使用TShark来查看HTTP请求和返回统计

这条命令还会以ASCII形式将http_google.pcap的0号TCP流打印到屏幕上。这个命令的输出如下所示:

C:\Program Files\Wireshark>tshark -r http_google.pcap -z

--snip--
===================================================================
Follow: tcp,ascii
Filter: tcp.stream eq 0
Node 0: 172.16.16.128:1606
Node 1: 74.125.95.104:80
627
GET / HTTP/1.1
Host: www.google.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.7)
Gecko/20091221 Firefox/3.5.7
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: PREF=ID=257913a938e6c248:U=267c896b5f39fb0b:FF=4:LD=e
n:NR=10:TM=1260730654:LM=1265479336:GM=1:S=h1UBGonTuWU3D23L;
NID=31=Z-nhwMjUP63e0tYMTp-3T1igMSPnNS1eM1kN1_DUrnO2zW1cPM4JE3AJec9b_
vG-YFibFXszOApfbhBA1BOX4dKx4L8ZDdeiKwqekgP5_kzELtC2mUHx7RHx3PIttcuZ

        1406
HTTP/1.1 200 OK
Date: Tue, 09 Feb 2010 01:18:37 GMT
Expires: -1
 
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Server: gws
Content-Length: 4633
X-XSS-Protection: 0

你也可以通过提供地址细节,来指明想要查看哪个数据流。例如,下面的命令会获取一个指明端点和端口的UDP流:

C:\Program Files\Wireshark>tshark –r packets.pcap –z follow,udp,ascii,192.168.
1.5:23429❶,4.2.2.1:53❷

这条命令会打印packets.pcap中端口23429上的192.168.1.5端点和端口53上的4.2.2.1端点的UDP流。

以下是我个人最爱的统计选项。

ip_hosts,tree:在一段捕获中显示每个IP地址,并统计每个IP地址在所占流量的比率。

io, phs:分层级统计在捕获文件中找到的所有协议。

http,tree:显示关于HTTP请求和回应的统计。

http_req,tree:显示每个HTTP请求的统计。

smb,srt:显示关于Windows会话的SMB命令的统计。

endpoints,wlan:显示无线端点。

expert:从捕获中显示专家信息(对话、错误等)。

当你使用-z参数时会有很多有用的选项,把它们都描述一遍会占用大量的篇幅。但是如果你经常使用TShark,我还是建议你在官方文档上花点时间学习一下所有可用的选项。

本章介绍了两个基于命令行的数据包分析应用,它们都能很好地胜任分内的工作,而且无论其中哪一款都可以通过各种选项来完成你手头上的任何工作。这里列出两个工具的几点差别,可以让你根据需求选择最适合的那个。

操作系统:Tcpdump只能在基于UNIX的系统下运行,而TShark既可以工作在Windows下,又可以工作在基于UNIX的系统下。

协议支持:两个工具都支持常见的第3层和第4层的协议,但Tcpdump对第7层的协议支持不足。TShark提供了丰富的第7层协议支持,因为它在底层使用Wireshark的协议解析器。

分析功能:两个工具都必须依赖手工分析才能生成有价值的结果。但是TShark还提供了类似于Wireshark的强大统计分析功能,在GUI不可用时能够协助分析。

其实个人习惯和工具的可用性才是选择哪个应用的决定性因素。幸运的是,这些工具的使用方式都是类似的,学会其中一个就能很快上手另一个,正所谓技多不压身。


相关图书

CTF快速上手:PicoCTF真题解析(Web篇)
CTF快速上手:PicoCTF真题解析(Web篇)
数字银行安全体系构建
数字银行安全体系构建
软件开发安全之道概念、设计与实施
软件开发安全之道概念、设计与实施
企业信息安全体系建设之道
企业信息安全体系建设之道
内网渗透技术
内网渗透技术
深入浅出密码学
深入浅出密码学

相关文章

相关课程