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

978-7-115-30236-6
作者: 【美】Chris Sanders
译者: 诸葛建伟陈霖许伟林
编辑: 傅道坤

图书目录:

详情

Wireshark是最流行的一款网络嗅探软件。本书通过45个案例场景对Wireshark的使用进行了详细讲解。通过本书的学习,读者可以掌握如何理解Wireshark捕获的数据,如何使用数据包分析来识别和解决常见的网络故障,以及如何实施监控网络等知识。

图书摘要

版权信息

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

ISBN:978-7-115-30236-6

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

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

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

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


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

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

版权所有,侵权必究。


内容提要

本书从网络嗅探与数据包分析的基础知识开始,渐进地介绍Wireshark的基本使用方法及其数据包分析功能特性,同时还介绍了针对不同协议层与无线网络的具体实践技术与经验技巧。在此过程中,作者结合一些简单易懂的实际网络案例,图文并茂地演示使用Wireshark进行数据包分析的技术方法,使读者能够顺着本书思路逐步地掌握网络数据包嗅探与分析技能。最后,本书使用网络管理员、IT技术支持、应用程序开发者们经常遇到的实际网络问题(包括无法正常上网、程序连接数据库错误、网速很卡,以及遭遇扫描渗透、ARP欺骗攻击等),来讲解如何应用Wireshark数据包分析技术和技巧,快速定位故障点,并找出原因以解决实际问题。本书覆盖了无线WiFi网络中的嗅探与数据包分析技术,同时也给出了嗅探与数据包分析领域丰富的参考技术文档、网站、开源工具与开发库等资源列表。

本书适合网络管理员、安全工程师、软件开发工程师与测试人员,以及网络工程、信息安全等专业学生与网络技术爱好者阅读。


Chris Sanders是一名计算机安全咨询顾问、作家和研究人员。他还是一名SANS导师,持有CISSP、GCIA、GCIH、GREM等行业证书,并定期在WindowsSecurity.com网站和自己的博客ChrisSanders.org发表文章。Sanders每天都会使用Wireshark进行数据包分析。他目前居住在美国南卡罗米纳州查尔斯顿,以国防承包商的身份工作。


我非常期盼能够收到本书读者的反馈,如果你出于任何原因想联系我,你可以将你的疑问、评论、批评,甚至是求婚信,直接发送到我的电子邮箱chris@chrissanders.org,我经常在http://www.chrissanders.org/发表博客,也欢迎你在Twitter上成为@chrissanders88的粉丝。


本书的成功出版离不开很多人的直接贡献和间接支持。

爸爸,我从很多来源获得动力,但比起听到你说你因为我而骄傲,没有其他任何事情能够让我更加高兴。对此,我对你真是感谢不尽。

妈妈,本书第2版将在你过世10周年纪念日的前夕出版,我知道你一直在天堂注视着我,并为我而自豪,我希望我能够继续努力,能够让你更加为我自豪。

Debi叔叔和Randy阿姨,你们从我写书的第一天起就是我最大的支持者。我没有一个大家庭,但我非常珍视我所拥有的亲情,特别是你们。尽管我们并没有能像我所期望的那样经常会面,但我深深地感谢你们,对我来说,你们和我的亲生父母没有差异。

Tina Nance, 虽然最近我们并没有像以前那样有很多的交谈,但我一直将你视作我第二个母亲。如果没有你的支持和信任,我今天不会在做我自己想做的事情。

Jason Smith,你比其他任何人都承受了更多我的牢骚,仅仅这样对我来说都已经是很大的帮助了。谢谢你成为我的好朋友和合作者,在很多项目中为我提供了建议,并让我占用了你家的车库长达6个月之久。

感谢我的同事们(过去的和现在的),我一直相信如果一个人周围都是好人的话,他也会成为一个好人。我非常幸运能够和一些优秀人士一起工作,你们是最棒最聪明的,你们是我的家人。

Mike Poor,你是我毋庸置疑的数据包分析技术的崇拜偶像。你的工作与达成目标的方法一直在给我启迪,并帮助我做我想要做的事情。

Tyler Reguly,非常感谢你为本书承担技术编辑的角色,我知道这并不是个有趣的活儿,但是绝对必要并需要感谢。

同样需要特别感谢Gerald Combs和Wireshark开发团队,正是Gerald和其他几百位开发者的无私投入,才让Wireshark能够成为如此强大的分析平台。如果没有他们的贡献,本书也不会存在……即使存在,也可能是基于tcpdump,那么就不会像现在这样有趣。

感谢Bill和No Starch出版社的同仁给予我这位来自肯塔基州的小人物不仅仅是一次,而是两次的机会,谢谢你们对我的容忍和耐心,并帮助我让我的梦想成真。


关于译者

诸葛建伟,博士,现为清华大学网络与信息安全实验室副研究员、狩猎女神科研团队负责人、CCERT紧急响应组成员、著名开源信息安全研究团队The Honeynet Project的正式成员,以及中国蜜网项目组(www.honeynet.org.cn)团队发起人和现任负责人、信息安全领域培训讲师和自由撰稿人,编写与参与翻译的畅销图书有《网络攻防技术与实践》、《Metasploit渗透测试指南》等。新浪微博:@清华诸葛建伟。

陈霖,现就读于洛桑联邦理工学院硕士项目,于北京大学获得计算机科学学士学位。新浪微博:@Larch爱刀刀。

许伟林,现为清华大学网络与信息安全实验室助理工程师,于北京邮电大学获得计算机科学学士学位,曾两次参与Google Summer of Code计划,分别为Nmap和The Honeynet Project贡献IPv6主机发现模块与IPv6攻击检测器的开源代码,并负责新浪微博 @Nmap网络扫描的维护工作。新浪微博:@许伟林。


谨以此书献给中国农村渴望得到更多计算机基础教育的孩子们!

本书是一本非常实用的网络技能培训技术图书,以最为流行和强大的开源数据包抓包与分析工具——Wireshark——作为基础软件,通过大量生动的真实场景案例来讲解数据包分析的基础技术、高级特性与实际应用技能。

Wireshark在2011年最新的SecTools安全社区流行软件排行榜中,超越Metasploit、Nessus、Aircrack与Snort,占据榜首位置,这充分体现了Wireshark软件在网络安全与取证分析方面的重要作用与流行度。与此同时,Wireshark更是一个通用化的网络数据嗅探器与协议分析器,在网络运行管理、网络故障诊断、网络应用开发与调试等各个方面都作为基本手头工具,而被网络管理员、软件开发工程师与测试人员所广泛使用。

尽管网络数据包分析技术是网络管理员、安全工程师、软件开发工程师与测试人员必备的基本技能,然而可惜的是国内却没有优秀的实用技术培训教材与书籍。在这广大技术人群遭遇一些实际网络问题,或是对Wireshark等网络嗅探器与协议分析器的使用存在疑问时,他们并没有系统性的资料去学习掌握基础知识与技能,并掌握相关技能与方法来解决工作中的实际挑战,而往往只能寄希望于在网络上搜索一些零散并且可能过时的信息来探索尝试,从而花费了大量宝贵时间,并对数据包分析技术的自我修炼不得要领。

本书(英文版)原是国外一本非常优秀、高度注重基础性与实用性的网络数据包分析技术教程,细致地讲解了网络数据包嗅探与分析的技术原理,并以目前最流行的网络数据包嗅探与分析开源工具Wireshark作为平台软件,一步步引导读者们掌握使用Wireshark进行实际网络中数据包分析、故障定位与问题解决的实践技术方法。

在本书的章节设计上,作者从网络嗅探与数据包分析的基本知识背景开始,以简练清晰的语言帮助读者首先建立起网络协议与数据包结构、不同网络场景下的嗅探方法等方面的基础知识,然后渐进地介绍Wireshark的基本使用方法、Wireshark的数据包分析功能特性,以及针对不同协议层与无线网络的具体实践技术和经验技巧,在此过程中,作者使用了简单易懂的一些实际网络案例,图文并茂地结合这些具体案例来演示使用Wireshark进行数据包分析的技术方法,使读者能够顺着本书思路逐步地掌握网络数据包嗅探与分析的技能。最后,本书以网络管理员、IT技术支持、应用程序开发者经常遇到的实际网络问题,包括无法正常上网、部署分部网络、程序连接数据库错误、网速很卡,以及遭遇扫描渗透与ARP欺骗攻击等,来讲解如何应用Wireshark数据包分析技术和技巧,快速定位故障点与原因并解决实际问题。本书也覆盖了无线WiFi网络中的嗅探与数据包分析技术,同时也给出了在嗅探与数据包分析领域丰富的参考技术文档、网站、开源工具与开发库等资源列表。

本书原版取得了国外读者的一致好评,在Amazon网络安全领域图书销售排名位居Top 20,以及4星半的良好评价,也验证了本书在网络安全领域的重要程度。此外,本书在2007年第一版基础上又增加了更多的技术内容和案例,是通过了市场检验的一本好书。

更加难能可贵的是,本书作者Chris Sanders是带着一颗善良感恩的心完成了本书的创作。他出生于美国的乡村地区,在通过自身努力成为一位网络技术专家后,成立了一家乡村科技基金会,并将本书的所有版税捐赠出来,为乡村学生设立奖学金,致力于减少乡村学生与城市同龄学生们之间的数字鸿沟。

本书和译者也非常有缘,在2011年10月为电子工业出版社进行书籍评估时,译者就已经对本书赞誉有加,并给出了引进的建议。之后,在本书中文版权的激烈竞争中,人民邮电出版社最终胜出,这也让译者一度认为无缘这本优秀的作品。机缘巧合的是,在新浪微博上回复一位读者@过来的微博评论时,译者向几个出版社编辑微博发出本书“通缉令”,意外地从人民邮电出版社编辑那获知了本书下落,也非常高兴地接受了他们的翻译邀请。为了平衡翻译质量和进度,我们组织起了3人的译者团队,由诸葛建伟译序、前言和第1~3章,陈霖译第4~7章,许伟林译第8~11章与附录。全书内容由诸葛建伟进行全面、仔细的统稿与审校,并由陈爱华、陈建军、刘跃、崔丽娟进行了试读。本书翻译正值学校暑假,因此译者团队也都投入了充分的时间来保障翻译质量,仔细推敲和统一全书技术词汇的译法,确保对翻译内容的技术掌控,从而能够忠实地描述出原书作者期望传递给读者的知识与技能。

在翻译到前言部分,获知本书作者的成长经历以及对乡村学生所做的公益事业,译者团队感同身受,三位译者中的两位也是从中国的农村地区成长起来的,也都还深刻地记忆着第一次接触到学习机和电脑时那种兴奋异常的感觉。在走向小康社会的今日中国,仍然有这样一个被社会边缘化的群体,他们渴望了解这个世界更多,渴望在互联网世界里遨游,但他们却因为贫困而无法跨越数字鸿沟。这就是农民工子弟学校计算机教育的现状,而在广大的农村地区,问题更加严重。1.5亿农村中小学生,竟然有77.3%从来没有见过电脑!但与此同时,我们看到,社会上存在着大量的废旧电脑资源,城市里每年淘汰的电脑就达500万台。

当你要淘汰掉手中“没有价值”的旧电脑,你能否记起那些求知若渴的孩子们?科技更新换代越来越快,许多旧电脑只要经过简单的整修,便可继续使用至少2年。

因此译者团队达成共识,将本书的公益特性进行到底,决定将本书的译者稿费捐赠给清华大学学生教育扶贫公益协会,通过@电脑传爱活动,将旧电脑维修之后,为打工子弟小学建立电脑室,将公益的精神传递下去。我们也非常欢迎读者能够参与公益事业,事实上,各位读者在购买本书的同时,就已经为公益做出了一份贡献。如果你愿意捐赠淘汰的电脑和计算机基础书籍,欢迎通过新浪微博@电脑传爱,也可以@清华诸葛建伟。如果你是高校学生,希望通过电脑维修做些公益并积累社会实践经验,也非常欢迎加入到@电脑传爱组织的高校电脑维修公益志愿者活动。

公益是举手投足之间的事,我们倡议,每个人为社会公益奉献一点点,让它汇成可以改变世界的力量!

一台电脑开启一扇窗,一次行动传递一份爱!

清华大学教育扶贫电脑传爱公益活动,邀你同行。


诸葛建伟 陈霖 许伟林

2013年1月于北京清华园


本书从2009年底开始编写,在2011年中期完成,总计历时一年半。而在本书出版之日,已经距离本书第1版发布的时间有4年之久。本书的所有内容几乎都经过了重写,并采用了完全重新设计的网络捕获数据包文件和场景。如果你喜欢本书第1版,那么你也会喜欢本书,因为本书采用了与第1版同样的写作方式,以一种简单容易理解的风格来展示技术。如果你不喜欢第1版,你也会喜欢本书,因为新版拥有全新设计的场景和扩展后的充实内容。

你一定很想知道为什么应该买这本书,而不是其他关于数据包分析的书籍。答案在于本书的书名:Practical Packet Analysis。让我们面对这样的现实——没有比实际的经验更加重要的了,而本书通过大量的真实场景中的数据包分析案例,让你获得最贴近实际的经验。

本书的前半部分将为你提供理解数据包分析技术和Wireshark软件的必备前置条件。后半部分则完全是一些你在日常网络管理中很容易遇到的一些实际案例。无论你是一位网络技术员、网络管理员、首席信息官、IT技术支持,还是一位网络安全分析师,你都可以从本书描述的理解与使用数据包分析技术中获得很多的收获。

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

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

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

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

所有本书中使用的网络数据包捕获文件都在本书的官方网站(http://www.nostarch.com/packet2.htm[1])下载到,为了最大化本书的价值,我强烈建议你下载这些文件,并在你学习每个真实案例时使用它们。

在我编写本书的前言时,我无法不提及由数据包分析实用技术书籍而衍生出的这一美好事物。在本书第一版出版后不久,我创办了一个501(c)(3)的非营利性组织,而这正是我最大梦想成为现实的巅峰时刻。

比起城市与市郊的学生们,乡村学生即使拥有很优秀的成绩,仍然很少有机会能够接触到最新的科技。创办于2008年的乡村科技基金会(RTF)致力于能够减少乡村学生与城市同龄学生们之间的数字鸿沟,主要通过针对性的奖学金项目、社区参与计划,以及一些在乡村地区的科技促进与提倡项目来达成。我们的奖学金项目专门提供给生活在乡村,但对计算机技术拥有着热情并希望在这个方向得到进一步教育的学生们。我非常高兴地宣布本书所有的作者版税将提供给乡村科技基金会,用于设立这些奖学金。如果你需要了解更多关于乡村科技基金会的信息,或者想了解你如何可以参与贡献,请访问我们的网站http://www.ruraltechfund.org/

[1]为了方便国内读者下载,将在http://netsec.ccert.edu.cn/hacking/book/提供备份链接。——译者注


本书第1版的书评

“各层次网络管理员的必备手册。”

——Linux Pro杂志

“一本优秀、易懂且具有良好格式的Wireshark实用指南。”

——ARSGEEK.COM

“如果您需要掌握数据包分析的基础知识,本书将是您起步的好地方。”

——STATEOFSECURITY.COM

“本书能够让您有一技之长,它抓住了书名中的关键词——实用,很好地为读者们提供了进行数据包分析所需要知道的基本知识,然后又恰如其分地带领他们进入到使用Wireshrak软件解决现实问题的缤纷世界中。”

——LINUXSECURITY.COM

“您的网络中有未知主机在和其他主机聊天吗?您的电脑是否在和陌生人说话?您需要一个数据包嗅探器来找出这些问题的真正答案。Wireshark是能够完成这件事情的最佳工具,而本书是学习这个工具最好的方式之一。”

——自由软件杂志

“新手入门的最佳读物!”

——DAEMON NEWS


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

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

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

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

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

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

注意

 在一些特殊情况下,如果Wireshark并不支持你所需要的协议,你还可以通过自己编写代码提供相应的支持,并提供给Wirshark的开发者,以便于使之能被包含在之后版本中(当然是在代码被采纳的情况下)。

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

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

注意

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

程序支持:一个软件的成败通常取决于其程序支持的好坏。虽然像Wireshark这样的自由分发软件很少会有正式的程序支持,而是依赖于开源社区的用户群,但是幸运的是,Wireshark社区是最活跃的开源项目社区之一。Wireshark网页上给出了许多种程序支持的相关链接,包括在线文档、支持与开发wiki、FAQ,并可以注册Wireshark开发者都关注的邮件列表。CACE Technologies通过SharkNet项目也对外提供付费支持。

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

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

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

尽管你也可以单独下载安装WinPcap(http://www.winpcap.org),但一般最好使用Wireshark安装包中的WinPcap。因为这个版本的WinPcap经过测试,能够和Wireshark一起工作。

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

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

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

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

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

4.在Additional Tasks窗口中单击Next

5.选择Wireshark的安装位置,并单击Next

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

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

8.WinPcap应该已经安装到你的电脑上,在安装完成之后,单击Finish

9.Wireshark应该已经安装到你的电脑上,在安装完成之后,单击Next

10.在安装完成确认界面中,单击Finish

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

在Linux系统中安装Wireshark的第一步是先下载合适的安装包。由于Wireshark并不支持所有的Linux版本,所以你可能会发现并没有合适你的Linux版本对应的安装包可供下载。

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

使用RPM的系统

对于类似于红帽Linux(Red Hat Linux)等使用RPM的Linux发行版,在从Wireshark网站上下载好合适的安装包之后,打开一个命令行程序并键入如下命令(将文件名替换成你所下载安装包的名称):

rpm -ivh wireshark-0.99.3.i386.rpm

如果缺少相关程序支持,在安装好这些之后,再重新安装Wireshark。

使用DEB的系统

对于类似与Debian和Ubuntu等使用DEB的Linux版本,你可以从系统源中安装Wireshark,打开一个命令行窗口并键入如下命令。

apt-get install wireshark
使用源代码编译

如果你的Linux没有自动安装包管理工具,那么安装Wireshark最高效的方法就是使用源代码编译。下面的步骤给出了安装方法。

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

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

tar -jxvf wireshark-1.2.2.tar.bz2

3.进入解压缩后创建的文件夹。

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

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

5.输入make命令将源代码编译成二进制文件。

6.使用make install命令完成最后的安装。

在Mac OS X雪豹系统中安装Wireshark有一些注意事项,但安装并不困难,我在这里罗列了所需的安装步骤。

1.从Wireshark网站上下载DMG包。

2.将Wireshark.app复制到Applications文件夹。

3.打开Utilities文件夹中的Wireshark.app。

4. 在Finder中单击Go,选择Go To Folder。输入/usr/local/bin/打开这个文件夹。

5.将Command Line文件夹中的内容复制到/usr/local/bin/,这时你需要输入你的密码以完成操作。

6.在Utilities文件夹中,将ChmodBPF文件夹复制到StartupItems文件夹,这时你需要再次输入你的密码以完成该操作。安装过程至此宣告结束。

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

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

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

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

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

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

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

1.打开Wireshark。

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

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

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

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

4.等上一分钟左右,当你打算停止捕获并查看你的数据时,在Capture的下拉菜单中单击Stop按钮即可。

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

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

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

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

注意

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

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

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

注意

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

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

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

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

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

Wireshark首选项分为6个主要部分。

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

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

Printing(打印):这个部分中的选项可以让你对Wireshark如何打印你的数据进行各种特殊的设定。

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

Statistics(统计):这一部分提供了一些Wireshark中统计功能的设定选项。

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

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

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

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

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

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

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

1.打开Wireshark,并且打开Coloring Rules窗口(ViewColoring Rules)。

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

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

4.单击Background Color按钮。

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

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

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

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

你还可以通过基于你自己定制的过滤器创建着色规则,来扩展这些着色规则的用途。

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


无论是处理延迟问题,还是甄别存在错误的应用,抑或对安全威胁进行聚焦检查,都是为了发现异常的流量,而你必须首先了解正常的流量。在下面的几章中,你将会学到正常的网络流量在数据包级别是如何工作的。

我们将介绍最常见的几种协议,包括最基础的TCP、UDP和IP,以及如HTTP、DHCP、DNS等最常用的应用层协议。在每个协议的相关部分,都会至少有一个捕获文件供你下载,并可以让你直接上手分析。在这一章中,我们将着重关注在OSI分层模型中从第1层到第4层的底层协议。

这应该是这本书中最重要的几章。如果跳过了这些内容,你会感到如同周末晚餐中没有牛角面包那样不完整,即使你对每个协议是如何工作的都了然于胸,那也请至少快速浏览一遍,以便复习每个协议数据包的结构。

网络上的通信会使用到逻辑地址和物理地址。逻辑地址可以使得不同网络以及没有直接相连的设备之间能够进行通信。物理地址则用来在单一网段中交换机直接连接的设备之间进行通信。在大多数情况下,正常通信需要这两种地址协同工作。

我们假设这样一个场景:你需要和你网络中的一个设备进行通信,这个设备可能是某种服务器,或者只是你想与之共享文件的另一个工作站。你所用来创建这个通信的应用已经得到了这个远程主机的IP地址(通过DNS服务,这将在第7章中介绍),也意味着系统已经拥有了用来构建它想要在第3层到第7层中传递的数据包所有需要的信息。这时它所需要的唯一信息就是第2层包含目标主机MAC地址的数据链路层数据。

之所以需要MAC地址,是因为网络中用于连接各个设备的交换机使用了内容寻址寄存器(CAM)。这个表列出了它在每一个端口的所有连接设备的MAC地址。当交换机收到了一个指向特定MAC地址的流量,它会使用这个表,来确定应该使用哪一个端口发送流量。如果目标的MAC地址是未知的,这个传输设备会首先在它的缓存中查找这个地址,如果没有找到,那么这个地址就需要在网络上额外的通信来进行解析了。

TCP/IP网络(基于IPv4)中用来将IP地址解析为MAC地址的过程称为地址解析协议(Address Resolution Protocol, ARP)。这个协议在RFC826中进行了定义,它的解析过程只使用两种数据包:一个ARP请求与一个ARP响应,如图6-1所示。

图6-1 ARP解析过程

注意

 RFC(Request for Comments)是定义协议实现标准的官方文档。你可以在RFC Editor的首页上搜索RFC文档,http://www.rfc-editor.org/

这个传输计算机会发出一个ARP请求,基本上就是问“大家好,我的IP地址是XX.XX.XX.XX,MAC地址是XX:XX:XX:XX:XX:XX。我需要向那个IP地址是XX.XX.XX.XX的家伙发些东西,但我不知道它的硬件地址,你们谁有这个IP地址的,可否请回复给我你的MAC地址?”

这个数据包将被广播给网段中的所有设备。不是这个IP地址的设备将简单地丢弃这个数据包,而拥有这个IP地址的设备将发送一个ARP响应,就像是说:“你好,传输设备,我就是你所找的那个拥有IP地址为XX.XX.XX.XX的,我的MAC地址是XX:XX:XX:XX:XX:XX。”

一旦这个解析过程完成了,传输设备就会对这个设备MAC和IP对应关系的缓存进行更新,并且开始传输数据。

注意

 在Windows主机中,你可以通过在命令行中键入arp -a来查看ARP表。

通过实际情况来看地址解析的这个过程,有助于你更好地理解它究竟是怎么工作的。但是在看一些例子之前,我们先介绍一下ARP数据包头。

如图6-2所示,ARP头包含下列的几个域。

硬件类型:数据链路层使用的类型数据。在大多数情况下,这个类型都是以太网(类型1)。

协议类型:ARP请求正在使用的高层协议。

硬件地址长度:正在使用的硬件地址的长度(八位组/字节)。

图6-2 ARP数据包结构

协议地址长度:对于指定协议类型所使用的逻辑地址的长度(八位组/字节)。

操作:ARP数据包的功能:1表示请求,2表示响应。

发送方硬件地址:发送者的硬件地址。

发送方协议地址:发送者的高层协议地址。

目标硬件地址:目标接收方的硬件地址(ARP请求中为0)。

目标协议地址:目标接受方的高层协议地址。

现在打开arp_resolution.pcap这个文件,就可以看到实际的解析过程。我们将对这个过程中的每个数据包单独进行分析。

如图6-3所示,第1个数据包是一个ARP请求。我们可以通过在Wireshark的Packet Details面板中,检查以太网头,来确定这个数据包是否是一个真的广播数据包。这个数据包的目的地址是ff:ff:ff:ff:ff:ff。这是一个以太网的广播地址,所有发送到这个地址的数据包都会被广播到当前网段中的所有设备。这个数据包中以太网头的源地址就是我们的MAC地址

图6-3 一个ARP请求数据包

在这个给定的结构中,我们可以确定这的确是一个在以太网上使用IP的ARP请求。这个ARP头列出了发送方的IP(192.168.0.114)和MAC地址(00:16:ce:6e:8b:24),以及接收方的IP地址192.168.0.1。我们想要得到的目标MAC地址,还是未知的,所以这里的目的MAC地址填写为00:00:00:00:00:00。

在我们对最初请求的响应中(如图6-4所示),第一个数据包中的源MAC地址成为了这个以太网头中的目的地址。这个ARP响应和之前的ARP请求看上去很像,除了以下几点。

图6-4 一个ARP回复数据包

在我的家乡,当一些事是所谓的“无偿”的时候,那通常没有什么好的含义。但无偿发送的ARP却是一个好东西。

在多数情况下,一个设备的IP地址是可以改变的。当这样的改变发生后,网络主机中缓存的IP和MAC地址映射就不再有效了。为了防止造成通信错误,无偿的ARP请求会被发送到网络中,强制所有收到它的设备去用新的IP和MAC地址映射更新缓存(如图6-5所示)。

图6-5 无偿ARP工作过程

几个不同的情形都会产生无偿ARP数据包,其中一个最常见的就是IP地址的改变。打开arp_gratuitous.pcap这个捕获文件,你就会看到一个实际例子。这个文件只包含一个数据包(如图6-6所示),因为这就是无偿数据包的全部了。

图6-6 一个无偿ARP数据包

检查这个以太网头,你会看见这个数据包是以广播的形式发送,以便网络上的所有主机能够接收到它。这个ARP头看上去和ARP请求很像,除了发送方的IP地址和目标IP地址是相同的。当这个数据包被网络中的其他主机接收到之后,它会让这些主机使用新的IP和MAC地址关系更新它们的ARP表。由于这个ARP数据包是未经请求的,却导致客户端更新ARP缓存,所以会称之为无偿。

你会在一些不同的情形下注意到无偿ARP数据包的存在。如上所示,设备IP地址的改变会生成它,并且一些操作系统也会在启动时进行无偿ARP的发送。此外,你可能会注意到一些系统使用无偿ARP数据包对流入流量进行负载均衡。

位于OSI模型中第3层的协议的主要目的就是使得网络间能够互联通信。正如你所知道的,MAC地址被用来在第2层处理单一网络中的通信。与其类似,第3层则负责跨网络通信的地址。在这层上工作的不止一个协议,但最普遍的还是互联网协议(IP)。在此,我们将介绍在RFC 791中所定义的IP协议版本4(IPv4)。

如果网络中的所有设备仅使用集线器或者交换机进行连接,那么这个网络称为局域网。如果你想将两个局域网连接起来,你可以使用路由器办到这一点。在复杂的网络中,可能会包含成千上万的局域网,而这些局域网是由世界各地成千上万的路由器连接起来的。互联网本身就是由无数局域网和路由器所组成的一个集合。

IP地址是一个32位的地址,用来唯一标识连接到网络的设备。由于让人记住一串32位长的01字符确实比较困难,所以IP地址采用点分四组的表示法。

在点分四组表示法中,以A.B.C.D的形式,构成IP地址的四组1和0分别转换为十进制0到255之间的数(如图6-7所示)。我们拿这样一个IP地址11000000 10101000 00000000 00000001举例来说,这个值显然不容易记忆或者表示,但如果采用点分四组的表示法,我们就可以将其表示为192.168.0.1。

图6-7 IPv4地址的点分四组表示法

IP地址之所以会被分成4个单独的部分,是因为每个IP地址都包含着两个部分:网络地址和主机地址。网络地址用来标识设备所连接到的局域网,而主机地址则标识这个网络中的设备本身。用来决定究竟IP地址哪部分属于网络或者主机的划分通常并不唯一。这实际上是由另一组名为网络掩码(netmask, network mask)的地址信息所决定的,有时它也会被称为子网掩码(subnet mask)。

网络掩码用来标识IP地址中究竟哪一部分属于网络地址而哪一部分属于主机地址。网络掩码也是32位长,并且被设为1的每一位都标识着IP地址的对应部分是属于网络地址的,而剩下设为0的部分则标识着主机地址。

我们以IP地址10.10.1.22为例,其二进制形式为00001010 00001010 00000001 00010110。为了能够区分出IP地址的每一个部分,我们将使用网络掩码。在这个例子中,我们的网络掩码是11111111 11111111 00000000 00000000。这意味着IP地址的前一半(10.10或者00001010 00001010)是网络地址,而后一半(1.22或者00000001 00010110)标识着这个网络上的主机,如图6-8所示。

图6-8 网络掩码决定了IP地址中比特位的分配

网络掩码也可以写成点分四组的形式。比如网络掩码11111111 11111111 00000000 00000000可以被写成255.255.0.0。

IP地址和网络掩码为简便起见,通常会被写成无类型域间选路(Classless Inter-Domain Routing, CIDR)的形式。在这个形式下,一个完整的IP地址后面会有一个左斜杠(/),以及一个用来表示IP地址中网络部分位数的数字。举例来说,IP地址10.10.1.22和网络掩码255.255.0.0,在CIDR表示法下就会被写成10.10.1.22/16的形式。

源IP地址和目的IP地址都是IPv4数据包头中的重要组成部分,但它们并不是你在数据包中能够找到的IP信息的全部。IP头比起我们刚刚介绍过的ARP数据包复杂得多。这其中包含很多额外的信息,以便IP完成其工作。

如图6-9所示,IPv4头有着下列几个域。

版本号(Version):IP所使用的版本。

首部长度(Header Length):IP头的长度。

服务类型(Type of Service):优先级标志位和服务类型标志位,被路由器用来进行流量的优先排序。

总长度(Total Length):IP头与数据包中数据的长度。

标识符(Identification):一个唯一的标识数字,用来识别一个数据包或者被分片数据包的次序。

图6-9 IPv4数据包结构

标记(Flags):用来标记一个数据包是否是一组分片数据包的一部分。

分片偏移(Fragment Offset):一个数据包是一个分片,这个域中的值就会被用来将数据包以正确的顺序重新组装。

存活时间(Time to Live):用来定义数据包的生存周期,以经过路由器的跳数/秒数进行描述。

协议(Protocol):用来识别在数据包序列中上层协议数据包的类型。

首部校验和(Header Checksum):一个错误检测机制,用来确认IP头的内容没有被损坏或者篡改。

源IP地址(Source IP Address):发出数据包的主机的IP地址。

目的IP地址(Destination IP Address):数据包目的地的IP地址。

选项(Options):保留作额外的IP选项。它包含着源站选路和时间戳的一些选项。

数据(Data):使用IP传递的实际数据。

存活时间(TTL)值定义了在该数据包被丢弃之前,所能经历的时间,或者能够经过的最大路由数目。TTL在数据包被创建时就会被定义,而且通常在每次被发往一个路由器的时候减1。举例来说,如果一个数据包的存活时间是2,那么当它到达第一个路由器的时候,其TTL会被减为1,并会被发向第二个路由。这个路由接着会将TTL减为0,这时如果这个数据包的最终目的地不在这个网络中,那么这个数据包就会被丢弃,如图6-10所示。由于TTL的值在技术上还是基于时间的,一个非常繁忙的路由器可能会将TTL的值减去不止1,但通常情况下,我们还是可以认为一个路由设备在多数情况下只会将TTL的值减去1。

图6-10 数据包的TTL在每次经过一个路由器的时候减少

为什么TTL的值会这样重要?我们通常所关心的一个数据包的生存周期,只是其从源前往目的地所花去的时间。但是考虑到一个数据包想要通过互联网发往一台主机需要经过数十个路由器。在这个数据包的路径上,它可能会碰到被错误配置的路由器,而失去其到达最终目的地的路径。在这种情况下,这个路由器可能会做很多事情,其中一件就是将数据包发向一个网络,而产生一个死循环。

如果你有任何编程背景,那么你就会知道死循环会导致各种问题,一般来说会导致一个程序或者整个操作系统的崩溃。理论上,同样的事情也会以数据包的形式发生在网络上。数据包可能会在路由器之间持续循环。随着循环数据包的增多,网络中可用的带宽就会减少,直至拒绝服务(DoS)的情况出现。IP头中的TTL域就为了防止出现这个潜在的问题。

让我们看一下Wireshark中的示例。文件ip_ttl_source.pcap包含着两个ICMP数据包。ICMP(我们会在这章之后介绍到)利用IP传递数据包,我们可以通过在Packet Details面板中展开IP头区段看到。

你可以看到IP的版本号为4,IP头的长度是20字节,首部和载荷的总长度是60字节并且TTL域的值是128

图6-11 源数据包的IP头

ICMP ping的主要目的就是测试设备之间的通信。数据从一台主机发往另一台作为请求,而后接收主机会将那个数据发回作为响应。这个文件中,我们一台IP地址为10.10.0.3的设备将一个ICMP请求发向了地址为192.168.0.128的设备。这个原始的捕获文件是在源主机10.10.0.3上被创建的。

现在打开文件ip_ttl_dest.pcap。在这个文件中,数据在目的主机192.168.0.128处被捕获。展开这个捕获中第一个数据包的IP头,来检查它的TTL值(如图6-12所示)。

图6-12 IP头告诉我们TTL已经被减1了

你可以立刻注意到TTL的值变为127了,比原先的TTL减少了1。即使不知道网络的结构,我们也可以知道这两台设备是由一台路由器隔开,并且经过这台路由器的路径会将TTL值减1。

数据包分片是将一个数据流分为更小的片段,是IP用于解决跨越不同类型网络时可靠传输的一个特性。

一个数据包的分片主要基于第2层数据链路协议所使用的最大传输单元(Maximum Transmission Unit, MTU)的大小,以及使用这些第2层协议的设备配置情况。在多数情况下,第2层所使用的数据链路协议是以太网。以太网的默认MTU是1500,也就是说,以太网的网络上所能传输的最大数据包大小是1500字节(并不包括14字节的以太网头本身)。

注意

 尽管存在着标准的MTU设定,但是一个设备的MTU通常可以手工设定。MTU是基于接口进行设定,其可以在Windows或者Linux系统上修改,或者在管理路由器的界面上修改。

当一个设备准备传输一个IP数据包时,它将会比较这个数据包的大小,以及将要把这个数据包传送出去的网络接口MTU,用于决定是否需要将这个数据包分片。如果数据包的大小大于MTU,那么这个数据包就会被分片。将一个数据包分片包括下列的步骤。

1.设备将数据分为若干个可成功进行传输的数据包。

2.每个IP头的总长度域会被设置为每个分片的片段长度。

3. 更多分片标志将会在数据流的所有数据包中设置为1,除了最后一个数据包。

4.IP头中分片部分的分片偏移将会被设置。

5.数据包被发送出去。

文件ip_frag_source.pcap从地址为10.10.0.3的计算机上捕获而来。它向一个地址为192.168.0.128的设备发送ping请求。注意在ICMP(ping)请求之后,Packet List面板的Info列中列出了两个被分段的IP数据包。

先检查数据包1的IP头(如图6-13所示)。

根据更多分片和分片偏移域,你可以断定这个数据包是分片数据包的一部分。被分片的数据包要么有一个大于0的分片偏移,要么设定了更多分片的标志位。在第一个数据包中,更多分片标志位被设定,意味着接收设备应该等待接收序列中的另一个数据包。分片偏移被设为0,意味着这个数据包是这一系列分片中的第一个。

图6-13 更多分片和分片偏移值可以用来识别分片数据包

第二个数据包的IP头(如图6-14所示),同样被设定了更多分片的标志位,但在这里分片偏移的值是1480。这里明显意味着1500字节的MTU,减去IP头的20字节。

图6-14 分片偏移值会根据数据包的大小而增大

第三个数据包(如图6-15所示),并没有设定更多分片标志位,也就标志着整个数据流中的最后一个分片。并且其分片偏移被设定为2960,也就是1480+(1500-20)的结果。这些分片可以被认为是同一个数据序列的一部分,是因为它们IP头中的标志位域拥有相同的值。

图6-15 没有设置更多分片标志位意味着这是最后一个分片

传输控制协议(Transmission Control Protocol, TCP)的最终目的是为数据提供可靠的端到端传输。TCP在RFC793中定义,在OSI模型中的第4层工作。它能够处理数据的顺序和错误恢复,并且最终保证数据能够到达其应到达的地方。很多普遍使用的应用层协议都依赖于TCP和IP将数据包传输到其最终目的地。

TCP提供了许多功能,并且反映在了其头部的复杂性上面。如图6-16所示,以下是TCP头的域。

图6-16 TCP头

源端口(Source Port):用来传输数据包的端口。

目的端口(Destination Port):数据包将要被发送到的端口。

序号(Sequence Number):这个数字用来表示一个TCP片段。这个域用来保证数据流中的部分没有缺失。

确认号(Acknowledgment Number):这个数字是通信中希望从另一个设备得到的下一个数据包的序号。

标记(Flags):URG、ACK、PSH、RST、SYN和FIN标记都是用来表示所传输的TCP数据包的类型。

窗口大小(Window Size):TCP接收者缓冲的字节大小。

校验和(Checksum):用来保证TCP头和数据的内容在抵达目的地时的完整性。

紧急指针(Urgent Pointer):如果设置了URG位,这个域将被检查作为额外的指令,告诉CPU从数据包的哪里开始读取数据。

选项(Options):各种可选的域,可以在TCP数据包中进行指定。

所有TCP通信都会使用源端口和目的端口,而这些可以在每个TCP头中找到。端口就像是老式电话总机上的插口。一个总机操作员会监视着一个面板上的指示灯和插头,当指示灯亮起的时候,他就会连接这个呼叫者,问她想要和谁通话,然后插一根电缆将她和她的目的位置连接起来。每次呼叫都需要有一个源端口(呼叫者)和一个目的端口(接收者)。TCP端口大概就是这样工作的。

为了能够将数据传输到远程服务器或设备的特定应用中去,TCP数据包必须知道远程服务所监听的端口。如果你想要试着连接一个不同于所设置的端口,那么这个通信就会失败。

这个序列中的源端口并不十分重要,所以可以随机选择。远程服务器也可以很简单地从发送过来的原始数据包中得到这个端口(如图6-17所示)。

图6-17 TCP使用端口传输数据

在使用TCP进行通信的时候,我们有65535个端口可供使用,并通常将这些端口分成两个部分。

让我们打开文件tcp_ports.pcap,看一些不同的TCP数据包,并识别出它们所使用的端口号。在这个文件中,我们会看到一个客户端在浏览两个网站时产生的HTTP通信。正如前面所提到的HTTP使用TCP进行通信,所以这将是一个非常典型的TCP流量案例。

在这个文件中的第一个数据包中(如图6-18所示),一开始的两个值代表着这个数据包的源端口和目的端口。这个数据包从172.16.16.128发往212.58.226.142,它的源端口是属于临时端口组的2826(需要记住的是源端口是由操作系统随机选取的,尽管它们可能在随机选择的过程中会选择递增策略)。目的端口是一个标准端口,80端口。这个标准端口正是提供给使用HTTP的Web服务器的。

图6-18 在TCP头中可以找到源端口和目标端口

你可能会注意到Wireshark将这些端口打上了slc-systemlog(2826)和http(80)的标签。Wireshark会维护一个端口的列表,并记录它们最普遍的应用。尽管列表还是以标准端口为主,但很多临时端口也关联着常用的服务。这些端口的标签可能会让人迷惑,所以一般来说最好通过关闭传输名字解析来禁用它。选择Edit -> Preference -> Name Resolution,然后取消勾选Enable Transport Name Resolution就可以将其禁用了。如果你希望保留这个功能但希望改变Wireshark对每一个端口的识别,你可以通过改变Wireshark程序目录下的Services文件。这个文件是根据互联网数字分配机构(Internet Assigned Numbers Authority, IANA)的通用端口列表编写的。

第二个数据包是由212.58.226.142发往172.16.16.128的(如图6-19所示)。除了IP地址之外,源端口和目的端口也同样有所改变。

所有基于TCP的通信都以相同的方式工作:选择一个随机的源端口与一个已知的目的端口进行通信。在发出初始数据包之后,远程设备就会与源设备使用建立起的端口进行通信。

在这个捕获文件中还有另外一个通信流,你可以试着找出它通信时使用的端口。

图6-19 在反向通信中,源端口和目的端口进行了互换

注意

 随着这本书的深入,你将会知道更多与通用协议和端口相关联的端口,并且最终可以通过端口来识别使用它们的服务和设备。如果希望查阅详细的通用端口列表,可以访问http://www.iana.org/assignments/port-numbers/

所有基于TCP的通信都需要以两台主机的握手开始。这个握手过程主要希望能达到以下不同的目的。

TCP握手分为3个步骤,如图6-20所示。在第一步中,主动发起通信的设备(主机A)向目标(主机B)发送了一个TCP数据包。这个初始数据包除了底层协议头之外不包含任何数据。这个数据包的TCP头设置了SYN标志,并包含了在通信过程中会用到的初始序列号和最大分段大小(MSS)。主机B对于这个数据包回复了一个类似于设置了SYN和ACK标志以及包含了它初始序列号的数据包。最后,主机A向主机B发送最后一个仅设置了ACK标志的数据包。在这个过程完成之后,双方设备应该已经具有了开始正常通信所需的信息。

图6-20 TCP三次握手

注意

 TCP数据包在称呼上通常会被其所设置的标志所代表。比如,对于设置了SYN标志的TCP数据包,我们将会简称其为SYN包。所以TCP握手过程中使用的数据包会被称为SYN包、SYN/ACK包和ACK包。

打开tcp_handshake.pcap,可以更实际地看到这个过程。Wireshark为了分析将简便,引入了一个特性,可以将TCP数据包的序列号替换为相对值。但在这里,我们将这个功能关闭,以便于能看到实际的序列号值。选择Edit -> Preferences,展开Protocols并选择TCP,然后取消勾选Relative Sequence Numbers and Window Scaling框,并单击OK就可以禁用了。

这个捕获中的第一个数据包是我们的初始SYN数据包(如图6-21所示)。这个数据包从172.16.16.128的2826端口发往212.58.226.142的80端口。我们可以看到这里传输的序列号是3691127924

图6-21 初始SYN数据包

握手中第二个数据包是从212.58.226.142发出的SYN/ACK响应(如图6-22所示)。这个数据包也包含着这台主机的初始序列号(233779340),以及一个确认号(2691127925)。这个确认号比之前的那个数据包序列号大1,是因为这个域是用来表示主机所期望得到的下一个序列号的值。

图6-22 SYN/ACK响应

最后的数据包是从172.16.16.128(如图6-23所示)发出的ACK数据包。这个数据包正如所期望的那样,包含着之前数据包确认号域所定义的序列号3691127925

图6-23 最后的ACK包

握手伴随着每次TCP的通信序列。当在一个繁忙的捕获文件中搜索通信序列的开始时,SYN、SYN/ACK、ACK的序列是一个很好的标志。

所有的问候最终都会有一句再见,在TCP中,每次握手后也会有终止。TCP终止用来在两台设备完成通信后正常地结束连接。这个过程包含4个数据包,并且用一个FIN标志来表明连接的终结。

在一个终止序列中,主机A通过发送一个设置了FIN和ACK标志的TCP数据包,告诉主机B通信的完成。主机B以一个ACK数据包响应,并传输自己的FIN/ACK数据包。主机A响应一个ACK数据包,然后结束通信过程。这个过程如图6-24所示。

图6-24 TCP终止过程

打开文件tcp_teardown.pcap可以在Wireshark中看到这个过程。在序列的第一个数据包(如图6-25所示),你可以看到位于67.228.110.120的设备通过发送有着FIN和ACK标志的数据包来开始终止过程。

图6-25 FIN/ACK包作为终止过程的开始

在这个数据包被发出去之后,172.16.16.128使用了一个ACK数据包进行响应来确认第一个数据包的接收,然后发送了一个FIN/ACK数据包。整个过程在67.228.110.120发送了最终的ACK之后结束。这时,这两个设备的通信便已经结束,如果想要再次开始通信就必须完成新的TCP握手。

在理想情况中,每一个连接都会以TCP终止来正常地结束。但在现实中,连接经常会突然断掉。举例来说,这可能由于一个潜在的攻击者正在进行端口扫描,或者仅仅是主机配置错误。在这些情况下,就需要使用设置了RST标志的TCP数据包。RST标志用来指出连接被异常中止或拒绝连接请求。

文件tcp_refuseconnection.pcap给出了一个包含有RST数据包网络流量的例子。这个文件中的第一个数据包发自192.168.100.138,其尝试与192.168.100.1的80端口进行通信。这个主机并不知道192.168.100.1并没有在监听80端口,因为那是一个思科路由器,并且没有配置Web接口,也就是说,并没有服务监听80端口的连接。为了响应这个连接请求,192.168.100.1向192.168.100.138发送了一个数据包,告诉它其对80端口的通信无效。图6-26中展示了在第二个数据包的TCP头中这个连接尝试突然终止的情况。RST数据包除了包含RST和ACK标志外,没有任何其他的东西,之后也并没有额外的通信。

图6-26 RST和ACK标志代表着通信的结束

如本例所示,RST数据包可以在通信序列的开始或者在主机通信的过程中,终止通信。

用户数据报协议(User Datagram Protocol, UDP)是在现代网络中最常使用的另外一种第4层协议。如果说TCP是为了满足带有内在错误检测的可靠数据传输,那么UDP主要是为了提供高速的传输。出于这个原因,UDP是一种尽力服务,通常会被称为无连接协议。一个无连接协议并不会正式地建立和结束主机之间的连接,也不会像TCP那样存在握手和终止过程。

无连接协议意味着不可靠服务,这将使得UDP流量一点都不稳定。事实上正是如此,但依赖于UDP的协议通常都会有其内置的可靠性服务,或者使用ICMP的一些功能来保证连接更可靠一些。举例来说,应用层协议DNS和DHCP需要高度依赖数据包在网络上传输的速度,其使用UDP作为它们的传输层协议,但是它们自己进行错误检查以及重传计时。

UDP头比TCP头要小得多,也简单得多。如图6-27所示,以下是UDP头的域。

图6-27 UDP头

源端口:用来传输数据包的端口。

目标端口:数据包将要被传输到的端口。

数据包长度:数据包的字节长度。

校验和:用来确保UDP头和数据到达时的完整性。

文件udp_dnsrequest.pcap中包含有一个数据包,这个数据包是一个使用UDP的DNS请求。当你展开这个数据包的UDP头时,你可以看到4个域(如图6-28所示)。

图6-28 UDP数据包的内容非常简单

需要记住的是,UDP并不关心传输的可靠性,所以任何使用UDP的应用在必要的时候都需要采取特殊的步骤,以保证可靠的传输。

互联网控制消息协议(Internet Control Message Protocol, ICMP)是TCP/IP协议族中的一个效用协议,负责提供在TCP/IP网络上设备、服务以及路由器可用性的信息。大多数网络检修技巧和工具都是基于常用的ICMP消息类型。ICMP在RFC792中定义。

ICMP是IP的一部分并依赖IP来传递消息。ICMP头相对较小并根据用途而改变。如图6-29所示,ICMP头包含了以下几个域。

图6-29 ICMP头

类型(Type):ICMP消息基于RFC规范的类型或分类。

代码(Code):ICMP消息基于RFC规范的子类型。

校验和(Checksum):用来保证ICMP头和数据在抵达目的地时的完整性。

可变域(Variable):依赖于类型和代码域的部分。

正如刚才所说,ICMP数据包的结构取决于它由TypeCode域中的值所定义的用途。

你可以将ICMP的类型域作为数据包的分类,而Code域作为它的子类。举例来说,Type域的值为3时意味着“目标不可达”。但只有这个信息可能不足以发现问题,当如果数据包在Code域中指明值为3,也就是“端口不可达”时,你就可以知道这应该是你试图进行通信的端口的问题。

注意

 如果想要浏览所有可用的ICMP类型和代码,可以访问http://www.iana.org/assignments/icmp-parameters

ICMP因为其ping功能而声名大噪。ping用来检测一个设备的可连接性。大多数信息技术专家都会对ping很熟悉。

在命令行中输入ping <ip地址>,其中将<ip地址>替换为你网络上的一个实际IP地址,就可以使用ping了。如果目标设备在线,你的计算机有到达目标的通路,并且没有防火墙隔离通信的话,你将能够看到对ping命令的响应。

在图6-30所示的例子中,给出了4个成功显示了大小、RTT和TTL的响应。Windows还会提供一个总结信息,告诉你有多少数据包被发送、接收或者丢失。如果通信失败,你会看到一条告诉你原因的信息。

图6-30 使用ping命令测试可连接性

基本上来说,ping命令每次向一个设备发送一个数据包,并等待回复,以确定设备是否可连接,如图6-31所示。

图6-31 ping命令只包含两步

注意

 尽管ping对于IT业必不可少,但当部署了基于主机的防火墙时,它的结果就可能具有欺骗性了。现在很多的防火墙都限制了设备去响应ICMP数据包。这样对于安全性是有帮助的,因为潜在的攻击者可能会使用ping来判断主机是否可达,从而放弃进一步的行动。但这样查找问题时也变得困难起来——当你知道你可以和一台设备通信时,使用ping检测连接却收不到任何响应会让你很抓狂。

ping功能在实际中是很好的简单ICMP通信的例子。文件icmp_echo.pcap 中的数据包会告诉你在运行ping时都发生了什么。

第一个数据包(如图6-32所示)显示了主机192.168.100.138在给192.168.100.1发送数据包。当你展开这个数据包的ICMP区段时,你可以通过查看类型和代码域判断ICMP数据包的类型。在这个例子中,数据包的类型是8,代码是0,意味着这是一个echo请求(Wireshark会告诉你所显示的类型/代码究竟是什么意思)。这个echo(ping)请求是整个过程的前一半。这是一个简单的ICMP数据

图6-32 ICMP echo请求数据包

包,使用IP发送,包含了很少的数据。除了指定的类型、代码以及校验和,我们还会有一个序列号用来匹配请求和响应,还有在ICMP数据包可变域中的一串随机文本字符。

注意

 echo和ping经常会被混淆,但记住ping实际上是一个工具的名字。ping工具用于发送ICMP echo请求数据包。

这个序列的第二个数据包是对我们请求的响应(如图6-33所示)。这个数据包的ICMP区段类型是0,代码是0,表示这是一个echo响应。由于第二个数据包的序列号与第一个的相匹配,我们就知道这个echo响应与之前数据包的echo请求匹配。这个响应数据包中有着和初始请求中传输的32位字符串一样的内容。在这第二个数据包被192.168.100.138成功接收到之后,ping就会报告成功(如图6-34所示)。

图6-33 ICMP echo回复数据包

你还可以使用ping的选项,增加它的数据填充,这样在检测不同类型网络时,强制将数据包分片。这在你检测分片较小的网络时会用到。

注意

 ICMP的echo请求使用的随机文本可能会引起潜在攻击者的兴趣。攻击者可能会用这段填充的内容来推测设备所使用的操作系统。并且攻击者可能在这个域中放置一些数据位作为反向连接的手段。

路由跟踪功能用来识别一个设备到另一个设备的网络路径。在一个简单的网络上,这个网络路径可能只经过一个路由器,甚至一个都不经过。但在复杂的网络中,数据包可能会经过数十个路由器才会到达最终目的地。这就是为什么确定数据包从一个目的地到另一个的实际路径对于通信检修十分重要。

通过使用ICMP(在IP的一些帮助下),路由跟踪可以画出数据包的路径。举例来说,文件icmp_traceroute.pcap中的第一个数据包,和我们在上一节中看到的echo请求(如图6-34所示)很类似。

图6-34 一个TTL值为1的ICMP echo请求数据包

乍看起来,这个数据包就是一个从192.168.100.138到4.2.2.1的简单echo请求,并且ICMP中的每一部分都与echo请求数据包相同。但是当你展开这个数据包的IP头时,你可以注意到一个奇怪的数字。这个数据包的TTL被设为了1,也就意味着这个数据包会在它遇到的第一个路由器处被丢掉。因为目标地址4.2.2.1是一个互联网地址,我们就会知道源设备和目的设备之前至少会有一个路由器,所以这个数据包不会到达目的地。这对我们来说是个好事,因为路由跟踪正是需要这个数据包只到达它传输的第一个路由器。

第二个数据包正如所期望的那样,是前往目的地路径上第一个路由器发回的响应(如图6-35所示)。这个数据包到达192.168.100.1这个设备后,它的TTL减为0,所以它不能继续传输,于是路由器回复了一个ICMP响应。这个数据包的类型是11,代码是0,也就是告诉我们由于数据包的TTL在传输过程中超时,所以目的不可达。

图6-35 来自路径上第一个路由器的ICMP响应

这个ICMP数据包有时候被叫做双头包,因为这个ICMP的结尾部分包含了原先echo请求的IP头和ICMP数据的拷贝。这个信息被证明在检修的时候非常有用。

在第7个数据包前,这样发送TTL自增数据包的过程又出现了两次。这次的过程与你在第1个数据包中看到的过程不同,IP头的TTL值被设为了2,从而保证这个数据包会在被丢弃前到达第二跳路由。和我们所期望的一样,我们从下一跳的路由12.180.241.1接到了一个有着同样ICMP目的不可达和TTL超时消息的响应。这个将TTL自加1的过程一直持续直到到达目的地4.2.2.1。

总体来说,路由跟踪要与路径上的每一个路由器进行通信,从而画出前往目的地的路由图,如图6-36所示。

图6-36 路由跟踪功能的样例输出

注意

 我们这里所讨论的路由跟踪主要是基于Windows,因为只有它在使用ICMP。Linux上的路由跟踪更复杂一些,并使用了其他的协议来进行路由路径的跟踪。

你会在整本书中看到ICMP有着不同的功能。在我们分析更多场景的时候,我们会更频繁地使用ICMP。

这一章主要向你介绍了数据包分析过程中会经常看到的最重要的几种协议。IP、TCP、UDP和ICMP是所有网络通信的基础,并且对于你每天要进行的工作至关重要。在下一章中,我们将会学习一些常用的应用层协议。


相关图书

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

相关文章

相关课程