信息安全技术丛书

黑客大曝光：无线网络安全（原书第3版）

Hacking Exposed Wireless：Wireless Security Secrets&Solutions，Third Edition

（美）莱特（Wright，J.）　（美）凯诗（Cache，J.）　著

李瑞民　译

ISBN：978-7-111-52629-2

本书纸版由机械工业出版社于2015年出版，电子版由华章分社（北京华章图文信息有限公司，北京奥维博世图书发行有限公司）全球范围内制作与发行。

版权所有，侵权必究

客服热线：+ 86-10-68995265

客服信箱：service@bbbvip.com

官方网址：www.hzmedia.com.cn

新浪微博 @华章数媒

微信公众号 华章电子书（微信号：hzebook）

译者序

在关于网络攻防技术的讨论中，常会遇到一个有趣的现象：一说起“攻”，大家马上就会认为这是“邪恶方”做的事，做这件事的人每天戴着墨镜，行为神神秘秘，目的不可告人；而一说起“防”，似乎就是“正义方”做的事，做这件事的人必须得西装革履，还要表情严肃，一脸正义。然而事实上并不是这样，也不需要这样。因为无论是攻还是防，都只是对网络安全性的一种设计和改进，二者没有谁正义谁邪恶之说。相反，将二者结合起来，反而会相互促进，使双方都能达到螺旋式地提高的效果。

这一点，在本书和现实中都体现得淋漓尽致。以我们的日常生活为例，拿出智能手机连接合适的Wi-Fi网络（即SSID网络），俨然成为“低头族”“手机控”每天的必修课。如果对网络再熟悉一些，那么我们还知道无线加密的技术有“WEP加密认证”“WPA/WPA2加密认证”“WPA-PSK/WPA2-PSK加密认证”等多种加密认证方式。为什么在短短的十几年时间内，无线路由器认证技术得到了这么快的发展？究其原因，就是“防”的一方，每有一种新技术被设计出来后，就被“攻”方破解，而要弥补这一技术的不足，避免被“攻”方再次破解，“防”方就不得不研发出更新、更安全的防守技术。于是，这种此消彼长的竞争，促进了双方的提高，也造就了越来越安全的系统。

越来越多的IT专业论坛都在预测IT行业的未来，民用无线通信、工业无线通信、物联网、智能家居都是当下研究的热点和重点，而这同样也是本书的重点。本书整体分为三个部分，每一部分又根据技术的分类分成了不同的章节。纵览全书，第一部分主要介绍的是民用无线通信，而第二部分主要介绍工业无线通信，第三部分则主要倾向于物联网和智能家居领域内的无线通信。从这里，我们也可以看到无线网络安全发展的一些理念变化，例如基于Wi-Fi的无线通信，普遍用于日常生活中，涉及百姓的生活安全，所以无疑会向大而全的复杂设计模式发展；而工业无线通信，更注重于低成本、低功耗、大范围推广的设计理念，因而第三代的工业蓝牙调整了自身的发展方向，不再追求大而全、面面俱到的设计模式，转向改为低功耗蓝牙的简单设计模式，呈现出向物联网靠拢的发展脉络。这种设计理念的差异和走向，体现了无线网络发展中的多样性。

很多人都有黑客梦，不为金钱，不为名利，只为“运筹键鼠之间，决胜千里之外”的成就感。然而真正的黑客寥寥无几。究其原因，就是黑客之路需要具备对新知识的快速接受能力、平时沉下心来做事的坚强毅力，还有可遇而不可求的好运气。不过，如果非要从每天日新月异的“技术堆”中找到一个终南捷径，那就是“取人所长，补己之短”，找对“良师益友”，直接从别人已得到的成果中学到方法，体会其成功之道，举一反三地应用到自己的实践中。而本书，恰是这样一本以实践为主，详化攻击过程和操作步骤的图书。更为难能可贵的是，书中还会讲到针对某一技术的使用历史，两种或多种工具之间攻击效果的对比。为了让读者对每种攻击方式有一个直观的了解，本书作者还独具匠心地将每种技术或漏洞根据其流行性、难易度、影响力、危险级四项参数分别进行定级，这样不仅可以使读者对该技术有新的了解，还能让网络安全人员对如何评价这种危险有所参考。值得一提的是，除了书中的内容，本书还提供了一些扩展章节和书中样例的附件文件，这些都可以从该书的配套网站上免费下载。

综合来看，本书既包含了当前常用网络的各种技术，也包含了前沿新型的无线技术的入侵和防护技术。绝大多数的技术细节都以当前主流的Microsoft的Windows、Macintosh的OS X和Linux操作系统作为主要的描述对象，这样既满足了各类操作系统用户的需求，也可以了解问题的普遍性。并且，正如本书作者所说，针对部分读者的建议，在本书第3版明显增加了在Windows操作系统下攻防技术和攻防工具方面的比重。这对于使用Windows系统较多的中国读者来说，无疑是一个不错的消息。

翻译的过程，是一个对自己掌握知识进行梳理、汇总的过程，是一个新知识、新动向的学习过程，也是一个与作者进行交流、探讨的过程，相信读者在阅读中也会有同样的感受。然而限于译者的水平和中西方文化的深层差异，书中难免会有曲解或错误，诚挚欢迎大家斧正。

李瑞民

2015年11月

关于作者

·Joshua Wright

Joshua Wright是Counter Hack公司（美国新泽西州的一家反黑客公司）的一名高级技术分析师，也是SANS研究所的高级讲师和作家。依靠渗入攻击测试工程师的经验，他同时为上百家移动设备、无线系统、开环信号产品和知名组织产品缺陷的攻击和防守工作。作为一名开源软件倡导者，Joshua在软硬件安全评估通用工具方面进行最前沿的研究，这些工具应用于Wi-Fi网络、蓝牙网络、ZigBee网络、Z-Wave无线系统、智能网格部署、Android和Apple公司iOS的移动设备平台。

·Johnny Cache

Johnny Cache于2006年获得“美国海军研究生院”（Naval Postgraduate School）计算机科学专业硕士学位。他的论文主攻802.11指纹设备驱动程序，因其在计算机科学领域最具创新性而赢得了“Gary Kildall” [1] 奖。Johnny于1988年某一时间，在Tandy 128K彩色计算机上编写了他的第一个程序，从那时起，他曾在几个安全组织会议上发言，包括黑帽子组织 [2] （BlackHat）、蓝帽子组织 [3] （BlueHat），以及Toorcon组织 [4] 。他还发表了一系列与802.11安全有关的论文，同时也是许多无线工具软件的作者，还是Cache Heavy Industries的发起人和首席科学官。

关于参编作者

·Chris Crowley

Chris Crowley是位于华盛顿特区的莫坦斯（Montance）咨询公司的所有人，从事渗入攻击测试、计算机网络防御、灾害事件响应、分析取证契约工作。作为SANS研究所的资深讲师，负责“移动设备安全”（Mobile Device Security）和“道德入侵”（Ethical Hacking）课程的讲授工作。Chris为上千个组织工作，职责是帮助他们在移动和无线系统中鉴定和分析漏洞，以及定位致命缺陷等问题。空闲的时候，他还会用极限攀岩活动来缓解工作的压力。

·Tim Kuester

Tim Kuester是马里兰州哥伦比亚市“战术网络解决方案”（Tactical Network Solution，TNS）组织的一名工程师。他有在“一站式工程”（turnkey engineering）的背景（该项目的范围从CubeSats卫星和BioMed生物医学设备研究，到间谍小配件和真空吸法器研究），平时喜欢嵌入式系统、无线通信、电路板等系统的入侵项目。除此之外，他还在TNS总部从事“软件无线收发”（software-defined radio）课程和“信号处理”（signal processing）课程的兼职讲授工作。工作之外，他还爱好业余无线电技术、步枪打靶射击、EMS邮政特快专递服务等方面。Tim特别感谢他的父母，以及他在马里兰大学巴尔的摩郡分校（University of Maryland，Baltimore County，UMBC）给予他悉心指导的工程教授。

关于技术审校人员

·Tim Medin

Tim Medin是Counter Hack公司的一名高级技术分析师，也是SANS研究所的资深讲师。作为一名专业的渗透入侵测试人员，Tim曾为数百个组织工作，这些组织包括财富100强企业，以及美国政府，其职责是在关键流程中，识别和使用系统弱点，进而保护关键网络。在创新的“网络战”（NetWars）程序方面，作为技术领先者，Tim领导了一个信息安全的开发团队，学员从高中生到退休的美国退伍军人，主要研究那些对教育行业、评估行业、竞赛行业的挑战信息安全内容，并最终将这些人培养成才华横溢的分析师。只要不是正在那些遍布全球的协议（如Kerberos协议）中查找致命漏洞，Tim则喜欢和家人待在一起。

·Mike Ryan

Mike Ryan是iSEC Partners组织的高级安全顾问（这是一个信息安全组织），主要从事渗透测试并专职红队的训练，同时兼顾网络渗透式入侵，嵌入式平台研究。另外，Mike还研究蓝牙安全，在专门针对蓝牙低功耗模式进行攻击的“超牙”（Ubertooth）项目中，在超牙的性能增加方面取得骄人战绩。从2002年起，Mike在安全领域，由先前的单一方式转换为另一种方式，如今已具备集各种技能、巧术，以及任何情况下将Leet语 [5] 带到台面上的能力。

·Jean-Louis Bourdon

Jean-Louis Bourdon是一名固件工程师。在Infineon处理器的设计方面拥有十年工作经验，在嵌入式系统方面拥有五年软件开发经验。现在，他在位于英国的Pektron公司工作，从事超级汽车和顶级汽车的仪表组设计工作。他的爱好经常是与技术相关，如拆解那些可以拿在手中进行详细分析的最新产品。

[1] Gary Kildall，微型计算机早期操作系统DOS的设计者之一。——译者注

[2] 黑帽子组织，发起于美国的一个国际黑客组织，主要以“黑帽简报”的形式在世界各地举办技术性很强的信息安全会议。另外“黑帽”和“白帽”本身也是对黑客进行分类的一个代名词，其中“黑帽”黑客注重于恶意攻击，带有破坏性；“白帽”黑客注重于攻击技术和防守技术的研究，且从不进行破坏性实战。有时，还有“灰帽”一词，介于“黑帽”和“白帽”之间。——译者注

[3] 蓝帽子组织，名称仿于黑帽子组织，由Microsoft创建，“蓝帽”会议每年举办两次，旨在通过与黑客之间的交流提升自己产品的安全性。——译者注

[4] Toorcon，发起于美国加州圣迭戈市的一个相对较新的年度计算机黑客安全会议。——译者注

[5] 黑客界俚语的一种，非常像中国年轻网友中使用的“火星文”，是将要使用的字符用其他形似、反转的、拆分的、重要特征相像的字符代替。如“7”表示“T”，“15”表示“is”，所以“\0vv 15 7-3 71v3.”表示“Now is the time”。——译者注

序言

我第一次关注无线通信安全大约是2001年，那时针对“有线等效保密协议”（Wired Equivalent Privacy，WEP [1] ）的攻击正大行其道。突然之间，数据网络通过空气传播，同样也是突然之间，这些网络的安全问题都深受其累。

对于无线网络的安全，总是存在大量激动人心的事情。无线网络的攻击不再需要以往的物理接入或网际互联！只要有一根好天线，监听者就可以从很远的距离监听一个网络！

随后的几年里，基于Wi-Fi的攻击工具和攻击技术变得越来越先进。尽管网络安全也在提高，但攻击者总能比防护者“领先一步”。这段时间以来，我对无线领域的安全越来越有兴趣，并从一些包括本书作者在内的802.11协议安全专家那里学到了一些重要的概念和技术。

最后，我将注意力转向其他无线通信协议。我很快意识到自己如果不动手开发一些发送和接收数字无线信号的工具集，那就意味着我几乎无所作为。Wi-Fi工具集便捷实用，并且功能异常强劲，这些工具使我受益匪浅，也让我学习了很多无线网络安全的通用原理。终于，借助工具集，在开始创建一些提供类似功能的工具以后，我就可以检测其他无线系统的安全了。

最初，我使用“软件无线收发”（Software-Defined Radio，SDR）开发平台来创建我自己的工具集。我是一个“软件独行侠 [2] ”（software person），极度热衷于“软件无线收发”SDR技术中，关于“允许无线电通信功能是生成到软件中，而不是生成到硬件中”的承诺，不幸的是，要达到这些目标，我发现我需要大量数据信号处理方面的背景知识。在最终掌握了这些知识后，我了解到实际上要设计这种对口工具，原本可以付出更小的代价。我所设计的一个平台是一个蓝牙测试工具，命名为“超牙一号”（Ubertooth One），可以在蓝牙设备处于“非可发现的”模式下仍然进行侦测。

如今，形形色色的无线技术在源源不断地开发出来，而无线通信领域的安全也比以往活跃。诸如对于Wi-Fi和蓝牙这些通行的技术，除了有那些专为针对它们的对口工具集之外，还有这些“软件无线收发”开发平台的通用工具集，并且后者正在变得更加廉价、易于使用。无线嵌入式系统正在迅速普及，新的无线通信协议似乎也在不断浮现，这导致我们永远难以找到合适的时间去探索这些系统中的安全问题。

在无线安全方面，这本书是我所知道的最佳参考。我希望那些学习无线通信系统的从业者可以好好读一读这本书。我也希望那些想获得更多安全知识的无线通信专家可以好好读一读这本书。尤其是对于那些数字无线电协议的设计者，我更推荐他们好好读一下这本书。因为对于了解一个新系统的安全来说，没有比通过实验成功地攻击之前的系统更行之有效的方法。

当我们快速开发一个新的无线通信协议时，那些已标准化的协议也更受欢迎。这些老系统中的安全问题，成熟得就像我们知道如何对抗那些熟知的攻击方式一样。Wi-Fi通信协议在安全方面是一个最好的例子，这得益于该协议被开发人员长年累月地研究和完善。如今，搭建一个可以弹性抵御攻击的、基于802.11协议的网络是可能的，而部署一个几乎没有，或根本就没有安全可言的网络也是可能的。你甚至可以使用安全问题诸多的“有线等效保密协议”加密算法来配置一个的新网络，不幸的是，一些人还真仍在这么做。

通过本书，你可以愉快地学到关于无线安全的一切内容，包括“Wi-Fi保护配置协议”（Wi-Fi Protected Setup，WPS）的弱点，以及诸如“蓝牙低能耗”协议等时髦的协议。你可以学到如何使用琳琅满目的基于“目的创建”的工具，也可以在Wi-Fi客户端系统中发现其多种多样的缺陷，还有就是通过重新定义部分无线电芯片目标的方法来攻击ZigBee网络与Z-Wave网络。在看过“软件无线收发”的产品部署以后，在使用其入侵无线协议的各个重要技巧上，你也可以获得一种跳跃式的提升。我甚至希望你借以破解一个或两个“有线等效保密协议”密钥。

总之，我希望你能愉快地探索令人振奋的无线安全领域。

Michael Ossmann

Great Scott Gadgets [3] 团队的创始人

[1] WEP协议是对两台设备间无线传输的数据进行加密的方式，由于算法存在几个弱点，所以随后被WPA和WPA2协议所取代。但是不了解的用户常误将其选为当前协议，所以现在该协议仍然经常是被攻击的对象。详见本书第3章。——译者注

[2] 软件独行侠就是软件开发过程中的设计、编码、测试、包装、发行都集于一身的人。——译者注

[3] 这是一个着力于无线入侵技术研究的团队，主要研究内容是通过软件对无线收发信号进行定义，进而实现对无线数字信号的监听和入侵，团队主页为http://greatscottgadgets.com/，软件开源，主要产品是HackRF One、ANT500、Ubertooth One、Throwing Star LAN Tap，这些都将在本书中有所体现。——译者注

前言

也就是一年以前，麦格劳-希尔教育出版公司的编辑找到我，谈及本书第3版的撰写事宜。当时，我们并不确定这是一件好事，因为当时每天的工作、会议计划，以及正在做的项目，使我们没有几乎没有时间投入到如此巨大的项目中。

现在回过头来看，我们很欣慰于当时做出了写作第3版的决定。首先，这是必须的！因为自从几年前本书第2版出版以后，黑客无线攻防技术变化非常之大。其次，我们可以将第2版出版以后研究的新协议、开发的新工具，通过本版与读者进行分享。再次，写这本书意味着这是一个保持信息共享的良好机会，因为无线是计算机网络安全的“瑞士奶酪（Swiss cheese）重叠孔” [1] 。

关于本书

在开始写作之前，我们讨论了在本书第3版中要写什么。我们要写的应该是务实的、有用的、注重实践的内容，注意实践意味着读者可以通过该方法进行渗透式攻击的测试与安全评估。因此，每章开始的第一节都描述某个被黑客攻破的技术案例，并不是用大量并不重要的背景知识打乱你的头绪，而是介绍一些底层协议以方便理解其原理。随后，在必要的背景介绍之后，每章都会介绍一些可行的攻击技术，这些技术足以用于攻击你的目标。

我们也清楚需要请专家在相应章节中为我们答疑解惑。在第11章和第12章中，我们幸运地请到了Tim Kuester和Chris Crowley。无论是广度，还是深度，这两人在各自领域内都造诣颇深。当然，我们并没有让二位在两章中直接代笔，而是让他们作为技术审校人员提供技术支持。Tim Medin作为本书大部分章节的技术评审，Mike Ryan在最具挑战的、与蓝牙技术相关的第7~10章中提供了宝贵的见解，Jean-Louis Bourdon则在第14章中提供了专家的视角，在Z-Wave领域，目前还没有几个人敢自称为安全专家。

对于本书第2版，我们也尽所能地找到读者的评论，花了大量时间来阅读（包括每一条正面和负面的评论）。对于正面的评论，我们会确保在写这些章节的时候继续保持。对于负面的评论，如果是非常有价值的，我们会悉心接受。例如有一些读者抱怨缺少在Windows操作系统上运行的黑客工具，再如在一个非常重要的话题，即针对“全球移动通信系统”（Global System for Mobile Communication，GSM）网络的入侵中，缺少必要的内容涵盖。我们希望在这次大规模更新版本中会对这些批评所涉及的不足进行修正。

对黑客来说，本书意味着：无论你是想点到为止，看看就行；还是牛刀小试，尝试“入侵”；或者是以全新的方式探索网络安全，以便达到以前已成文的技术所未曾到达的深度。动机你自己来选，只是我们可以很容易地看到，无论是在你的下一个无线入侵测试的过程中，还是你在重新审视以前对无线技术的使用方式上，又或者是在选择保护下一代嵌入式无线系统的资源上，本书就是你的绝佳参考。

本书涵盖了对无线安全进行攻击的很多内容，其意义在于通过了解黑客技术入侵到无线系统的技术，进而提高无线系统的安全。尽管Wi-Fi已成为无处不在的互联网接入技术，但许多其他无线协议也在使用，而本书所涵盖的协议是从安全角度出发，我们认为在日常使用中最重要的无线通信协议。包括从Wi-Fi协议到先进的“软件无线收发”协议，后者是目前无线通信协议中前所未有的。也包括“传统蓝牙”通信协议到“低能耗蓝牙”（Bluetooth Low Energy，BLE）通信协议。还包括苹果发布的iBeacon协议。对于“关键任务业务”和“家庭控制系统”，也包括ZigBee协议和Z-Wave协议。我们每天都在使用这些协议，所以了解它们的安全缺陷，保护它们免受攻击至关重要。

快速索引

在本书中我们使用“黑客大曝光”特有的格式进行编写，该格式已注册。

攻击图标

这个图标表示特定的渗透测试技术和工具。图标后面是技巧或者攻击技术的名称。在本书中你会看到传统的“黑客大曝光”危险分级表。

应对措施图标

大部分的攻击都有对应的应对措施图标。应对措施表示我们可以采取的一些措施，使用它们可以缓解对应攻击所带来的威胁。

我们同样使用特殊标记（即注意、提示、警告）来强调我们认为必要的特定细节和建议。

配套网站

为了方便读者，作者为本书开发了一个相应的网站，即http://www.hackingexposedwireless.com 。在网站上，读者可以找到本书中描述的许多资源，包括源代码、脚本、高分辨率的图片、资源的链接等。

网站上同样包括了802.11网络和蓝牙网络的补充介绍资料，还有一整套有关“射频低电平”（low-level radio frequency）的完整材料，它影响着所有的无线通信系统。

在本书出版之后，我们确定了一张勘误表，在配套网站上读者也可以找到这些更正，所以请经常访问配套网站确保与无线入侵领域的发展保持同步。

本书使用指南

阅读这本书，有几种不同的方法。第一种方法，随便翻到哪一页，找到“攻击图标”，就可以学到一种特定的技术，通过该技术可以查到一种具体的无线安全技术。第二种方法，随便翻到某一章的开始，可以学到一个具体的无线通信协议的重要操作特征。第三种方法，从头到尾，一章一章地读完。此外，我们希望这本书能作为一本有价值的参考书，能多年后仍然保存在你的书架上（或保存在你的数字阅读器里）。

本书共分成三个部分。第一部分专门讨论针对Wi-Fi的破解，本部分开始介绍如何入侵IEEE 802.11网络（第1章），随后详细介绍了扫描和发现802.11网络（第2章）。第3章主要介绍针对Wi-Fi网络的通用攻击。第4章则将这种攻击目标扩展到了流行的“Wi-Fi保护访问”WPA/WPA2（“Wi-Fi保护访问”版本1或版本2）保护的Wi-Fi环境中。第5章在深度上介绍了如何入侵无线用户的客户端。第6章则主要介绍通过“架桥过隙”技术，借助于一个中间被攻陷的主机去攻击一个远端无线网络。

第二部分主要介绍蓝牙网络的破解，既包括传统蓝牙支持，又包括低功耗模式的蓝牙技术。第7章主要介绍在蓝牙传统模式下，扫描和侦测时所用的工具和技术。随后的第8章则是蓝牙在低功耗模式下的扫描和侦测。第9章是蓝牙侦听和嗅探过程中所用的攻击技术，囊括了前面的传统模式和低功耗模式。第10章则是组合所有的技术，攻击传统模式和低功耗模式的蓝牙网络，以及使用这些技术所涉及的协议。

第三部分主要介绍的是除了Wi-Fi协议和蓝牙协议之外，其他无所不在的网络无线技术及其所支持的网络。第11章介绍了通过软件无线收发技术入侵的精彩内容，该技术令黑客“如虎添翼”，使其可以方便地访问以往无法访问的无线网络。第12章着眼于“蜂窝网络”的破解，包括二代（即2G）、三代（即3G）、四代（即4G）网络及LTE [2] 安全。第13章探讨改进ZigBee的黑客技术，主要介绍工业控制系统和其他重要无线部署。最后的第14章关注之前从未出版过的Z-Wave智能家居网络破解的相关知识。

本书可以作为参考手册备用，帮你在下一个渗透测试中，进行脆弱性评估时，或在审计时，或在政策审查时，或道德入侵约定中使用。保有本书，可以在洞察复杂的无线协议时，将其作为参考。最后，在你发现某无线安全漏洞的时候，及时向全世界同行进行分享，因为只有公开披露，世界才会实现显著的变化。

Joshua Wright

[1] “瑞士奶酪模型”是James Reason提出的，即在多层奶酪片中，每一层都有不规律分布的孔，如果有光穿透奶酪，则穿透部位的每一层都在该位置有重叠孔，反之，只要有一层没有重叠孔，光就透不过来。这句话的意思是：如果将计算机安全分成一个个层，那么各层中与无线相关的部位将组成重叠孔，成为整个系统的公共弱点。——译者注

[2] LTE，Long Term Evolution，即长期演进，是由3GPP（The 3rd Generation Partnership Project，第三代合作伙伴计划）组织制定的UMTS（Universal Mobile Telecommunications System，通用移动通信系统）技术标准的长期演进。——译者注

致谢

感谢约翰逊·威尔士大学技术学院（Johnson&Wales University School of Technology）的全体教职员工，即使我毕业多年，他们仍然一如既往地继续为我提供教育上的服务。本书的每一章都是我在那里受教后的反馈，从程序编写到逻辑设计，从电路理论到数字信号处理，从嵌入式系统到单片机的逻辑分析，我的教授们给我留下了不可磨灭的印象，他们教我怎样从失败中吸取教训，那就是不停地自问“这件事应该怎么做”，这使我可以克服任何困难，进而投入激情做更伟大的事情。特别感谢Al Benoit、Frank Tweedie、Jim Sheusi、Ron Russo、Al Colella、Al Mikula和Sol Neeman，感谢他们送给我的特殊礼物。

感谢我在Counter Hack公司的同事们，他们在我利用一些学术间隙从事本书写作的时候，给予了帮助和支持。感谢本书的编辑组成员Brandi Shailer、Meghan Manfre、Janet Walden和Amanda Russell，在整个繁杂的编审流程中，每到稿件的重要时间节点，他们都提供悉心指导和灵活的处理。这次，我再次幸运沾了LeeAnn Pickrell超凡编辑技巧的光，对此我非常感激。同时感谢技术编辑Tim Medin、Mike Ryan和Jean-Louis Bourdon，他们为本书增辉不少。感谢Matt Carpenter、Chris Crowley和Tim Kuester所给予的宝贵支持和技术诀窍，感谢我的合著者Jon，在一年前就同意与我同舟共济，共担此任。

最后，感谢我的孩子Maya和Ethan，他们使我想成为一个更好的人。感谢我的妻子Jen，她帮我变成了这样的人。

——Joshua Wright

我要感谢许多有超凡才华的个人和团体，我有幸与之共事多年。这些个人和团体包括（但不仅限于）#area66、serialbox、trajek、Rich Johnson、Matt Miller、hlkari、geo、linnox、spoonm、Skywing、hdm和Pusscat。如果不是你们，我可能永远不会使用ATDT 9884227这个网名。

——Johnny Cache

第一部分　破解802.11无线技术

·第1章　802.11协议攻击概述

·第2章　发现和扫描802.11网络

·第3章　攻击802.11无线网络

·第4章　攻击WPA保护下的802.11网络

·第5章　攻击802.11的无线客户端

·第6章　在Windows 8上架桥过隙

案例学习：用十二伏电压 [1] 的英雄

在Foray Solutions公司总部的三楼，Jen刚在她的办公小隔间里，倒好早晨的咖啡，扫视了一下电子邮件的标题。积攒了几天的邮件，有强制性的道德培训方面的，有关于她的一些费用的有效性问题方面的，看着没有需要多关注的，Jen就将它们都标记为“已读”（read）状态。Jen很久以前就知道，如果有重要的事情，对方一定会重发的。这样做，她就不必浪费宝贵的时间来对这些邮件一一阅读，因为她有更多事情想去做，比如到新闻社交网站Reddit上看新闻，或到专门发小猫图片的LOLCats网站上看图片。

Jen在网上欣赏了一些可爱的小猫图片，大约十分钟后，Ryan站在了旁边，这意味着工作的开始。他们俩本周计划是审计市中心的一家法律公司。可没料到的是，该公司在安全方面管得还挺严，Ryan仅在前台接待员那里硬是磨了几分钟才让他进去。不过，他也没心思关注一楼的建筑艺术画廊，而是直奔律师办公室而去。

Jen来到画廊里，并不停地在画廊中走来走去。Jen和Ryan都心照不宣，在Jen的钱包里装了一个电池供电的“Wi-Fi小菠萝” [2] （Wi-Fi Pineapple）。这时在律师办公室中的Ryan通过下达命令控制这台小设备，而Jen则是尽量靠近目标，因为这意味着Ryan也会离目标更近。

事实上，Jen在画廊里所带的这台“小菠萝”，是一台黑客工具，其目标就是连接无线路由器，Ryan在头一天晚上就配置好了。当Jen走近目标的时候，她接下“小菠萝”的工作开关。一分钟后，“小菠萝”就连接到了“全球移动通信系统”GSM网络上，并反向主动连接到Ryan的主机上。而Jen进门之后，她的“小菠萝”就从Ryan那里收到了一个文字信息，告诉Jen一切顺利。

当Jen和画廊馆员聊天的时候，Ryan则忙于入侵“小菠萝”所连的那个无线网络。Jen犹豫的是，为了工作，她已经买过一幅画，现在是否还有必要再买一幅。与此同时，Ryan已经找到了该公司的客户网络，一旦入侵成功，他会发出“Stach_and_Liu_ESQ_Guest”命令对路由器进行刺探性地连接。碰巧的是，这个型号的思科路由器设备上，一个能产生后门的漏洞最近才被黑客发现。想到这儿，Ryan就通过漏洞，借助后门登录到路由器上，开始内部网络中，“Wi-Fi保护访问”WPA密钥的破解工作。

其实这时，如果利用“小菠萝”向连接到该路由器上的客户端发起“中间人攻击”（man-in-the-middle attack）是件很刺激的事，但是Ryan知道现在的“小菠萝”是靠电池供电的，Jen也不可能背着“小菠萝”在画廊里转上一整天。要知道她本来也没有打算买什么东西，这么明显的道理，这样的成本估计，使Ryan放弃了这种想法。

想想自己估计也就只有十分多钟的时间，再多了，估计Jen会因为自己的拖延而让自己为她的疯狂购物而买单，Ryan就赶紧登录到路由器，启用了路由器的远程管理功能，设置了路由器的“主域名”（primary Domain Name System，DNS）地址，使其指向一个他为了这个工作而专门申请的“虚拟专用服务器”（Virtual Private Server，VPS）上。现在，他知道他已牢牢地掌控了这个网络。这时，Jen也可以回她的办公室了。

每当Ryan看到有DNS请求进来，他都会检查他们的浏览器是否有漏洞。看到他们当前使用的浏览器范围，Ryan不禁哑然失笑。他给Jen发了个消息，让她直接回办公室，或者是在路上选一个星巴克咖啡店准备工作，因为这将是忙碌的一天。

[1] 目前的大多数电子设备，采用的都是5伏或12伏电压。本文的主角“Wi-Fi小菠萝”采用的就是12伏电压。——译者注

[2] Wi-Fi小菠萝是目前广为流行的一种安全测试设备，具有简单易用的中间人攻击操作功能，是黑客常见的工具之一。其第一代外形像个菠萝，后面几代虽然没有这一特征，但名字被保留下来。——译者注

第1章　802.11协议攻击概述

欢迎阅读本书。第一章主要介绍802.11协议，其目的是帮助读者在工作中选择正确的802.11设备。在本章的最后，你会对802.11网络的工作原理有一个基本的了解。同时，本章也会回答一些常见的问题，包括需要购买哪种无线网卡、哪种“全球定位系统”（GPS），以及哪种天线等。另外，读者也能明白类似于Kismet的“无线服务发现”工具是怎样工作的。

1.1　802.11标准简介

802.11标准定义的是一个数据链路层（link-layer）的无线协议，该标准由“美国电气和电子工程师协会”（Institute of Electrical and Electronics Engineers，IEEE）负责管理。许多人在听到802.11时，首先会想到Wi-Fi技术，实际上二者并不等同。Wi-Fi标准是802.11标准的一个子集，而且Wi-Fi标准是由“Wi-Fi联盟”（Wi-Fi Alliance）负责管理。因为802.11标准过于复杂，其标准的更新流程非常耗时间（具体的更新操作由IEEE下的一个委员会负责），所以几乎所有的主流无线设备制造商都觉得，他们需要一个小但灵活的组织来管理更合适，这样当他们通过市场的努力，需要进行技术推进时，该组织能在供应商之间进行维持、协调工作。Wi-Fi联盟由此产生。

在一个给定的功能集合上，Wi-Fi联盟可以确保所有具有Wi-Fi认证标志的产品都能一起工作。这样一来，如果802.11协议中出现任何两义性的概念时，Wi-Fi联盟会定义其中一项作为“正确的项”（right thing），然后要求所有Wi-Fi认证的产品按照“正确的项”去做。该联盟还允许供应商实现一些“草案标准”（指未经过批准的标准 [1] ）的重要子集。草案标准中，最著名的例子就是“Wi-Fi保护访问”（Wi-Fi Protected Access，WPA）或叫作“802.11n草案标准”。

提示

网站

要想对上述内容有更多的了解，或者是想更细致入微地了解802.11标准，可参见本书的配套网站中的“Bonus Chapter 1”，网址是http://www.hackingexposedwireless.com/chapters/ 。

1.1.1　基础知识

大多数人都知道，802.11是通过“ AP接入点 ” [2] （AP，Access Point）将无线设备接入有线网络，但当设备处于ad-hoc [3] 模式或独立基本服务集（Independent Basic Service Set，IBSS）模式时，802.11可以在没有接入点的前提下使用。因为ad-hoc网络本身就是一个开放的无线网络，所以一般我们并不关注无线安全，而当设备处于ad-hoc模式时，802.11协议中，各项技术细节改变很大，因而作为专讲无线安全的书，并不涉及ad-hoc模式。除非另有规定，否则这一节所包含内容都是指802.11运行在“ 无线接入点 ”模式（Infrastructure Mode，即有AP的模式）。

802.11标准将所有的通信数据包分为三种类别：数据数据包、管理数据包、控制数据包，这些不同类别被统称为通信数据包类型（packet type）。数据数据包的作用是负载更高层次的数据（如IP数据包）。管理数据包可能是攻击者最感兴趣的通信数据包，因为它控制网络的管理功能。控制数据包得名于“介质访问控制” （Media Access Control，MAC），用来干预访问共享介质。

任何给定通信数据包的类型都有许多不同的子类型。例如，信标帧 [4] （Beacons）和解除认证（Deauthentication）的通信数据包都是管理数据包的子类型，请求发送（Request to Send，RTS）和清除发送（Clear to Send，CTS）的通信数据包都是控制数据包的子类型。

1.1.2　802.11通信包的地址

与以太网的数据包有源地址、目的地址这两个地址不同的是，大多数802.11通信包有三个地址：源地址、目的地址和“基本服务集标识”（Basic Service Set ID，BSSID）。这个“基本服务集标识”项就是唯一标识某个AP接入点，以及该AP接入点所关联站点的集合，采用AP接入点的无线接口使用相同的MAC地址。这三个地址告诉通信数据包到哪去、谁发送的、经过哪个AP点。

然而，并不是所有的通信数据包都有三个地址。例如“确认帧” [5] （Acknowledgment frame）就不是这样，这是因为减少发送“控制帧”的开销非常重要，所以此类帧结构的bit位的个数也能减就减，一般保持最低的位数。另外，美国电气和电子工程师协会也使用不同的术语来描述“控制帧”的地址，如用“接收地址”（receiver address）来代替“目的地址”（destination address），用“发送地址”（transmitter address）来代替“源地址”（source address）。

图1-1显示的是通过Wireshark截包软件截获的一个典型的数据包。

图1-1　Wireshark软件截获的数据包

不要被Wireshark所定义的“接收地址”（即图1-1的Receiver）和“发送地址”（即图1-1的Transmitter）所迷惑。所有的802.11数据包都有三个地址（目的地址、源地址、“基本服务集标识”），而不是五个（目的地址、源地址、接收地址、发送地址、“基本服务集标识”）。Wireshark最近也开始允许将“源地址”作为“发送地址”，“目的地址”作为“接收地址”。这样可以使在各个工作控制帧和数据帧之间的过滤器（filter）有一个兼容的层 [6] 。

1.1.3　802.11安全启蒙

如果你正在读本书，那么可能已经意识到，在保护802.11网络成员中，有两个非常不同的加密技术：“有线等效保密协议”（Wired Equivalency Protocol，WEP）和“Wi-Fi保护访问”（Wi-Fi Protected Access，WPA）。其中的“有线等效保密协议”是早期版本，是一个相当脆弱的标准；“Wi-Fi保护访问”则更现代和有弹性。“有线等效保密协议”的网络一般使用静态的40位或104位公开密钥，事先参加传输的每一个客户端都知道所使用的密钥。密钥用于初始化一个基于RC4加密算法的流密码，恰恰这个RC4加密方式吸引了很多攻击者的兴趣，并实施了对“有线等效保密协议”的攻击，这些攻击方式会在第3章涉及。而“Wi-Fi保护访问”协议可以配置两个差距迥异的模式，即“预共享密钥”（Pre-Shared Key，PSK）模式和企业模式。下面分别对二者进行简要说明。

1.WPA的预共享密钥模式

“Wi-Fi保护访问下的预共享密钥”（WPA Pre-Shared Key，WPA-PSK）的工作方法和“有线等效保密协议”相似，都需要连接方提供密钥才能访问无线网络，不过，二者的相似点也仅限于此。图1-2显示了“Wi-Fi保护访问下的预共享密钥”的认证过程，这一过程被称为“四次握手” （four-way handshake）。

图1-2　一次成功的“四次握手”过程

“预共享的密钥”PSK（即密码）可以是8~63之间任意长度的可打印的ASCII码字符。使用“Wi-Fi保护访问”的加密算法依赖于“成对主密钥” （Pairwise Master Key，PMK），该PMK是由“预共享密钥”和“服务集标识”计算生成的。一旦客户端获得了PMK，客户端就会与AP接入点开始协商一个新的、临时的密钥，该密钥称为“成对临时密钥”（Pairwise Transient Key，PTK）。这些成对临时密钥PTK在每次客户端进行连接的时候被动态创建，在之后每次连接的时候进行定期更换。从编程的角度来看，PTK的生成可以看成是由5个参数组成的函数，其参数有：“成对主密钥”，一个随机数字（由AP接入点提供，称为A-nonce [7] ），另一个随机数（由客户端提供，称为S-nonce），以及客户端与AP接入点各自的MAC地址。PTK的生成之所以需要这么多的变量，究其原因是为了使每次创建的PTK值都独一无二，不会重复。

AP接入点通过在认证交换时检查“信息完整性检查码”（Message Integrity Code，MIC）字段，来验证客户端是否真的有“成对主密钥”。“信息完整性检查码”是一个数据包的加密散列函数（hash function），该函数是由PTK和PMK混合而成，主要用于防止篡改和核实客户端具有这个主密钥。如果“信息完整性检查码”是不正确的，这就意味着“临时密钥”和“成对主密钥”是不正确的，因为“临时密钥”是从“成对主密钥”中推算出来的。

攻击“Wi-Fi保护访问”算法时，我们最感兴趣的当然是还原正确的“成对主密钥”。如果网络设置在“预共享密钥”模式下，则允许你“读取”所有其他客户端所传输的数据包中所包含的“成对主密钥”，并验证自己是否成功。当然，这里的“读取”实际上就是嗅探监听，要使用一些手段才行。

同传统的“有线等效保密协议”部署一样，“Wi-Fi保护访问下的预共享密钥”也有很多类似的使用案例，但即使如此，“Wi-Fi保护访问下的预共享密钥”仍然也仅能用于家庭或小型办公室环境中。由于“预共享密钥”的使用需要连接到网络，所以主密钥是一个全网共享的数据，这意味着在一个使用“Wi-Fi保护访问下的预共享密钥”加密网络的大公司中，有员工离开公司，或该公司的一个网络设备被盗，这就意味着“成对主密钥”被公开。要想系统不受攻击，则整个网络必须重新配置一个新的“成对主密钥”。在“Wi-Fi保护访问”的算法中，与上述预共享密钥模式相反，“WPA企业模式”并不需要全网使用同一个“成对主密钥”，而是可以提供多个单独认证，这意味着对可以连接到无线网络的客户端有更大的控制权，因此在大多数大型企业中被广泛使用。

一花多名：WPA，WPA2，802.11i和802.11-2007 [8]

聪明的读者可能已经注意到，我们前面已提出了“Wi-Fi保护访问”WPA。如前所述，WPA是Wi-Fi的通信标准，而Wi-Fi属于“Wi-Fi联盟”，802.11属于“美国电气和电子工程师协会”，所以，“Wi-Fi保护访问”是802.11i的子集，但在802.11i未被批准前，WPA也还只是一个由Wi-Fi联盟创造的临时解决办法。在802.11i被批准以后，“Wi-Fi保护访问”就被合并到最新的802.11标准中了。从技术上讲，大多数路由器和客户端，除了实现802.11i的功能之外，还实现了802.11-2007标准中增强的安全性功能，因此，如果我们不拘泥于版本之间的细节差异，可以把802.11-2007啰嗦地解释为“对于以前称为“Wi-Fi保护访问”或称为802.11i的加密标准，802.11-2007是其改进版”，在本书中，我们将继续使用“Wi-Fi保护访问”WPA这一术语。

2.WPA的企业模式

在一个基于WPA认证的网络中，一旦我们证实了该网络是运行在“WPA企业模式”下，那么网络中每个用户每次主动连接时，“成对主密钥”都会被动态地创建。也就是说，即使我们拿到了该用户的PMK，也只能模仿这一个用户的指定连接。

在“WPA企业模式”中，“成对主密钥”是在“认证服务器”（authentication server）上产生，然后下发到客户端的。AP接入点和认证服务器是通过一个称为RADIUS的协议（Remote Authentication Dial In User Service，远程用户拨号认证协议）进行对话的 [9] 。认证服务器和客户端的信息交流使用AP接入点作为其中继节点。当认证服务器做出最终决定接受或拒绝客户端用户时，AP接入点则会忠实地听从认证服务器的决定，实施同样的接受或拒绝操作。因为AP接入点只是充当一个中继节点，所以在客户端通过认证服务器的认证之前，它只是认真地将客户端的认证传给认证服务器，而只有客户端通过认证后，AP接入点才开始传送客户端正常的数据包。

如果认证成功，客户端和认证服务器都将获得相同的“成对主密钥”。“成对主密钥”如何创建的细节根据验证类型的不同而有所不同，但重要的是，它是一个加密的强随机数，两端都可以计算。然后，验证服务器就告诉AP接入点，可以允许用户建立连接了，但同时让用户在向AP接入点建立连接的时候发送该“成对主密钥”，以便AP接入点识别。因为这时的“成对主密钥”是动态创建的，每个用户的“成对主密钥”一般是不同的，所以AP接入点必须记住哪个“成对主密钥”对应哪个客户端用户。一旦所有AP接入点和所有客户端都有“成对主密钥”，那么各AP接入点和各客户端之间就可以像图1-2中所显示的一样，进行连接时所需的“四次握手”操作。这一过程用于确认客户端用户和AP接入点都有正确的“成对主密钥”，并能正常通信。图1-3显示了基于企业模式的整个认证过程。

3.EAP和802.1X

你可能注意到图1-3中许多通信的数据包前有EAP标识。EAP表示“扩展认证协议” （Extensible Authentication Protocol）。EAP基本上是一种携带任意其他认证协议的协议，所以可以说是一种认证的“元协议”（meta-protocol）。EAP允许设备（如AP接入点）忽略具体的认证协议细节。

图1-3　基于企业模式的“Wi-Fi保护访问”认证

IEEE 802.1x协议的设计本来是为了在有线局域网上认证用户的。借助EAP，802.1X就可以实现认证，而“Wi-Fi保护访问”又使用802.1X。当客户端向AP发送认证包时，双方使用了“局域网上的EAP协议”（EAP over LAN，简称EAPOL），该协议也是802.1X协议组中规定的一个标准协议。当AP和认证服务器进行通信时，又会在RADIUS协议的数据包外再包上一个EAP的认证数据包。

在“WPA企业模式”下，所有的AP接入点所做的事情，就是在客户端和认证服务器（例如RADIUS服务器）之间来回传送EAP信息。并且，AP接入点其实所期待的，也就是RADIUS服务器及时地让它知道是否允许某个用户进入本系统中。而是否允许进入，是通过寻找“EAP成功”的消息，或者是“EAP失败”的消息来判断的。

正如你可能已经猜到的那样，还真有几个不同的认证技术是基于EAP实现的。比如其中最受欢迎的：“基于传输层安全的扩展认证协议”EAP-TLS（certificate-based authentication，基于证书的认证协议）和“受保护的扩展认证协议”（Protected Extensible Authentication Protocol，PEAP）。有关这两个协议的细节，以及怎么样攻击它们等内容，具体参见第4章。

一般而言，理解802.1X在哪里结束，EAP/EAPOL在哪里开始，以及RADIUS服务器在哪里开始起作用并不重要。重要的是必须知道，当使用企业模式进行认证时，客户端和认证服务器互相传送特定格式的认证数据包。所以，AP接入点必须来回地代理双方互通的信息，直到认证服务器告诉AP接入点是停止还是允许客户端访问。图1-4显示了各个数据包的协议栈，如前所述，由于每次认证数据包都由多层协议共同完成，各层协议各司其职，完成所负责的功能。对于在以太网中实施802.1X端口安全管理的网络管理员来说，这个图看起来应该很熟悉。如果将一个基于802.1x的软硬件交换机替换掉图中的AP接入点，效果是完全相同的。

图1-4　各数据包的协议栈

[1] 802.11n标准在2009年获得IEEE的正式批准，而Wi-Fi联盟在2007年就发布了《802.11n技术白皮书》，所以Wi-Fi的很多早于IEEE的标准，在当时只能称为“草案”。——译者注

[2] 对于AP接入点，大家可以将其简单地理解为家里或单位里的无线路由器，这样有助于理解后面的内容。——译者注

[3] ad-hoc模式是一种无线自组模式，每一个设备节点除了具有通信功能之外，还具有路由功能，所以在这种模式下，任何两个节点间可直接通信或通过第三方节点进行通信，而不需要固定的路由设置，也叫作“点对点模式”，主要应用于军队或地下、野外等不能或不值得架固定通信设施的特殊环境施工环境。在本书第13、14两章中频繁出现的mesh网，是ad-hoc网络的一个升级版。在这两种网络中，数据在两个相邻设备之间传输的动作称为“跳”（hop）。——译者注

[4] 无线设备中，定时依次按指定间隔发送的有规律的无线信号，主要用于定位和同步使用。——译者注

[5] 帧在本书，乃至于整个计算机领域，都有两层意思，一个是数据链路层上一个完整的数据包的单位，这一帧数据到了网络层原则上会变成一个数据包，但没有绝对关系。还有一层是应用层的，比如一个浏览器浏览的页面或一整屏幕的数据，也称为一帧数据，这个通常都是由一个或多个数据包组成。另外，在很多不使用IP进行传输的网络里，只有“帧”，没有“包”的概述。在本书中混用了两种帧，将帧与数据包等同并混用，所以这里也沿用了这种混用的风格，将三个概念混用，基本上不会影响对内容的理解。——译者注

[6] Wireshark中，每一个对包操作的对象都叫“过滤器”。对于控制命令，通常有一个发送的，一个接收（并执行的）的，故习惯使用“发送地址”和“接收地址”；而数据，则是由一个地方到另一个地方，所以常用“源地址”和“目的地址”。——译者注

[7] 凡是以nonce命名的随机数，一般都表示一个与时间有关的随机数，其作用一般有两种：一种是由于该值一直处于变化状态，所以引用该机制的随机数也一直处于变化状态，接收方如果连续收到很多该数不变的包，则可以认为自己受到了“重播攻击”；二是在时钟同步的系统中，发送方在某一时刻发送一个带有该时刻值的数据包，该数据包经过网络到达接收方以后，接收方可以将该包中的时刻与自己本地的时刻进行比较，如果发送方的时间靠前，且相差不多，则为正常，否则也可以认定对方是在用随机数攻击自己。——译者注

[8] 除了原书作者所提的各点之外，还有WPA和WPA2除了是无线通信标准之外，还是该标准的一种实现。另外，文中没有提WPA2，WPA2很显然是WPA的升级版。IEEE的标准格式中，带年代的标准通常是几个标准的合集，所以确切地说802.11-2007中，与802.11i的对应部分才与802.11i是一花多名。——译者注

[9] 所以后面也称认证服务器为RADIUS服务器。——译者注

1.2　“服务发现”的基本知识

在攻击一个无线网络之前，你需要找到一个无线网络，这需要借助扫描类（也称服务发现类，后面混用这两个概念）的工具。有相当多各式各样的工具都可以满足我们对这一功能的需要，只是这些工具都可以归于两大类：“被动式”（passive）或“主动式”（active）服务发现工具。被动式服务发现工具的原理是在一个给定信道（channel）上，监听无线信号的任意数据包，进而通过分析这些数据包来确定哪些客户端正和AP接入点进行通信。主动式服务发现工具的原理更基础，它们向目标主机主动发送希望得到回应的“探测请求”（probe request）数据包 [1] 。在攻击任何无线网络之前，了解和选择顺手的工具都是一个重要的步骤。随着对“战争驾驶” [2] （war driving）的一些参与实践，本节涵盖了网络发现所需的软硬件的基本原则。下一章将深入研究现今可使用的主要工具。发现无线网络，首先应该了解主动和被动扫描的基础知识。

主动式扫描

实现主动扫描的工具，都会周期性地发出一些探测类的请求数据包。每当客户端需要进行网络查找操作的时候，客户端就会使用这样的探测类请求数据包。例如，客户端需要查找一个指定网络的时候，可能发送有针对性的“探测请求”数据包：“网络X，你在那边吗？”，如图1-5所示。或者客户端需要查找都有哪些网络的时候，他们也会通过广播的方式发送另一种“探测请求”数据包：“喂，有人吗？”，如图1-6所示。“探测请求”本身是802.11标准规范的两项技术之一，作用既是用来让客户端寻找一个要关联的网络，也是用来让客户端通过使用信标去找到所有的网络 [3] 。

图1-5　一个探测请求数据包实例（注意其中SSID参数是个广播地址）

AP接入点每1/10秒发出一次信标数据包。每个数据包包含相同的信息集合，这些信息集合将出现在探测回复数据包中，其内容包括主机名、主机地址、所支持的速率等。因为这些数据包通常可以被任何接收者轻而易举地接收到，所以大多数主动的扫描器也同样可以接收这些数据包并进行处理，然而，事实并非总是如此。通常情况下，主动扫描器可以从网上拿到信标数据包，但并不都是这样，拿不到的情况不仅取决于所使用的扫描器本身，还包括控制无线网卡的驱动程序。主动扫描器的主要缺点是程序界面上除了能看到“探测请求”（和可能的信标）的数据包之外，看不到其他所有的无线通信内容。

图1-6　一个典型的广播探测请求数据包

大多数操作系统都是在寻找要连接的网络的时候才采用主动扫描，并且它们都是周期性地做这个操作，如果客户端用户请求一个更新操作的内容时，操作系统也会做这样的操作。对操作系统系统来说，两个操作的不同之处在于，前者进行寻找操作时，操作系统发的是广播探测请求数据包；而后者发送的是定向的“探测请求”数据包。在Windows XP操作系统，并在打了SP2（Service Pack 2，即第2版服务包补丁）之前，客户端通常向所有它们想连接的主机SSID发送定向探测请求数据包，所有的这些AP接入点都保存在“用户的网络偏爱列表”（user’s preferred network list）中。Windows XP SP2之来，操作系统在设计上改进了扫描技术，变成了只在需要的时候，向需要连接的AP接入点发送定向探测数据请求数据包。

大多数主动扫描的工具永远只能找到那些“操作系统能通过主动扫描方式找到的网络”（换句话说，这些扫描工具的能力不会比你所用操作系统的能力更强，你只能找到那些出现在你操作系统的可用网络名单里的网络），从这一点来说，主动式扫描工具与被动式扫描工具相比，主动式扫描被挤到一个非常不利的地位。

嗅探器、搜寻器、扫描器

与无线攻击工具相关的术语有点令人难以应付。对“搜寻器”（Stumbler）和“扫描器”（Scanner）来说，绝大多数主动式扫描的工具都称为“搜寻器”，而绝大多数被动式扫描的工具被称为“扫描器”，使用“扫描器”略多于“搜寻器”。而对“搜寻器”和“嗅探器”（Sniffer）来说，“搜寻器”即使从技术上看不能算是扫描器，但“搜寻器”仍然被认为是一个“扫描工具”，而“嗅探器”是网络监测工具，虽然与所有网络都息息相关，但与无线网络并没有必然的相关性，它只是一个简单的网络工具，可以显示网卡接口所能看到的所有数据包。另外，“嗅探器”也是一个应用程序的常见名称，鉴于它的数据都来源于协议的低层，所以如果处于低层的无线的驱动程序或网卡不向“嗅探器”提供数据包，那“嗅探器”就什么也做不了。

被动式扫描（监测模式）

被动式扫描工具产生的效果要比主动式扫描工具产生的效果好很多。被动式扫描工具自身不发送数据包。相反，它们收听给定信道上的所有数据包，然后分析这些数据包，进而看看下一步做什么。这些工具能更好地查看周围的整个网络。不过，要想达到这种效果，所用的无线网卡必须支持一种功能，即一种被称为“监测模式”（monitor mode）的功能。

把一个无线网卡置于“监测模式” 类似于把一个正常的有线以太网卡置为“混杂模式”（promiscuous mode），在这两种情况下，都可以看到所有通过“线缆”（或信道）的所有数据包。不过，一个关键区别是，当你把有线网卡置为“混杂模式”时，你肯定只能看到你所接入的网络上的所有通信。而在无线网卡上就不是这种情况了，以我们最常使用的Wi-Fi为例，Wi-Fi使用2.4GHz波段范围的频率，而这个频段是“免授权的” [4] ，任何单位都可以共享地使用这个频段，这就意味着，同一信道内可以有多个重叠的网络。在这一共享频段的前提下，如果你和你的邻居共享同一信道，当把你的网卡置于“监测模式”，想看看“你的网络”中会发生什么时，你在看到自己网络上所有通信数据包的同时，也会看到她的网络上所有通信的数据包。

无线网卡和有线网卡的另一个关键区别是：以太网卡上的“混杂模式”是一个标准功能，而某一泛指的无线网卡是否具有“监测模式”则不能草率地得出“肯定就有”的结论。要想让一块无线网卡支持“监测模式”，并能好好工作，需要同时满足两个必要条件。首先，网卡上的主芯片必须支持这种模式（有关芯片方面的更多说明，详见在本章后面的1.3.2节）。其次，正在使用的驱动程序也必须同样支持监测模式。显然，对于想成为无线网络方面的黑客的人来说，选择一个支持“监测模式”的网卡（甚至要考虑在多个操作系统上的驱动程序都支持这一功能）是重要的第一步。

一个关于被动式扫描器如何工作的简介，很可能就可以帮助我们消除隐藏在扫描器背后的“魔力”。任何被动扫描工具的基本结构都是一致且简单的。首先，将无线网卡置于“监测模式”，如果用户已经这么做了，则跳过本步骤。然后，扫描器的程序内部进入一个循环运行状态，该循环不停地从网卡读取数据包，并对其进行分析，当有新的信息的时候，同时刷新用户的显示界面。

例如，当扫描器看到一个数据包，包中信息包含一个新的“基本服务集标识”，就会更新显示用户界面。当出现一个数据包可以关联一个“服务集标识”SSID（即网络名称 [5] ）到该“基本服务集标识”上时，它也会更新其显示界面，并将其网络名称加上去。而当扫描器看到一个新的信标帧时，只是将新的网络添加到它的名单中。所以，从这里来看，被动式扫描工具与主动式扫描工具一样，也是对数据进行分析，只是主动式扫描工具发出探测请求后，接收和分析的是对方回复的数据包信息，而被动式扫描工具则自身不发送“探测请求”数据包，只是直接接收对方所发的数据包，进而进行分析。

主动扫描应对措施

要规避主动式扫描器的扫描相对简单，但这样做有一个主要缺点，具体内容涵盖在随后章节中。因为主动式扫描器只处理两类数据包（探测回复数据包和信标数据包），所以一个AP接入点，要想避开主动式扫描器的扫描，必须分别使用两种不同的技术来进行有效地躲避。

第一种技术是对广播类的“服务集标识”的“探测请求”不予回复，当然，如果AP接入点看到一个“探测请求”不是广播类的，而是指向自己（即探测请求数据包中，已经包含本AP接入点的“服务集标识”），就做出反应，对其进行回复。因为如果是这种情况发生，就说明对方已经知道你的网络名称，很显然它此时只是在寻求和你进行连接。反之，如果探测请求发送的是广播“服务集标识”请求，这时大可不予理会 [6] 。

通过上述方式，虽然一个AP接入点没有回复对方广播式的“探测请求”，但信标数据包中仍然包含有自己的“服务集标识”，所以这样做仍然不能叫“隐藏”。也就是说，当一个接入点设定成不回复广播“探测请求”模式，扫描器还将“检查”它在信标数据包里的“服务集标识”，所以如果主动式扫描器接收到信标数据包，同样可以从中获得“服务集标识”。根据无线通信标准，AP接入点必须得在自己的信标数据包里包含“服务集标识”字段，这种操作是强制性的，无法回避。不过也有变通手段，那就是在填“服务集标识”的位置，插入一些空字节 [7] 代替“服务集标识”。

大多数AP接入点都包括这两项功能。有时这个功能被称为“隐藏模式”（hidden）。还有些AP接入点的供应商只会在设备功能配置界面上简单地提供一个复选框，名称只是草草地标为“允许广播SSID”。因为要避免被扫描到，通常都是“广播探测回复”和“检查信标中的SSID字段”两项，要禁都禁，二者缺一不可。所以一般来说，AP接入点只提供一个禁用开关同时控制两项，因此要想禁用这一功能，只需要取消选择上面的“允许广播SSID”复选框即可。

你可能会认为，或许隐藏AP接入点的最好办法就是完全禁用信标功能。听起来似乎可行，因为如果这样做的话，AP接入点不再向外发送“服务集标识”，各个客户端要连接AP接入点时，直接在探测请求中指明要连的“服务集标识”，那么网络上“服务集标识”出现的唯一机会就是客户端在访问该AP接入点的时候。然而事实上你是不可能完全禁用信标的。对于AP接入点来说，信标数据包的作用不仅仅是宣布自己这个AP接入点网络的存在性，而是有大量的功能要使用信标，如果一个AP接入点在一个固定的时间间隔不发送自己的信标，那么整个网络就会因很多功能无法实现而瘫痪。

还有一点不要忘记，如果主动式扫描器不能拿到一个AP接入点网络的“服务集标识”名称，那么那些合法的客户端也不能。所以网络运行在“隐藏模式”下，意味着使用这个网络的终端用户事先保存了隐藏起来的那些“服务集标识”名称。或者用户客户端虽然没能找到该“服务集标识”网络，但它很确定这里肯定有这个“服务集标识”的AP接入点，才会有人这样设置。特别需要说明的是，在AP接入点隐藏的状态下，客户端用户必须知道他们感兴趣的网络“服务集标识”是什么，并且有办法把这个“服务集标识”名称输入到自己的操作系统中。

警告

将网络设置为“隐藏模式”，意味着客户端需要传送定向“探测请求”数据包。而打开这种模式会引发客户端通过模拟探测功能连接AP接入点，最终导致“客户端攻击”（client-side attack）。

现在讲讲坏的方面。Windows和OS X操作系统的新版本都设置为客户端避免传送定向“探测请求”数据包，除非它们知道它们正在寻找的网络是隐藏的。虽然这一功能被许多供应商广泛采纳，但是很难被推荐并启用，因为启动AP接入点中的“隐藏”功能可能会有管理不善的风险。另一个不足的方面，就是AP接入点处于隐藏的状态时，主动式扫描器确实很难找到你，但对被动式扫描器来说并非如此，事实上，与主动式扫描器相比，被动式扫描器拿到“服务集标识”只是稍微难了一些。在数据交换的时候，你费尽心机地迫使你的客户端传送定向“探测请求”到AP接入点，但那个坐在咖啡店里的攻击者却可以信手拈来地捕获到该请求，并加以利用。总之，网络采用不广播“服务集标识”信息的隐藏方式，对攻击新手来说，攻击变得稍微难了点，对更多熟练的攻击者来说不过是徒增一小步操作而已。

被动扫描应对措施

和规避主动扫描器相比，规避被动扫描器则是一个完全不同的问题。无论在一个信道上传送什么样的信息，被动扫描器都可以看到这些信息，不过即使如此，你仍然可以采取一些切实可行的预防措施尽量减少暴露。首先，我们假设网络中已针对主动扫描采取了预防措施，考虑一下，在这些预防已经生效的前提下会发生什么情况，那就是当一个被动扫描器进入一个隐藏的网络中，扫描器将可以看到被审查的信标数据包，并知道在该区域内有个网络，但是，这个网络的“服务集标识”仍然不得而知。使用被动扫描器时，怎样获得一个隐藏网络的名称，其技术详情请见第2章。

再来看看无线协议的模式，如果你的AP接入点支持多种模式的混合模式，而你又没有老掉牙的802.11b/g模式的客户端，那就请禁掉该AP接入点上的混合模式，进而改选为只按照802.11n的模式，或者更新版本的模式运行，以避免旧模式下漏洞被利用。这时的AP接入点，所传送的所有数据包都理当使用802.11n编码了，然而不幸的是，即使是模式已整体更新，但AP接入点的信标数据包和探测回复数据包仍将采用802.11b编码发送，这种不放弃旧编码格式的想法，对于那些仍然使用802.11b/g模式网卡进行“战争驾驶”的被动扫描黑客来说，无疑是一个好主意。

在无线协议的模式中，另一种选择是把你的网络设置于频段为802.11a模式的5GHz波段。因为大多数无线网络都运行在2.4GHz这个频段上，所以许多“战争驾驶”者并不扫描5GHz的范围。原因有两个，也都很简单：其一是攻击者通常只想买一副天线，这时的首选当然是2.4GHz频段的；其二是支持5GHz范围的网卡要贵很多。

最后，如果你的AP接入点安装的是能够自动调整无线发射功率的智能天线，那么在没有数据通信时，该装置的低发送功率可以大大减少你的信号覆盖范围。当然，即使你这样做了，对于那些离你AP接入点几百英尺之内的，和那些找不到你绝不罢休的人来说，这种方式仍然无法让你达到完全隐身。

频谱分析（在数据链路层之下）

当网卡处于“监测模式”时，你可以看到在一个给定的信道上的所有802.11通信，那么如果你只想看看一个较低层次的数据是什么，怎么办？如果你只想看看在一个给定的频率或802.11信道运行的是什么系统，怎么办？也许你想知道为什么你的邻居把他的网络由原来的信道调切到了第13信道（美国法律规定，不使用第13信道 [8] ）？你想找到原因，因此可以问他为什么这样做？也许你更想知道的是，邻居的微波、无线电话、婴儿监视器等是在哪里发出无线干扰的，知道这些信息后，就可以更准确地定位他的网络位置了。

测量给定频率上的能量值的工具称为“频谱分析仪” （spectrum analyzer）。独立的频谱分析仪价格数千美元，是由专业工程师使用的，之所以这么贵，是因为这些频谱分析仪可以在很大的跨度范围上进行扫描。然而，802.11只是运行在2.4GHz和5GHz的波段上，所以很多公司看到这一商机，就推出一些低端的频谱仪，这些频谱仪只对这两个范围进行检测，以便对802.11中产生的噪声干扰、信号冲突等问题进行测试。

作为频谱分析领域的原创者，MetaGeek公司推出了一款基于USB“加密狗”（dongle [9] ）接口的频谱仪，名叫Wi-Spy。该频谱仪可以与软件应用程序进行数据通信。这样一来，原来位于设备内部的数据分析和用户界面部分，就可以转移到计算机中，以软件应用程序的方式实现，从而降低成本。目前，MetaGeek公司最便宜的产品是名为“Wi-Spy mini”的设备加上名为“inSSIDer office”的软件，售价是200美元，如果想要更专业的设置（其中也包括能对5GHz进行扫描），售价是850美元。

最近，一家名为Oscium的公司也决定进入这个市场。Oscium提供基于硬件的“加密狗”，甚至允许你的iPad或iPhone作为一个频谱分析仪，它的扫描范围是2.4~2.5GHz，还有一个可选的扫描功率表，量程从100MHz~2.7GHz。该装置称为WiPry，既提供引脚为30针的连接器，也提供最新的lightning接口 [10] （不过，使用该接口，需要另配适配器）。读者从Oscium公司挑选入门级的WiPry，其价格比MetaGeek入门级的Wi-Spy低100美元。图1-7显示的是WiPry扫描到的可视化数据通信界面，扫描的范围是802.11的13信道。也就是在美国法律规定不使用的那个802.11信道。

图1-7　WiPry扫描到的可视化通信界面

如果你想玩一个2.4GHz的频谱分析仪，你会发现很难找到比WiPry更合适的了。它比Wi-Spy便宜（当然，这里有个假设前提，就是你已经有了一个iPhone手机或类似的其他手机）；用户界面反应更灵敏；其移动便捷的优势，使其从形式方面来看更加方便。如果你对WiPry的产品有兴趣，可以从其网站上获得更多细节，该公司网址是：http://www.oscium.com 。

频谱分析的应对措施

在一个可以对2.4GHz和5GHz进行监测的频谱分析仪面前，要想保护你的网络通信数据不被频谱分析仪看到，唯一的方法就是关掉无线网络，改回到纯线缆的传输方式。虽然说，智能天线好的布局可以起到一定的作用，但事实上，802.11的网络只要在已知频率上发射能量信号，就意味着，即使对于上述这些低级的工具来说，它们都是可见的。

[1] 一旦得到目标主机的回应，就可以通过分析回应的内容来确定所要的信息。——译者注

[2] 战争驾驶，指通过驾驶车辆，在目标区域往返等行为来进行Wi-Fi无线接入点探测，可在车辆内部使用诸如PDA、笔记本电脑等设备。根据驾驶的工具不同，类似的还有“战争单车”（war biking，通过自行车、电动车、摩托）、“战争徒步”（war walking，通过步行）、“战争飞行”（war flying，通过飞机）等。——译者注

[3] 实现主动扫描的工具正是这样的一个程序（从功能的角度上来看，主动扫描工具也是网络客户端的一种）。——译者注

[4] 任何国家或组织使用某频段的无线频率都需要通过国际组织IEEE的统一授权，但为了增加灵活性，IEEE在分配频率带宽时，对某些频段不做硬性规定，任何单位或组织可以不向国际组织申请而直接使用，如2.4GHz频段就不需要授权，工业、教育、医疗都可使用。2.4G指的是2.4～2.5GHz。在这个频段内的某个连续70M区域内，再等分为14个信道，每个信道5M，其余部分作为“隔离带”。Wi-Fi的带宽是22M，所以一次要占用5个信道。这相当于并排14个车道的高速公路上，有一个有5个车道宽度的车在行驶，任何车道都可用，但一次必用相连的5个车道，并且最多只能有3辆这样的车并排走。——译者注

[5] 服务集标识说得通俗一点，就是我们平时打开手机Wi-Fi无线发现的无线网络名称，例如“TP_LINK_XXXX”“CMCC”“ChinaNet”。——译者注

[6] 即AP接入点忽略掉这个没有明确目的的“探测请求”，就可以避免被对方扫描到。——译者注

[7] 空字符（null），不是空格字符，空字符一般用来表示字符串的结尾，所以这里“插入一些空字节”表示让SSID的值显示，但显示为空白的。——译者注

[8] 美国法律规定不使用第13个信道的原因众说纷纭，确切说法不得而知。也许是14个信道中，不能同时使用3个Wi-Fi，而使用两个Wi-Fi时，12个信道就足够了。也许是因为13在西方是个要想办法避讳的数字。——译者注

[9] dongle一词在计算机领域，一般是指某个硬件上以软件方式实现的一个软件保护程序，其作用很像是家里负责守门的看门狗，所以俗称加密狗或软件狗。——译者注

[10] lightning接口是苹果公司推出的高速多功能接口。配置的目的很显然是为了使其能与苹果手机进行对接。——译者注

1.3　硬件与驱动程序

你所要使用的软件工具，同这些支持软件运行的硬件一样重要，所以一提到硬件的选择，世界上最好的无线网卡和芯片组肯定是你的首选。不过，也有例外，那就是如果控制硬件的驱动程序根本就不知道你想要什么，然后把驱动程序做得一塌糊涂，那就另当别论了。

本节会介绍一些目前可用的驱动程序和它们所控制的芯片组，以及装有芯片组的网卡。这里着重强调Linux驱动程序是因为这将是当前绝大多数开发中会遇到的。

1.3.1　Linux内核简介

在对无线通信提供支持方面，Linux操作系统的内核常常招来相当坏的评价。事情是这样子的，一般来说，老一代芯片组都会为自己提供独立的驱动程序，每个驱动程序自成一体，形成“孤岛设计”，程序本身也不向其他驱动程序共享任何东西，也不需要将其他驱动程序作为自己的先决条件。可是，在Linux内核开发中，驱动程序几乎没有独立性，每个驱动程序都需要与其他的独立单元一起合作才能生效，因此对其的批评声遍布于整个内核开发中，每个人都希望会好起来。

这样做有很大的弊端，既然驱动程序间要相互协作，所以每次要统一编译，如此一来，每个驱动程序都携带约数千行代码，并且每个驱动程序中已实现的功能，又都被其他驱动程序重复实现。如果驱动程序编写者有某种标准化的“应用程序接口”（API） [1] 可供驱动程序调用来处理这些问题，那么他们的工作将变得更加容易，并且可以用更少的工作来维护这些核心代码。类似于驱动程序所用的代码，无非是诸如身份验证、系统配置，以及信道选择等几乎所有驱动程序都必然会用到的共同功能。

这种共享的代码库最终被设计出来，称为“802.11堆栈”。Linux开发人员认为实现两次是一个好主意，但也许三次更好，这取决于你想怎么来计算次数。无论如何，总有一段极度粗制滥造期，编写者希望他们的驱动程序被包括在主驱动树结构中，就写了又写。最后事情尘埃落定，大家也平静下来，在伟大的“802.11堆栈设计战” [2] （802.11 stack war）中，“mac80211驱动框架”脱颖而出，成为赢家，而其他竞争者（特别是ieee80211）被戏称为“折旧”而扔进了大垃圾堆中。

由于现在只有一个标准化的Linux 802.11堆栈，所以许多老掉牙的、与802.11堆栈没有依赖关系的独立驱动程序都被改写，合并到驱动树结构中。不过，为了保持兼容，并不是所有驱动程序都必须符合“802.11堆栈”的要求，这意味着，虽然仍有一些“老爷车”式的历史遗留式的驱动程序（包括那些为特定的无线攻击而进行优化的补丁类驱动程序），那些成绩平平的入侵类驱动程序仍然可以在不做任何修改的情况下，编译到你的内核中。

具体来说，本书中所有提到的攻击方式，都是以功能集驱动程序的方式在栈结构实现的，并且全部都添加在上面提到的“mac80211驱动框架”树状结构中。对于具有特征的攻击方式中，凡是在未打补丁的“mac80211驱动框架”的驱动程序找不到的，统统都会在本书中明确地告知，类似的驱动程序有ath9k和iwlwifi。这就是说，之后绝大多数的攻击技术，并不需要读者做深度挖掘和提供补丁程序之后才能使用，而是在最原始的Linux版本的内核上就可以使用。除非另有说明，否则本书中所有的攻击方式，都是运行在没做任何修改的，版本等于或高于3.3.8的内核中。

1.3.2　芯片组和Linux驱动程序

每个网卡都需要有芯片。虽然市场上有数百种形状各异的网卡，但其实这些网卡所用的芯片也只是少数的几个，所以大多数的网卡因为使用了同一芯片，而可以使用相同的驱动程序，它们通常情况下也都是这么做的。因为对于驱动程序软件来说，即使不同的网卡，只要使用的是相同芯片，那么软件所看到的都是一致的。唯一真正的区别在于网卡有什么样的功率输出，或天线插孔的类型和可用性。所以，对于从事无线攻击的人员来说，选择购买什么样的网卡，首先要做的是决定要什么样的芯片组。

提示

许多网卡广告宣称支持某些功能，例如支持802.11n和802.11ac。但请务必记住的是，使用这些功能，需要芯片组硬件和驱动程序软件的通力合作才能实现。许多Linux驱动程序在一些尖端技术上，是落后于最先进技术的，对于网络入侵，我们最需要关注的是802.11ac。如果你关心新功能的兼容性问题，一定要仔细检查驱动程序的支持程度。

1.驱动程序中想要的特定功能

任何无线驱动程序都有两个非常渴望的功能。显然，其中最重要的一个功能是“监测模式”（详见前面的1.2.2节）。另一个需要驱动程序一起实现的功能是“数据包注入”（packet injection）。数据包注入是指在一个在线网络中，通过大量发送任意格式数据包，进而影响该网络原有功能的能力。这种能力允许重现网络上的数据通信，加快对“有线等效保密协议”的统计袭击；也允许注入“解除认证数据包”（deauthentication packet），然后借助该数据包，可以将某个在线用户从AP接入点上踢掉，使其与网络断开。接下来讨论数据包注入。

2.数据包注入

许多年前，借助于Abaddon公司发布的一个名为AirJack的工具，使“数据包注入”功能首次成为可能。AirJack是一个驱动程序，与Prism2芯片组和一套使用该芯片的应用程序一起工作。自AirJack发明以来的这几年，数据包注入的特性已被广泛添加到主流驱动程序中，所以随便找个网卡，基本上没有为了这个功能而去查找提供该功能的补丁程序的必要。

事实上，对“数据包注入”的技术支持已经发展得很好，现在，有两组不同的用户级“应用程序接口”编程库可以使用。应用程序可以通过“应用程序接口”，以一种跨驱动程序的方式完成无线网络中数据包的注入。第一组编写并发布的“应用程序接口”编程库被称为“无线连接的剪断器”（Loss Of Radio Connectivity，LORCON）。这组程序库目前已升级为LORCON2。

另一个支持注入的编程库被称为osdep，由较新版本的Aircrack-ng软件使用。不幸的是，现在有两个库来完成同样的事情，然而，这也许仅仅是程序开源领域里成熟度的一个标志。否则就不会有GNOME和KDE，Alsa和OSS，Wayland、Mir和Xorg等这么多对优秀的开源程序供我们使用。开放源码给我们的最大自由是选择权 [3] 。如果你忙于选择哪款“窗口管理器”软件，或哪款“电子邮件提醒器”软件，或者想知道为什么某个程序的设计者不再积极地维护他们的某个程序，那么，只要你有时间发电子邮件，你只需要在邮件里问问RMS（Richard Stallman，自由软件基金会的创始人），作为这方面的行家，他会给你推荐你满意的开源软件的。

无论如何，LORCON和osdep都为应用程序开发人员提供了一组方便的“应用程序接口”，使他们的应用程序可以在不依赖特定驱动程序的前提下，发送自己定制的数据包。在mac80211得到广泛支持之前，想实现这样的注入功能是一件很困难的事。现在，大多数用户只须使用带LORCON支持库的“mac80211驱动框架”的驱动程序，即可轻松实现。下面汇总了在Linux操作系统上，支持的802.11数据包注入功能的应用程序中，使用这两个“应用程序接口”编程库的当前状态。另外，osdep和LORCON都分别为不同的驱动程序提供了类似的支持。

1.3.3　现代的芯片组和驱动程序

以下介绍的所有芯片组，都有积极地维护着的被合并到mainline版内核 [4] 的Linux驱动程序，它们也很容易在当今市场上找到。当然，这个无线芯片组和驱动程序的功能列表清单并非详尽无遗。相反，这里只是一组最常见的、对Linux提供相当好的支持的芯片组名单。而那些不提供现代“mac80211驱动框架”下驱动程序的芯片组，还有那些太陈旧，以至于不能完成有效的黑客攻击的芯片组，则都未在列表中列出。

喂，我的802.11ac呢？

对Linux无线网络来说，一般情况下，最大的讽刺是，Linux的内核对802.11n和802.11ac路由提供强大支持的同时，对802.11n和802.11ac客户端的支持程度，则似乎落后于其他平台。在写作至此时，就有两个内核驱动程序在限制对802.11ac的支持。这两个程序分别是athlOk驱动程序和Intel公司的iwlwifi驱动程序。不幸的是，基于athlOk驱动的外部设备目前非常有限。

1.Ralink（RT2X00）

Ralink公司（中文名叫“雷凌”）是规模较小的802.11芯片组制造商之一。Ralink公司的软件产品具有极好的程序开源支持，已经使用过的所有该品牌网卡都非常稳定。Ralink是在Linux上提供USB硬件接口的少数几个芯片组制造商之一，另一个制造商是Realtek公司的RTL8187芯片组。

像大多数芯片组一样，Ralink基本上已经有两个驱动程序系列。“历史遗留式”的驱动程序是独立的驱动程序，每个程序针对一个特定的芯片组。这些驱动程序在被广泛使用之前就提供了对黑客来说非常有用的功能，如数据包注入功能。Pedro Larbig收集保存了一组增强型的传统Ralink驱动程序，见http://homepages.tu-darmstadt.de/~p_larbig/wlan/ 。这些驱动程序可能都是最优化的独立驱动程序，并且都保留了专门针对802.11入侵而做的修改。不过，这些驱动程序也太陈旧了，就像前面所说的，连“历史遗留式”的独立式驱动程序都属于早期产物了，这些驱动程序当然也不例外，现在也当然不值得为要不要使用这些老的驱动程序而争论什么。

较新的Ralink驱动程序被统称为rt2x00。这种驱动程序现在根据“mac80211驱动框架”要求驻留在内核中。虽然这些位于“mac80211驱动框架”结构树中的rt2x00驱动程序并没有针对无线黑客入侵进行多少优化，但它的优点是可以在任何现代分布设备上使用。

2.Realtek（RTL8187）

虽然这里所说的大部分驱动程序支持许多种网卡和为数不多的芯片组，但是使用RTL8187驱动程序的用户通常记得一种单一的网卡——Alfa网卡（阿尔法）。Alfa卡是一块USB接口的无线网卡，内置Realtek（中文名叫“瑞昱”）公司的RTL8187芯片组。该驱动程序具有和芯片组相同的名称。此驱动程序已被合并到mainline版内核好多年了，并且成绩斐然，令人印象深刻。尽管基于RTL8187芯片组和驱动程序的Alfa网卡多年来一直都是一个简单的选择，但该网卡本身不支持802.11的a、n和ac版本，所以这一缺点限制了程序在新设备上抓取数据包的能力。也就是说，对于数据包注入方面，这款网卡也可以作为排名第二的板卡。同时，这也是能工作在OS X操作系统上最早出现的外置式网卡芯片组和驱动程序。

3.Atheros芯片组（AR5XXX，AR9XXX系列）

由于可扩展性和高质量开放源码的驱动程序，Atheros（中文名叫“钰硕” [5] ）的芯片组多年来一直深受黑客社群的青睐。虽然所有Atheros的802.11芯片组都可以完美地支持Linux操作系统，但基于Atheros的大多数无线网卡都不支持USB接口，而是支持PCMCIA接口。这意味着，随着笔记本电脑逐渐放弃使用PCMCIA总线，对外置基于Atheros无线网卡的接受度已经变得越来越棘手。Atheros生产其大部分芯片都是为嵌入式迷你PCI网卡的，或者是直接将芯片逻辑做到进入SoC [6] 中。可悲的是，如果一个Linux驱动程序“同时支持”USB接口和一个不支持USB接口的Atheros无线网卡，那就会变得不伦不类。

如果你足够幸运，有一块内置Atheros芯片的设备（之所以说“设备”，是因为在笔记本电脑中，很少能看到内置Atheros芯片的无线网卡），或者你想将一块迷你PCI卡部署到笔记本电脑或其他嵌入式设备中，那么下面的内容给出了当前驱动程序支持能力的解释。

·MadWifi：MadWifi是一款“历史遗留式”的驱动程序，因其稳定性方面的不足而从未被合并到mainline版Linux内核中，如果你坚持想用Madwifi网卡，那么就像卡的名称一样，你就等着疯掉吧。这款芯片最好的替代品就是ath5k或ath9k。

·ath5k：这款驱动程序是MadWifi的合乎情理的继承者。性能很稳定，足以包含在vanilla版Linux内核中，并且像所有在Linux上的现代无线驱动程序一样，它使用“mac80211驱动框架”的堆栈结构。在许多使用AR5XXX系列芯片组的设备上，ath5k驱动程序都为其提供支持。不过，ath5k不提供对USB的支持，同时也不提供对802.11n标准的支持。

·ath9k：作为块头比ath5k大的兄弟，ath9k后来居上，在Linux下的这些芯片组，基于802.11n标准提供了稳定的支持。虽然最初的驱动程序是由Atheros开发的，但现在是开放源码社群在维护它。ath9k同时也为后来的AR54XX各版本芯片组提供支持，除此之外，对AR91XX系列的各个版本，ath9k也同样提供支持。不过，ath9k和ath5k存在相同的不足，那就是ath9k设备也不提供对USB接口的支持。

·ath10k：作为块头比ath9k大的兄弟，ath10k同样当仁不让。不过该版本除了增加对802.11ac标准的某种程度的支持之外，其他只是ath5k和ath9k的一个功能合集。

·ath9k_htc：ath9k_htc是少数支持基于USB接口的Atheros芯片组的驱动程序。这些芯片组包括AR9271和AR7010。

·carl9170：如果你有一个Ubiquiti SR71的USB设备，那么carl9170将是支持这个设备的第3款（注意这里的“第3”，意味着它的评价排名）驱动程序。曾经，carl9170源自并取代了ar9170usb驱动程序，而ar9170usb也曾经巧妙地取代过一款名为otus的驱动程序。如果你分不清它们这几代之间的关系，那你就难以想象到，同那个稳定的同行兼对手之间，这三代软件分别与ath5k、ath9k、ath10k之间存在一一对应的竞争关系。

4.Intel公司Pro无线驱动（iwlwifi）

Intel公司的802.11芯片组通常内置在笔记本电脑中，并且与PCIe总线 [7] 相关联。较新的Intel芯片组是由iwlwifi或iwlagn驱动程序支持的，这些驱动程序都被合并到了最新的Linux内核中。

Intel公司的芯片组通常都有很好的优势，那就是供应商基本上都是买主的坚实后盾。然而，事情都有两面性，在各外置网卡中几乎看不到基于Intel芯片的好卡，究其原因，就是对于Intel公司来说，没有令人信服的理由为了更方便破解支持802.11的驱动程序而加入任何需求。那么，如果你的笔记本电脑上，本来就带有一个集成Intel芯片组的无线网卡总可以吧？事实上，如果你有这样的笔记本电脑，出于测试目的使用这个网卡练练手也许没有问题，但要想当一个资深的黑客，你就只能自己想办法，为这个内置的无线网卡接一个外置的天线了。

为什么我在监测模式下，看不到基于802.11n或802.11ac标准的数据包呢？

在从事无线入侵黑客的眼里，在监测模式下，看不到基于802.11n或802.11ac标准的数据包，其最大的问题是这两个标准都使用了“多输入多输出”（MIMO）技术。一言以蔽之，就是MIMO允许单个适配器同时发送多个数据包流，这就是为什么你能在界面上同时看到802.11n和802.llac所有小天线图标都处于连接状态的主要原因。这就意味着，攻击者要想看到无线网卡所捕获到的全部通信数据包，就也得具备同时接收和重组两路，甚至是三路独立传送的数据包流。对于任何一个流，即使是有一个字节未成功收到，那么你也不得不扔掉与这个字节相关的完整数据包。

1.3.4　网卡

既然芯片组和驱动程序已经考虑好了，下面该决定用什么网卡了。记住，内置的无线网卡将提供基本的监测模式和数据包注入支持，这是赔率很高的方案，因为你可能不需要再购买任何其他东西，只需要试一下就知道结果了。本节的目标是编制一张列表，在表格中列出各网卡的重要特征，最后，你会看到一张“推荐网卡”的列表，供读者根据列表购买一款自己感兴趣的网卡。

购买无线网卡的过程中，最令人丧气的事，就是做完了所有的调查，也从中找到恰到好处的那一款并购买回家时，你发现其实你拿到的是一个硬件版本稍有不同，但芯片组却完全迥异的无线网卡。事实上，包装盒里的网卡和你花钱想买的网卡，唯一的相似之处，就是长得都跟包装盒里的网卡的形状一样。

不幸的是，这种情况经常发生，并且你束手无策，除非你所购买无线网卡的这家店里有无条件退货的规定。一个提供了最全面描述的列表，包括从产品到芯片，以及驱动程序的网站名叫“Linux无线产品”（Linux Wireless），其网址是http://linuxwireless.org/en/users/Devices 。

提示

你对哪种芯片组出现在新近发布的网卡里感到好奇吗？如果你能拿到网卡的“FCC ID” [8] ，就可以直接从FCC网站中搜集大量信息，最有用的信息是该网卡所使用的芯片组。除此之外，还有一些通过高分辨率的内部相机，在拍照后又发到网络上的在线照片，从这些照片中，通常也可以读到很多信息。如果你对卡的内部结构感到好奇，但不想自己动手打开它，那么我强烈建议你访问“http://www.fcc.gov/oet/ea/fccid/ ”网站，在界面中输入“FCC ID”，然后你就可以查到与设备相关的内部照片记录了。

1.发射功率

发射（Transmit，TX）功率当然是指你的网卡可以把数据传送到多远的距离，单位通常是毫瓦（mW）。大多数“客户级”（consumer-level）的无线网卡的发射功率是30毫瓦（+14.8 dBm，单位全称是decibel milliwatts）。“专业级”（professional-grade）的基于Atheros的无线网卡，在UbiquiLi系统中的发射功率是300毫瓦（+24.8dBm）。Alfa的AWUS306H无线网络，目前握有十足的发射功率金牌，据称提供1000毫瓦（+30dBm）的功率。虽然发射功率很重要，但随便指定一张无线网卡，不要忘记它是与灵敏度参数息息相关的。

2.灵敏度

很多人判断一张无线网卡的优劣，往往只重点关注发射功率，而忽视网卡的灵敏度，这种看法是很肤浅的。假如有一张发射功率很大，但灵敏度很小的网卡，虽然能够将数据发送到很远的距离，但由于发射功率和灵敏度明显不匹配，最终这块网卡有可能无法接收对方的回复。人们经常会忽略灵敏度，是因为无线网卡的广告中，较少会强调这个参数的重要性。如果你能找到一个网卡的产品性能参数表，表上应该会列出灵敏度，该值通常也是以dBm为单位的。不过该值一般是负值，并且在测量灵敏度的时候，除去负号后的数字越大，灵敏度越好 [9] （如灵敏度为-90dBm的就比灵敏度为-86dBm的要好）。

·一般“客户级”的无线网卡的灵敏度的标准值是-80~-90dBm。“专业级”的高端网卡则可能到达-93~-97dBm的灵敏度。

·每增加3dBm的变化代表灵敏度加倍，比如信号源和测量的一方正在相向移动；每减少3dBm的变化代表灵敏度减半，比如信号源和测量的一方正在背向移动。

·如果你发现需要把mW毫瓦转换成dBm，不要害怕。dBm功率恰巧是以10为底的毫瓦功率的对数的10倍。公式是：10×log₁₀ （mW）=dBm，或mW=10dBm/10 。

注：例如上面的10×log₁₀ 30(mW)=14.8dBm，以及30mW=1014.8dBm/10 。——译者注

3.天线的支持

决定购买哪种网卡，最后要考虑的一项就是天线对网卡的支持。什么样的天线能够支持你的网卡？你需要先由天线开始考虑吗？如果你的工作职责就是确保公司的无线网络安全，或者是对公司的无线网络安全进行审计，那你一定得想有一个或两个相当好的天线，这样才能精确地测量到你公司的信号泄漏到外边有多远。

目前，你的无线网卡上，通常会有0个、1个或2个天线插孔。如前所述，802.11n卡由于支持“多输入多输出”（MIMO）模式，所以你的网卡至少需要再安装两个外置天线（即使你的笔记本电脑中已经内置了一个无线网卡）。无线网卡与天线卡之间起连接作用的缆线连接器 [10] ，被称为“小辫子” （pigtail）。在这里，小辫子的作用仅仅是在卡上的任意插孔和连接天线上的任意插孔之间起到连接的作用。使用USB接口的外置无线网卡的好处之一，就是几乎所有的插座都无一例外地使用了相同的接口，该接口称为“反极性SMA”接口（reverse polarity SubMiniature version A，RP-SMA）。

幸运的是，大多数天线与一个特定的连接器相连。这个连接器称为“N型连接器”（N-type connector）。特别需要说明的是，天线端通常是母头的“N型连接器”。这种标准的连接器接口意味着朋友间可以互借天线，而不用担心因为线缆接口和天线接口不是同一类型而无法使用。其他天线连接器类型也不是没有，所以在你假定天线有一个N型连接器之前一定要检查一下。表1-1详细列出不同连接器的类型，以及其生产商的名称。

表1-1　不同连接器的类型及其生产商

注：MMCX（Miniature Microax rf Coaxial Connectors），微小型射频同轴连接器，主要用于在对系统体积、重量都有要求的小型通信、网络设备之间连接射频同轴电缆。——译者注

4.推荐的网卡

作者强烈推荐以下三种网卡。它们有高于平均水平的灵敏度和发射功率，Linux下的稳固支持，以及外接天线连接器。它们大多也支持OS X和Windows系统上的数据包注入和监测模式。

Alfa无线网卡（详见表1-2），逐渐开始为众人所知，在最近的一段时间以来，已经是802.11狂热爱好者的主要选择。从支持802.11g标准以来，这种网卡的缺点主要是对跨平台系统的支持较少，以及价格较高。因为Alfa的产品线一直处于拓展状态，为了与新产品进行区分，我们习惯上称早期原始的Alfa中的无线网卡为“银色Alfa”，其型号为AWUS036H，之所以这样称呼，是因为该款网卡的颜色就是银色的，如图1-8所示。

表1-2　AlfaAlfa AWUS036H无线网卡的参数

虽然“银色Alfa”无线网卡在很长的时间里我们都感觉挺好，但是它已被更新的型号所取代。使用“银色Alfa”网卡的读者们，是时候认真地考虑一下，将其升级为一块更现代的无线网卡了。

型号为AWUS036NEH的“黑色Alfa”（见图1-9），是Alfa系列中一款支持802.11n的基本版无线网卡，也是“银色Alfa”网卡的缩减版本，其性能指标详见表1-3。与其他支持802.lln的网卡相比，它最大的变化就是体形明显较小。不过可悲的是，这款Alfa无线网卡并不支持OS X操作系统上的KisMAC软件。其实，自“银色Alfa”以后所有其他版本的无线网卡都不支持KisMAC软件。

图1-8　银色Alfa无线网卡

图1-9　黑色Alfa

表1-3　Alfa AWUS036NEH

型号为AWUS051NH的“金色Alfa”无线网卡（如图1-10所示）是Alfa系列中一款支持5GHz频率的无线网卡（详见表1-4），不幸的是，这款无线网卡并不支持OS X操作系统。

图1-10　金色Alfa

表1-4　Alfa AWUS051NH

SR71-USB（见表1-5）是一款较好支持Windows操作系统的无线网卡（如图1-11所示）。如果你正在寻找一块既可以稳定地运行在Windows上，又能同时提供数据包注入功能，还能在监测模式下监测所有基于802.11标准的通信数据包的无线网卡，那么你就要考虑SR71了，配上“CommView for Wi-Fi”软件就可以完成上述所有需求。这种组合要比在CACE系统上，配上“AirPcap NX”软件的组合，便宜得不是一星半点。

表1-5　Ubiquiti公司的SR71-USB

图1-11　SR71-USB

Tamosoft软件公司是“CommView for Wi-Fi”软件的创造者，在加配一个小适配器装置后，也可以支持802.llac标准。如果读者比较关注这款网卡在Windows上监测无线通信数据包的功能，可以看一下该产品的兼容性列表。其网址是：http://www.tamos.com/products/commwifi/adapterlist.php 。

1.3.5　天线

市场上有不少各式各样的遵从802.11标准的天线。如果你之前从来没有购买或看到过一款，那么，与天线相关的术语可能就会让你找不着北。所以在开始之前，需要学习一些基本术语。“全向天线” （omnidirectional antenna）是一种在所有方向上都能够发送和接收无线信号的天线。“定向天线” （directional antenna）是一种可以将信号集中于某一个特定的方向进行发送和接收无线信号的天线。两种类型的天线在不同情况下各有各的用武之地。

如果你以前从未使用过天线，千万不要抱着“最贵、最大的就是最好”的思想，初次去买的时候，逢大个的就买，最后只能是“只买贵的，不买对的”收场。相反，一个便宜的“磁性底座天线”（magnetic-mount omnidirectional antenna）就可以收到相当不错的效果，而其售价只要20或30美元。如果可行，先从懂行的朋友那里借个天线试试手，也不失为一个好办法，至少你可以知道，当前借到的这个天线还需要再增加点什么功能就可以满足自己的需要了，借此你也可以估算一下你心目中的天线大概需要花多少钱了。

如果你有机械和电气方面的爱好，可以用一些易拉罐自助创建一个便宜的波导天线（waveguide antenna），造价仅为几美元。这些摇摇晃晃的自制土天线，其接收效果却并不见得差，互联网上随处可以看到这类故事，你的天线也可以达到很好的效果。这需要你在车库里花上数小时，造出一个什么也看不出来，但却有一个带洞的罐和一个带奇怪的辐射模式的1dBi或2dBi的增益的天线。当然，如果你感觉这个小爱好还算有趣，那么你不妨在网上找找，必定能找到很多这样的DIY指南。

天线好坏的判断指标是“天线灵敏度”，它的单位是dBi（decibel isotropic，各向同性上的功率对比）。最后是一个关于天线灵敏度比较的提示：“天线灵敏度”就是天线指标的一个对比值，但不要随意进行两个dBi数值大小的比较，因为这样可能会误导你对它们的直观印象。究其原因，是因为“天线灵敏度”每增加3dBi，天线的有效功率覆盖范围就会加倍。也就是说12dBi的天线的功率是9dBi的天线功率的两倍。

1.基本部件

有相当多不同类型的天线，甚至有些博士论文通篇都是论证如何用不同的技术改进其性能的。当然，本节不会讨论这类内容，本节的目的是为读者提供一些实用的知识，帮助读者选择正确的天线，最后完成手边所要做的工作。

天线既不是变戏法，也不会向你的信号中注入魔幻的力量，而是将无线网卡正在产生的信号集中起来，并准确地发出去，或者接收来自外部的信号。可以想象一下，你的网卡产生的信号覆盖范围，其形状像一个三维球体（确切地说不是球体，但是先这么假定）。首先我们想象一下一个细管的喷泉，当喷口垂直向上，水压适中时，水会经由喷口向四周散开，形成一个类似没柄的苹果把儿处的形状，如果下面也对称想象成这样的形状，那么现在无线网卡产生的信号覆盖范围就是这样的一个形状，基于这个三维模型的想象，全向天线的工作原理基本上就是在这样一个竖放的“苹果”，可以增大发射功能，这个苹果不是等比例地扩大，而是由于电磁力的相互作用，两极的磁力相互抵消改变不大，但四周的范围却被扩大，这时的“苹果”被压扁，变成一个圆形的矮胖“大南瓜” [11] 平放在地面上的形状，这时，原本属于“大南瓜”上面和下面的垂直方向的能量被“压”到“大南瓜”侧面水平方向上的范围内，从而增加了这一区域的功率，所以这样在水平方向上的信号传得更远，但垂直方向上却达不到原来那么远。更重要的是，全向天线的增益越高，这个“大南瓜”的形状就越扁平。定向天线以同样的方式工作，只不过它将信号集中在一个方向发送，而在另一个相反的方向上接收信号。要记住一个重要特点：无论是哪种天线，信号发射的功率值一直是保持不变的，但信号发出的功率范围却是可以变化的，而所能变化的，只是天线的功率覆盖范围的形状。如果仍使用上述比喻，那就是“大南瓜”内的发射器功率是个恒定的常量，但“大南瓜”的厚度是可以变的，越接近于原来的球体，水平方向上“大南瓜”能到达的区域越小；反之，“大南瓜”越扁，水平方向上能达到的区域越大。

如前所述，全向天线的功率覆盖范围近似接近于“大南瓜”的形状，由于实施了变形，所以扩大了原来的功率发射范围。如果你想开着车，借助于天线在街上寻找无线网络，那么全向天线可能是该工作的最佳工具。不过，在某些情况下，如果你希望能够更精确地调整信号，那么换用一个定向天线则会非常方便。试想一下，如果将全向天线中的“大南瓜”进行垂直中轴的等分，那么分后的每一个“扇形饼”就是一个定向天线的功率覆盖范围的形状。其中“扇形饼”两个切边的夹角称为“波束宽度”（beamwidth），定向天线比普通定向天线的波束宽度要小。这一点不难理解，夹角内的总功率是一定的，夹角越小，则“扇形饼”向远处延伸的范围越大。如果夹角足够小，那么全向天线中将“大南瓜”进行“压扁”的操作也是多余的，进而定向天线就简化为一个“锥体”的形状（试想一下夜晚打开手电筒，光柱所形成的形状），这时，“波束宽度”越小，发射能量就越集中，发射的范围就越远（例如，我们在大声喊远处的人的时候，有时会用双手在嘴边形成一个喇叭状，以使声音能传得更远）。不过，“波束宽度”也有缺点，那就是很难瞄准对方。

2.天线特性

每一个无线黑客至少需要一个全向天线。全向天线基本上有两种类型：9~12dBi的“基站天线”（base-station antenna）和5~9dBi增益的“磁性底座天线”（magnetic-mount antenna）。“磁性底座天线”的设计原理是利用磁性直接吸附在汽车的顶部，“基站天线”的设计是可以直接插入到一个AP接入点设备中。

“基站天线”通常外套一个白色PVC管 [12] ，长度是30或48英寸。长度越长，增益越高，并且价格越贵。当“战争驾驶”时，从“可接收性”（reception）上来说，尽管增益较低，“磁性底座天线”一般比“基站天线”接收更好些，这一点不难理解，汽车本身就是一个大铁盒子，对无线信号具有很强的屏蔽作用，所以在汽车里边，接收效果无疑会差很多。不过，如果你想在办公楼里使用全向天线，12dBi增益的“基站天线”效果明显更好。

接下来说一下各种“定向天线”。到目前为止，最流行的是廉价的波导天线（有时称为Cantenna [13] ，不妨称为“手工易拉罐天线”）。一个典型的“手工易拉罐天线”可以获得12dBi的增益。相比波导天线的平均性能上有较大提升的是“八木天线”（Yagi）。增益为15和18dBi的“八木天线”很容易找到，但它们往往比波导天线明显贵很多。

3.全向天线

“全向天线”通常是用磁性底座将天线吸附在一辆汽车的车顶。这些天线一般配置比较低，不引人注目，增益通常是5~9dBi范围内，价格为20~40美元。对于喜欢“战争驾驶”的黑客来说，一个基本的“磁性底座全向天线”是必备的。

4.定向天线

波导天线，俗称“手工易拉罐天线”（Cantenna），一般都比其他的定向天线便宜，并且有大约30度左右的“波束宽度”（beamwidth）和15dBi的增益范围。虽然比起专业天线商品，这种天线在执行任务的时候并不完全理想，但这种形式的天线可以很容易地由成套的模块半成品或零配件制作手工组装完成。

板状天线（panel antenna）通常有13~19dBi的增益，和35~17度的“波束宽度”。“波束宽度”越小，意味着增益值越大。这些天线一般售价都在30美元~50美元之间。对喜欢“渗透测试”攻击的黑客来说，板状天线是个不错的选择，究其原因，板状天线的面板是一个平板，相比于其他的定向天线，更容易隐藏。

八木天线（yagi antenna）通常可以有30度的“波束宽度”和15~21dBi的增益。当大多数人想到“长相很吓人”的天线时，可能就会想到八木天线。

抛物面天线（parabolic antenna）可以提供最大的增益和最窄的“波束宽度”。一个标准的抛物面天线具有24dBi的增益和5度的极窄的“波束宽度”。“波束宽度”这么窄，就意味着很难“瞄准”目标，换句话说，就是在安装这种天线的时候，为了进行两点间“点对点”（point-to-point）的回程线路（backhaul）测试，所以必须进行很专业的安装。

5.射频放大器

如果在你的系统里添加一个射频放大器（或双工放大器的发送模式），那么这将大大增加系统的发射范围。如果再增加一个接收放大器（或双工放大器的接收模式），也将同样大大提高天线的接收灵敏度。不过，缺点是，放大器（amplifier）在放大信号的同时，也放大了信号噪音。因此，我们会建议先使用“定向天线”收发信号，然后再使用放大器放大信号。如果还是觉得放大的效果不够，或者如果你已打算好不惜花上数百元来改进无线设备，那么下面就是要记住的基本思路。

任何在市面上能见到的802.11放大器都是双向收发的，这意味着系统可以在需要发送的时候自动切换到发射模式，而在有数据到达时自动切换到接收模式。在802.11的Wi-Fi无线网络通信中，一个只有发送功能或只有接收功能的放大器是没有用处的。放大器的另一个重要特征是它的增益控制（gain control），一般放大器具有固定增益型、可变增益型或自动控制增益型三种。可变增益型放大器因为增益效果可变，因而使用灵活；固定增益型放大器的成本更低；自动控制增益型放大器则有智能，可以将放大器的发射功率始终保持在一个设定的值上，也就是说，你不必担心输入端现在提供的是多大功率，因为放大器会“多增少降”，进而使之平衡在所需要的功率点上。如果你打算从上述三种型号中选择一种，那么建议使用一个自动控制型增益放大器。RFLinx 2400 SA是一个不错的自动控制型增益放大器，适合于那些从事802.11无线网络攻击的黑客们。

1.3.6　蜂窝数据卡

在通过“战争驾驶”模式采集无线信号的时候，蜂窝数据卡 [14] （cellular data card）是必不可少的。有了这些卡，你就可以在采集数据的同时，实时下载地图和Google Earth（谷歌地球）上的实时地理图像，还能从互联网上下载预先忘了下载的任何软件工具。令人惊讶的是，这些卡大部分都在Linux操作系统上有较好的表现。从操作系统的角度来看，系统会把这些卡作为一个串行设备（serial device），该设备与操作系统之间通过基本的AT指令集 [15] 进行通信。你几乎可以将该设备看作是一个拨号连接时使用的调制解调器。

如果你正在考虑购买一个蜂窝数据卡，那么在订购之前，你需要先核查一下所要购买的蜂窝数据卡是否支持你的无线网络系统所需要的那些特定模式。比如AT＆T公司的蜂窝数据卡不支持Linux操作，所以你也别指望该公司的技术支持来帮助你解决因他们公司蜂窝数据卡而引起的Linux的问题。通常情况下，大多数中国华为公司的蜂窝数据卡（Huawei card）可以很好地运行在Linux操作系统上。

1.3.7　GPS

许多基于802.11协议的扫描工具都可以使用“全球定位系统”（Global Positioning System，GPS）接收器。这意味着，扫描软件可以把从GPS接收器读到的经度和纬度与一个给定的AP接入点关联起来。对于GPS接收器，一个可喜的地方在于几乎所有可以连接到计算机的接收器都使用统一的通信协议，这个通信协议被称为“美国国家海洋电子协会”（National Marine Electronics Association，NMEA）标准协议，简称“NMEA协议”。只要你有一个可以使用NMEA协议的GPS设备，那么它可能就会在你的操作系统上很好地工作。

1.鼠标式和手持式接收器的对比

GPS接收器有两个系列：一种是鼠标式，另一种是手持式。鼠标式GPS接收器是一种后面拖出长长连线的GPS接收器，因为像鼠标，所以有了这样的名称。鼠标式GPS接收器本身不能单独使用，只能跟别的设备联合起来使用。比如与笔记本电脑或PDA一起使用。有些鼠标式GPS接收器是防雨的，这种设计无疑是可以将它贴附到汽车的车顶上。其他的设计也有在车内使用的。通常情况下，鼠标式的GPS接收器都使用USB接口，不过，也有使用其他连接方式（比如蓝牙通信）的。不推荐使用蓝牙通信的GPS接收器，因为蓝牙也工作在2.4GHz的范围内，当你进行“战争驾驶”操作的同时，蓝牙的无线信号会干扰天线的工作。

如果你已经有了一个GPS接收器，先插到电脑上，看看你的操作系统是否能认出这个设备，只有认出设备才有继续的可能。在不同的操作系统上，完成这一识别动作的操作方式差别很大，下面分别说明。在Linux系统上，在计算机上插入该设备后，还应该通过dmesg命令检查一下输出信息，运气好的话，你会看到一个“/dev/ttyUSB0”列表项弹出，这就意味着Linux操作系统识别到这个设备了，否则的话，就说明该设备不支持Linux。在OS X操作系统上，用户几乎肯定需要安装一个“USB转串口”的转换器驱动程序，否则不能识别。在Windows操作系统上，即使用户拥有并安装好所有必需的驱动程序，可能还需要运行一款名为GPSGate的软件，然后应用程序才能从这款GPS接收器中实时接收GPS信息。GPSGate之所以可以帮助应用软件和设备进行交互操作，是因为程序的作用是创建一个虚拟串口，然后将该GPS接收器所用的USB口或蓝牙口数据转到这个虚拟串口上，这样使用GPS数据的应用程序只需要同这个虚拟的串口进行通信就行了。

如果你还没有GPS接收器，并且正在寻找合适的GPS接收器，以便满足你想购置一套精良“战争驾驶”行头的念头，那么推荐使用GlobalSat公司的BU-353。这款GPS接收器的“USB转串口”接口使用的是Prolific公司的p12303芯片组，具有可靠的跨平台的支持特性（注意：Windows 8除外）。这种鼠标式GPS接收器还支持“广域增强系统”（Wide Area Augmentation System，WAAS [16] ），从而可以显著提高GPS坐标的准确度，大约35美元就可以买到。本书后面与GPS坐标有关内容基本上都是使用BU-353作为例子的。

2.Linux上的GPS

在Linux操作系统上，GPS接收器基本上就是一个串行设备。如果你有一个Garmin公司的USB接口GPS接收器，那么你就需要使用garmin_gps驱动程序。如果你的GPS接收器采用的是Prolific公司的pl2303芯片组的BU-353设备，那么在Linux操作系统上，该设备的驱动程序使用相同的名称。

如果你的GPS接收器不能正常工作，那么你需要卸载并重新加载“USB转串口”转换器的内核模块（kernel module）。这个操作可以通过下面的命令来完成。

假设上面的编译操作完成，那么在“/dev”目录中，应该会看到有某种“字符设备”（character device）了（例如“/dev/ttyUSB0”），这意味着，驱动程序已安装成功，之后就可以从该设备上读取到GPS设备的信息。

这个时候，即使你已顺利完成驱动程序的加载操作，并且设备也开始正常工作，但是其实你也只是保证了设备正常地接入到Linux操作系统中，要读取GPS信息，还需要有两步操作步骤。第一步是运行gpsd程序，该程序是一个GPS读取的守护进程，其作用是将GPS信息读取到内存中，而当有应用程序向它提出请求时，它又会把GPS信息给这个应用程序。这样做的优点很明显，那就是多个不同的应用程序都可以按各自的节奏随意向它请求当前的GPS信息。出于调试目的，你只需要运行“gpsd–D 2–n–N/dev/ttyUSB0”命令即可。如果系统开始按“国家海洋电子协会”的NMEA协议的格式的GPS提示信息开始滚动（由于数据太多，所以只能滚动显示），说明当前gpsd正处于良好状态。如果你仅仅是拿到GPS信息即可，那么gpsd的滚动信息就可以直接读到，但要结合具体的应用，就还需要运行执行上面提到两个操作步骤中的第二步，第二步操作就是运行使用GPS信息的应用程序，由于gpsd的存在，这些程序都可以独立地，不受任何影响地，各自同时从gpsd处获得当前的GPS信息。一个方便的实用工具名叫“cgps”（即curses gps）。在Linux的命令行中，不需要带任何参数，只要运行cgps，该程序就会自动连接到上面提到的gpsd运行实例上，并开始显示当前的所有GPS信息。

3.Windows上的GPS

在Windows 7操作系统中，“设备管理器”（Device Manager）会自动检测硬件的变动，并加载正确的驱动程序，以及给该驱动程序分配合适的串口（COM port）。不幸的是，即使在Windows 7上运行很好的驱动程序，在过渡到Windows 8之后，驱动程序中也明文规定禁用BU-353芯片。这个时候，Windows 8的用户（也许叫“受害者”更合适）要想使用这个芯片，只能安装一个旧版本的驱动程序，以便作为一个替代方案。在Windows 8中，BU-353驱动程序的主文件有两个，其中ser2pl.sys用于32位Windows 8中，ser2pl64.sys用于64位的Windows 8中。替代方案详细的方法在网上可以找到。图1-12显示了一个在64位Windows 8.1操作系统中BU-353驱动的详细信息，注意其中ser2pl64.sys的版本是一个较早的版本号3.3.2.102。

图1-12　 64位Windows 8.1操作系统中BU-353驱动的详细信息

4.Macs上的GPS

默认情况下，对基于p12303芯片组的“USB转串口”转换器的驱动程序，OS X操作系统并没有提供过滤产品。但是在该芯片生产商Prolific公司（“旺玖科技”）的主页（http://www.prolific.com.tw/ ）上可以很容易找到这样一条信息，那就是在安装p12303的驱动程序以后，插入BU-353设备，系统会创建一个新设备“/dev：”。

KisMAC知道如何与此设备进行通信。该程序是一款运行在OS X操作系统上流行的被动式扫描器名称。

[1] API，应用程序接口，是一个或一组功能函数，所有用户的程序直接调用就可以使用，而不必再去亲自编写。在Windows中，有数千个这样的API。——译者注

[2] 称其为“伟大的战争”并不夸张，“mac80211驱动框架”是一个无线驱动的框架，它提供了大量的API和规范，在这个框架下编写驱动程序能和其他驱动程序具有良好的共享性、兼容性（类似于Windows下的NDIS框架的作用）。一般来说，各家芯片厂商都会提供配套的驱动程序并提供更新支持。——译者注

[3] 由于英文单词free本身同时有“自由”和“免费”两个意思，所以有人常认为自由软件是免费的无偿使用，这其实并不是自由软件的实际意思，这里free的实际意思是该软件大家都是可以获得并直接使用的，而不需要再获得授权。虽然绝大多数自由软件是免费的，但也不排除有些自由软件是收费的；与自由软件相对应的是闭源软件，而闭源软件中也不乏免费的软件。非自由软件经常要在软件显著位置显示“copyright”（版权）一词。有趣的是，英文单词right同时有“右边”和“权利”两个意思。于是自由软件的倡导者为了和非自由软件中的copyright相对应，故意“将错就错”，根据英文中left表示“左”的意思，设计出一个新的单词copyleft，以表示“放弃版权”。——译者注

[4] Linux内核目前的开发模式是Linus Torvalds制作的新版本的发布，也被称为“vanilla”或“mainline”的内核，这意味着它们包含了主要的、通用的开发分支。——译者注

[5] 美国硅谷一家从事无线芯片组生产的公司，2011初被Qualcomm并购。——译者注

[6] SoC即System on Chip的缩写，一般称为“片上系统”。如果某个系统的所有运算、控制、存储、输入输出都可以明确定义出来，并且改动小、用量大，那就可以将整个系统做到一个芯片中，形成芯片级系统。——译者注

[7] PCIe全称PCI-Express，是由Intel公司在2001年提出的最新的总线和接口标准。——译者注

[8] FCC：Federal Communications Commission，即美国联邦通信委员会，进入美国市场的电子电器产品必须经过FCC的认证，该认证具有强制性，电子电器产品需拿到FCC认证证书才能顺利进入美国市场。FCC ID是指某一类通过FCC认证的产品的一个唯一标识号。——译者注

[9] 对这一点的理解，可以简单地认为灵敏度就是“判断在多弱的信号下，我们对对方发出的无线信号仍然能够收到并进行识别”。随着距离增大，信号越弱，该值越小，那么当灵敏度差的（即除去负号后的数字小的）识别（且不说能不能收到）不到信号的时候，灵敏度好的仍然可以识别到。对于无线黑客，这意味着你能够在离目标更远的距离发起无线攻击。——译者注

[10] 缆线连接器的作用是通过缆线将两个接口连接起来，起到物理接口类型转换和延长线的作用，俗称“小辫子”。“正式的”名称众多且不统一，容易引起误会，而“小辫子”虽为口语，但普遍都理解，所以后文采用此术语。——译者注

[11] 有些书喜欢用轮胎或游泳圈来形容，译者认为这两样东西对于“压扁”的程度过于夸张，另外这两样东西都是“空心”的，所以不太合适。——译者注

[12] PVC，全名为Polyvinylchlorid，主要成份为聚氯乙烯，PVC管本身没有单独使用的，主要用于对线缆的包装保护，因其良好的耐热性、韧性、延展性等优点而广受欢迎。——译者注

[13] 这是一个由can（易拉罐）和antenna（这里应该理解为天线的接收模块）合成的新词，特指家里手工制造的，在天线的头端，由金属罐（如易拉罐）连接而成的定向波导天线，借以增加收发范围。这也是Wi-Fi爱好者最常做的事。——译者注

[14] 根据书中的介绍，应该就是我国流行的无线上网卡。——译者注

[15] AT即Attention，AT指令集是从数据终端设备（Data Terminal Equipment，DTE）向数据电路终端设备（Data Circuit Terminal Equipment，DCE）发送的一组指令的集合，早期主要用于对Modem的操作，可以进行呼叫、短信、电话本、数据业务、传真等方面的控制。——译者注

[16] WAAS（Wide Area Augmentation System）是由美国联邦航空局开发建立的用于空中导航的一个系统，该系统主要是通过解决广域差分GPS的数据通信问题来提高全球定位系统的精度和可用性。——译者注

1.4　本章小结

本章简要地介绍了与802.11无线网络安全相关的各项内容，并包括被动式扫描器和主动式扫描之间的区别。希望读者在看完本章后，对无线网络完成一次成功的攻击所需要的装备有一个完整的理解。总的来说，这需要一套802.11黑客工具包，包括天线、网卡、芯片组、信号放大器、GPS。同时，也应该对如下问题有一个宏观的了解。如哪些芯片组在Linux下可得到最好的支持，哪一款网卡适合对无线网络实施测试和攻击。下一章将详细介绍一些特定软件的各项详细内容，主要包括这些软件是如何对802.11网络进行扫描的，以及如何以可视化的效果显示给用户。

第2章　发现和扫描802.11网络

如前一章所述，当前有两类无线网络中的扫描工具：被动型扫描器和主动型扫描器，本章涵盖了这两种类型的扫描器。如果你已清楚你最适合使用什么操作系统，那就可以直接跳转到该操作系统所对应的那一节；如果你连所使用的扫描工具名称也清楚，还可以直接跳转到该工具所对应的小节中。如果你对其他操作系统平台好奇，或试图通过操作系统工具间的两两对比，比较出哪个更好，请继续依次阅读所有内容。

2.1　选择操作系统

在上一章，我们讨论了依靠基本硬件的功能差异，会导致各种攻击技术的多样化差异。这些硬件都是靠设备驱动程序与操作系统进行通信，所以设备驱动程序都与特定的操作系统紧密相关。此外，不同的无线黑客软件也只运行在特定的操作系统平台上。所有这些因素组合在一起，使得选择一个合适操作系统变得非常重要。

2.1.1　Windows操作系统

Windows操作系统可能的优点是已被优先安装在您的笔记本电脑上。但是奇怪的是，在较新版本的这些Windows操作系统中，只有为数不多的几种方法可以将无线网卡设置为“监测模式”（monitor mode）。由Microsoft提供的一款最简单的程序开发包，称为“网络监视器”（NetMon）程序。不幸的是，尽管Microsoft提供了大量驱动级的支持，并且该开发包已推出很久了，但到目前为止，还没几个第三方程序使用这一开发包从事网络无线入侵方面的开发。

2.1.2　OS X操作系统

OS X操作系统是一个奇怪的“野兽”。当操作系统的核心开放时，某些子系统却不开放。虽然一些人认为OS X非常优雅，但OS X操作系统的设备驱动子系统却没有Linux或任意BSD驱动子系统那么出名。这意味着很多黑客放弃对OS X操作系统设备驱动程序进行攻击。

在Release 10.6版本中，Apple公司增加了“监测模式”以支持内置的机场卡 [1] （Airport card）。现在有了这个模式，这对黑客来说无疑是好消息，但要将一个外部天线连接到内置机场卡上，需要大量的练习和勇气。如果只使用内置卡，那么你可以在上面运行一些被动型扫描器，但这对于专业级无线黑客来说，他们更愿意使用外置天线，因此OS X在这方面还存在局限性。

对于无论是哪的OS X操作系统用户，幸运的是，有一个OS X操作系统上的无线网络“半主动型扫描器”工程，名为KisMAC。感谢这个工程，因为它尽管不像在Linux上那么强健，但至少让许多外部芯片可以很容易地支持在“监测模式”下，让“数据包注入”的操作也变为可行。总之，尽管许多攻击可以在OS X操作系统上完成，但就Linux从芯片组的支持和最新的技术方面，OS X是远远滞后的。

2.1.3　Linux操作系统

Linux操作系统是无线网络攻击中惯用的选择。不仅是它拥有最积极的驱动程序开发人员，而且大多数无线工具本来就是在Linux下设计的。像驱动程序需要支持“监测模式”和“数据包注入”这两大黑客必备的功能，对于Linux根本就不需要确认，因为这两项功能几乎是标配，而不是附加或可选功能。此外，因为驱动程序是开放源码的，所以很容易通过给驱动程序打补丁或直接修改驱动程序，进而使其完成更高级的攻击。

当然，如果你没有太多使用Linux的历史，即使是有丰富的经验，使用中也会失去信心，甚至是后退，特别是将定制基于802.11标准的驱动程序作为主要的攻击手段的时候，因为这不仅需要有高超的编程水平，还需要对Linux漏洞和攻击方式有透彻地了解。幸运的是，如果你利用现代分布式版本的Linux操作系统（例如Ubuntu系列的14.04版或Kali系列），大部分的驱动程序本来就可用于数据包的注入。正如前面章节所述，在本书中，所有的攻击均可以在stock 3.3.8版本其以后版本中完成，并且除非明确指出，否则只要Linux内核未做修改，这些攻击都仍然有效。

另一种在Linux上的攻击方法是使用各种各样“可启动的分布式攻击”（bootable distribution）进行攻击，其中最流行的Linux操作系统版本是Kali系列版本（这个系统其实是原BackTrack系列的继承者）。作为分布式攻击，需要同时使用多台计算机同时操作，在使用“可启动的分布式攻击”技术时，你不需要将程序安装到多台计算机中的“主”笔记本（main laptop），仍然可以发动分布式攻击，进而测试Linux的能力。另一个在Linux上测试无线网络攻击的简便方式就是使用VMware虚拟机软件。VMware本身提供强有力的“USB直通支持”（USB pass-through support），通过这一功能，当你将真实的硬件插入到宿主计算机上，“USB直通支持”就可以将宿主的设备映射到虚拟机中，那么对于虚拟机中的众多无线黑客工具就可以像使用虚拟机中的设备一样，通过VMware使用宿“主设备”。在Kali版的VMware映像（VMware image）中，预创建（prebuilt）了这些功能。

[1] Apple苹果计算机以前曾推出来的两种无线网卡：一种型号是机场卡（Airport Card），规格为802.11b(11Mbps)；另一种型号是机场终极卡（Airport Extreme Card），规格为802.11g(54Mbps)。——译者注

2.2　Windows服务发现工具

目前，在Windows操作系统上，只有一个自由式的扫描工具被开发人员积极地维护着，即Vistumbler。只要提到基于802.11的主动式无线扫描工具，Vistumbler也常会被提到，并且其名声还不错。目前这款扫描器软件也开始支持多种接口，比如现在的版本中，就集成了GPS定位KML文件生成器，一个实时的Google Earth（谷歌地球）的实时可视化界面等诸多功能。如果你只是偶尔想把周边的无线网络都标在地图上，并且又比较喜欢Windows操作系统，那么这款工具是个不错的选择。

2.2.1　Vistumbler工具

因为Vistumbler是一个“主动式扫描器”程序，所以它在运行的时候不能创建数据包捕获，并且在发现隐藏的无线网络“服务集标识”上还有困难。从原理上，Vistumbler只是调用了netsh命令（该命令是一个Windows自带的命令行网络工具），由于中间隔了这么一个应用层软件，所以这就意味着该程序与驱动程序接口实现了分离。这意味着在Windows下，无论什么样的无线网卡，只要Windows能较好地识别，那么Vistumbler程序也都能很好地运行。

提示

运行Vistumbler之前，禁用任何第三方无线配置的客户端，从任何网络连接中断开，以便确保获得最佳的结果。

Vistumbler（主动扫描器）

Vistumbler的主界面窗口如图2-1所示，系统提供了一个可重排位置顺序的网络视图，在列表中列出了所扫描到网络的“基本服务集标识”、“服务集标识”、信号强度（signal strength）等我们所关注的参数。

图2-1　Vistumbler主界面

Vistumbler显示每个网络的以下信息：

·激活状态（Active）：表示该网络目前是否在信号覆盖范围。

·MAC地址（Mac Address）：显示网络的“基本服务集标识”值。

·网络名称（SSID）：显示网络的服务集标识（即网络名称）。如果网络是隐藏则显示为空格。

·信号强度（Signal）：以报告的方式列出从驱动程序中获得的信号强度。驱动程序的供应商不同，则单位也不同。

·信道（Channel）：不言而喻，该无线当前所使用的信道。

·认证（Authentication）：列出所使用认证的类型。

·加密（Encryption）：列出所使用加密的类型。

·制造商（Manufacturer）：显示AP接入点的制造商。这种信息可能是来自于“基本服务集标识”的“OUI”选项 [1] 。

1.配置Vistumbler的GPS

假设你的GPS全球卫星定位系统硬件已安装好，并且工作在操作系统内核级别（如果不是，参见第1章），要想让Vistumber软件读取GPS数据是件很容易的事情。单击Vistumber软件的“设置（Settings）|全球定位系统设置（GPS Settings）”菜单。

如果你有一个支持“国家海洋电子协会”（NMEA）接口串口GPS设备，将其与笔记本电脑连接好，那么Windows就会自动给它分配一个COM串口值，在Vistumbler中，单击上述菜单后通常会弹出一个对话框，在这个对话框中，输入这个COM串口值即可。对于简单的NMEA设备，选择使用Kernel32选项，对于大多数GPS设备，默认串口参数值为：4800 bps的波特率，8个数据位，无校验位，1个停止位，无流量控制 [2] ，保存使这套参数生效，就可以看到GPS数值了。

提示

如果Vistumbler程序在识别GPS设备的时候遇到麻烦，可以尝试用程序调用GpsGate代理程序。GpsGate代理程序可以与任意的GPS产品之间建立会话，并且以代理服务器的方式将数据送往几种标准接口中，例如，一个虚拟串口。这样一来，Vistumbler程序就不再与实际的GPS物理设备直接通信了，而是与起中转作用的GpsGate软件进行通信。

2.Vistumbler的可视化配置

如前所述，Vistumbler集成了对Google Earth中卫星地图的实时映射功能，所以在扫描的同时，你可以看到Google Earth也在随着你的操作变化而不断刷新结果。扫描结束时，所有扫描到的数据可以保存起来，保存的文件是以Google Earth所支持的KML [3] 格式存储的。所以这时只要进行一次保存的操作，就会自动生成一个KML文件。

一次典型的扫描效果如图2-2所示。在Google Earth软件中，没有加密的网络用绿色 [4] 显示，使用“有线等效保密协议”加密的网络用橙色显示，使用“Wi-Fi保护访问”或更好加密方式的网络用红色显示，单击某一个网络，就会显示出该网络的详细描述，如信道、“基本服务集标识”等信息。

图2-2　“谷歌地球”实例

因为你拥有Google Earth的所有强大支持，所以可以很容易地标注你的扫描结果用于随后的分析使用。例如，你可以使用Google Earth的多边形工具（Polygon）（照片上方工具栏中左起第三个图标）创建一个多边形。然后用所设的多边形范围加亮某一你感兴趣的特定区域，然后在上面加一些注释。因为Google Earth可运行于所有的操作系统上，所以你可以将上述各项操作保存到KML文件中，然后将其移植到任何你喜欢的操作系统上使用这些分析结果。Google Earth软件的这种互动性，使这些采集点和标注点形成一个可视的无线网络。

提示

网站

对本书所有提到的无线网络扫描工具，如果读者对它们之间扫描能力的对比感兴趣，可以从本书的网站（详见前言中的“配置网站”）上本章所对应的位置（http://www.hackingexposedwireless.com/files/02/ ）下载包含有各工具所有调查资料的KML文件，然后自己分析对比。

3.整合到Google Earth中

一旦你的GPS设备可以与Vistumbler一起工作，就需要搭建起一套Google Earth的整合系统，进行可视化查看。你可以单击Vistumbler的“设置（Settings）|自动KML（Auto KML）”菜单（见图2-3）。通过调整界面上显示的“航向”（Heading）与“高度”（Altitude）的值，你就可以在Google Earth刷新的时候，调整看这个区域的远端拍摄点位置。

然后，在主菜单中单击“额外（Extra）|打开KML网络链接文件（Open KML NetworkLink）”菜单项。这时Google Earth就会弹出扫描结果的一个实时的可视化界面。

图2-3　Vistumbler的“设置/自动”菜单界面

[1] OUI：Organizationally unique identifier，组织唯一标示符。——译者注

[2] 波特率、数据位、校验位、停止位和流量控制这五个参数是串口操作中首先要设置的五个选项，并且控制端和硬件的设置必须一致。——译者注

[3] Google Earth支持KML和KMZ格式的文件，用于保存用户在Google Earth中所做的配置。——译者注

[4] 由于本书采用黑白印刷，所以无法分辨颜色，图中的绿色以“√”号表示；橙色和红色以“×”号表示。——译者注

2.3　Windows嗅探工具/注入工具

比较悲剧的是，尽管Windows操作系统的“监测模式”已获得广泛支持，这些支持既包括本地的，也包括通过第三方工具（如AirPCap和CommView）获得的，但并没有多少应用程序可以很好地在“监测模式”下进行“被动式扫描”。这些Windows上的应用，多数只是与无线网络的故障诊断和调试相关。以同样的方式，Wireshark并不能真正地取代Kismet、NetMon/MessageAnalyzer和CommView，也不是一个可以实施“战争驾驶”无线网络攻击操作的好的替代品。

2.3.1　NDIS 6.0对“监测模式”的支持（NetMon/MessageAnalyzer）

在Windows Vista版本发布后，Microsoft公司借机清理了Windows上的无线“应用程序接口”。Windows Vista及以后版本的无线驱动程序主要针对NDIS 6.0编译的。“网络驱动程序接口规范”（Network Driver Interface Specification，NDIS）是用于Microsoft公司网络接口设备驱动程序的编写而设定的“应用程序接口”。当Microsoft公司返工重新设计无线规范的时候，他们还增加了一个为驱动程序设置“监测模式”的标准方式。这样做最明显的结果是，Microsoft公司“网络监视器”（Network Monitor）NetMon程序和它的大哥“消息分析器”（Message Analyzer），可以用来把网卡设置成“监测模式”并捕获数据包。

网络监视器NetMon程序（被动嗅探）

为了能够支持“监测模式”，你需要安装最新版本的“网络监视器”NetMon程序，然后在nmwifi的实用工具集（该工具集也包括NetMon程序）中配置网卡适配器的信道和模式。图2-4是nmwifi软件的一张截图。

图2-4　nmwifi的截图

nmwifi工具用于配置“监测模式”接口。一旦配置成功，就可以用来捕获通信数据包（详见图2-5）。关于使用“网络监视器”NetMon程序的“监测模式”入侵网络的更多细节，请参见7章。

图2-5　配置成功后捕获通信数据包

提示

不能忘记使用nmwifi设置适当的信道以供无线网络使用。令人惊讶的是，尽管Microsoft提供了一套标准化“应用程序接口”，可以全面支持无线网卡的“监测模式”，但第三方在Windows上提供“监测模式”解决方案的市场仍然相当大。事实证明，目前还没有哪个应用程序比“网络监视器”NetMon程序更能有效地使用当地“监测模式”。

2.3.2　AirPcap工具

AirPcap是Riverbed公司提供的产品（该公司的前身是CACE技术公司）。对于基于UNIX操作系统的用户来说，通常对这个工具并不陌生。但对于Windows操作系统的用户来说，还比较新。总之，AirPcap这款产品的设计目标是提供商业级“监测模式”。保护对自身的保护方式，是通过一套特定品牌的“USB接口软件狗”（USB dongle）实现的。这些软件狗也可以很好地与WinPcap集成起来，这意味着Wireshark公司可以很容易地支持AirPcap软件，原因是CACE技术公司是Wireshark软件的母公司，CACE公司在2010年被Riverbed公司收购之后，Wireshark公司自然就成为Riverbed公司的子公司。

AirPcap（被动型嗅探）

针对于不同需求的用户，AirPcap产品包被分成多种配置组合，其中大部分配置组合都支持“数据包注入”功能。AirPcap产品价格从不支持“数据包注入”功能的大约200美元，到全面支持802.11协议中的a/b/g/n等子协议的700美元不等。不幸的是，具备这种能力会将你重新拉回到配备笔记本电脑合理的价格上（约700美元）。详细的价格和功能介绍，请参阅网址：http://www.cacetech.com/products/airpcap.html 。

AirPcap的一大优势，就是它对程序开发者十分友好。就第三方支持而言，AirPcap目前有两张王牌，一张是著名的密码恶魔“Cain&Abel” [1] ，另一张是Aircrack-ng，二者是因为AirPcap的易用性而将AirPcap作为其编程接口的。

安装AirPcap

在Windows上安装AirPcap软件的步骤和在Windows上安装其他任意应用程序一样。一旦你安装完驱动程序，并且将驱动程序与应用工具软件进行了关联（associate），那么就可以使用“AirPcap的控制面板”（AirPcap Control Panel）（如图2-6所示）对用户的无线网卡中，信道频率等信息进行配置了。

图2-6　AirPcap的控制面板

当AirPcap的接口配置操作完成以后，就可以运行那些与AirPcap关联过的各种应用程序，包括Wireshark、“Cain&Abel”等应用程序。如前所述，AirPcap其实是一个产品包，其中包含几个应用程序。在这些应用程序中，有一款十分有趣的应用程序，名为“AirPcap的情景再现”（AirPcapReplay）（该程序的界面如图2-7所示），这个应用程序最大的特点就是，根据之前在Windows中捕获并保存的那些数据包文件，该应用程序可以对捕获过程中出现的现象进行再现播放。

图2-7　AirPcapReplay界面

2.3.3　Wi-Fi版CommView

Wi-Fi版CommView是一个由Tamosoft公司开发的商业产品，Tamosoft公司的主页是http://www.tamos.com 。你可以从其公司主页上免费下载一个非常功能化的试验版本进行试用。这个免费试用版本的所有功能和操作方式都与商业版完全相同，只是免费试用版在使用30天后就会过期。

Wi-Fi版CommView针对各种不同的芯片组和网卡适配器提供了不同的驱动程序。下面网址的名单中，列出了这些芯片组和网卡适配器的厂商，其中包括了Atheros和最新Intel公司的芯片组。你可以通过http://www.tamos.com/products/commWi-Fi/adapterlist.php 查看完整列表。

CommView的安装十分简单，就像安装一个标准的Windows应用程序一样。一旦应用程序安装成功，CommView将查找所有可以支持的网卡适配器，并配置相应的驱动程序。因此，在你想运行setup安装程序之前，最好先将你想使用的网络适配器插入到计算机上。驱动程序的安装向导可以通过“帮助（Help）|驱动安装指南（Driver Installation Guide）”的功能在任何时候重新运行。一个正确配置适配器过程的界面，如图2-8所示。

图2-8　正确配置适配器过程的界面

一旦启动Wi-Fi版CommView，将看到如图2-9的界面。单击“开始捕获”（Start Capture）按钮（即工具栏的左数第一个“播放”按钮）。这时，Wi-Fi版CommView将开始在各个无线信道间跳频，并将扫描到的在功率覆盖范围内的网络全都显示在列表中，除了网络，也包括可以使用的信道。整个界面综览效果良好。

图2-9　启动Wi-Fi版CommView的界面

在CommView运行的过程中，有两个非常有用的窗口显示区，分别是“节点”选项卡（Nodes）和“数据包”选项卡（Packets）。“节点”选项卡如图2-10所示，显示的是CommView所看到的客户终端列表和AP接入点的列表。

并且，正如我们所预料的那样，单击“数据包”选项卡可以显示一个看上去很像Wireshark界面的列表，表中所列的都是CommView所捕获到的数据包。

所有这些显示都十分浅显易懂，单击“文件（File）|将数据包保存为（Save Packet Log As）”菜单，就可以将此前所捕获的数据包导出到一个libpcap格式的文件中。结合这一功能，可以很容易在其中注入数据包（详见后面内容），与此同时，有一个漂亮的Windows图形界面程序，通过该方式可以解除用户验证功能，也可以捕获“Wi-Fi保护访问”通信的协议握手过程，还可以将其导出到Aircrack-ng系统中进行破解。不过，在Wi-Fi版CommView的Demo版中，最能引起大家兴趣的特征是该软件的数据包发送功能。这一点在随后的内容中进行介绍。

图2-10　“节点”选项卡

在Wi-Fi版CommView中发送数据包

在Windows上，Wi-Fi版CommView已很成熟地能够支持数据包的注入功能。并且支持各种类型的数据包注入，如管理类数据包、数据类类数据和控制类数据包。它甚至有一个很直观的可视数据包生成器。

要想使用“数据包注入”功能，你可以单击“工具（Tools）|数据包生成器（Packet Generator）”菜单，就可以进入“数据包发生器”的界面，如图2-11。要定制数据包，你需要配置一些与注入的数据包相关的参数，如该数据包的传输速率（transmission rate），再如该数据包的每秒发送次数。在图2-11中，显示的是一个没有负载数据的信标数据包（beacon），该数据包就是由可视化“数据包生成器”所创建，其中的“基本服务集标识”字段设置的是CC：CC：CC：CC：CC：CC。

单击“可视化数据包合成器”（Visual Packet Builder）按钮（图2-11中左边竖列的正中间按钮），就可以将自己手工制作的数据包发送出去。不难看出，通过该软件，数据包的生成和发送出乎意料的直观、方便。图2-12显示的就是使用“数据包合成器”生成信标数据包的制作流程界面。

通过单击在顶部的“数据包类型”（Packet Type）下拉列表框，还可以轻易地手工制作出更高层次的数据包，例如“地址解析协议”（Address Resolution Protocol，ARP）数据包，以及TCP协议协议数据包等。

图2-11　通过CommView发送一个定制的数据包

图2-12　使用“数据包合成器”生成信标数据包

Wi-Fi版CommView还有一个专门用于注入“解除认证数据包”（deauthentication packet）的用户界面，方便实用，并且同样是图形化。该功能是用来破坏用户为关联和重新关联AP接入点时，所进行的“WPA的四次握手”（four-way WPA handshake）过程，所表示的现象就是某个连接正在通过某个无线路由器上网的用户，突然从该无线路由器上被“踢”下来了，此后再次重新连接，也连不上。此功能可从单击CommView主界面上的“工具（Tools）|节点重新关联（Node Reassociation）”菜单后运行，如图2-13所示。

图2-13　CommView的“禁止节点关联与重新关联”的数据包注入界面

Wi-Fi版CommView总结

Wi-Fi版CommView是一个强大的无线破解工具，也配得上它合理价格（一年的授权使用费是199美元）。软件支持多种包括符合802.11n标准和符合802.11ac标准的网卡适配器，在Windows 7、Windows 8/8.1上都能良好地运行。其中最酷的功能是直观的图形化数据包生成器。如果要在802.11无线网络中实施一些临时性的实验，那么比起其他平台，这一功能特性会使CommView变得容易得多。

[1] 这是一款可以破解本地或远程数十种常见密码系统，以及通过嗅探功能捕获数十种明文账号口令和特定规则的信息的黑客工具软件。——译者注

2.4　OS X服务发现工具

如2.1节中提到，Apple公司的OS X操作系统并不太合适无线网络攻击所需要的各种要求，不过，幸运的是，在OS X上，还真有一个“被动式扫描器”软件，这个软件叫作KisMAC，尽管名字上非常像，但这款运行在OS X操作系统上的KisMAC和运行在UNIX操作系统上的Kismet没有任何关系。目前，KisMAC支持所有最新的“苹果机场无线网卡”（Apple AirPort）的驱动程序，也支持少量外置的USB接口802.11b/g适配器的驱动程序，而支持最多的，就是基于支持Prolific公司的RTL8187芯片的“银色Alfa”设备的驱动。

2.4.1　KisMAC工具

KisMAC（被动型扫描器）

KisMAC是第一个，也是最重要的一款被动式扫描器。从特色上来讲，这款软件支持GPS定位，也可以把无线网卡设置到“监测模式”，并且软件也可以把捕获到的数据包保存成多种标准的格式。

如果要简单地介绍一下KisMAC的特点，那么可以分为四点。第一，作为一个扫描器，KisMAC包括了大量与扫描器身份关联度不大的功能，这些都会在后面的描述中感受到。第二，作为优点，KisMAC支持针对无线网络各种攻击方式，不过，虽然这些功能将在本节中简要地提及，更详细的内容在第3章中介绍。第三，KisMAC也有针对的Apple公司的“机场卡”（AirPort card）和“机场终极卡”（AirPort Extreme card）进行“主动式扫描”所需要的驱动程序。第四，虽然你可以在紧要关头使用一下这些“主动式扫描”驱动程序，但作为该软件的主业，你更应该试着用KisMAC为“被动式扫描”所提供的驱动程序，以从中得到它的全部功能。

1.KisMAC的主界面

图2-14显示的是KisMAC的主窗口。大部分列的意义都是不言而喻的。值得注意的是窗口底部并排的四个按钮。这些按钮是访问KisMAC四个主功能窗口的快捷方式，从左到右，四个按钮所对应的功能窗口依次为：无线网络节点、某个网络的数据通信、地图和数据细节。

在对无线网络扫描之前，你需要先告诉KisMAC，让它使用哪一个驱动程序，当然，正确的选择取决于用户实际上使用的是什么样的无线网卡。要完成这个操作，首先要打开KisMAC软件的“主界面偏好”（KisMAC Preferences）窗口，然后单击工具栏中的“驱动程序”按钮，然后就可以将这些驱动程序设置到KisMAC中了，该界面如图2-15所示。如果要设置其他参数，也同样在“主界面偏好”窗口中，例如“要扫描的信道和跳频范围”（即图上的“Channel hopping”）以及“是否将数据包保存到文件中”（即图上的“Save Dumps At”）等参数。另外，在图2-15中也可以看到，KisMAC使用的是RTL8187驱动程序（在图中“Capture devices”列表中），所扫描的是信道1~信道11，这些信道都是美国合法使用的信道。因为“是否将数据包保存到文件中”中输入了文件名，所以所捕获的数据包都将自动保存在：~/Dumplog-<年>-<月>-<日>.pcap [1] 的文件中。

图2-14　KisMAC主窗口

2.KisMAC地图可视化

KisMAC支持GPS全球定位系统。正如在上一章所说的一样，要想使用这个GPS设备，你需要通过驱动程序或代理程序，将GPS映射成一个可识别的串行设备，这样想使用GPS的应用程序只需要与这个虚拟的串口进行通信就可以了。BU-353就是一款具有这种功能的驱动程序。有关GPS设备的识别，以及将某GPS设备映射成一个虚拟串口的内容，详见第1章的内容。

图2-15　KisMAC的主界面偏好窗口

运行KisMAC软件，这个应用程序会自动连接系统中所有的串口，并最终生成一个“正在使用的”串口列表。假设你在这之前已将GPS接收器插入计算机，并且该GPS设备已被当前的OS X操作所识别，那么由这个设备所创建的虚拟串口也会被KisMAC所识别。对应于KisMAC的程序界面，当用户进入“GPS配置”对话框（GPS Configuration），你就会看到有一个下拉式菜单，这个菜单就是KisMAC运行时生成的串口列表，而由这个GPS设备所虚拟的串口，也作为一个菜单项位于下拉菜单之中。选择这个菜单项（比如，我使用GPS设备，所显示的菜单项是“/dev/tty.usbserial”），那么随后当你单击主界面下面四个按钮中的“地图”（即左数第三个）按钮时，可能会看到一条消息，这条消息会告诉你现在的位置是哪里。

曾经有一段时间，KisMAC软件中内置了真实的地图。在“地图”的这个主界面上，程序会从不同的服务器上下载当前位置的卫星图像或地图数据，然后对应实时地贴在界面上，这样网络位置一目了然。不过，提供地图数据的供应商逐渐消失了，取而代之的是“Google Earth”。在“Google Earth”中，操作和查看调查数据都是轻而易举的事，并且，在浏览过程中，KisMAC将数据导出到KML文件中的作用不会受到影响。

3.KisMAC和Google Earth

要在KisMAC上生成KML文件，只需单击“文件（File）|导出到KML文件（Export To KML）”菜单，然后在“Google Earth”中读入这个刚生成的KML文件即可。一个KisMAC的KML文件导出的样例，如图2-16所示。

图2-16　KisMAC的“Google Earth”展示效果图

4.保存数据和捕获数据包

在KisMAC中，你可以保存两种类型的数据：“扫描数据”类型（scanning data）和“捕获数据包”类型（packet capture）。如果你保存的是“扫描数据”类型，那么以后该数据可以在KisMAC中载入，并允许你在KisMAC提供的地图上进行定位，在使用结束后，再导出为其他类型的数据。是KisMAC以自己的格式保存的数据，所以完全可以把这个格式认为这是KissMAC的私有格式，这种格式就是所谓的“.kismac”格式，其扩展名也是“.kismac”。与之相对，将原始数据包保存的格式，称为“.pcap”格式，其扩展名也是“.pcap”。

另一种KisMAC软件支持的保存类型，就是“捕获数据包”类型。这是使用“被动式扫描器”的最大的优点之一，KisMAC可以保存所有捕获到的数据包，以便以后的收集和分析。拿到这些数据包后，主要有两个用处。第一个用处，除了这种“捕获数据包”类型文件，也包括前面的“扫描数据”类型文件，就是在这些数据包中，可以寻找到以明文（plaintext）方式表示的用户名和密码。例如你当前所看的数据包中，包含有很多邮件操作，你也许就会惊讶于“为什么还有那么多未加密的POP3服务器仍然在使用”？拿到用户名和密码，其安全性根本就无从谈起。另一个用处，就是利用这些文件破解所监听的无线网络本身，事实上，大多数针对“有线等效保密协议”无线网络和“Wi-Fi保护访问”无线网络的攻击，都是先在该无线网络中搜集一些（有的时候需要先搜集很多）这样的数据包，然后“以其人之道，还治其人之身”地用在这个无线网络中，进而破解或入侵。这一部分详细的说明详见第3章和第4章。

要让KisMAC为你保存它所捕获的数据包，只需要在“驱动程序的配置”（Driver Configuration）界面上，单击界面上选择所要捕获的数据包类型单选框即可。如果你不确定你所感兴趣的数据包属于是哪种类型，则保存一切数据包也不会产生任何影响。KisMAC保存的数据包文件采用的是标准开源的“.pcap”格式。如果你想要查看这些文件的内容，那么打开和显示这种格式文件的最好工具是Wireshark，Wireshark可以在OS X操作系统上安装为一个本地应用程序。

最后要说的是KisMAC支持多种黑客攻击方式。目前，这些攻击包括Tim Newsham的21位WEP密钥攻击（Tim Newsham's 21-bit WEP key attack），多种模式的暴力破解（brute-forcing），针对RC4计划表攻击（RC4 scheduling attack，该攻击又名“统计攻击”（statistical attack）或“弱初始向量IV攻击”（weak IV attack））。虽然通过KisMAC的下拉菜单可以使各种攻击变得异常方便，但要从攻击效果上来说，由于KisMAC在这方面表现一般，所以对于某一个具体的网络漏洞，使用专用工具进行攻击通常会得到更好的效果。

对于KisMAC应该程序，其他值得一提的特征还有不少，比如该软件能够将定制的数据包注入到采用“有线等效保密协议”算法加密的“.pcap”文件中，并在随后实施破解。目前，KisMAC是OS X操作系统中唯一可以实施“数据包注入”攻击的黑客工具。不过，如前所述，要想在KisMAC中成功地实现注入数据包的能力，还需要一个支持该功能的无线网卡。目前支持这一功能的最常见的网卡就是基于RTL8187芯片的“银色Alfa”无线网卡。

[1] 图2-15的文件名格式为“~/Dumplog-%y-%m-%d.pcap”，其中“~/”表示根目录，后面的“%”是转义符，表示该符号及后面紧跟的字母一起表示一个变量，%y、%m、%d分别表示保存文件时的年、月、日，在保存的瞬间，系统会读取当前的年月日值，并取代其中的变量，所以最后生成的格式只是具体操作的时间与有。同样，上面描述中，“~/Dumplog-<年>-<月>-<日>.pcap”中的“<年>”“<月>”“<日>”也表示保存文件时，实际的年月日。——译者注

2.5　Linux服务发现工具

在Linux操作系统中，主要有两个“被动式扫描器”，分别是airodump-ng和Kismet。airodump-ng程序是一款由轻量级的C语言编写的扫描器程序，是在Aircrack-ng组件中捆绑的一个小套件。该程序只提供了一个最简陋的用户界面和最基本的GPS支持，并且在所捕获数据包列表中，也没将GPS位置加上去（估计以后会加上去）。

Linux上的另外一个选择就是Kismet扫描器。这是一款全功能的，基于“客户机/服务器”架构的，运行802.11标准监测框架的应用程序。程序界面使用了插件和curses图形接口 [1] 。与airodump-ng相比，Kismet最明显的一个优势是，它输出的该数据包捕获文件“.pcap”中带有GPS位置标签，所以将来离线分析的时候，仍然能方便地确定地址位置。

2.5.1　airodump-ng工具

因为airodump-ng程序是一个轻量级的小程序，所以我就也顺手找一个名为“Wi-Fi小菠萝”（Wi-Fi Pineapple）的小工具配合其进行演示。“Wi-Fi小菠萝”也是以“小”著称：一是功能简单，只提供最基本的功能；二是个头也很小。可能是由电池进行供电的路由器，软件在Linux操作系统和OpenWrt系统 [2] 上运行。由Hak5组织 [3] 创建了“Wi-Fi小菠萝”的主板，详见图2-17所示；最新的版本是第5版（称为“Mark V”），有两个无线天线的接口，一个是通过USB接口，另一个是自定义的Web界面。这两个接口都允许用户运行专用模块（即被称为“注入”的模块）。

图2-17　 Hak5组织创建的Wi-Fi小菠萝主板

可以说，Web界面是用PHP网络编程语言编写的，PHP服务器在后台运行，即使我们不用，它也会耗掉一部分本来就不多的资源。在下面的例子中，我们打算扫描“Wi-Fi小菠萝”的命令行。开始时，首先配置“Wi-Fi小菠萝”处于在线状态，以便它可以下载一个包文件，并且以root管理员的身份登录到Linux系统中。（如果在这些操作中有疑问，那就请参阅“Wi-Fi小菠萝”的产品手册。）

1）首先，我们停掉“Wi-Fi小菠萝”的Web服务器，以便让出一些资源方便后面的操作。

2）其次，我们安装“多分屏程序”（tmux）、“GPS的守护程序”（gpsd）和“GPS的客户端”（gpsd-client）。

注意

在上述命令中，“--dest”参数表示将程序安装到外部的SD卡上，以便节省设备内部的资源。

3）下一步，我们可以安装确保Linux能够识别出GPS设备上BU-353芯片的驱动程序。

提示

网站

tmux是一款新的Linux屏幕替代工具。该程序可以将你现在使用的终端屏幕分割成两个或多个部分，每一个称为一个“子屏幕”，每个子屏幕可以分别和Linux进行“关联”（attach）或“解除关联”（detach），且互不影响。当然每个屏幕通常都是使用命令行的操作方式。作者本人的tmux配置就是经过对“Wi-Fi小菠萝”等嵌入式系统操作时优化出来的“多分屏”模式。在随后的几个截图中，也可以看到这个效果。这其实只是tmux的一个配置文件，如果用户对这种效果感兴趣，可以从本书配套网站上下载试用。下载地址是http://www.hackingexposedwireless.com/files/02/tmux.conf 。下载后，按上述步骤2的方式，在“Wi-Fi小菠萝”上运行即可。如图2-18所示，系统被分为上下两个屏幕，每个屏幕就是一个终端，二者各自的运行互不影响。

图2-18　系统被分为上下两个屏幕

4）上传好tmux，就可以运行该程序了。对于那些不习惯写备忘录的用户来说，tmux的多分屏效果会让你在各个“分屏幕”之间相互参照，其效果会好上不止一百倍。

5）随后，我们就看到屏幕被tmux分成多块。使用Ctrl+B快捷键，然后再按一个半角的双引号键（double quote），就可以对系统的屏幕分区进行配置，如果使用Ctrl+Q快捷键，然后再按一个减号（single dash），系统就会保存、生效，并退出。

然后就可以分别运行“GPS的守护程序”gpsd和cgs（该程序是由前面的“GPS的客户端”安装包安装后生成的程序）。很快，我们就可以在运行程序的“分屏幕”中读到GPS状态。

运行命令如下所示。

在“分屏幕”中读到的GPS状态如图2-19所示。由图可知：纬度（Latitude）是北纬38.886708，经度（Longtidude）是西经77.096222。

6）再下一步，我们在外部SD卡上创建一个目录，以便保存随后捕获的“.pcap”文件。

图2-19　在“分屏幕”中读到的GPS状态

7）然后，我们创建一个新的tmux的“分屏幕”，并运行命令，使无线网卡进入到“监测模式”，然后运行airodump-ng程序，如图2-20所示。在这个例子中，我们设定wlanl为捕获数据包的无线网卡。如果通过Wi-Fi连接到“Wi-Fi小菠萝”上，切记一定要选择不使用ssh的无线接口，以免“以己之矛，攻己之盾”，即自己的“Wi-Fi小菠萝”监听自己和“Wi-Fi小菠萝”之间的数据。

图2-20　运行airodump-ng程序界面截图

8）最后一步，就是我们开始运行airodump-ng，运行效果类似于图2-21。

注意

若要airodump-ng能读取GPS的数据，则至少需要airodump-ng 1.2版本，或之后更高的版本。

图2-21　在“Wi-Fi小菠萝”上运行的airodump-ng程序实例

airodump-ng的地图可视化

实际上，airodump-ng所创建的文件格式，与Kismet早期的“.netxml”与“.csv”格式是兼容的。但当我们习惯于通过Google Earth实现地图可视化浏览时，问题就来了，Google Earth并不认可这两种格式，而是使用KML格式。一个违反常规的办法就是通过另一个叫作GISKismet的软件作为中转，实现文件格式的转换。

格式一旦转换成功，那么原来枯燥单调的数字就可以变成Google Earth的可视化效果，因此，不妨将这种转换程序称为“Kismet可视化器”（Kismet visualizer）。多年来，已有多套“Kismet可视化器”脚本程序被编写出来，其作用都是将Kismet的输入格式转换为KML格式，或其他地图能识别的格式。但它们中的大多数最终都被弃用了，不过，最近有一个被称为GISKismet的“Kismet可视化器”出现，有望改变这种状况。这款转换器在2009年ShmooCon [4] 大会中首次推出，可以将最新版的Kismet输出文件格式转换为KML格式。

提示

很多现代检测工具直接将GPS信息连同数据包内嵌到一种称为“数据包通存信息” [5] （Per-Packet Information，PPI）格式的文件中，在上述各节中，其实，对于解决Kismet问题的老方法来说，这是一种更好的办法，因为很多扫描器都支持这一格式，所以转换为这种格式，可以供airodump-ng或其他的扫描器使用。

GISKismet软件　GISKismet可以从http://trac.assembla.com/giskismet/ 网站上下载。该文件的输入格式是“.csv”或“.netxml”。这两种格式一般是由Kismet或airodump-ng生成的。GISKismet将这得到的数据写入到SQLite数据库中，然后就可以通过各种灵活的SQL命令对战争驾驶生成的数据进行查询。GISKismet程序预装的Kali系列的Linux操作系统中，主要用于处理从“Wi-Fi小菠萝”中采集的数据，以便将其可视化，如图2-22所示。

图2-22　GISKismet程序实例

一旦你完成了上述操作，在当前的目录下，你就会看到一个SQLite数据库文件，该文件的名称是wireless.dbl。

到目前为止，我们只是将由anrodump-ng生成的“.csv”格式或“.netxml”格式导入到了数据库中，下面用几个例子说明如何使用数据。下面开始导出所有的网络数据，这些数据都是在这些战争驾驶中搜集的数据，导出的格式是KML格式。

下一步，在这些数据中找到那些“基本服务集标识”名为“Linksys”，未使用任何加密算法的无线路由器，命令是：

上面的例子只是通过SQL命令查询扫描结果能力的一次牛刀小试，当亲自测试过大量实例以后，你就可以通过这种方式做大量渗透测试（pen-test），并很容易地将可以作为攻击目标的主机从不能作为攻击目标的主机中分离出来。图2-23是通过GISKismet的输出文件生成的Google Earth可视化实例。

2.5.2　Kismet工具

Kismet不止是一个扫描工具，它其实已然是一个802.11协议数据包捕获和分析的框架。事实上，Kismet这个名字本身就是模棱两可的，这个名字的真实来源是这个工具包中两个二进制可执行文件的名字：kismet_server和kismet_client，而所谓“可执行的Kismet”其实仅仅是一个“外壳”（shell）的脚本。在该脚本中分别调用两个程序，并各自以典型的配置开始运行。Kismet的框架体系显示如图2-24所示。

图2-23　通过GISKismet的输出文件生成的Google Earth可视化实例

图2-24　Kismet的框架体系

Kismet（被动型扫描器）

在GPS地理数据采集的时候，Kismet程序和airodump-ng程序一样，都是同另一个名为GPSD的程序进行通信，而GPSD程序再同实际的GPS硬件建立会话、采集数据。GPSD通过一个串行端口连接到GPS全球定位系统装置上，并且通过一个TCP连接（默认的2947端口）将数据提供给任何其他的应用程序。GPSD带有许多发布版本，易于安装（在Linux下，安全命令是“apt-get install gpsd gpsd-clients”）。一旦安装好，你只需要通过正确的参数就可以和硬件建立会话，如图2-25所示。

图2-25　通过GPSD和硬件建立会话

如果在使用GPSD中有问题，该程序支持通过“-D（debug，调试模式）”和“-N（no background，不要背景）”等两个有用的调试选项在调试状态下进行排查。例如，“gpsd–D 2–N–n/dev/ttyUSB0”会让你看到实时状态下正在发生什么事情。

提示

最近版本的GPSD服务程序在默认的情况下，只允许本地客户端进行连接。如果你通过网络连接GPSD的时候遇到困难，可以增加“-G”参数尝试运行。

你可以通过telnet命令，或netcat命令，连接到GPSD的TCP端口上，下面的命令可以连接到GPSD，并验证该连接是否正常。

提示

在与BU-353或类似的GPS设备进行通信的时候，如果将现在的二进制协议格式转变为“国家海洋电子协会”（NMEA）协议格式，你可以通过“gpsctl-f-n-s 9600/dev/ttyUSB0”进行强制转换。

1.配置Kismet无线网络

要配置Kismet无线网络，主要需要将无线网卡设置为“监测模式”，因为一台主机可能有多个网卡，所以还要在监测之前先确定使用哪个网卡。对于网卡的识别上，Kismet可以很好地完成对无线网络接口的自动检测工作，然后提示你有新的信息设备源加入。下面要做的就是先确定要通过哪个无线网络的物理接口实施数据包的捕获操作，然后将这个物理接口配置为“监测模式”，这是一个好主意。在下面的例子中，我们先删除关联到物理接口phy0上的“管理模式接口”wlan0，然后用一个名为mon0的带有“监测模式”的无线网络接口代替，这就意味着实际的物理接口phy0使用的是带有“监测模式”的mon0了。

2.运行Kismet

现在你已经在笔记本电脑上配置好了GPS和无线网卡，那么是时候启动运行Kismet了。Kismet将在启动Kissmet的目录中创建一连串的多个文件，所以建议在运行前先创建一个Kismetdumps目录，然后在这里运行Kismet，使其新创建的文件都在这个新建的目录中，以减少当前目录下的文件数，避免杂乱无章的现象。

一旦开始运行Kismet，你会被提示是否要先运行一下Kismet服务器（即kismet_server程序），单击鼠标表示同意，这时又会提示你增加一个“数据采集来源”（source）。选择前面配置为“监测模式”的无线接口mon0作为“数据采集来源”，然后单击“添加”按钮以完成“数据采集来源”的添加操作，如图2-26所示。

图2-26　增加“数据采集来源”

新的Kismet很大程度上是菜单驱动。如果你想做某件事，按下“~”键就可以访问菜单。在这里，你可以改变相当多的显示设置。在网络名称上按“回车”键，就可以显示“网络详细视图”（Network Detail View）对话框（如图2-27所示），在这里显示了一个给定的网络的详细信息。

3.Kismet生成的文件

默认情况下，Kismet程序运行的目录中会生成以下五种文件：

·.alert：报警的纯文本日志文件。Kismet将对特别关注的事件发送警报，例如Metasploit程序发现了一个疑似的驱动程序漏洞。

·.gpsxml：XML格式的，包含有每个包和GPS位置的日志文件。

·.nettxt：纯文本格式的网络信息，非常适合于人们阅读。

·.netxml：XML格式的网络信息，非常适合计算机读取。

·.pcapdump：通过pcap捕获的实时数据通信数据包保存文件。如果设置了PPI选项，则文件中包含有PPI格式的文件。

图2-27　Kismet的主窗口

[1] curses是一个在Linux/UNIX下广泛应用的图形函数库。——译者注

[2] OpenWrt是基于Linux操作系统的嵌入式开发平台，以高度模块化、高度自动化，拥有强大的网络组件和扩展性而著称。——译者注

[3] 个主要从事无线网络安全检测的黑客组织。——译者注

[4] ShmooCon是一个美国黑客大会的名称。每年举办一次，一般每次会议有40个议题，主要讨论计算机安全和计算机文化。——译者注

[5] 这是一个由CACE公司（Wireshark公司的母公司，Riverbed公司的前身）制定的一种专为无线网络数据包捕获后保存的格式，大多数类似功能的商业软件都支持该格式。——译者注

2.6　高级可视化技术

如前所述，Kismet新版本输出“.pcap”格式的文件，该文件是按一种名叫“数据包通存信息”（Per-Packet Information，PPI）的数据格式进行保存的。这种带标签的格式对于无线信号地理测量非常有用，因为这种格式可以以时间作为参考点，同时将许多参数信息一起保存起来。这些信息有数据包在捕获时的地理位置信息、所用信道、网络名称等信息，在一些特殊情况下，还包括天线类型、当前的移动方向等参数。

例如，参考图2-28，这是Wireshark软件解码后查到的GPS信息截图，该信息取自于以PPI格式保存到“.pcap”文件，该文件是Kismet进行测量的时候生成的。

图2-28　Wireshark软件解码后查到的GPS信息截图

这种格式的好处之一，就是我们可以使用“Wireshark显示过滤器”（Wireshark Display Filter）根据数据采集所在的位置进行数据过滤。例如，要显示一个特定的区域内（假设范围位于北纬38.08到38.09，西经77.00到77.01之间），包含“WPA握手”的所有数据包，我们可以使用以下“Wireshark显示过滤器”：

2.6.1　可视化PPI标签Kismet数据

使用这种PPI标记数据格式的另一个好处是，由于一些可视化工具支持这一格式，借助于这些第三方可视化工具，可以直接对“.pcap”格式文件进行分析，而不需要考虑这些文件是由哪个测量工具生成的。例如，有一款符合PPI格式参考标准的可视化器（visualizer），名为ppi-viz，该软件就可以将新版本Kismet生成“.pcap”格式文件转成KML格式文件（见图2-29），其命令格式如下：

在Google Earth中，我们载入前面生成的KML文件，随后，就可以在Google Earth中看到如图2-30的效果。每一个扫描到的无线网络都显示在左边的“地址”（Places）中，在这里选中一个无线网络，在右边的主窗口中就会显示出该网络的条形图，在信号采集的时候，在这一地点的信号越强，表示数据包的线越亮，其长度也越长。为了便于描述，在下面的例子中，我们选中了一个叫作“Madrose Patio.”的网络来说明，所有的测量工具的功能的测量也都在这个位置完成。为了能让大家更清楚地了解我们的测试范围，我在图上手工绘制了一个三维的多边形，以此标注“Madrose Patio.”网络的位置和范围。

图2-29　利用ppi-viz进行文件转换

看着这个图像，你可以看到信号接收强度最大值是（-63dBm [1] ），其测量点位于“Madrose Patio.”网络的右边（与预期的一样）。但这么多值里，哪个点是最有用的呢？其实，我们现在最关心的是在多远的距离时，我们还能看到这个网络。这是所有信息中关键的点。这也是前面费尽心机，加上GPS信息，采用PPI格式的最大动机。

在主窗口中，右边的垂直条形图可以让我们从街对面知道信号的强度，根据经验，使用-75dBm或更好的信号，无疑是访问这个网络最合适的范围。通过借助于KML文件在Google Earth上的分析，现在我们知道了哪些地点适合作为渗透测试的地点，哪些地点不适合。借助于这些标准可视化工具，在各点之间对比的效果，如图2-31一样。

图2-30　在Google Earth中载入KML文件

图2-31　各点之间对比效果

通过这种方式，你也可以看到由Vistumbler和KisMAC两个软件分别进行扫描，然后借助于GISKismet软件对扫描结果转换后同时输出的效果图。虽然这两个工具对网络进行了定位，并且做得都很出色，但无论是哪种方式都无法提出足够的说服力来告诉你，距网络有多远时你可以和网络进行通信，通过比较，再回到使用了PPI格式，在PPI格式中嵌入了GPS信息，那么两种图的差距就一目了然了。再看信号强度，在上面这张图中，在你走过的每一个点上，你都无法告诉别人，这个网络在当前位置是否可以看到，同时你也无法确定当前这一点的信号强度。

2.6.2　基于PPI的三角架机器人

最后，PPI规范允许用户的应用程序将方向和位置，连同所截获的数据包一起打包编码，然后将这些信号一起放到一个“.pcap”文件中的向量标签（vector tag）中。图2-32显示了一个向量标签通过Wireshark解码后正确的填充格式 [2] 。

图2-32　向量标签通过Wireshark解码后的界面截图

不幸地是，Kismet并不知道目前你正在使用的是什么类型的天线，在朝什么方向移动。为了使这一功能生效，作者创造了一个无线扫描机器人，名叫“Servo-Bot”，机器人的照片如图2-33所示。这个机器人与GPS接口，通过软件控制云台，无线网卡运行在“监测模式”。利用这些信息，软件负责创建“.pcap”文件，通过控制云台的转动，可以控制天线的方向，而读取云台的数值，就可能知道当前天线的方向。

图2-33　Servo-Bot机器人的实物图

在图2-33中，云台位于天线和三脚架之间。在一个悠闲的下午，在邻区公园的边上，作者带着这个奇怪的玩意儿走上街头。如图2-34所示，servo_scanl和servo_scan2明确表明机器人Servo-Bot两次调查所放的位置。

图2-34　Servo-Bot两次位置显示截图

在基于云台机器人Servo-Bot方式下数据包的捕获完成以后，我们通过前面提到过的“可视化器”工具ppi-viz，将Kismet捕获的数据包转换为PPI格式。

最后，如果我们将由云台机器人Servo-Bot读取的数据标示在图上，我们可以得到如图2-35所示的输出效果。长一些的亮线，代表更强的信号（不过，这一特性仅对Kismet有效）。为了描述清楚，我们在图上再手工加上一些相交的线。

最后，如图2-36所示，我们可以使用Google Earth以街景的视角看这些扫描数据，这提供了一个更加真实的视野，一些明亮的方向线指向网络，垂直地面的线越高，那么在这个点接收到的信号越强。

网站

有关云台机器人Servo-bot更多的附加信息可以从本书的配套网站上下载。网址是http://www.hackingexposedwireless.com 。

[1] 单纯从图中并不能看到这个数值，要看数值，需要鼠标单击左边“地址”列表中网络名称左边的“+”加号，就可以从展开的该网络的下一级列表中看到数值。——译者注

[2] 图上用户区中，上半部分是数据包的列表，图中列出前4个；下半部分是被选中的第一个包的详细内容，从中可以看到PPI协议依次为“版本号、标志位、头部长度，数据连接类型DLT”，然后就是GPS位置、方向、天线等信息。──译者注

2.7　本章小结

本章涵盖了在三个主流的操作系统上使用扫描器的各项细节，包含了使用每一个平台的优点和缺点，以及在每个操作系统上配置和使用这些主要的扫描器工具的细节。我们也提供了一些在每一个平台上，如何实现扫描数据的本地可视化方法。并且，比起其他平台，用一个深度的例子说明带GPS信息的“.pcap”文件可以向我们展示非常好的可视化效果。

我们将借助这些工具和工具所收集的信息，在随后的章节中，继续关注无线网络攻击技术。

图2-35　从Servo-Bot和Kismet扫描后结果的可视化效果

图2-36　Google Earth街景视角下查看扫描结果的效果图

第3章　攻击802.11无线网络

在无线网络上的安全问题，有一个曲折的过去。特别是采用“有线等效保密协议”（WEP）加密的网络，由于早已被黑客破解过无数次，所以大家会理所应当地认为人们早就放弃使用这样充满危险的加密网络了，但事实是这样的吗？本章通篇更多介绍的是在Linux、Windows以及OS X等操作系统上，在使用基于“Wi-Fi保护访问”（WPA）加密的Wi-Fi无线网络过程，如何绕过这些网络安全机制，以及在可能的情况下实施攻击的一些工具和技术。

3.1　攻击的基本类型

无线网络的防御可以分为几个不同的类别。第一种防御类型是“防御完全无效”，别名就是可以“悄无声息地安全通过”，也就是说，任何人，只要他们诚心想进入系统，就可以轻易地攻破防御系统，然后悄无声息地进入系统中。

下一个防御类型就是可以把防御级别归为“防御存在障碍”。要攻击这一种网络，通常情况下需要一个密码字典，通过字典攻击进而拿到基于“有线等效保密协议”协议和基于“Wi-Fi保护访问下的预共享密钥”（WPA-PSK）协议的无线网络。这时，所需要的主要是一点时间和适当的技能，攻击者最终都可以拿到静态“有线等效保密协议”密钥，或者是一个弱WPA密码。

一旦你突破了“存在障碍”的安全措施，那么你就可以开始接触到第三类防御：“挑战思维”。攻击这种网络，需要真正的努力和超凡的大量高级别的技能。许多无线网络都想不到和做不了这么远，所以也无法归入到这一类中。在这一类网络中，通常使用了“Wi-Fi保护访问”协议，良好的优化配置，以及很强的客户端安全控制。对这类配置良好的“Wi-Fi保护访问”无线网络，在第4章中有详细的介绍。

3.2　悄无声息地安全通过

今天的许多无线网络的“AP接入点”服务器 [1] 都有的“隐身”（hidden mode）或“非广播”模式（non-broadcasting mode）。运行在这种模式下，AP接入点发出的网络的信标数据包中不包括其“服务集标识”名称（Basic Service Set ID，SSID，通俗地讲，就是我们所连的网络名称），AP接入点也不回复客户端以广播方式发送的“探测请求”（probe request）数据包。这样配置的那些“网络管理员”之所以这样配置，是因为他们将“服务集标识”作为一种秘密手段，与此同时，他们也倾向于在AP接入点上将“MAC地址过滤”（MAC address filter）设置为“有效”。

其实，一个“服务集标识”根本就不是秘密。在无线网络中，很多数据包都包含有明文的“服务集标识”字段，而不仅仅是在信标数据包中。之所以说“服务集标识”是非常重要的，是因为你首先得知道有这么一个“服务集标识”，然后才谈得上向这个AP接入点发送连接的请求，这意味着每一个合法的客户端在尝试连接网络的时候，都要以明文的方式指明他们要发送“服务集标识”。

既然在很多类型数据包中都包含有明文的“服务集标识”，那么即使你关掉信标数据包，停止回复广播类的请示，但“被动式嗅探器”（passive sniffer）却可以很容易地从另外类型的数据包中获得“服务集标识”。如果你曾经看到过Kissmet或KisMAC所捕获的数据包中被填入一些奇怪的名称，这是因为这些名称就是隐藏网络的名称，而获得这一名称的原因，就是因为有合法用户的客户端在所有发送的数据包中，某一些数据包中，也包含这个名称。比如，用户在登录网络认证的时候，就必然会用到“服务集标识”，那么他的数据包中，也必然包含“服务集标识”，不过，想拿到这个“服务集标识”，就意味着你得等待别人上线。在你监听（sniff）某个AP接入点的某个信道的时候，只要你监听的时间足够长，你就肯定能捕获到有人上线的消息，然后从这个过程中的所有数据包中获得“服务集标识”。但其实，除了耐心等待之外，你还有很多捷径可以做，比如你可以强制地控制一下用户的“行为”。

解除用户的认证

要获得你比较感兴趣的某个无线网络的“服务集标识”，最简单的方式是把一个合法的用户从这个无线网上“踢”下来，然后“观察”该用户重新连接网络的过程。如前所述，这个被踢用户的“关联要求”（association request），或者是“重新关联请求”（reassociation request）的数据包会以明文的方式带上“服务集标识”名称。也就是说，在一个AP接入点隐藏“服务集标识”的网络中，如果你没有耐心等待有人主动上网，那就踢掉一个正在上线的用户，这样强迫他发送一个重新关联请求，进而从中拿到“服务集标识”。这里所谓“踢”操作，其实就是“解除认证”（deauthenticate）操作。

之所以可以这样做，是因为802.11的管理帧（management frame）是不需要鉴定识别的，如果管理帧需要鉴定，那用户客户端就能够识别出来哪些管理帧是黑客发出的，哪些管理帧是由AP接入点发出的。所以你要做的就是给用户发送一个看起来像是来自AP接入点发出的数据包，用户客户端并不能分辨不出其中的区别，这时用户客户端的无线驱动程序就会立即发送重新连接的请求。从技术的角度，就是用户将随后发送一个带有“服务集标识”的“重新关联请求”到AP接入点，而这时，你的扫描器就可借机从“重新关联请求”数据包中知道这个网络的名称了。

警告

IEEE 802.11-2012版本，最初是作为IEEE 802.11w修正案起草的，在后来的标准发布中，积累了一些这方面的改进内容。如包括在“解除认证帧”和“解除关联帧”中支持“密码散列”（cryptographic hash）算法。有时这一改进的协议也被称为“管理帧保护”协议（Management Frame Protection，MFP），这个增强版协议可以阻止常见“解除认证攻击”（deauthencicate attack），但对于阻止其他的，针对Wi-Fi部署的“拒绝服务攻击”（Denial of Service，DoS）作用微乎其微。所以到目前为止，很少有网络采用MFP这一安全控制措施。

在Linux中，为什么会有这么多的无线命令行程序？

任何用过Linux一段时间的人，都可能因为控制一个无线网卡需要不同的命令而变得沮丧。要完成同样的命令效果，那些行将就木的老掉牙MadWifi程序，习惯于使用wlanconfig命令，而那些最老的，以及当前的较新的驱动程序，则习惯于使用iwconfig命令，并且最尖端的用户，可能已经熟悉了最新版Linux中的一个称呼“iw”的无线工具命令。

然而，iwconfig命令可能还会再继续工作了一段时间，所有新的无线驱动功能都将可通过iw命令进行访问。你可能也需要手动将iw命令安装到你的Linux上（安全命令是“apt-get install iw”）。虽然上述所有命令完成的都是相同的事情，但是他们是通过调用不同的“应用程序接口”（API）实现的。iw命令不是一个单一的命令，而是一个命令的前缀，是一系列命令。所有“老”的iw命令（例如iwconfig、iwlist、iwpriv）都是调用“无线扩展的”应用程序接口，而那些“新”的iw命令，使用的是netlink/cfg80211的应用程序接口，这个协议在一段时间以后，将希望成为最新的Linux无线标准协议。

由于配置实用程序多种多样，所以对于某个具体的驱动程序，忘记准确的命令是常有的事。用户在记忆这些命令的详细格式而遇到麻烦时，就会被鼓励去使用airmon-ng。这是一款包含在aircrack-ng软件工具包中的一个实用工具，该工具是专门用来处理给定的驱动程序或内核，控制其“监测模式”中的各项详细信息。

对于那些想要手动配置接口的用户来说，或需要一个公共的命令行例子作为快速参考的用户，可以使用下面提供的命令：

·实施一次主动式扫描的命令：

·在指定的网卡接口上使“监测模式”：

·手动设置信道编号：

·手动启用802.11n的40MHz模式：

·其中的“+/-”号表示调到比指定值高于或低于20MHz的相邻信道。

·创建一个“监测模式”的接口（只针对“mac80211驱动框架”）：.

·撤销一个虚拟接口（只针对“mac80211驱动框架”）：

1.在Linux上加载一个解除认证的攻击

下面的示例演示了如何在Linux上通过aireplay-ng程序完成一个简单的解除认证攻击。这里的aireplay-ng是一种包含在Aircrack-ng软件工具包中的一个应用工具。假设“被攻击站点（victim station）的MAC地址是00：23：6C：98：7C：7C，它目前是在信道1上与无线网络关联的，其“基本服务集标识”值是10：FE：ED：40：95：B5。

在下面的例子中，我们通过使用Kismet软件在信道1上检测到一个隐藏的网络，如图3-1。随后，通过Kismet软件的“Kismet|配置信道（Kismet|Config Channel）”菜单，我们已指示Kismet锁定到信道1上，并且准备好了解除这个所检测到的客户端的认证。因为Kismet为我们创建了一个“监测模式”接口，所以我们也可以使用这一相同的接口来实施解除对方认证的攻击操作。

图3-1　通过Kismet检测隐藏网络

命令行的参数有点混乱。参数“--deauth”是指示aireplay-ng执行解除认证的攻击。指定目标地址用的是参数“-c”，指定“基本服务集标识”用的是参数“-a”。

参数“--deautri”显示的是aireplay-ng在攻击的过程中，完成攻击的轮数。每一轮攻击都包含有64个从AP接入点到客户端的解除认证数据包，和64个从客户端到AP接入点的解除认证数据包。

在执行这种攻击期间，我们将发送128个解除认证的数据包，其中64个从AP接入点到客户端的解除认证数据包，和64个从客户端到AP接入点的解除认证数据包 [2] 。最终的结果是：客户端将看到在她的网络连接中有一个停顿，客户端然后重新关联AP接入点。当她这样做的时候，Kismet软件会在她的“探测请求”（probe request）数据包和“关联请求”（association request）数据包中看到“服务集标识”也在其中。比如，网络的名称是“linksys”。在此之后，如果网络使用“Wi-Fi保护访问”，用户将重新关联，我们会看到客户端完成了“四次握手”，又可以继续之前的在线状态。

提示

要想创建一个基于“解除认证的洪水拒绝服务”攻击（deauthenticace flood DoS atcack），只需要简单地将参数参数“--deautri”的数字由1变成0即可。这里的“0”其实表示的是“无限次”，所以这样的改变意味着之后由replay-ng软件所发出的解除认证操作会源源不断地发送，直到黑客主动停止这一操作，所表现出来的，就是这个用户将无法正常上网。作为可选项，如果使用“-c”参数，就意味着客户端的MAC地址指定为广播地址（broadcast address），那么这种解除认证的扫描服务攻击目前将是所有客户端，所表现出来的，就是全网用户都无法正常上网。

2.在OS X上加载一个解除认证攻击

目前，能在OS X操作系统上实现“数据包注入”功能的只有KisMAC软件。KisMAC当前支持注入功能的网卡都是有使用prism2、RT73、RT2570和RTL8187芯片组的网卡。但KisMAC却不支持OS X上使用最多的内置的AirPort机场卡，这也是许多Mac用户购买使用D-link DWL-G122s [3] 或Alfa AWUS036H [4] 网卡的主要原因。目前KisMAC所支持的所有无线网卡的列表，详见http://trac.kismac-ng.org/wiki/HardwareList 。

假设你已有一个支持“数据包注入”的设备，并在KisMAC中加载正确的驱动程序，那么要开始攻击一个无线网络，只需要单击“网络（Network）|解除认证（Deauthenticate）”菜单就可以了。随后，KisMAC就会不断地发送解除认证数据包到广播地址，直到你让它停止这样做。如果你所使用的KisMAC并没有出现解除认证的菜单项，这说明驱动程序不对或配置不对，仔细检查并确认你的驱动程序是支持“数据包注入”的，并且确保在KisMAC的当前这个驱动程序的“偏爱窗口”（preferences window）中“作为主设备使用”（Use As Primary Device）的复选框一定要选中。

3.在Windows上加载一个解除认证攻击

从Windows操作系统中发动一次“解除认证”攻击，最简单的方法是利用Wi-Fi版CommView。该软件可以从http://www.tamos.com/products/commwifi 网站上下载到。Wi-Fi版CommView是一款针对Windows用户的商业化软件。一个无限制的授权版，费用是499美元，还可以买一年的授权版，售价为199美元/每年。

与别的工具相似的是，Wi-Fi版CommView需要一个支持“数据包注入”攻击的无线网卡，目前Wi-Fi版CommView所支持的无线网卡列表详见网站http://www.tamos.com/products/commwifi/adapterlist.php 。使用列表中的一块无线网卡，单击“工具（Tools）|节点重新关联（Node Reassociation）”菜单，一旦出现成功，你会看到一个如图3-2所示类似的屏幕。默认情况下，CommView会向所有被选中的客户端主机直接发送解除认证的数据帧。

图3-2　节点重新关联成功

提示

在发动“解除认证”数据包，对用户实施攻击的方面，Aircrack-ng相比于CommView更具有威力，而CommView又比KisMAC更具具威力。Aircrack-ng发送定向解除认证数据包时，既给AP接入点发送，也给客户端发送。CommView则只会将解除认证数据包发送给客户端，而KisMAC的解除认证数据包的发送方式是只有广播方式。另外还有一个叫密码恶魔“Cain&Abel”的软件其实也有网络无线攻击的能力。但这一功能只支持在商业的机场网卡AirPcap上使用。

对“解除认证”攻击的应对措施

IEEE 802.11w修正案，就是后来被合并到IEEE 802.11-2012标准集中的那个网络协议，其实既包含了对“解除认证攻击”的抵御，也包含了对“解除关联帧”的抵御，识别伪造帧的方式是通过“消息完整性检查”（message integrity check）。但这种抵御方式只有在对方使用了“Wi-Fi保护访问版本2”认证方式的时候才管用，并且对于Windows 8的客户端来说，支持该功能是强制型的要求，这些Windows 8都是基于“网络驱动器接口标准”（Network Driver Interface Standard，NDIS）6.30及以后版本兼容的。

虽然许多Windows 8和8.1客户支持这一功能，但许多AP接入点并不支持这样的功能。而要使这一功能生效，需要双方都支持这一功能。那么如果想支持这一功能，那就需要你先检查你的AP固件生产厂商的升级版本，在确保该版本是支持“管理帧保护”（management frame protection）功能之后，才能抵御“解除认证”攻击和“断开关联”（disassociation）攻击。

在本书写作时，当前的各主流如Android系列、iOS系列、Windows Phone系列、黑莓BlackBerry系列的“移动无线终端”（通俗地讲，就是手机或Pad），以及Mac的OS X操作系统设备（通俗地讲，就是苹果笔记本电脑等）还没有通过管理帧保护技术，对设备进行管理。

破解MAC地址过滤

大多数AP接入点允许你设立一个“信任的MAC地址列表”（trusted MAC addresses），那么当不是该表中的其他MAC地址发送过来的任何数据包都会被忽略。一度以来，我们都认为MAC地址几乎是非常靠谱的东西，一旦烧入硬件芯片中就永不再变。然而那些日子已经一去不复返了，一个新策略的出现，使无线网络上的“MAC地址过滤”（filter MAC addresses）功能马上变的黯然失色，毫无意义。

想要击败MAC过滤，你只需要简单地效用某个已经在网络上的其他MAC地址即可。要做到这一点，首先需要运行一个“被动式扫描器”，借助于扫描器，你可以拿到那些已经连接在AP接入点的客户端MAC地址。然后就有很多种作法了，最绅士的情况是，你静静地等待这个用户不想上网了，从网络上断开后，你再开始“偷梁换柱”；还有的选择是对这个用户加载一个拒绝服务的DoS攻击（例如一个“解除认证”攻击），强制这个用户连续掉线后无心上网，然后“反客为主”；还有折衷的办法，那就是二者共用一个同一个MAC地址，各用各的，虽然各自都会受一些影响，但还算能用，也算“浑水摸鱼”。一旦你选择了要使用的MAC地址，那么克隆这个地址则只需要少数的几个命令而已。

1.在Linux上破解MAC地址过滤

大多数无线网络接口，以及部分有线网络接口都允许你动态修改MAC地址。甚至MAC地址有时仅仅是作为ifconfig命令使用时的一个参数。例如，在Linux操作系统上，设置MAC地址为00：11：22：33：44：55，执行以下操作即可。

2.在Windows上破解MAC地址过滤

要在Windows上修改你无线网卡的MAC地址，你可以手工地运行regedit命令进行修改。运行“regedit”命令，然后定位到节点“HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002bE10318}”。一旦找到这个位置，就可以找到所有无线网卡的列表。其中的“主键”（key）包括了你的网卡描述，所以寻找应该不会太困难。一旦找到了你的网卡，就创建一个新的主键，并命名为“NetworkAddress”，其类型为“REG_SZ”。然后输入你想要的12位MAC地址 [5] 。

注意

最新版本的Windows操作系统要求的第一个字节的第二个数字值必须是2、6、A、E几个数字或字母（不分大小写）其中之一。比如一般MAC地址的形式是“XY-XX-XX-XX-XX-XX”那么其中的X都可以是0~9或A~F中的任何值，但Y则必须是2、6、A、E其中之一。

图3-3展示了在Windows下，新的MAC地址被改成了00：CA：FE：BA：BE：00。

图3-3　Windows系统下修改MAC地址

提示

有些驱动程序公开这一注册表主键值是通过“配置（Configure）|高级（Advanced）|网络适配器接口的地址（Network Address Interface for the adapter）”菜单实现的。

当修改完成后，你需要先禁用，然后马上再重新启用你的网卡，以便新MAC地址生效。不过，更多的情况下需要重启整个主机，这缘于Windows中对注册表的任何修改，需要重启主机才能生效的一个不成文规定。如果你想恢复到你原始的MAC地址，其实也是你网卡本来的MAC地址，只要到注册表相同的位置，删掉NetworkAddress主键，然后按上面的操作重启一下网卡或主机即可。

警告

当你在Windows中，对你的MAC地址进行了修改，一定要通过在“命令提供符”窗口中运行“ipconfig/all”命令来确认你的驱动程序确实已改成了新的MAC地址值。

如果你感觉使用“regedit”命令过于繁琐和令人生畏，你可以通过一些独立的工具来协助你完成。两种常见工具分别是Tmac（Technitium MAC Address Changer，Technitium的MAC地址转换器）和MacMakeup。Tmac的下载网址是：http://www.technitium.com/tmac ，另一个MacMakeup的下载网址是http://www.gorlani.com/portal/projects/macmakeup-for-vista-seven-2008-windows-8 。这些程序提供了一个方便的图形用户界面，但它们似乎除了更改网络地址中“NetworkAddress”这个主键值之外，也没做更多的事。

3.在OS X上破解MAC地址过滤

在OS X操作系统的10.5版，Apple公司允许用户以一种类似于Linux操作系统下的操作方式修改MAC地址。要顺利地修改MAC地址，在修改前，你的网卡必须断开同任何网络的连接，然后可以通过“airport-z”命令完成这一操作。

ifconfig命令运行结束的时候，MAC地址也随之修改并生效。之后，你可以使用正常的机场卡AirPort的图形界面加入到这个网络了。

对破解MAC过滤的应对措施

如果你在AP接入点上使用了“MAC地址过滤”功能，你将无法阻止别人通过上述方法修改他的MAC地址的方式绕过你所设的这种机制。最好的事情是根本不使用这种机制，或者至少不把它当成是一种安全控制。唯一能把“MAC地址过滤”能当成是好处的，就是这个AP接入点上无人使用，因为黑客无法监听到“信任的MAC地址列表”中合法的MAC地址，因而无MAC地址，当然也就谈不上后面的数据包注入。不过，无论如何，都不要使用“有线等效保密协议”认证方式。在黑客眼里，“MAC地址过滤”实际上只是花拳绣腿，货不抵值，即使你同时使用无线入侵检测系统（wireless IDS）和“MAC地址过滤”，对于两个人在同一时间共用同一个MAC地址进行上网的入侵方式，你的入侵检测系统应当能够发现，但对于黑客等到某用户正常下线后，借助他的名义再上线的入侵者，那么入侵检测系统也是无能为力。

[1] 生活中，我们更多地称为“无线路由器”。将AP接入点理解为我们家庭或单位用的无线路由器将十分有助于很多术语的解释。——译者注

[2] 其实这种说法不严谨，确切地说是：攻击者假借AP接入点的名词，从自己的位置向客户端发送64个“AP接入点主动提出的”解除认证的数据包，同样再假借客户端的名词，向AP接入点发送64个“客户端主动提出的”解除认证的数据包。所有的128个数据包都是由攻击者发出的。——译者注

[3] 该设备使用RT73芯片。——译者注

[4] 该设备使用RTL8187芯片。——译者注

[5] 这里有几个方面要说明：1）新主键名称NetworkAddress属于关键字，必须完全一致；2）REG_SZ类型表示一种变长纯文本的字符串格式，SZ表示String Zero，指的是该字符串最终以一个’\0’表示结束；3）MAC地址是16进制的表示形式，这也是强制的；4）对注册表的修改，一般需要重启主机才能生效。——译者注

3.3　击败的WEP认证

作为一种安全控制的认证方式，“有线等效保密协议”是一个很好的学习机会，它会教会我们在一套加密系统中，什么东西不能做。不过，我们经常可以看到在一些“SOHO场所”（即“小型办公室”或“家庭作坊”，small office/home office）中，基于“有线等效保密协议”的认证还在使用中，所以说，虽然“有线等效保密协议”认证方式已经过时，但是如果这本书没有涵盖基于“有线等效保密协议”的攻击，那书的内容就是不全面的。但是本书也不会投入大量的页面进行介绍“有线等效保密协议”攻击，而是将这些页面让给那些更新、更令人兴奋的无线攻击方式。鉴于此，我们决定只提供少量的基于“有线等效保密协议”攻击的页面介绍，并且主要介绍理解这一技术你所需要知道的那一部分，然后通过实践来使用其中的弱点。

“有线等效保密协议”密钥有两种长度：40位（5字节）和104位（13字节）。最初，供应商只支持40位密钥。其实，原本供应商提供的密钥长度分别是64位和128位，之所以“缩水”减到这个长度，是因为在这64位和128位中，有24位来表示“初始向量”（Initialization Vector，IV），代表“共享密钥”（shared key）。这24位的“初始向量”在传达的时候是以明文方式发送的，这个形同虚设的值，对于正常用户和黑客，都可以轻易地获得，因此说密钥位的“实际有效长度”是40或104位。

3.3.1　WEP密钥还原攻击

对于一个黑客来说，有很多机会可以监听网络，并还原出网络加密的密钥。而一旦黑客拿到还原出来的“有线等效保密协议”密钥，他就可以随意访问这个网络了。他可以看到每个人收发的数据，他也可以向任何一个客户端或AP接入点注入他自己的数据包。有许多独特的方式可以实施“有线等效保密协议”密钥还原，具体流程详见图3-4。该图中都是每种还原“有线等效保密协议”密钥方法的最简路径。

图3-4　“有线等效保密协议”攻击流程图

基于FiOS上的SSID WEP密钥还原

正如在图3-4的流程图中所看到的，破解“有线等效保密协议”密钥最简单的方法是与FiOS路由器合作，一起攻击。FiOS [1] 是Verizon公司“光纤到户”（fiber-to-the-home）的互联网服务。尽管最近的FiOS路由器，在部署上市的时候，都默认使用了“Wi-Fi保护访问”认证，但很多老的设备都是使用很容易受到攻击的“有线等效保密协议”认证。“有线等效保密协议”认证下密钥算法将在后面介绍。

如果你碰巧生活在Verizon公司提供的FiOS服务区域，你可能已经看过很多带有下列字样的AP接入点的名称。遵循这种模式：C7WAO、3RA18，或BJ220（注意：全都由五个字母或数字组成，并且字母都是大写 [2] ）。正如你可能已猜到的那样，这些AP接入点的“服务集标识”，都是路由器通过一个很简单的函数功能调用生成的，这些值也都是从“基本服务集标识”（就是网卡的MAC地址）衍生出来的。到目前为止，这还不算是问题，真正的问题在于它的“有线等效保密协议”认证所使用的“默认密钥”（default WEP key）也是由一个函数调用完成的，也就是说“默认密钥”也是从“基本服务集标识”上衍生出来的。因此，如果你有AP接入点的“服务集标识”SSID（这个值AP接入点会定时广播）和“基本服务集标识”（这个值AP接入点也会定时广播），那么你就相当于有了“计算”“有线等效保密协议”密钥的所有条件了。并且这里的计算即不需要使用暴力破解方式（brute-force），也没有密码（crypto）的参与！

第一个记录这种破解方式的是Kyle Anderson，他只用一个基于Linux系统的简单的在线Bash脚本（script）就能生成“有线等效保密协议”密钥。该网址为http://wiki.xkyle.com/Fioscalc.html 。

Bash脚本已经将密钥缩小到了两个可能的值。现在所要做的就是验证两者哪一个是正确的，排查的方法只是两个都试一下就行了。还记得吗？前面提到FiOS中的“服务集标识”值都是由五个数字或大写的字母组成，如“2C6W1”或“3A65B”。

提示

上面由JavaScript脚本语言实现的这种攻击方式，其在线程序可以从http://fwc.dylanmtaylor.com 上找到。

对FiOS WEP还原技术的防御措施

如果你安装了FiOS服务，并且没有重新配置你的无线网络，那么你可能很容易受到黑客的这种攻击。要避免这种情况发生，首先登录到“FiOS服务的Wi-Fi路由器”（即我们前面经常提到的“AP接入点”，更通俗一点，如你家里的无线路由器）的管理界面，将认证方式由原来的“有线等效保密协议”模式切换到“Wi-Fi保护访问”模式，然后选择一个强口令。需要注意的是，这样修改之后，FiOS服务的Wi-Fi路由器会因为WPA/WPA2加密算法产生的额外开销而使整个网络的性能有所降低。

针对WEP的两种密钥破解（FMS方式和PTW方式）

前面“默认密钥”是基于“基本服务集标识”生成的，所以这么草率的处理，是算法失败的一个重要原因。如果说针对这种“有线等效保密协议”认证的攻击是基于一个错误的密钥生成机制的前提下，那么本节所介绍的攻击方式，则是即使所使用的“有线等效保密协议”密钥是完全随机的情况下仍然可以实现的攻击方式。这种攻击方式是基于长时间的加密研究而获得的，并且这种密码学研究的起始时间可以追溯到2001年。

2001年，Fluhrer、Mantin和Shamir（首字母合称为“FMS”）发表了一篇论文，文中描述了在RC4（Ron加密算法代码的第4版）的“密钥调度算法”（Key Scheduling Algorithm，KSA）中有一个漏洞（vulnerability）。“有线等效保密协议”认证中所使用的RC4算法是一种“流密码”（stream cipher）算法。事实证明，正是因为“有线等效保密协议”认证采用RC4作为其加密算法，最终让使用“有线等效保密协议”认证机制的服务器变成了针对这一漏洞的完美攻击目标。

导致这一问题的关键在于，“有线等效保密协议”认证是如何在每个数据包使用“初始向量IV”的。在“有线等效保密协议”认证时，会使用RC4算法加密一个数据包，它在给RC4发送密钥之前，会先将“初始向量IV”转化成了加密的值，而这个加密的值又会填在数据包中。这意味着入侵者在每个数据包中，都可以获得一个据说“保密”的密钥的前三字节。一些等待之后，在基于RC4的输入上又有了一个好的机会，这个机会可比直接猜完全随机的剩下40位密钥的胜算要大得多。这一步完成后，剩下的仅仅是收集足够的数据，以便让密钥自己浮现出来。

2005年，Andreas Klei提出关于RC4的另一个问题。Darmstadt大学的研究者Pyshkin、Tews和Weinmann（首字母合称为“PTW”），将这项研究应用到针对“有线等效保密协议”认证的攻击上，并设计了攻击软件，名字叫aircrack-ptw。并且不久之后，该程序的增强版就被合并到aircrack-ng攻击工具包中，并且很快成为其默认的配置。

“PTW攻击方式”解决了“FMS攻击方式”中的主要缺点。首先，“PTW攻击方式”在还原密钥的时候，并不需要考虑任何弱的“初始向量IV”作为前提，而是只需要先拿到几个值得关注的数据包，然后就可以对其密钥进行还原。所以当运行“PTW攻击方式”还原密钥的时候，整个工作量与CPU关系不大。而在“FMS攻击方式”中，需要尽可能多地收集弱的“初始向量IV”，然后自始至终，一直通过暴力破解（brute-force），以便更早地得到密钥。通过对比，不难发现，“PTW攻击方式”只需要几秒钟的CPU运行时间，就可以还原出“有线等效保密协议”的密钥，在这种情况下，再去考虑如何节省时间，节省CPU的计算能力，本身就意义不大了，而“FMS攻击方式”的破解时间只很大程度上取决于CPU的运算能力。

有客户参与下用aircrack-ng破解WEP

虽然aircrack-ng可以用在Linux、OS X和Windows这三种操作系统上，但最合适的系统平台是Linux平台。因为对于“数据包注入”的操作，在Linux上要比任何其他操作系统上容易得多。同时，“数据包注入”技术又是无线网络入侵中最重要的技术之一，方便地实施这种攻击，可以大大加快对整个无线网络的攻击速度。

下面的例子带你参观一个入侵“有线等效保密协议”WEP无线网络的完整的步骤，不过，整个入侵过程中，有一个重要的特征，那就是这种入侵方式中至少有一个无线网络的某个“被占领客户端” [3] （victim client）已连在了这个无线网络上。在这个例子中，我们假设有一个名为linksys的网络，运行在信道1上，其“基本服务集标识”为10：FE：ED：40：95：B5。首先，设置无线网络适配器，使其进入“监测模式”：

接下来，我们开始运行airodump-ng程序，并设定我们感兴趣的信道和“基本服务集标识”：

这时，airodump-ng也将所有捕获到的数据包写入到文件Linksyschl-01.pcap中。

在上面的操作实例中，我们已经看到当前有一个客户端在线，它的MAC地址是02：BA：DC：OD：ED：01。我们将使用该MAC地址，并“从” [4] 这个客户端发送“重新注入”（reinject）的ARP地址解析数据包。这样做的目的是创造更多的数据包，这样我们就可以更快地破解密钥：

在上面的操作实例中，aireplay-ng成功地将ARP地址解析协议数据包以注入的方式发送到了网络中。由于数据包是以当前这个客户端的名义发送的，所以这个客户端很快就会收到AP接入点和其他客户端回复给它的数据包。aireplay-ng发送的动作是不停地连发（还记得一轮向各设备分别64个数据包吧），因此，网络中各相关的设备为各自的发送和回复而开始发送数据包。回过头来，看看airodump-ng，我们会发现大量的数据包正在快速地暴涨。

看到捕获的数据包个数正在稳定增长，这时，就可以运行aircrack-ng程序了。

最初，我们高兴地看到，在一个屏幕上显示的是分配到每一个密钥字节的权重（weight），以及“初始向量IV”的个数等值。如果aircrack-ng不能推导出最初的密钥，它会等待更多的数据写入到文件中，然后再试一次。一个成功的破解结果如图3-5显示的效果 [5] 。

图3-5　成功的破解结果

1.无客户参与下用aircrack-ng破解WEP

前面的例子是一个非常简单的事例。该事例的重要特点，同时也是不足的地方，就是这种攻击方式需要有一个或多个客户端连接到要攻击的网络上。该破解方式依赖有一个“被占领主机”最终发出一个ARP地址解析数据包，然后，我们可以在随后重复地产生数据包收发过程，并最终破解密钥。下面的例子将带你参观的是一个更复杂的事例，即在没有客户端连接到网络的前提下进行入侵攻击。整个完整过程如图3-6所示。

第1步：启动airodump-ng 　在这个例子中，作为攻击目标的无线网络上，信道是11，“服务集标识”是“quiet_type”，目前无用户连接到网络上。首先，运行airodump-ng，以便开始捕获网络上的活动，以备随后的入侵。

第2步：假认证AP接入点　下一步，使用aireplay-ng伪造一个和AP接入点之间的关联。这就像是一个常规的客户端会去做的连接一样，你只需要使用aireplay-ng在不知道“有线等效保密协议”密钥的前提下，去和AP接入点建立连接关系。

图3-6　破解一个寂静无人的网络

使用无线网卡的MAC地址作为源地址，并通过aireplay-ng命令的“-h”参数使用这个地址。

第一个参数告诉aireplay-ng执行假的认证，并且认证的时候，命令要带上1秒的延迟。“-o 1”参数是告诉aireplay-ng一次只发一组数据包，在实施攻击的时候，这样做可以减少对AP接入点的冲击。再后面的“-e”参数是设置“服务集标识”SSID，“-b”参数设置“基本服务集标识”BSSID，“-h”参数设置源MAC（这应该是当前分配给你的无线接口的MAC地址）。

如果一切顺利，你应该得到类似以下的信息：

如果你看到一个消息：“得到了一个解除认证的数据包！”，那么假关联已经失败。最可能的原因是AP接入点实现“MAC地址过滤”（MAC address filter）。这时，你只能等，等待一个正常用户上线，借助于他的MAC地址，静等他下线，或是发起攻击将他“踢”下网，或者与他一起用同一个MAC地址共用网络。总之，拿到他的MAC地址后，你就可以修改自己的MAC地址为该MAC地址，然后再连上网络，继续后面的攻击。

再回到airomon-ng上，你会看到你的假客户端名单也名列客户端名单中。下一步尝试一下“碎片攻击”方式（fragmentation attack）。

提示

如果完成后面的“碎片攻击”（和随后的ChopChop攻击），可以留下这个假认证（fake-auth）的程序运行在后台上。这样一来，如果高级攻击中的某一个导致了AP接入点解除与我们的认证，我们将在1秒延迟以后自动重新认证（re-authenticate）。

第3步：启动碎片攻击　“碎片攻击”是一种先进的“有线等效保密协议”破解技术，该技术可以用于使用AP接入点作为一个解密工具，一次解密一个单一的数据包。除非这次指定的就是“碎片攻击”方式，否则只要用之前aireplay-ng中“假认证攻击”（fake-auth attack）进行攻击就可以了。

如果你看到这段关于保存密钥流（keystream）的信息，这说明现在程序正在执行一个数据包中，明文（plaintext）和密文（ciphertext）的“异或”（xor）操作。如果“碎片攻击”进入工作状态，你可以直接跳转到第5步。如果“碎片攻击”无法进入工作状态，那么可以试试ChopChop攻击。

第4步：启动ChopChop攻击　除了“碎片攻击”之外的，另一种常用的攻击方式就是“ChopChop攻击”。“ChopChop攻击”需要比“碎片攻击”花更长的一点时间（最多几分钟）才能完成。详情请参见在本节后面讨论，至于现在，你可以运行如下所示代码。

提示

如果要实施攻击，你可以尽可能只使用尺寸较小的数据包，以便加快“ChopChop攻击”的攻击速度。如果要实施“数据包注入”，则可以使用较大的包，大于68字节的数据包都应该能够满足以后在一次“ARP注入攻击”（ARP injecton attack）中使用。

提示

数据包越大，“ChopChop攻击”所用的时间就越长。如果实施攻击的数据包大于300字节，你可能就会考虑扔掉这个软件，等待有能发小数据包的合适攻击软件了。

这种攻击将需要几分钟。如果你觉得在攻击的中途接收到了解除认证的信息，那就先确认一下在最初很早运行的“假认证”攻击是否仍在运行。

一旦攻击完成，你会在“.cap”文件中得到解密数据包的一份拷贝，在“.xor”文件中得到密钥流的一份拷贝。一个比较好的主意，是理智地查找攻击程序所留下的输出内容。这主要是在上面保存的“.cap”文件中。这里，会包含有某种“有效的IP地址”的数据包。例如，刚解密的数据包，经过解码，发现是“简单服务发现协议（Simple Service Discovery Protocol，SSDP）” [6] 的数据包，该数据包位于一个192.168.O.X的子网中：

任何时候，数据包的应用层（application layer）信息能够被解出来，这都是一个好的迹象。毕竟，看到应用层的数据，意味着所有与应用层以下各层（对于TCP/IP协议来说物理层、网络层、传输层）上的问题已解决。

第5步：手工制作ARP数据包　成功地进行了“碎片攻击”或“ChopChop攻击”之后，你现在可以通过注入你自己的数据包，实现“还原的密钥流”（recovered keystream）。但应该注入什么样的数据包呢？你需要的是AP接入点直接向广播地址发送的内容。从这样的一个加密的数据包中，通过使用“ChopChop攻击”进行解密，你就可以知道AP接入点所管理的网络位于192.168.0.x子网中。跳过802.11的头部和加密的部分，如果随后的ARP“who-has”请求数据包 [7] 在网络上被生成，那么这个AP接入点将会向所有的客户端重新广播一遍。并且在随后的处理中，使用新的“初始向量IV”。

请注意，我们实际上并没有手工制作那些AP接入点已经回复了的ARP包（比如对于无线路由器常用的“192.168.0.1”IP地址）。我们只需要那些AP接入点将要重新发送的ARP数据包，才需要手工制作。测试表明，针对AP接主点的手工制作的数据包，更像是告诉AP接入点“解除对我的认证吧”这样的自杀行为，所以我们还是别冒那个险了。

在aircrack-ng套件中，有一个叫packetforge-ng的工具，这个工具就是用于手工制作数据包。首先，运行packetforge-ng，并带上“--arp”参数，这是告诉程序你想手工制作的数据包类型。下一点，你需要指定网络TCP/IP协议的第二层，也就是数据链路层的参数（“基本服务集标识”、目的MAC地址、源MAC地址），这个命令是同前面一样，格式是“-a BSSID”参数和“-h发送源MAC地址”参数。接下来，通过“-k”参数指定目的IP地址，和通过“-l”（这是一个“L”的小写字母，而不是数字“1”）参数指定源IP地址，这两个参数共同创建ARP的数据包。最后，使用参数“y”，将前面由“ChopChop攻击”所生成的“密钥流”加密一个新的数据包。这个命令如下所示。

提示

如果你创意十足，你可以通过packetforge-ng软件生成其他协议的数据包，并使其在网上发来收去。一个广播方式下的“Internet控制报文协议回送请求”（ICMP echo request）数据包在生成后，可以产生积极的结果 [8] 。

做完这些事，你应该有了一个手工制作的ARP数据包，该数据包使用针对该网络作了正确的加密，你可以请其“注入”到网络中，然后观察在airodump-ng中所捕获的数据包总数是不是增加了。

第6步：注入手工制作的ARP数据包　随着繁杂的内容被一一处理掉，看看按照前面的方式手工制作的加密ARP请求数据包，终于到了使用这些数据包的时候了。一个简单的命令行如下所示：

运行aireplay-ng后，你应该切换到终端上再运行airodump-ng。如果你没有看到“＃Data”的计数在增加，就说明某个环节发生了错误。最有可能的是命令中的几个MAC地址，你在键入时存在输入错误，或者你需要重新运行aireplay-ng上的“假认证攻击”（fake-auth attack）。如果你看到“＃Data”计数的增加，那就继续向前，开始运行aircrack-ng来分析处理由airodump-ng生成的“.pcap”文件。

第7步：启动aircrack-ng 　运行aircrack-ng，先让程序运行几分钟，以便捕获到足够的网络通信的数据包。然后运行aircrack-ng以便对所捕获的文件进行分析处理。由于生成的数据包文件太大，所以下面我们在命令行中，通过使用通配符（wildcard）在当前目录下，从所有airodump-ng所捕获数据包文件中，查找那些文件名中，带有前缀“quiet_type”类型的文件（这是本次入侵时，作为攻击目标的无线网络的假设网络名）。

最终aircrack-ng命令将成功返回密钥，或者因为所捕获的数据包还不足以还原密钥，那么程序会继续等待更多的捕获数据包，然后再次尝试还原操作。你可以将它放在那里运行，直到拿到还原后的密钥，然后再回到另一个终端上，停止aireplay-ng命令的运行。

2.在OS X上攻击WEP

要想在OS X操作系统上破解“有线等效保密协议”认证系统，你要有协同使用KisMAC和aircrack-ng这两个软件的能力。KisMAC可以通过重新注入数据包（reinject packet）来产生数据通信，但是，相比于aircrack-ng，它又缺乏后者所具有的先进加密功能，比如可以实现“PTW攻击”。反过来，aircrack-ng没有KisMAC的这项功能。这意味着你需要配置KisMAC，以便让KisMAC捕获所有通信数据包，并将其保存到到一个“.pcap”文件中，实现这一功能，需要使用KisMAC的“KisMAC（Kismac）|偏爱（Preferences）|驱动程序（Driver）|保存所有数据（Keep Everything）”菜单。完成这一操作后，将生成的pcap传送到aircrack-ng中实施“PTW攻击”的破解。在下面的例子中，我们将所有的数据包保存到“Dumplogs/cumpcap”文件中。

在OS X上运行aircrack-ng程序，最简单的办法就是使用“Brew程序包管理系统”（Brew package management system）。对于这套系统的安装和配置手册，可以从http://brew.sh网站上找到。假设你已安装了Brew系统，那么安装aircrack-ng就是轻而易举的事了。

一旦你已经安装好aircrack-ng，就可以在Kismet中开始扫描。当扫描到一个可以作为攻击目的的网络后，选择“网络（Necwork）|重新注入数据包（Re-inject Packets）”菜单启动KissMAC中重新注入（re-inject）ARP数据包的功能。一旦KisMAC看到一个可以用于重新播放（replay）的ARP数据包，你应该就会看到如图3-7所示的类似界面。

图3-7　重新注入数据包

这时，我们可以关注数据包的计数值。如果注入操作正在进行，你应该能够看到数字在迅速攀升。那么，你就可以从命令行中止aircrack-ng的命令：

3.在Windows上通过PTW攻击WEP

当前流行的Windows破解工具“Cain&Abel”最近增加了对“PTW攻击”的支持，也增加了“ARP重播攻击”的数据包能力。该功能的提供，需要使用带有“数据包注入”功能的AirPcap设备。这个设备可以让你在不使用命令行工具的前提下，能像aircrack-ng软件一样快速地破解“有线等效保密协议”认证方式。唯一的缺点是你必须使用专业版的AirPcap网卡适配器，详见http://www.airpcap.nl/airpcap.htm 。并且目前没有实现先进的“ChopChop攻击”和“碎片攻击”这两种攻击方式。

假设你已经安装AirPcap网卡适配器，并且正在使用中，运行“Cain&Abel”软件，单击“无线”（Wireless）选项卡。随后从下拉列表中选择你的AirPcap网卡适配器的名称，然后单击“以被动方式扫描”（Passive Scan）按钮。一旦你所感兴趣的网络出现在列表中，单击“停止”按钮，然后锁定在相应的信道。确认ARP请求数据包注入选项显示在底部列表中，然后再次单击“被动扫描”按钮。这种配置的一个例子如图3-8所示。

图3-8　配置示例

主要关注数据包的计数值，正常情况下，如果“ARP重播攻击”正在工作，那么该计数器应该一直处于增加状态。如果你遇到了麻烦，你可以用鼠标右击客户端，然后解除认证。这将导致客户端重新关联，并希望发出一个ARP请求。一旦数据包的数量增至40000左右，单击“分析”（Analyze）按钮。选择你有兴趣的“基本服务集标识”BSSID，然后单击“PTW攻击”按钮。如果一切顺利，你应该看到一个“发现有线等效保密协议密钥！”（WEP Key Found！）的消息，如图3-9所示。

图3-9　发现有线等效保密协议密钥

虽然“有线等效保密协议”是目前无线网络中最容易攻破的一种协议，但要成功地攻破一个基于“有线等效保密协议”认证的无线网络，却要多个步骤才能成功，失败的原因千奇百怪，有因工具破解失败而受挫，有因工具的配置和使用时的输入手误。作为一种替代手动攻击的方法，有一款集上述各攻击技术为一侧面的“傻瓜式”简单界面的集成工具。

[1] FiOS，Fiber Optic Service（光纤服务）是Verizon公司提供的采用光纤电缆传输数据的数据通信服务。由于它可以实现直接将光纤连接到用户家里，所以又称为“光纤到户”（FTTH，Fiber To The Home）。——译者注

[2] 要注意到更重要的一点，这五个字节正好就是40位，和密钥的长度是一致的。——译者注

[3] 所谓“被占领”理论上来说，应该是之前已被入侵，黑客可以在上面任意操作，但本例中，指的只是一个旁观者，但在入侵行动中，并不需要黑客事先入侵，只是为了统一方便，所以也称之为“被占领主机”。——译者注

[4] 注意这里的“从”只是表示数据包是由入侵者自己的电脑发出的，但要以客户端的名义发送，后面的“重新注入”是因为之前的这个客户端在入网的时候就发送过ARP数据包，只是之前的数据包不是以“注入”的方式发送的。——译者注

[5] 根据图中显示的结果不难看出，破解的结果是成功的（图下方正中的“KEY FOUND!”表示“密钥找到了！”），破解的密钥是104位（图中“KEY FOUND!”后面13个字节，每个字节是8位）。——译者注

[6] 一个应用层的协议，即用于在“网络上查找指定类设备”和“设备通知网络自己的存在”而设计的一套协议。其实客观地讲，本书第2章的所有内容，也都是SSDP协议的“网络上查找指定类设备”的意思。——译者注

[7] ARP（Address Resolution Protocol）本来就是根据IP地址获取MAC地址的一个TCP/IP协议。其中的“who-has”就是其标准的请求数据包类型之一，通常都是以广播的方式发送，其意义很像生活中，有人在人群中大喊“谁是某IP的主机，请把你的MAC地址告诉我”。——译者注

[8] 对ICMP（Internet Control Message Protocol，Internet控制报文协议）的介绍会引出大量复杂的术语，通俗地讲，你ping别人的时候，就会向对方发送一个“回送请求”数据包，相当于“请你回答我你的情况”。由于这是主动请求式，所以属于“主动式扫描”中的一种，所以这里“积极的结果”有两层含义，一层是方式是“主动式”的，二层是结果比较理想。——译者注

3.4　集众长于一身的Wifite

现在，你已经明白了破解“有线等效保密协议”无线网络背后的每一个过程，就到了学习Wifite的时候了。Wifite是一个对经常出错的命令行提供帮助的一个工具，一个可以使以前这些操作变成自动化的工具。

3.4.1　在“Wi-Fi小菠萝”上安装Wifite

Wifite软件的最大优点之一，就是它事先预配置一个目标清单，然后让Wifite在无人值守的情况下，自动按清单中的每一条操控着aircrack-ng的进程。随后，你就可以高枕无忧，因为Wifite会根据列表中每一项完成破解工作，如果Wifite完成了对目标清单中，列表的第一项破解完，就会自动地切换到目标清单中的下一条。这一自动运行的特性对于一些嵌入式设备来说非常有用。这个Wi-Fi嵌入式设备名叫“Wi-Fi小菠萝”（Wi-Fi Pineapple），该设备的实物图片如图3-10所示。

图3-10　Wi-Fi小菠萝

“Wi-Fi小菠萝”是一台专用的无线攻击工具，这个设备由Hak5组织开发，价格大约是100美元。在http://www.hakshop.com 网站上可以找到详细介绍。每一台设备配备有两个Wi-Fi的无线网卡，一个400MHz的MIPS处理器，一个SD插槽（可以通过插入SD卡达到扩大存储的功能），一个快速以太网卡和一个USB端口。“Wi-Fi小菠萝”是一款集中了很多Wi-Fi攻击技术于一身的小型便携式攻击器。

购买到一款新的“Wi-Fi小菠萝”之后，首先要做的事是让你的“Wi-Fi小菠萝”启动并连接到互联网上，下载一些数据包。如果在将设备连接到互联网方面遇到什么疑问，可以查询“Wi-Fi小菠萝”的用户手册。

下载数据包

一旦配置好了“Wi-Fi小菠萝”，使之可以访问到你的笔记本电脑，并且也可以访问到互联网，则可以使用SSH工具以root管理用户的身份登录系统。登录时，如果需要密码，则使用在初始化安装时配置的密码。假设设备默认的IP地址是172.16.42.1，在进入系统以后，就可以运行下面的命令来下载和安装Wifite正常使用所需要的工具软件。

注意

如果你有一个Ext4格式 [1] （Ext4-formatted）的USB接口连接到你的“Wi-Fi小菠萝”上，那么在运行opkg程序安装所下载的软件包时，需要使用“-d usb”参数，以便让程序使用使用的是USB设备，而不是SD卡。

想必大家在购买“Wi-Fi小菠萝”的时候，就心知肚明地了解这是一个黑客工具，这也是各种技术防范的重点地带，因此“Wi-Fi小菠萝”所提供的http下载方式，也不敢担保说所下载的东西都是“开箱即用”的（out of the box）。所以你的“Wi-Fi小菠萝”需要经常下载最新版的Wifite程序，网址是https://github.com/derv82/wifite ，hak5组织也会在这里不时更新其版本。将新程序包下载到的笔记本电脑后，然后使用“安全外壳shell复制”（Secure Shell copy）方式将Wifite.py脚本复制到“Wi-Fi小菠萝”中，如下面的命令格式所示。如果你使用的不是Linux操作系统的主机，而是Windows操作系统的主机，那么你可以先从http://www.chiark.greenend.uk/~sgtatham/putty 上下载并安装一款名叫Simon Tatham’s PuTTY工具，然后借助于其中的pscp功能将文件复制到“Wi-Fi小菠萝”上。

运行Wifite

一旦上面的工具全都完成，你就可以在“Wi-Fi小菠萝”上运行Wifite了，其格式和运行效果如下所示：

现在，将网线插入到“Wi-Fi小菠萝”以太网端口上 [2] ，网线的另一头连上自己的笔记本计算机，很快，你就会看到自己的笔记本电脑上出现wlan0和wlanl两个Wifite无线网络的适配器标识，两个都可以使用。如果你嫌以太网的网速太慢，而是通过无线连接使用“Wi-Fi小菠萝”，那么一定要注意，确保不要选择正在使用的这个无线接口。

在这一点上，Wifite已经自动把无线网卡设置为“监测模式”，以便在被动方式下进行侦测，随后，根据信号强度，按顺序排列在当时位置中的各无线AP接入点的“服务集标识”名称（图3-11中“ESSID [3] ”列）。和平时我们用手机连接周边的Wi-Fi无线路由器略有不同的是，Wifite在列出各AP接入点名称的同时，在“加密算法”（图3-11中简写为“ENCR”，即encryption）一列，也让我们知道每一个AP接入点正在使用的是“Wi-Fi保护访问版本2”WPA2认证、“Wi-Fi保护访问”WPA认证或“有线等效保密协议”WEP认证的加密算法，还有，如果这个网络支持“Wi-Fi保护配置协议”（Wi-Fi Protected Setup），那么在“是否支持WPS”（图3-11中“WPS？”）一列，还会显示“支持WPS”（即“wps”），否则显示“无”（即“no”）。如果任何客户端连接到那个AP接入点，在“有客户端连接”（图中“CLIENT”）一列也会给出提示。

图3-11　按信号强度排序

尽管大家习惯选择所有的无线网络，让Wifite通过各自的方式尝试破解所有的这些“邻居”网络，不过，作为例子，下面我们还是只选那个之前曾手动破解过的quiet_type无线网络：

注意，下面我们运行Wifite时所使用的脚本，还是本章以前我们手工完成这些操作的时候所用的脚本。首先，这些脚本会生成“假的”认证数据包，然后试着重播任意的ARP地址解析协议数据包，这些ARP数据包的地址都是通过无线网络中读到的。程序界面左边的一个“时钟”显示的是破解这个网络所用的时间，该“时钟”会随着破解的进行而增大，直到程序或你放弃目前的攻击，或者是程序破解成功，程序都就会移动到下一个无线网络上，重新开始新网络的破解。默认情况下，Wifite每攻击一个无线网络，其时间上限都会设定为10分钟，10分钟到的时候，如果还没有破解成功，则程序放弃当前的攻击。在攻击期间，如果你没有耐心再等待下去，比如知道没人会连接到quiet_type网络，并产生一个ARP包了，你可以按Ctrl+C，就会人工放弃当前的攻击，程序自动移动到下一个无线网络上继续在新的10分钟之内进行攻击。

如图3-11所示，一旦你按了Ctrl+C，程序暂停，然后询问你是按“c”（continue）继续随后的攻击呢，还是按“e”（exit）放弃当前的攻击？如果我们选择了“e”，那么Wifite程序要么就会移动到下一个目标无线网络上，进行攻击。当然如果列表中没有无线网络了，那就程序退出运行了。

Wifite目前正在执行的，是一个类似于我们在本章的前面完成过的“ChopChop攻击”：

我们可以观察处于运行状态的进程（processe）中Wifite正在做什么。不幸的是，这款“Wi-Fi小菠萝”中的“ps”程序（该命令也是Linux下查看进程的主要命令──译者注）只能显示进行状态信息中的前78个字符。

当Wifite处于攻击的过程中时，它会打印“正在等待数据包”（waiting for packet）提示信息到用户的屏幕上。这样的提示信息有些轻微误导，因为此时的Wifite实际上等待的是通过“ChopChop攻击”解密一个数据包，而不是“等着”这样的一个数据包，然后在这个数据包出现的时候捕获到它。假设“ChopChop攻击”是成功的，那么Wifite会显示出下面新的提示信息。

注意，其中的“初始向量数/秒”（iv/sec）的速率显著高于之前的速度。这意味着某些攻击正在进行中，由攻击而导致的大量数据包也在网络间飞来跑去。几分钟之后，当然也可能是10分钟之后，我们有了足够的数据包，可以用来成功地破解密码了。一旦破解成功，我们就会收到一个成功的信息提示，如图3-12所示。

图3-12　破解成功

通过使用Wifite工具，可以极大地加快和简化攻击的过程。对于一个使用“有线等效保密协议”无线网络的对手，使用Wifite也可以降低攻击者的负担，减少攻击“有线等效保密协议”网络所需的专业技能和背景知识量。此外，除了支持对“有线等效保密协议”认证网络的破解，Wifite也支持攻击其他无线网络的技术，这部分内容，将在下一章中详细介绍。

对“针对WEP攻击”的防御措施

防范黑客对“有线等效保密协议”认证方式的攻击，最简单的办法就是弃用“有线等效保密协议”认证方式，进而改成“Wi-Fi保护访问版本2”认证方式。可说起来简单，做起来难。许多无线网络继续使用“有线等效保密协议”认证的原因是要兼容那些传统的老掉牙设备，或者是很多无线网络的使用者，根本也意识不到“有线等效保密协议”存在的不安全因素，而是一厢情愿地相信无线网络本来就是安全的。

[1] EXT4（Fourth extended filesystem，第4代扩展文件系统）是Linux系统下的日志文件系统，是Ext3文件系统的后继版本。非常适合超大容量和超大格式文件的存取。——译者注

[2] 对于笔记本电脑来上，要使用这款“Wi-Fi小菠萝”，有三种连接方式：第一种是通过USB连线连接设备；第二种是通过有线方式的以太网连线连到设备；第三种就是通过无线方式连接到设备。其中的有线方式，这款“Wi-Fi小菠萝”设备所提供的是10M/100M的慢速连接（当然这里指的相于对千M的快速以太网来说的）。——译者注

[3] ESSID是SSID的另一种称呼。——译者注

3.5　本章小结

本章涵盖了多个各式各样的专门针对“由“有线等效保密协议”WEP保护的无线网络”的攻击方式。这些部署在“小型办公室”或“家庭作坊”的SOHO网络上有一些共同的基本特征，就是使用“有线等效保密协议”认证方式，隐藏了“服务集标识”，设置了“允许通过的MAC地址列表”。这些技术永远不会被应用于对安全级别要求很高的敏感的网络中，但在一些大型企业的零售仓库中，这类产品或产品参数设置的部署却仍然是司空见惯的现象。使用便捷的工具，无论是Microsoft的Windows操作系统，Mac上的OS X操作系统，还是应用广泛的Linux操作系统，一个黑客可以针对这些系统的弱点进行多数方式的攻击。这既包括对无线网络中数据包的捕获，也包括获得对网络的非认证访问（unauthorized access）。

要防御黑客对“有线等效保密协议”认证方式的攻击，建议的缓解策略是，在部署的时候避免使用“有线等效保密协议”认证，而全部改换为“Wi-Fi保护访问版本2”认证。不过，这并不意味着“Wi-Fi保护访问版本2”认证对于无线网络的安全就是一劳永逸的，因为在下一章，你会看到“Wi-Fi保护访问版本2”认证中也存在一些不足。

第4章　攻击WPA保护下的802.11网络

相比于“有线等效保密协议”（WEP）认证，“Wi-Fi保护访问版本1”（WPA）认证和“Wi-Fi保护访问版本2”（WPA2）认证（在这里统称为“WPA认证”）极大地提高了无线网络的安全性，然而，额外的保护带来的代价是协议复杂性被抬高。在本书的第1章中，对“Wi-Fi保护访问”已经做了一段简要的介绍，如果读者对“Wi-Fi保护访问”认证的基础知识不太熟悉，那么可以回读一下，以便了解“Wi-Fi保护访问”的背景资料，本章的重点则主要集中于针对“Wi-Fi保护访问”认证中，当前已知的攻击方式方面的介绍。

尽管“Wi-Fi保护访问”认证在部署方面就是为了安全因素而考虑的，然而它也有自身的缺陷，并可为我们所用。在较高的层次，针对“Wi-Fi保护访问”WPA认证的攻击可以拆分为两类：“对身份认证的攻击”（attack against authentication）和“对加密的攻击”（attack against encryption）。“对身份认证的攻击”是最常见的，并且是直接针对所访问无线网络的攻击，当攻击“Wi-Fi保护访问下的预共享密钥”认证系统的时候，攻击者也有解密或加密数据通信的功能，因为这时的主密钥（master key）已被破解。“对加密的攻击”只是出现针对基于WPA无线网络的攻击，这种攻击只提供对来往数据包的解密/加密的功能，而不是让攻击者作为一个合法的用户而全部地加入网络后再实施攻击。

WPA认证和WPA2认证的不同

“Wi-Fi保护访问”协议被IEEE采纳的时候，IEEE正忙着为802.11无线网络继续开发新的安全策略。从密码学的角度，“Wi-Fi保护访问”认证中引入了TKIP协议，而“Wi-Fi保护访问版本2”即可以使用TKIP协议，也可以使用AES-CCMP协议，或者二者都使用。而从认证的角度来看，无论是“Wi-Fi保护访问”，还是“Wi-Fi保护访问版本2”都支持“预共享密钥认证”（PSK）算法，或都在“企业模式”下（enterprise mode）都支持“IEEE 802.1X认证”算法。

对于我们而言，“Wi-Fi保护访问版本1”认证和“Wi-Fi保护访问版本2”认证之间的实际差异不大。在这一章中，我们会看到针对TKIP协议的特有的攻击，由于二种认证都支持该协议，所以这些攻击都是既可以针对“Wi-Fi保护版本1”WPA部署，也针对“Wi-Fi保护访问版本2”部署。虽然现在TKIP协议已不太普遍，但在IEEE 802.11的标准中，一直到最近的修订版本中，TKIP才正式地退休了。尽管在适当的情况下，我们总是能指出这两个协议之间“重要的”细微差别，但从认证的角度，无论应用什么样的攻击技术，对于是选择“Wi-Fi保护访问版本1”认证，还是选择“Wi-Fi保护访问版本2”认证，其攻击效果差别不大。

下一次，如果你听到有人声称，某种攻击技术很难攻击“Wi-Fi保护访问版本2”，而对于坆击“Wi-Fi保护访问版本1”WPA却是易如反掌，那他一定是在信口开河。从攻击的角度，二者之间的差异微乎其微。所有的组织今天都在使用WPA2，只是因为在IEEE 802.11的现代安全标准中，“Wi-Fi保护访问版本2”较之“Wi-Fi保护访问版本1”要新，但这并不妨碍它招来为数众多的攻击，这结论会遍布于本章全章。

由于本章中所描述的绝大多数的攻击都同时适用于“Wi-Fi保护访问版本1”和“Wi-Fi保护访问版本2”，因此，我们将简单地只用“Wi-Fi保护访问WPA”，来代替“WPA和WPA2”进行网络认证方式的描述。当然，对于具体某一个只针对WPA，或只针对于WPA2的漏洞，那只能特事特办，在需要的地方，通过“Wi-Fi保护访问版本1”或“Wi-Fi保护访问版本2”明确地指出。

破解WPA-PSK的身份认证

在今天，许多仍使用“Wi-Fi保护访问”认证方式进行部署的单位，都将“Wi-Fi保护访问”称为“预共享密钥的认证”（Pre-Shared Key Authentication，WPA-PSK），或者称为更为大家所熟悉的“WPA个人版”（WPA-Personal）。这种机制的核心是在网络上所有需要认证的设备中使用一个公共的、共享的密钥作为认证的关键标识的，这个标识是预先定义的，也是共享的，所以称为“预”共享的。在“企业模式”下，“个人版”需要认证的位置“企业版”也需要认证，但尽管在“企业版”中，企业用户认证时所使用的密钥生成函数，与“个人版”中个人用户认证所使用密钥的生成函数十分相似，但“个人版”这种预先全网共享式的部署方式就是容易招来大量的攻击，这些攻击无疑会削弱这些无线网络部署的整体安全。有关在认证中使用WPA“预共享密钥的认证”方法的细微差别方面的介绍，请参阅第1章。

1.获得的四次握手

在“Wi-Fi保护访问”认证方式下，通信的数据是加密的。为了让客户端使用解密的密钥，而其他客户端（当然也包括黑客）不知道密钥，需要在加密通信之前，在客户端和AP接入点之间先进行加密密钥协商的过程（这里所谓的“协商”其实是建立连接后，AP接入点的部署），之后，二者之间再相互发送的数据都将是基于这个密钥加密的数据了，而这个过程，就称为“四次握手”（four-way handshake）。“四次握手”的步骤如图4-1所示，其作用就是在通过无线发送来往的数据包之前，在客户端和AP接入点之间先进行的密钥协商过程。

图4-1　“Wi-Fi保护访问”WPA的“四次握手”过程

如果我们要破解某次“四次握手”中的这个密钥，我们需要先获得AP接入点的“服务集标识”、由AP接入点发送客户端的随机数（图中称为“A-nonce”）、由客户端回送给AP接入点的随机数（图中简称为“S-nonce”）、客户端的MAC地址、AP接入点的MAC地址，以及一个用于数据验证的“信息完整性检查码”（Message Integrity Check，MIC），然后才谈得上破解。不过，也不难发现，几个值中除了“服务集标识”之外，所有其他值都可以在“四次握手”中找到。由于它们所发送的数据帧的传送中，常常出现内容重复或顺序交叉，所以我们实际上甚至也不需要完整的四个握手数据帧才能成功地破解密钥。这在某些情况下是很有用的，比如由于信道跳频，有时我们不小心错过了握手的一部分帧数据，但并无妨大碍。一个完整的“四次握手”数据包捕获过程如图4-2所示。

图4-2　一个完整的“四次握手”数据包捕获过程

（1）被动式嗅探

要想获得“四次握手”过程中双方通信的数据包，可以通过“被动式嗅探”（passive sniff）拿到，并且，在嗅探的过程中，嗅探器（sniffer）无须与目标网络进行交互的操作，而是通过一种悄无声息的方式。因为一个客户端加入某网络是一个相当普遍的现象，所以要想拿到一个“四次握手”，我们要做的只是耐心地等待。如果我们在正确的时间、正确的信道上，就不难捕获到握手过程中的数据包。这个简单的过程可以通过使用任意的符合802.11标准的无线嗅探器工具来实现。Aircrack-ng套件（http://www.aircrack-ng.com ）中的airodump-ng是一个简单、轻量级的嗅探器，它在这种行动中特别有用，因为它在成功地捕获到一次握手时会及时知道我们。

运行airodump-ng时，我们需要确保我们的网卡工作在“监视模式”下，锁定到特定的信道，并且通过该网卡能将嗅探到的数据保存到一个文件中。同时也需要通过指定一个“基本服务集标识”的关键字过滤（通过使用“--bssidoption”参数）来锁定一个特定的AP接入点，但在这种情况下，我们将只能保存被指定的单一信道数据。

第一个命令将设置无线网卡进入“监测模式”，后一个命令是使用airdump-ng开始捕获数据包。我们锁定无线网卡到指定的信道，该信道是AP接入点所使用的信道（参数格式及实例如“--channel 11”），这样就可以将这个信道上的所有数据保存到文件中了，指定这个文件名的前缀为“allyourbase”（这是通过参数“-w allyourbase”），并通知接口将用来进行嗅探操作（这通过参数“mon0”）。参数“--ignore-negative-one”参数也附在了后面，是为了避免一种错误条件的发生，这个错误条件就是如果无线网卡上的信道没有设置好，那么设置这个参数就意味着程序没有必要依赖于无线网站的驱动程序，只要能运行就继续运行。如果没有设置这个参数，则如果驱动程序不行，程序停止运行。

你会注意到在图4-3右上角的位置，airodump-ng通知我们一个“Wi-Fi保护访问”的“四次握手”已被捕获到。

（2）主动攻击

为了更快更好地捕获到“四次握手”过程中的数据包，与其坐等，不如主动出击！其实想想也是，为什么要等待周围的用户主动连接？如果我们直接“踢”一个在线的用户下线，然后看着他重新连接不就行了吗？我们可以使用任何“802.11拒绝服务攻击”（Wi-Fi denial of service attack）“踢”一个用户下线，其中，最流行的是“解除认证攻击”（deauthentication attack）。我们的第一步是运行如前所述的“被动式嗅探器（passive sniffer），然后在同一系统上的一个新窗口中，运行解除认证攻击程序，以便我们的嗅探器可以既捕获到攻击，又能捕获到客户端重新连接。尽管有好几个工具可用于发动“解除认证攻击”，在这个例子中，使用aireplay-ng是最直接的。

图4-3　捕获到一个“四次握手”中的数据包

提示

当我们选定指定的无线网络以后，你就可以在airodump-ng程序命令上使用“--bssid”参数来减少那些杂乱无章的攻击数据包量，这既包括捕获到的数据包量，也包括屏幕上显示的数据包。

要将一个用户的客户端“踢掉”，进而迫使其重新连接时，所需要的“解除认证攻击”的帧数量是可以变化的。尽管你可能猜测，参数“--deauth 1”意味着发送1个解除认证数据包，但实际上，这里的“1”是“一轮”，aireplay-ng会发送“一轮”解除认证数据包。确切地说，这里的“一轮”是指64个数据包，并且aireplay-ng在发送这些“解除认证”数据包的时候是在两个方向上都发。在上例中，从AP接入点（通过参数“-a 10：FE：ED：40：95：B5”指定）到客户端（通过参数“-c 00：11：95：E9：FF：5C”指定）有“1轮”，反之亦然，从客户端到AP接入点也有“1轮”（如3.3.1节所述，这里两个方向都发，是指分别以AP接入点和客户端的名义，代替他们互向对方发）。攻击完成后，我们稍等一秒钟，然后检查我们嗅探器是否捕获到“四次握手”。如果一切顺利，我们可以继续发动“暴力攻击”（brute-force attack）了！如果没有捕获到握手数据包，检查“基本服务集标识”和客户端的MAC地址是否正确，然后加大发送“解除认证”帧的轮数，再重新试试。

破解预先共享密钥

与许多“解除认证攻击”一样，入侵“Wi-Fi保护访问下的预共享密钥”认证也可以归结是一个“离线的暴力攻击”（offline brute-force attack）方式。攻击“Wi-Fi保护访问下的预共享密钥”认证特别具有挑战性，这是因为：作为“预共享密钥”算法，它的字符集可以是8~63个可打印的ASCII字符，被选中的密码在被用于“成对主密钥”之前，通过HMAC-SHA1函数被散列过4096次，这大大增加了暴力破解的计算复杂性，使破解一个长而复杂的密码变得非常困难。

我们使用aircrack-ng工具，是因为我们同时在使用Aircrack-ng套件 [1] 。我们使用这个跟套件重名的软件工具的目的是让它去破解密钥。像大多数破解“Wi-Fi保护访问下的预共享密钥”的工具一样，aircrack-ng工具也需要一个捕获后数据包的保存文件，这个文件中至少包含“四次握手”所对应的四个数据帧中的两个数据帧。使用aircrack-ng工具极其简单：

跟着前面的例子，我们将指定一个字典文件（参数中的“-w wordlist.txt”），以及一个捕获有数据包的文件（参数中的“hackmeup-01.cap”）。如果有多个AP接入点在附近，你可能还必须提供足够的对应关系，以便aircrack-ng可以区分开哪些字典文件分别是哪个AP接入点的，这个对应关系的内容主要就是目标的“基本服务集标识”。该BSSID是在aircrack-ng工具执行完这个命令以后，位于由aircrack-ng提供的列表中，如图4-4所示。当列表显示出来后，列表中也会显示哪些“基本服务集标识”被发现，“握手”过程中的数据包包含有多少个基于“有线等效保密协议”认证的“初始向量IV”。最后，arcrack-ng将继续运行“暴力攻击”，并试图找到“预共享密钥”。

图4-4　执行命令后aircrack-ng提供的列表

WPA认证中握手的“卫生清理”

虽然为了内容上的清晰省略了下面的部分，使用aircrack-ng或Pyrit（在后面的内容中讨论）的使用者，通常会在处理pcap文件的时候遇到错误，比如文件中只有一个握手的数据包。这种情况通常都是因为程序处于一个“忙”的状态，或者说是“干扰”状态，导致程序无瑕顾及捕获数据包，或是及时将捕获到的数据包保存到文件中所致。造成程序忙的原因是在珍贵的“扩展认证协议”数据包之间，有太多其他操作造成的、干扰我们捕获和分析的垃圾数据包。在EAP数据包中包含有密钥。虽然Pyrit、aircrack-ng，以及其他破解工具，在这一方面都在努力做最好的自己垃圾数据排除设计，有时候它们还需要一点用户的人工干预以提升其处理能力。读者可以先将Wireshark捕获到的文件打开，然后通过过滤功能找到代表“四次握手”过程的一组EAP数据包，随后使用一个“局域网上的EAP协议”（EAPOL）的显示过滤器（display filter of eapol），把这些你认为是“四次握手”数据包中共性的最好特征手工标注出来。另外，读者可以使用“wpaclean”程序或“pyrit stript”程序以自动的方式来完成这个步骤。

2.破解加密加速器

实事求是地讲，除非被你攻击的无线网络使用了各种字典中最频繁出现的词 [2] ，否则你是不可能只靠一台标准的笔记本电脑或台式机系统上的CPU资源还原出密码的。要知道虽然不同的硬件会有差异，但上面这样的计算机通常一秒钟只能尝试小几千种可能的密码，按这个速度试完所有的密码通常需要令人无法接受的时间。要提高攻击的速度，有两种方法：一是拔掉计算机中某些无助于破解的硬件，然后换成更专业的硬件，例如一个GPU的显示卡；二是上传你的破解程序到云端（cloud），让数以万计的“云计算机”帮你解决这一问题。后面会讲到这两种方法。

（1）图形处理单元

“图形处理单元”（Graphical Processing Unit，GPU）是显卡（video card）中专门用于处理图形渲染（graphic render）处理器（processor）。现代的显卡运行非常高效，在执行计算任务时表示极为强大。通过使用Nvidia公司的“计算统一设备架构”（Compute Unified Device Architecture，CUDA），或是AMD公司“流开放计算库”OpenCL（Stream Open Computing Library），程序开发人员可以卸载显卡的任务，转而处理密码的破解工作。

Pyrit（http://code.google.com/p/pyrit ）是一个开源的，针对“Wi-Fi保护访问下的预共享密钥”认证进行暴力破解工具，它支持图形处理单元GPU，以及“多用途处理架构”（General-purpose Processing Architecture，GPA）。Pyrit被分为两部分：“主控模块”（main module）和“扩展模块”（extension module）。在Pyrit中，基于Python的“主控模块”提供了一个命令行的组件，它可以同时处理一系列管理任务，并且也支持基于CPU计算上的破解。其真正的力量在于其“扩展模块”，“扩展模块”提供对不同的架构的支持。这些“扩展模块”都可以轻松地被调用，进而使用Python功能，所以如果你不喜欢这种“主控模块”上各功能的表现方式，你完全可以自己动手，写你所喜欢的表现方式！Pyrit也支持多个CPU和多个图形处理单元同时运算的模式，所以如果你能以“堆栈”（stack） [3] 的方式同时使用这些显卡，那将可以产生超强的破解能力。下面，我们完成一个在前面曾用aircrack-ng完成过的一个攻击任务，不过，这次的攻击主角由上次的aircrack-ng换成了现在的Pyrit。

在上面的命令Pyrit后面所跟的参数中，除了最后一个“attack_passthrough”，其他的参数都因为和aircrack-ng命令的参数一样而不再赘述。通过指定参数“attack_passthrough”，告诉Pyrit在破解过程中不必保存那些将来可能使用到的散列运算结果（hashing result），以便减少每次散列运算中因为要把散列值写入到磁盘中而浪费的时间。

针对“Wi-Fi保护访问下的预共享密钥”认证的攻击工具中，另一个可以作为Pyrit的备选方案就是oclHashcat，其网址是http://hashcat.net/oclhashcat 。这款软件同Pyrit一样，oclHashcat软件可以将原本在CPU上精耕细作的“预共享密钥”破解任务通过散列函数（hashing function）迁移到所有可用的“图形处理单元”中。不过，oclHashcat和Pyrit也有不同的地方，那就是oclHashcat为了达到一种公平的边缘效果（fair margin），它正在开发一种完全可以超越Pyrit表现的新功能。从命令使用的角度来看，这个新功能就是通过增加扩展的PSK暴力破解的选项来实现的。

oclHashcat软件既可以支持AMD的可执行文件，执行破解工作，也可以使用Nvidia公司可执行文件执行破解工作。如果你是工作在AMD系统上，那就下载oclHashcat软件使用；如果你是工作在Nvidia系统上，那就下载cudaHashcat软件使用。在下面的例子中，我们采用Nvidia系统，所以我们使用cudaHashcat工具作为例子。不过，总的来说，不管使用哪种架构，这次攻击行动项目还是被为“oclHashcat攻击”。

要使用oclHashcat对“Wi-Fi保护访问下的预共享密钥”认证方式进行破解，都是从捕获包含“四次握手”的Wi-Fi数据包开始的。oclHashcat不能从libpcap捕获数据包后生成的文件中直接进行读取，而是需要在两种文件格式中生成一个中间文件格式进行过渡，这个中间文件中需要包括用于实施一次攻击所必要的数据包。aircrack-ng的最新开发版本（版本1.2 beta 3）包括将libpcap文件转换为中间文件的hccap格式的功能，其命令格式如下所示：

接下来，我们使用oclHashcat通过分析hccap文件中捕获到的数据包数据，发起对“预共享密钥”认证无线系统的攻击。由于oclHashcat和cudaHashcat分别使用不同的图形架构，要根据你的系统使用统称为“oclHashcat”文件中的哪一个版本，下载适合你系统的最正确版本，网址是https://hashcat.net/oclhashcat 。在这里，作为二进制可执行文件的oclHashcat的发布版本是作为一个7-Zip格式的压缩文件，需要7Z工具才能解压缩。解压缩的过程如下所示：

在下面的例子中，参数“-m 2500”是告诉oclHashcat程序散列函数的类型（hash type），通过该参数，oclHashcat程序可以实施对“Wi-Fi保护访问下的预共享密钥”或者“Wi-Fi保护访问下的预共享密钥版本2”认证方式的攻击。作为字典暴力破解，我们使用字典文件“wordlist.txt”作为字典，oclHashcat程序就会将字典中的每一个词作为“预共享密钥”可能的密码源，进行一个一个地尝试。

在随后的工作中，oclHashcat不停地计算和核对计算散列值的结果，直到找到正确的密码后立即退出，或者是把字典wordlist.txt文件中的每一个词都试完，最终以破解失败的方式退出。在破解过程中，如果想查询当前的攻击状态，可以在交互命令的提示符下，输入“s”命令。

在这个例子中，oclHashcat根据“预共享密钥”值计算“成对主密钥”值，其速度为56736次散列运算/秒。相比于Pyrit的40788次散列运算/秒，在攻击相同的系统中，有近30%的性能提升。oclHashcat还支持灵活的密码暴力选择的“掩码攻击” （mask attack），而不像传统方式下只有字典暴力破解攻击方式。这个不妨用具体的实例来说明，例如，已知某个移动热点设备“Novatel Mifi”的默认密码是一个长度为11个数字组成的密码，并且该密码的前6位代表出厂日期，而某一个2012年11月1日出厂的该型号设备，其密码必然是以“121101”开始的，所不知道的仅是后5位的值，因此，在用oclHashcat进行破解的时候，可以通过参数告诉设备破解时所用的掩码是：“121101ddddd”，这表示，在暴力破解的时候，密码的前6位是固定的前缀“121101”，所要暴力破解的也只是后5位。

oclHashcat程序会将序列中所有的“d”依次用1个字节的数字字符代替。换句话说，其中每一个“d”，oclHashcat都会从“0”到“9”进行穷举。而前缀“121101”则作为一个恒定值，始终放在最前面。oclHashcat程序中，所有类似可以用可打印的ASCII字符代替的掩码字符，如表4-1所示。

表4-1　OclHashcat软件掩码攻击中的掩码意义表

注：表中space表示这里是一个半角的空格。

在足够多的“图形处理单元”核心可供使用的情况下，oclHashcat可以暴力破解在密码选择上具有有限信息量的“预共享密钥”。例如，下面的“掩码攻击”将暴力破解所有可能有的“预共享密钥”，目前知道这些PSK值全部是由小写字母组成，总长度是八个字符长度：

在本书的攻击系统上共有两个“图形处理单元”，每一个GPU的速度在56000PSK/秒，那么估算这次暴力攻击将在43.2天内用完。当然，一个攻击平台配置8个“图形处理单元”，那么总攻击时间会降到原来的25%，即大约减少11天左右。

注：8个小写字母总数为26⁸ ，1天的秒数是（3600×24），所以两个GPU总运算时间为：26⁸ /（56000×2）/（3600×24）=8.3天。——译者注

对于入侵“Wi-Fi保护访问下的预共享密钥”的部署的网络，字典攻击（dictionary attack）和暴力攻击（brute-force atcack）都十分有效，但都需要足够的攻击时间。另一个可供选择的技术就是我们可以花时间在攻击之前先预先算出散列结果，并将其保存在一个表格中，这样在攻击的时候就可以通过散表中的值进行“密码猜测攻击”（password-guessing attack），进而提高破解速度。

预先计算的散列表　暴力破解工具的工作原理是通过“采纳”一个明文值（plaintext）（比如，通过猜测假定某一个字符串就是密码），加密该明文值，同时解密捕获到密钥的散列值，然后将加密后的密文值与这个散列值进行比较。通俗地讲，暴力破解就是不停地从字典中依次拿每一个明文，加密后与某个已经加过密的密文进行比较。如果比较失败，说明之前的猜测是错误的，则处理过程再换下一个猜测的值后反复上述过程。这一处理过程，大多数工作量都用在所猜测的密码的加密上了，属于“基于处理器的精耕细作型”（processor-intensive）处理方式，也属于“基于时间消耗型”（time-consuming）处理方式。

“预先计算的散列表”（precomputed hash table）是由所猜测的明文加密后的密文组成一张散列表。有了“预先计算的散列表”，破解工具只是从中读取预先计算好的散列值，然后与密码散列之后的值进行比较。通俗地讲，基于“预先计算的散列表”的破解就是预先将字典中的所有明文都按指定的算法加密好，更重要的是，将这些加密好的数据，以一种散列的关系 [4] 保存！这样，当拿到某个已经加过密的密文时，就不需要拿表中的每一个项依次与这个加过密后的密文进行比较，而是用散列函数直接定位于表中加密好的数据进行比较。如果它们匹配，程序就根据表中的这个密文，按照预先计算时明文与密码的对应关系反向找到明文，而这个明文就是密码，可以直接将其提供给用户。预先计算的散列表是由一个或多个人共同生成和分布的，所以用户一般不必担心花费时间生成这样散列表，其目的是为了减少CPU用于散列计算所需要的时间，从而提高破解的速度，减少破解时间。但是换一种可能，如果出于自己的爱好，你需要破解一个特定的散列类型密钥，那么你就不得不去创建属于自己的预先计算散列表。因为“预先计算的散列表”的完成，我们可以减少或完全消除暴力破解过程中加密部分所消耗的时间，从而可以极大地提高带路径破解密码散列所花费的时间。“预先计算散列表”的缺点是：这样的表因为包含密码字典、密码散列后字典，以及这两个字典中各项的对应关系，所以整个“表”的容量可能会非常大，无论是网上传送，还是在各种磁盘里存储，都会遇到麻烦。

在“Wi-Fi保护访问下的预共享密钥”认证的无线网络中，当加密后的数据进入到“预先计算散列表”中后，情况变得特别棘手，这是因为“成对主密钥”不仅仅是一个“预共享密钥”的散列运算结果，同时也“服务集标识”的一个散列运算功能。这意味着，即使两个有不同“服务集标识”的无线网络具有相同的“预共享密钥”，那么它们的“成对主密钥”也会有所不同。因此，针对“Wi-Fi保护访问下的预共享密钥”无线网络的“预先计算散列表”的唯一作用就是：你是为了一个很常见的“服务集标识”名称而生成该表，这样只要遇到同“服务集标识”名的无线网络，都可以使用。或者是你拥有的这个表所对应的“服务集标识”虽然不常见，但你做这个表就是为了随时攻击这个“服务集标识”的网络的。

为一个网络专门做一个表也是很实用的，比如，你可以想象一下，对于某一个网络，我们曾经成功地进入到该系统中，但过了几星期后，当我们试图使用前面的密码再次进入这个网络的时候，他们的管理员已改变了密码。这时，如果该无线网络除了密码改变之外，其他都没有改变，我们应该怎么做？如果事先没有做过这样一个基于这个“服务集标识”的“预先计算的散列表”，那就只能在网络中捕获到一个新的握手，然后再一次运行我们的整个词典，将每一个密码进行加密，然后比对和捕获到的密钥是不是相同，虽然方法和流程跟上面一样，但我们仍然要把上面整个流程重做一遍。显然，如果我们已经建立了这样一个表（这里的表的表现形式并不重要，可以是一个字典文件，也可以是数据库），那就可以第一时间顺利通过，并且不必重做上述所有的工作。为了做到这一点，我们需要拿到要攻击的那个无线网络的“服务集标识”，然后告诉Pyrit创建一个与这个“服务集标识”相关联的表。

下一步，我们向Pyrit给出一个字典，该字典的内容正是要求Pyrit进行散列函数转换。

在我们向Pyrit提供的字典中，应该是包括“所有”可能密码的全集。在这一点上，我们应该尽可能多地增加“服务集标识”和可能的密码到列表中，然后再进行散列运算。在这里，因为我们只是在攻击“所有基于我们”感兴趣的无线网络，所以那些与我们要攻击的这个网络无关的“服务集标识”都不必要，因此，我们可以告诉Pyrit，凡是对于那些与所设的“服务集标识”无关的所有导入的密码都统统跳过，所有参与散列运算的都是我们与该“服务集标识”有关的，而所保存的密码散列字典中，保存的当然也都是该“服务集标识”的散列密码。要做到这一点，我们可以通过Pyrit的批处理命令（batch command）实现。

现在，我们可以向Pyrit发出attack_db命令了。这个命令告诉Pyrit到数据库中直接查找散布结果值，而不是重新进行散列运算。随后，就会很快地得出结果。

在这里，针对“预共享密钥”的破解，其速度要远比以前各种破解方式快得多。这时程序显示其速度高达176830746次成对主密钥PMK/秒。这一成果显然得益于破解之前，预先就完成了散列函数的计算。

随便一个无线网络，现在告诉你这个网络的“服务集标识”让你来攻击，如果只是攻击这个网络的“预共享密钥”，那么预先计算“成对主密钥”的意义不大，因为对于“预先计算的散列表”这种攻击方式，你没有获得显著的性能提升。然而，如果你事先知道要攻击的网络的“服务集标识”，或者希望在将来还会对这个“服务集标识”的网络进行重新攻击，那么预先计算的“成对主密钥”，结合与Pyrit可以提供独特的性能优势，就可以为后续的攻击提供极大便利。

（2）通过云计算破解WPA-PSK认证

“通过显卡破解Wi-Fi保护访问认证听起来的确是个不错的主意，但显卡每天都要用，我更喜欢用它玩Minecraft游戏 [5] ，破解的事能不能交给别人去做？比如让云计算 [6] 去做？”

亲爱的读者，你很幸运，可以毫不夸张地告诉你，答案是“可以！”。“亚马逊网络服务”（Amazon Web Service，AWS）就支持这样允许使用“图形处理单元”功能的实例 [7] ，其名称是“弹性云计算”（Elastic Cloud Computing，EC2）。这意味着你可以在这个平台上启动一个针对基于WPA认证破解的虚拟机，上传你的文件，运行散列命令，只要你认为需要，想用多久用多久，直到你要做的事情干完了，关机走人。当然，作为商业运作的公司，在月底的时候，你会收到一个来自Amazon公司的账单，不过，不用担心，完成上面的运算，所付的费用可能比从星巴克买一杯你喜爱的饮料还便宜。

a）运行一个Amazon公司的“弹性云计算”的实例

下面的内容先假设读者已经对Amazon的“弹性云计算”服务有一定的了解。建议没有使用过“Amazon云服务”（Amazon’s cloud service）的读者去注册一个账号，在创建一个实例之前，先了解一些免费的普通服务。一旦你创建了收费的实例而又弃之不理，那么这个实例仍然会花费你一大笔钱。笔者曾在上面创建了一个相当大的实例，该实例运行了整整一个月，费用高达300美元。另外，一旦你的“弹性云计算”实例运行结束，一定要及时终止掉。

注意

最后再重复一遍：当你完成你的任务时，就永远终止你这次“弹性云计算”的实例，以避免不必要的费用。终止你的实例不会破坏已有的数据，将来，如果需要，你还可以在重新启动实例时再次使用。

当你登录到“亚马逊网络服务”的管理控制台，导航到“弹性云计算”的面板上，启动一个新的实例，当看到“Amazon机器映像”（Amazon Machine Image，AMI）的提示时，浏览到“AWS市场”（AWS Marketplace），然后选择其中“Amazon基于NVIDIA显卡网格图形处理单元驱动程序”（Amazon Linux AMI wiLh NVIDIA GRID GPU Driver）。这是基于CentOS的映像，该映像（image）提供所有驱动程序的预加载（preloaded）服务。

下一步，Amazon会询问你的实例类型。通过“图形处理单元实例”（GPU Instance）的关键字进行条件筛选，在查询出来的结果中选择最需要的配置。目前提供的“图形处理单元”配置只有“g2.2xlarge”，该实例类型具有8x64的CPU内核，有一个“NVIDIA GRID k520”的显卡。

最后，Amazon会再让你配置一下所需要使用的存储容量。当前默认容量（默认值是60GB）应该说可以满足大多数用户的需要。大致说来，要散布运算每150万个密码，对于每一个“服务集标识”，你将需要使用50MB的存储容量。如果你打算创建一个大型数据库（包含成百上千的“服务集标识”），那你可以根据上面的这个容量单位，推算所需要的总规模。

一旦你完成了上面Amazon实例的配置工作，就可以向Amazon发出运转的命令，一两分钟之后，系统就开始计算。然后使用你登录系统时所关联的“SSH密钥对”（SSH keypair）开始写日志文件（即散列密码文件）。

提示

是不是感觉到一个“图形处理单元”的实例不够快？那读者可能要考虑运行多个图形处理单元实例了，但这需要额外追加存储容量。这样做的好处就是，这些操作可以很容易地进行并行处理，其存储结果在同一个地方，便于以后查找。

b）安装Scapy、Pyrit以及它们所依赖的程序

Amazon默认的映像系统配备了所有需要的驱动程序和公用程序，这些驱动程序和公用程序都是根据需要进行加载的。可是，它们都是通用类程序，不是专为Pyrit程序和Pyrit-cuda程序，以及它们两个程序正常运行所依赖的程序而设计的，所以要让整个系统顺利运行，必须安装这两个程序和其依赖程序。为了简化安装过程，作者创建了一个简单的“外壳”shell脚本，该脚本可以在“弹性云计算”上运行一个“图形处理单元”加速Pyrit的实例，为我们自动安装所需要的所有相关程序，安装运行的总时间大约需要几分钟。

1）首先，登录你的“弹性云计算”实例，所使用的命令如下所示，然后，通过“sudo”命令 [8] 升级为root用户。作者的EC2主机如下面的示例所示：

2）下一步，作者所创建的这个“外壳”shell脚本，名叫ec2-pyrit-prep.sh，在“弹性云计算”上，要创建和使用这个脚本，可以事先在本地的计算机上录入下面这段代码，然后在本地选择“剪切”（cut）命令，在EC2上选“粘贴”（paste）命令。另一个办法就是直接从本书的网站直接下载这个脚本。本文件的网址是http://www.hackingexposedwireless.com/files/04/ec2-pyrit-prep.sh 。无论上述哪种方式，在拿到并上传到“弹性云计算”上之后运行这个脚本，那么脚本就会自动安装这些作为运行Pyrit所需要的先决条件的程序包，当脚本的运行结束的时候，脚本还会做一个快速的完整性检测，然后就可以让Pyrit运行和工作起来了。

（3）在破解提速方面的对比总结

表4-2列出的是前几节中所用的各种破解提速方面的对比描述，主要包括“提速方式”、“速度”和“成本”三项。

表4-2　针对WPA-PSK认证的破解中，在破解提速上的总结

从表4-2中不难看到，最有效的方法是使用“预先计算的散列表”方式。不过，大多数情况下，面对要攻击的这个“服务集标识”，你手头并没有针对它预先计算的散列表，而手头的“预先计算的散列表”中又没有包含你所要的加密密码，对于暴力破解来说，“图形处理单元”破解方式显然是最快的，虽然价格上不低，但它物有所值！

通过Reaver和WPS拿到密码

2007年，在“Wi-Fi联盟”开始对IEEE 802.11的安全认证方式进行扩展，新的方式称为“Wi-Fi保护配置协议”（Wi-Fi Protected Setup，WPS），旨在简化家庭网络的配置。这种认证方式总的目标是：让那些不从事技术工作的最终用户不必费心于记住家庭网络的“Wi-Fi保护访问”安全密码，甚至在最初使用这个网络的时候，根本就不需要设置这个密码。要设计和实现如此方便的机制不是天方夜谭，有一个可以看到的，在商业上最成功的方式就是在路由器的设备外壳上打印一个8位数字的PIN码（Personal Identification Number，个人身份ID码）。路由器设备通过这个PIN码（或者从技术的角度上，任何其他更不流行的WPS技术）就可以验证通过，并在随后给需要连接无线网络的移动设备发送识别证书（credential）。总体的概念就是，家庭用户在第一次用移动终端连到这个无线网络的时候，根据路由器外壳上所印的一串相当简单的八位数，将其输入并发送给路由器，然后路由器就会向你的移动终端发送一串难记但安全的密码和“预共享密钥”。这组密码由于并不需要人来记，加之“字典”的创建本身就是利用人记忆的特点，从穷举中挑出可能性更大的词作为密码，所以这组密码可以复杂到无法通过“字典攻击”（dictionary attack）的地步。客户端会保存这个“预共享密钥”，然后在以后连接这个AP访问点的时候，都会像任何其他客户端的连接一样使用这个密钥。图4-5为Windows 8操作系统上，需要用户输入基于PIN码的认证证书时系统的提示。

图4-5　Windows 8系统提示需要输入基于PIN码认证证书

为了简单起见，我们先假设使用一个简单的PIN码通过认证过程需要花费1秒的时间，并且在连续输错1亿（10⁸ ）个PIN码后AP接入点仍然可以正常地受理新的认证请求。那么以这样的速度，要想试完所有可能的PIN码中的一半，你仍然需要大约578天（或一年半）。

注：因为所有的PIN码都是等概率的，所以破解的时候，可能第一个你猜的PIN码就是路由器上的PIN码，也可能最后一个才是，所以从概率的角度来看，一般来说，猜对的平均次数是所有PIN码所需时间的一半。由于PIN码是8位数字组成，所以共有10⁸ 个，1秒1个，1天3600×24秒，所以算一半约需要10⁸ /2/（3600×24）=578.7天。——译者注

不幸的是，尽管PIN码看上去似乎是一个随机的8位数，但实际上，这8位数字中的最后一位是校验和（checksum），也就是说，最后1位不是随机的，而是根据前7位计算出来的。由于校验位的算法是公开的，所以正常客户端会算，黑客也会算，这意味着暴力破解PIN码的时候，实际上不需要578天，而只需要57.8天就够了。不过，即使这样也仍然不理想，因为57.8天也仍然是一个难以接受的时间长度。

然而，PIN码的第二个不足是使“暴力破解”这种方式对于WPS认证的破解成为可能。因为协议内部，实际上将整个PIN码分成两个独立的数字，如下所示。

当在WPS系统中进行认证的时候，客户端会发送“前一半PIN码”到一个数据包中。如果客户端的这个“前一半PIN码”和AP接入点保存的“前一半PIN码”不匹配，那么AP接入点会给客户端发送一个“否定应答”（Negative Acknowledgement，NAK）。因此，在上面校验和参与的情况下，暴力破解的次数甚至不会到达10⁷ 。而且被分为两次独立的PIN认证，攻击者也只需要分暴力破解这两次独立的PIN码即可。其中第一次暴力破解的次数为10⁴ 次，第二次暴力破解的次数10³ 次。所以攻击的总数锐减为11000次，也就是说即使破解完这个PIN码的整个密码空间（keyspace），所要做的也只是分别进行11000次独立的认证尝试。

虽然我们开始于一个假设，即每猜一个PIN码只需要一秒钟，在实际的破解过程中，由于数据在客户端和AP接入点之间来回传送需要花费时间，所以实际的时间通常是几秒一次。如果路由器对于基于WPS认证的“PIN码猜测攻击”（PIN guessing attack）很脆弱，那么其实在2~14小时就可以完成进攻。影响速度的最主要因素是对于客户端的PIN码请求，AP接入点能以多快的速度进行回复。目前，厂商已经针对这一问题发布了补丁程序，其解决方法很简单，就是在一定数量的PIN码请求失败以后，增加一个等待时间（throttle），这样可以大大增加黑客完成攻击的总时间。

有趣的是，尽管WPS第一次大范围广泛部署是在2007—2008年的事，但是WPS的“PIN码猜测攻击”直到2011年才被公开披露。TNS（Tactical Network Solutions）公司的员工Craig Heffner和一名叫Stefan Viehbock的安全专家分别独立地发现了这个漏洞。一旦Viehbock发布他的白皮书（whitepaper），Heffner和TNS公司就通过开源他们的工具软件“Reaver”作为回应。而这个Reaver正是实现这种“PIN码猜测攻击”的程序。

通过Reaver软件查找AP接入点的漏洞

如果你想看看在你周边哪些AP接入点存在上面这种安全漏洞或潜在地存在这种漏洞，最简单的方法就是使用一个绑定了Reaver程序的工具。一款名为Wash的软件可以完成这样的任务，该软件是一个被动式探测软件，可以探测到周边的所有AP接入点，并且显示出该点的WPS状态。对于一个有漏洞的网络，WPS必定是处于启动（enabled）状态，且没有锁定（locked）。首先，从https://code.google.com/p/reaver-wps 网站上下载和安装Reaver，下面是使用Wash工具处于工作状态的一个例子。

一旦我们有了一个“基本服务集标识”和信道序号，下面就可以开启Reaver程序，然后等待攻击的过多成。

最终Reaver将得到有价值的信息。至于这次破解需要多长时间，则要取决于AP接入点上对“等待时间”的处理方式了，同时，也取决于你的CPU的速度有多快。

提示

如果Reaver程序没有显示没有拿到“前一半PIN码”（假设完整的PIN码是“12345670”），那么在1分或2分钟后再试的时候，可以在后面加上“-N”和“-S”的参数。这些标志将分别禁用向AP接入点回送“否定应答”NAK标志和故意选择小的Diffie-Hellman值，该值主要用于保护“预共享密钥”PSK的发送量，以减少对AP接入点的负载。

Securing Against WPS PIN Brute-Force

针对PIN码暴力破解的防御

针对暴力破解PIN码技术使WPS认证变得不稳定的现象，许多厂商已经通过增加延时（delay）的方法部署补丁程序。这里的延时，就是前面所说的“连续多次PIN码输入错误，则增加一个等待时间”。对此，最好的防御就是禁用WPS认证方式，但这样做对于看不到路由器表面的非认证用户来说，也可以起到降低攻击的益处。

从客户端还原WPA密钥

到目前为止，我们把大量精力都放在了攻击当前所连接的网络或设备上了，现在应该把精力放在如何取回“Wi-Fi保护访问”认证网络的密码了。但是所有的终端设备上，都保存的AP接入点的密码呢？比如，你可能刚刚拿出你的笔记本电脑，然后将公司的网线插入到电脑的网口中，这时你还没有指定想要连AP接入点的Wi-Fi密钥。在这样的情况下，获得“Wi-Fi保护访问”认证网络密钥的访问是你笔记本电脑设备上负责“访问控制”（access control）模块的一个功能。通过这个功能，用不了多久，你访问这个AP网络的障碍就荡然无存，随便变成了入口，并可以在一个平台和另一个平台之间切换。

（1）从安卓设备中拿到最近访问过的网络

假设你启动终端，以一个用户登录访问一部Android设备。该操作需要使用root身份。通过从当前目录切换到“/data/misc/wifi”目录，然后查看wpa_supplicant.conf文件的内容即可。拿到恢复该Android设备最近访问过的网络列表和每个网络的密钥。在这个配置文件中，主要是指某一个以“psk=”开始的行，因为这里写着的，就是以明文方式写的网络“预共享密钥”。

（2）从Mac的OS X上拿到WPA的密钥

“Wi-Fi保护访问”认证方式下的密钥，同其他每一种密码一样都会保存在客户端本地，在Mac操作系统上，“Wi-Fi保护访问”的密钥是保存在一个名为keychain的文件中。所有用户都可以合法地通过Keychain Access工具查看里边的数据。攻击者通过用户级别的访问就可以复制到这个文件，这相当于看到了数据内容，访问的文件是~/LibraryFkeychYains/login.keychain。在这个文件中，尽管有大量的信息是以明文的方式显示的，比如账户名（account name）、域名（domain）等，不过，实际的认证证书是进行加密的。攻击者想要这些加密认证证书需要用户密码。如果想解密keychain文件并还原密码，一个方法就是通过暴力破解的方式破解用户的登录密码，这样的破解工具有crowbarKC，该软件可以从http://www.iboostup.com/app/com.georgestarcher.crowbarkc 下载。

（3）从Windows中恢复WPA密钥

读者所关注的从Windows中还原密码，可以使用NirSoft公司的WirelessKeyView软件，该软件可以从http://www.nirsoft.net/utils/wireless_key.html 下载，图4-6是一个通过WirelessKeyView软件破解加密密钥的例子。

图4-6　通过WirelessKeyView破解加密密钥

击败已认证客户端密钥还原攻击

上网时客户端都会访问“Wi-Fi保护访问下的预共享密钥”，所以在客户端上，如果限制对“Wi-Fi保护访问下的预共享密钥”密钥的访问，等价于阻止对客户端自身的访问。由于移动设备在访问企业网络时候访问范围得到了极大的扩展，所以我们能做的就是让移动设备可以提供远程管理的功能，但是，一旦你的移动设备被盗或者丢失，那你就只剩下擦眼泪的份了。

另外，组织应该避免所有的AP接入点都进行“Wi-Fi保护访问下的预共享密钥”认证，相反可以用EAP的方式改用WPA的“企业认证”（Enterprise authenticacion）方法。在“WPA企业模式”认证方式中，没有PSK，而是每个客户端有一个独立的、较短有效生命周期PMK。

解密捕获的WPA-PSK数据包

到目前为止我们已经了解了一些针对“Wi-Fi保护访问下的预共享密钥”暴力破解的技术细节，通过Reaver程序可以让我们绕过认证证书，这样就可以从另一个被攻破的设备上窃取密码。无论如何，我们有密码。它的密码，我们也可以从网络的通信的数据包中进行解密。

可能听起来简单，但这里有一个问题：每个用户都有一个独特的“成对临时密钥”（Pairwise Transient Key，PTK），该值是当用户与网络相关联的时候生成的。尽管我们已经有了密码或者是“成对主密钥”，但我们不知道所生成的PTK是什么，除非我们还捕获了它们的会话的握手数据包。如果我们有“成对主密钥”，并且想嗅探出其他用户的连接，则我们不得不先强制客户端断开连接（例如，使用“解除认证”攻击使其强制退开），然后捕获它们重新连接时产生的“四次握手”数据，以便我们可以从中推导出“成对临时密钥”。

提示

任何可以破解“Wi-Fi保护访问”认证上通信数据包的工具，都不仅需要密码，还需要“四次握手”中的数据。其中的“四次握手”数据主要用于创建用户的“个人会话密钥”，或者是“成对临时密钥”。

（1）使用Wireshark来解密通信数据包

Wireshark软件提供了内置的通信数据包监听解密功能，这些功能主要针对的是由“基于WPA-”和“基于WEP-”加密了的数据包。Wireshark程序在解密“Wi-Fi保护访问”认证数据包的时候，会自动使用一个“成对主密钥”或密码值的列表，然后程序会尽可能多地在捕获到的数据包中找“四次握手”的数据包。要在Wireshark中指定一个密钥，需要通过选择“编辑（Edit）|偏爱（Preferences）”菜单，然后从左侧“协议”（Protocol）列表中选择“IEEE 802.11”项，然后在“启用解密”（Enable Decryption）复选框上，设备为允许，然后单击“解密密钥”（Decryption Keys）右边的“编辑”（Edit）按钮。

密钥可以被指定作为一个密码（通过“wpa-pwd”进行指定，如图4-7所示），也可以被指定作为一个“成对主密钥”（即图4-7中标为“wpa-psk”），还可以作为“有线等效保密协议”密钥。当一个数据包被成功解密，Wireshark将会解析解密的内容，并同时显示加密和解密的数据。

图4-7　在Wireshark中指定一个密钥

（2）使用airdecap-ng程序

在“Wi-Fi保护访问下的预共享密钥”认证的无线网络中从捕获的网络通信数据包中进行解密软件，第二优选的程序就是airdecap-ng，这是包含在Aircrack-ng套件中的另一个工具。像排名第一的Wireshark一样，airdecap-ng让我们解密由“基于WPA-”和“基于WEP-”加密的数据包，并且既得到密码，又能得到“成对主密钥”。假设你要在前面的例子中使用的相同的pcap文件进行解密操作，你可以发出以下命令：

如果我们得到解密的“Wi-Fi保护访问”认证数据包个数为0，则表明或者所提供的密码是错误的，或者提供的该无线网络的“服务集标识”是错误的，再或者我们的pcap文件中根本就没有“四次握手”的数据包，其中，没有“四次握手”的数据包是各种失败原因中最常见的原因。一旦airdecap-ng已完成破解，那么就会在当前目录中创建一个名为allyourbase-Ol-dec.cap的文件。如果以某种方式成功地还原了“成对主密钥”，但没有还原出密码，那么我们可以直接通过“-k”参数指定“成对主密钥”。

保护WPA-PSK认证

防止“Wi-Fi保护访问下的预共享密钥”认证攻击，最有效方法是在可能的情况下选择一个复杂的密码。不用说，黑客字典中的词是要排除在外，不能用作密码的。另外，大多数操作系统不要求每次都输入密码，所以不要因为让用户记住长的随机字符串而感觉到不妙，他们仅仅需要在输入密码的时候记住一次就行了。然后就可以一如往常定期修改密码，它就永远不会造成伤害。

另外一个很好的威慑物是选择一个独特的“服务集标识”。如果你的“服务集标识”是“linksys”，有人很可能已经为你的这个“服务集标识”计算了一个散列表。远离这个AP接入点默认的“服务集标识”，或者考虑将一个随机数字追加到某个字的结束，例如，“Unique-01923”，也不失为一个好办法。

目前，本节到此为止我们的重点一直还都是进攻“Wi-Fi保护访问下的预共享密钥”认证系统，或你为“WPA个人版”认证系统。下面我们看看开发更加成熟和复杂的认证方案：“WPA企业模式”认证。

[1] 如果没有用过的话，可能读者已被这一组名为airXXX-ng的程序给弄糊涂了，那么大家记住，首字母A大写的是套件名称，首字母a小写的是这个套件中某个具体软件名称，全书都是这样，但仅限于“airXXXX-ng”这个格式。——译者注

[2] 所谓的字典，更准确的名称应该是“常见密码列表”。不同攻击使用不同的字典，比如有生日字典，有姓名字典，更多的是混合字典。字典的准确性是暴力破解是否成功的直接因素。——译者注

[3] 堆栈，也简称“栈”，在计算机科学中表示一种仅能在表尾进行插入或删除操作的线性表。——译者注

[4] 散列关系，又称哈希（hash）关系，是将所有的数据根据某个函数保存在表中指定的位置，这样在查找某值是否在表中，只需要用同样的函数计算位置，然后查找该位置是否有值的办法。该方法效率很高，但要找到这样一个好的函数很难。——译者注

[5] Minecraft是一款自由度很高的沙盒游戏，这个游戏让每一个玩家在三维空间中自由地创造和破坏不同种类的方块。中国用户称呼最多的名称是《我的世界》。——译者注

[6] 云计算中的“云”来源于IT工程师在画互联网图形的时候，习惯于把互联网画成一朵云。所以其中“云计算”的本意就是指“让一个网络像你自己的计算机一样，为你提供计算”。——译者注

[7] 在云服务上进行的计算，是按一个完整的任务算的，每个任务都有启动和停止的过程，所以称为“实例”。因此同时开两个任务运行同一个程序，或前后依次开两个任务运行同一个程序，都会被当作是两个实例。任务是相对于“云服务”来说的，所以你开一个任务，在其中任意运行程序，都算是一个任务；反之，即使其中你什么也没有做，但只要你不提出结束任务，但对于“云服务”来说，你仍然在执行任务。——译者注

[8] sudo是UNIX/Linux上的命令，是su命令的加强版，意思是“以管理员身份执行”（do something as the supervisor），相当于Windows下，右击某个程序，然后在弹出的菜单上选择“以管理员身份运行”一样。——译者注

4.1　破解企业模式下的WPA认证

大部分主要的组织将“WPA企业版”（WPA Enterprise）作为他们的无线网络的部署方案。它提供了认证上的细粒度控制（fine-grained control），这种控制可以使网络整体变得更安全。“WPA企业版”在使用EAP协议的基础上支持多种身份认证方案，这些方案中的一些方案，被认为是比其他方案更安全的认证方案。这里EAP协议就是在第1章中提到的“扩展认证协议”（Extensible Authentication Protocol，EAP）。

提示

网站

如果你对RADIUS协议、802.1X协议和EAP协议之间交互的细节不熟悉，那么请参见第1章中相关的内容，那里有对这三个概念的介绍。对于这三个协议详细的详细分析，可以参考本书网站上额外附送的试读章节《802.11协议介绍》（Intro to 802.11），该章介绍了IEEE 802.11的背景，其网址是http://www.hackingexposedwireless.com/chapters/ch01.pdf 。

4.1.1　获取扩展认证协议的握手

正如“四次握手”对于攻击“Wi-Fi保护访问下的预共享密钥”认证至关重要一样，“EAP协议握手”（EAP handshake）对于攻击“WPA企业版”同样至关重要。“EAP协议握手”同样是采用“四次握手”的通信方式。在“EAP协议握手”期间，系统会告诉我们现在正在使用的“扩展认证协议”（EAP）类型，虽然这样的EAP类型取决于我们对网络的配置，但仅这个名字，就给了我们足以发动攻击的信息量了。要捕获到“EAP协议握手”的数据包，我们可以使用前面所描述的主动嗅探方法和被动嗅探方法中的任意一种。

1.EAP的身份响应

“扩展认证协议”的“身份响应”（Response Identity）的消息是客户端在“EAP握手”期间发送给“认证服务器”（authentication server）的第一条消息 [1] ，消息中包含了客户端的用户名（见图4-8）。“认证服务器”通过实际的认证过程，可以确定该客户端发送的用户名是否可用。EAP的“身份响应”信息中有一个重要的特点，那就是该数据包是以明文方式表示的，易于辨认。如果你能够捕获到一次“EAP协议握手”数据包，那你就有可能从数据包中，得到这个正在请求连接的客户端的用户名。如果这身份认证与Windows操作系统的“系统用户”关联，那么你还可以看到的是该用户所关联的“域名” [2] （domain）。

图4-8　EAP身份响应的消息

2.确定EAP的类型

“扩展认证协议”的类型可以通过检查“EAP握手”来确定。EAP类型定义在消息中，并且无论我们使用哪一款数据包检查工具（例如Wireshark软件），EAP的类型通常都会被自动翻译。客户端可以通过配置支持多个EAP类型 [3] ，因此嗅探程序监测到客户端完整的“EAP协议握手”数据包是非常重要的，否则，如果你只是嗅探到“EAP协议握手”中的某一个数据包，则有可能会出现错误的判断。例如，你可能会注意到：某个客户端第一次使用EAP/TLS类型尝试连接，所以你理所当然地认为它们的EAP类型就是EAP/TLS了，但紧随其后的是，客户端又改用了“受保护的扩展认证协议”类型进行连接，如果成功，那客户端和AP接入点实际使用的连接类型就是“受保护的扩展认证协议”类型，而不是前面的EAP/TLS类型。这一点很重要，因为“扩展认证协议”类型比别的类型更容易遭到攻击。一旦你确定对方使用的是EAP类型，那么你就可以发起一个攻击，该攻击指向这个EAP类型的网络，并有望拿到对该网络访问的权限。

4.1.2　EAP-MD5认证方式

“基于消息摘要第5版的扩展认证协议”（EAP-Message Digest Algorithm version 5，EAP-MD5）是一个相对简单的“扩展认证协议”认证方式，此方式正如其名称所暗示的，是通过MD5 [4] 的散列处理，向客户端身份认证提供加密支持的。图4-9显示了整个认证过程。

客户端在“EAP协议握手”的第一次握手的数据包中，将自己的用户名写入到了“扩展认证协议”的“身份响应”消息中。接下来，Radius服务器在收到“身份响应”消息以后，将客户端发送一个包含有标识符（identifier）字段和一个16字节的“质疑”（challenge）字段的“EAP请求”（EAP Request）以完成第二步握手。然后，客户端就将其“密码”、“标识符”字段和“质疑”字段连接起来形成一个大的字符串，并将这个字符串通过MD5加密算法进行散列运算（hash）。运算结束后，客户端将运算结果发送到Radius服务器，这就是“EAP握手”中的第三次握手，服务器会用同样的散列运算算法，将同样的几个参数进行运算，然后将运算出的结果与收到客户端的这个运算结果进行比较，如果它们匹配，则用户成功认证；否则不匹配，则认证失败。无论哪种结果，服务器都会向用户发送一个认证结果，这就是“EAP协议握手”中的最后一步。“基于消息摘要第五版的扩展认证协议”是一个简单的方法，但是它存在诸多问题，特别是在无线网络上。

图4-9　“基于消息摘要第5版的扩展认证协议”的握手过程

攻击EAP-MD5认证方式

让我们先通过讲述RFC 4017 [5] 来开始本节内容。在RFC 4017中详细定义了“为了在无线网络上安全使用各项操作，而对EAP算法提出必须遵守的特定要求”。然而“基于消息摘要第5版的扩展认证协议”违反了该“要求”中的大量规定，当EAP-MD5开发出来以后，并不意味着可以应用于全部无线网络中。“基于消息摘要第五版的扩展认证协议”在多少地方并不容易被发现和使用，不过，如果你找到了，那说明你很幸运。“客户机-服务器”（Client-Server，C/S）模式的通信在无线网络上以明文方式进行的，所以，如果我们得到一个有效的客户端与服务端的“四次握手”，你就可以对该“四次握手”过程中所捕获的数据包发动一次针对该数据包的离线“暴力攻击”（brute-force attack）。Joshua Wright所制作的eapmd5pass工具可以证明这一点，该工具的下载地址是http://www.willhackforsushi.com/?page_id=67 。

使用eapmd5pass软件破解“基于消息摘要第5版的扩展认证协议”的操作非常简单：我们指定一个捕获数据包的文件，该文件中包含MD5的“质疑”字段和“回应”字段的数据包（通过参数“-r PrettyLilPwnies.cap”来实现），再指定一个字典文件（通过参数“-w wordlist.txt”实现），然后按回车键。如果字典中包含了目标账户的密码，那么不久eapmd5pass软件将会成功地还原出这个密码。之后，使用这组账号和密码，就可以作为一个有效的用户连接到这个无线网络，并“合法”地登录。

保护EAP-MD5认证的安全

不幸的是，在“基于消息摘要第5版的扩展认证协议”认证方式下，某些操作方式的设计不可能实现无线网络上的安全，如“四次握手”中明文传送用户名。除此之外，还有“基于消息摘要第5版的扩展认证协议”认证中以明文方式发送“质疑”字段和“响应”字段也都是安全隐患。另外，在“基于消息摘要第5版的扩展认证协议”认证方式中，客户端和Radius服务器之间不提供相互认证的机制，所以要确保可以应对可能发生的“中间人攻击”（man-in-the-middle attack）和“AP接入点模拟攻击”（AP impersonation attack）。但在这种机制下，因为客户端和Radius服务器不能确定接收到的数据包必定是由对方直接发给的或必定不是对方直接发给的，所以要想确保能防止这两种攻击是不可能的。在一些设置中，你可能会看到同样的“质疑-响应”机制（challenge-response mechanism），该机制可以在一个如“基于隧道传输层安全的扩展认证协议”的“隧道协议”（tunneling protocol） [6] 下进行连接和通信，这可以被认为是一个安全的替代方法。不过，如果你是单独地使用“基于消息摘要第5版的扩展认证协议”认证方式，还是建议使用另外的、更安全的EAP类型。

4.1.3　EAP-GTC认证方式

“基于通用令牌卡的扩展认证协议”（EAP-GTC）是一种名叫“通用令牌卡”（Generic Token Card）的认证方式，该认证方式就是在AP接入点和客户之间共同使用某种动态生成的一次性密钥，这个一次性密钥就叫“令牌”（Token），这里的“一次性”是指每一个密钥都有“生命期”，过了这个“生命期”该密钥就作废了，进而换成另一个新的密钥，并重新开始统计这个“生命期”的有效时间。尽管市场上有许多硬件厂商都在基于这种认证方式生产产品，但是最常见的例子是“RSA SecurID”的品牌。

从概念上讲，“基于通用令牌卡的扩展认证协议”认证方式甚至比“基于消息摘要第5版的扩展认证协议”认证方式还简单。在EAP-GTC认证情况下，用户硬件的“令牌”（token）和“认证服务器”（authentication server）都共同知道一个“短生命期”（short-lived）的共享密钥（shared secret），该值其实就是“令牌”。在通信之前，客户端的用户要想证明自己拥有这个令牌，就需要把该共享密钥值发送给认证服务器。认证服务器将接到的这个值与自己事先保存的值进行比较，如果两值相同，则认证服务器就给客户发送一个“EAP-Success”的成功消息给提出认证的这处客户端用户，表示是合法用户，二者可以通信；否则就会发送“EAP-Failure”失败的消息 [7] 。

攻击EAP-GTC认证方式

“基于通用令牌卡的扩展认证协议”认证方式同“基于消息摘要第5版的扩展认证协议”认证方式类似，但就“基于通用令牌卡的扩展认证协议”自身而言，该认证方式并不符合为802.11网络提供认证服务的认证要求，其原因是使用这一认证方式的客户端和认证服务器之间，在认证的开始阶段没有相互认证就直接通信了。相反，硬件令牌则用作认证的次要形式，而把一个用户名和密码，或加密证书作为了首要的形式。

从概念上讲，攻击“基于通用令牌卡的扩展认证协议”认证方式非常简单，根据前面的描述，就不难想到，只要我们拿到当前用户正在显示的“令牌”值，在该值“生命期”过期之前，向服务器进行通信的时候，将其作为自己的“令牌”即可。在模拟信号（analog）的世界里，你可以通过“肩窥”（shoulder-surfing）用户的“令牌”或直接“亲手偷”（physically stealing）过来 [8] 。在数字信号的王国中，你可以更加隐密地完成这一点：创建一个“骗子”AP接入点（rogue AP），吸引拥有“令牌”的用户，并“说服”他输入正常的“令牌”值。因为该值是有时效性的，所以你要尽可能快地将该值说成是自己的“令牌”值，拿到那个真正的网络中使用。

在实际的操作中，在Wi-Fi的无线网络网络领域，“基于通用令牌卡的扩展认证协议”认证方式并不能作为一种完全独立的认证方式单独使用，而是作为“基于隧道传输层安全的扩展认证协议”认证方式或“受保护的扩展认证协议”认证方式中内部认证时使用的方法，这些内容将在后面的章节中详细介绍。因为如果不使用内部认证，那么用户将在传递他的“令牌”值的时候使用明文方式传递了。

保护EAP-GTC认证的安全

如果你已经部署了“受保护的扩展认证协议”认证方式或EAP-ITLS认证方式，并将“基于通用令牌卡的扩展认证协议”认证方式作为这两种方式中的次要的内部认证形式，那么在这个无线网络的上下文中，同样意味着你正在使用“基于通用令牌卡的扩展认证协议”这种认证方式。你所能做的最重要的事情，就是确保在客户端的设备上配置了“只有在隧道建立成功以后，才与服务器进行认证”的设置，并且如果隧道连接失败，则马上停止。“受保护的扩展认证协议”、“基于隧道传输层安全的扩展认证协议”等认证方式都会在后文中进行详细讨论。

4.1.4　LEAP认证方式

“轻量级扩展认证协议”（Lightweight EAP，LEAP）是Cisco公司专有的EAP认证类型之一，主要是基于“Microsoft版的‘质疑响应认证协议第2版’”（Microsoft-Challenge-Handshake Authentication Protocol，MS-CHAPv2）。客户端要连接到网络，先发送它的用户名，认证服务器会返回一个8字节的“质疑”。然后，客户端会计算密码的NT散列值，然后将该值作为“种子” [9] （seed material），并通过DES算法对“质疑”进行加密，最后将散列值和加密后的“质疑”连接在一起，一并返回给认证服务器。认证服务器在拿到连在一起的结果后，会做相同的计算，以验证结果的正确性。

表面上，“轻量级扩展认证协议”好像一个相当不错的协议。然而，其主要的缺点就是“质疑”和“响应”都是通过明文进行传送的，如果我们可以捕获到一个用户认证过程中所产生的通信数据包，那么我们就可以启动离线“暴力破解”攻击，进而破解出该用户的密码。

用Asleap软件攻击LEAP认证方式

“轻量级扩展认证协议”的漏洞是由Joshua Wright [10] 首次发现并展示出来。他以Asleap来命名用来展示这一漏洞的软件工具。该软件工具的下载地址是http://www.willhackforsushi.com/?page_id=41 。Asleap的运行，需要先捕获一些EAP进行协议握手时的一些数据包。要完成这种捕获操作，你既可以直接使用Asleap工具本身得到，也可以通过任何其他的“嗅探器”（sniffer）得到。无论采取哪种方式，我们要做的第一件事情，就是创建一个散列字典文件（hashed dictionary file）。这个文件可以用来从任何“轻量级扩展认证协议”保护的网络中还原密码。下面创建一个散列字典文件：

该命令输出了两个文件：一个索引文件（扩展名为“.idx”）和一个散列字典文件（dict.hashed）。这个“预先计算散列字典”（precomputed hash dictionary）文件不针对特定的任何无线网络，从而只需要产生一次。当然，这样说的前提是假设该用户的密码在这个字典中，否则要么在攻击中失败，要么就是你发现有新的可能有密码后，再重新生成一次。一旦散列字典生成结束，就可以发起实际的离线“暴力破解”攻击。在下面的例子，有一个名为pcap的文件，是在采用“轻量级扩展认证协议”认证的无线网络中被嗅探程序捕获到的数据包组成的文件，假设该无线网络的密码是“qaleap”。

保护LEAP认证的安全

出于某种原因，如果你的无线网络上被迫使用“轻量级扩展认证协议”认证方式，并且不能升级，那你唯一可以做的事就是尝试执行严格的密码策略，否则如果你可以换成别的东西，那请马上换掉。其中，“受保护的扩展认证协议”认证方式就是一个“轻量级扩展认证协议”认证方式的很好的替代品。换成“受保护的扩展认证协议”认证方式以后，你仍然可以使用以前的用户名和密码。最后，Cisco公司的建议是所有“轻量级扩展认证协议”认证方式的设备都请替换为使用“基于安全隧道灵活认证的扩展认证协议”认证方式。

4.1.5　EAP-FAST认证方式

“基于安全隧道灵活认证的扩展认证协议”（EAP-Flexible Authentication via Secure Tunneling，EAP-FAST）认证方式也是一种EAP的认证方式，同“轻量级扩展认证协议”一样，也是由Cisco系统开发的。并且EAP-FAST很像后面将要讨论的“受保护的扩展认证协议”认证方式和“基于隧道传输层安全的扩展认证协议”认证方式。“基于安全隧道灵活认证的扩展认证协议”认证方式首先在客户端和认证服务器之间建立一个安全隧道，然后将用户认证证书经由该隧道进行传送。在“基于安全隧道灵活认证的扩展认证协议”认证中，安全隧道的创建被称为“第1阶段”（Phase 1），客户端通过隧道传输认证证书被称为“第2阶段”（Phase 2）。

“基于安全隧道灵活认证的扩展认证协议”的显著特征之一是其具有“受保护的访问认证证书”（Protected Access Credential，PAC）。PAC是一个存储在客户端系统中的文件，其中包含一个“公共密钥”（shared secret），即“PAC密钥”（PAC-Key）；一个不透明的元素，称为“PAC不透明成分”（PAC-Opaque）；以及其他信息，称为“PAC信息”（PAC-Info）。“PAC信息”中包括了认证服务器的“权威ID”（Authority Identity，A-ID）。上述信息一起随着“受保护的访问认证证书”分发到各个客户端上，完整的“‘传输层安全’握手”并不需要用于建立TLS隧道。相反，“第1阶段”所使用的处理方式是基于RFC4507 [11] 中所提到的方式完成，RFC4507定义免声明的TLS会话还原。

连接时，认证服务器向客户端发送一个“权威ID”，然后客户端检查本地系统的A-ID，看与该A-ID是否与“受保护的访问认证证书”进行了关联。如果有一个有效的“受保护的访问认证证书”是关联的，客户端将该PAC所对应的“PAC不透明成分”回送给认证服务器。该“PAC不透明成分”是认证服务器生成的，最初，当客户端向认证服务器发送认证的时候，认证服务器在向客户端提供一个双方会话（session）的“身份证明”（identifier），“PAC不透明成分”也就是在这个期间生成的。你可以将这个“身份证明”理解成一张“门票”。一旦认证服务器能识别这个“PAC不透明成分”是有效的，那么“PAC密钥”就会被用来派生“传输层安全”的主密钥（master secret），并且这个缩短的“‘传输层安全’握手过程”（即“第1阶段”）就将告完成。

虽然“基于安全隧道灵活认证的扩展认证协议”的可支持多种“第2阶段”的协议，但是只有“Microsoft版的‘质疑响应认证协议第2版’”MS-CHAPv2和“通用令牌卡”GTC是最常用的。从EAP-FAST协议的角度看待MS-CHAPv2和GTC，就像从“受保护的扩展认证协议”PEAP和“基于隧道传输层安全的扩展认证协议”EAP-TTLS看待TLS隧道一样，“传输层安全”TLS隧道可以保护这些认证证书免受攻击。只不过TLS隧道是在“第1阶段”建立的。

向用户发布一个“受保护的访问认证证书”的过程被称为“PAC配置”（PAC provisioning），或者称为“第0阶段”（Phase 0）。即使在小规模部署中，“PAC配置”也是一项艰巨的任务。“第0阶段”所需要的不仅仅是初始化安装，而且还包括重建，所以“PAC配置”个数的添加就意味着管理费用的增加，因此通常的这种配置工作周期为一年一次。“PAC配置”可以通过“跑腿网络” [12] （sneakernet）来引导，通过客户端的有线接口来引导，或者自动进行配置。前两个选项与传统的基于证书的EAP协议相比，确实没什么优势；然而，第三个选项是系统管理员喜欢“基于安全隧道灵活认证的扩展认证协议”的真正原因。自动的“PAC配置”只要求用户输入她的认证证书，就可以通过无线接收其“受保护的访问认证证书”。尽管自动的“PAC配置”对于网络管理员来说是一个方便的功能，但它也是的“基于安全隧道灵活认证的扩展认证协议”迅速土崩瓦解的主要原因。

攻击EAP-FAST认证方式

自动的“PAC配置”可以以两种形式出现：“需服务器认证”（Server-Authenticated）和“非服务器认证”（Server-Unauthen-ticated）。“需服务器认证”的“PAC设置”不太吸引人，因为作为客户端需要有服务器的认证证书才能建立“第1阶段”，这种“鸡生蛋，蛋生鸡”的逻辑在一定程度上抵消了自动“PAC配置”的初衷。“非服务器认证”的“PAC配置”则广受欢迎。它实现“第1阶段”的时候，使用一个匿名的（anonymous）“Diffie-Hellman隧道”，然后在“第2阶段”继续的时候使用“Microsoft版的‘质疑响应认证协议第2版’”（MSCHAPv2）认证证书。这样说来，其实整个协议就变成了“在‘基于安全隧道灵活认证的扩展认证协议’认证下使用‘Microsoft版的‘质疑响应认证协议第2版’协议’的认证”（即EAP-FAST-MSCHAPv2）。也正如其超长名称所暗示的一样，在“非服务器认证”的“PAC配置”下，匿名隧道并没有为用户提供“到认证服务器去认证”的能力。因此，“基于安全隧道灵活认证的扩展认证协议”的部署方法很容易受到“中间人攻击”（man-in-the-middle attack）或“AP接入点模拟攻击”（AP impersonation attack），这一点很像“受保护的扩展认证协议”PEAP和“基于隧道传输层安全的扩展认证协议”。一旦有了访问“Microsoft版的‘质疑响应认证协议第2版’”的认证证书，你就具有了发动一次“暴力攻击”的能力，并且，如果成功的话，就允许你从事“PAC配置”的处理，并且拿到一个有效的网络“受保护的访问认证证书”。

对这种攻击方式需要注意的是，为了成功地发动攻击，你必须在“PAC配置”的时候处在该无线网络中。而“处在该无线网络中”又谈何容易呀，有时还比较困难，因为客户端通常只在初次部署的时候进行大规划的批量“PAC配置”，然后偶尔再以新客户端身份加入。另外，“受保护的访问认证证书”重建的时候，也会为攻击提供了另外一次良机，但这时的攻击同样存在上面所说的这种限制。

保护EAP-FAST认证的安全

保护“基于安全隧道灵活认证的扩展认证协议”的安全是件非常简单的事，就像是禁止“非服务器认证”的自动“PAC配置”一样简单。然而，应当指出：一旦”非服务器认证”的自动“PAC配置”不再可用，“基于安全隧道灵活认证的扩展认证协议”所提供“对其他基于证书的EAP认证”就几乎没什么好处可言了。如果必须使用这种类型的“PAC配置”，它应该在“有限的次数内”，在“可控制的地方”再进行这样的“PAC配置”，以便降低风险。

4.1.6　EAP-TLS认证方式

“基于传输层安全的扩展认证协议”（EAP-Transport Layer Security，EAP-TLS）是第一个要求与“Wi-Fi保护访问”兼容的EAP认证方法。EAP-TLS被认为是非常安全的，主要是因为它使用了客户端和服务器证书来认证网络上的用户。然而，这同时也是其主要的缺陷。在一个任意规模的组织中，管理所有用户的证书肯定是一个让人胆寒的挑战，大多数组织根本不具备所需的PKI的水平 [13] 。

从概念上讲，“基于传输层安全的扩展认证协议”EAP-TLS协议很简单。服务器向客户端发送它的证书，该证书是经过认证的，证书中包括的“公共密钥”（public key）用来加密进一步消息的。客户端将它的证书发送到认证服务器，该证书是认证服务器认证过了的。然后客户机和服务器处理生成一个“随机密钥”（random key）。在其他情况下（例如“安全套接层”（Secure Sockets Layer，SSL）），这个密钥是用来初始化一个对称加密套件（symmetric cipher suite），加密从“传输层安全”会话（TLS session）中得来数据。然而，在“基于传输层安全的扩展认证协议”中，你对使用“传输层安全”来加密这些数据并不感兴趣，这是“高级加密标准-计数器模式密码块链消息完整码协议”（Advanced Encryption Standard-Counter Mode CBC-MAC Protocol，AES/CCMP）或“临时密钥完整性协议”（Temporal Key Integrity Protocol，TKIP）的工作。相反，你可以使用通过“传输层安全”生成的随机密钥去创建“成对主密钥”。随着“EAP-Success”的成功消息，“成对主密钥”会从RADIUS认证服务器发送到AP接入点上。

攻击EAP-TLS认证方式

正面攻击“基于传输层安全的扩展认证协议”协议几乎是不可能的。如果EAP-TLS的漏洞突然受到了某种加密攻击，这可能意味着“传输层安全”被破解了，这比担心你的无线网络被攻击更加可怕。但这并不是说这个供应商的“基于传输层安全的扩展认证协议”没有缺陷。虽然你肯定也希望它的确没有，但正如该协议是非常强健的一样，它的确还是有缺陷的。打败“基于传输层安全的扩展认证协议”的唯一可行的方法就是窃取一个客户端的“私人密钥”（private key）。

窃取客户端的“私人密钥”可能非常困难，或者根本一点也不难。如果他的“私人密钥”保存在一个受“个人身份ID码”（Personal Identification Number）密码保护的智能卡内，那么你会有相当多的工作要做。如果“私人密钥”保存在一个用最低级别保护的Linux或Windows操作系统的硬盘中，那你可以通过一些其他手段进行攻击了，例如，偷到“私人密钥”是最直接的攻击方式。

在Linux操作系统上，从一台已成功入侵过的系统中获取“私人密钥”只是找到密钥的保存区域并将其复制出来的简单问题。而在Windows操作系统中则会有点麻烦，因为密钥通常保存在“认证证书”中。

一旦你偷到了一个“私人密钥”，并获得用户的“认证证书”，那就简单多了。因为“私人密钥”和“认证证书”的算法是公共的，所以后面的操作比较容易，下面，你就可以使用正确的“认证证书”和“私人密钥”，配置你的计算机连接到这个无线网络上。一旦你进入网络中，如果你想捕获别人的通信数据包，你可以用“ARP欺骗”（ARP-spoof）来完成，或者运行“中间人攻击”（man-in-the-middle attack）方式。不过，因为每个人都有独特的“成对主密钥”，所以如果你使用airdecap-ng，恐怕并不能轻易地解密每个人的通信数据包。

保护EAP-TLS认证的安全

如果你已经实施了“基于传输层安全的扩展认证协议”进行系统的认证，这至少说明你在无线网络安全方面已经做了不少处理。如果有可能，尽可能将客户端的“私人”密钥保存在智能卡上，或其他一些“防篡改的令牌”（tamper-resistant token）中。如果没有这些，那就保持经常给客户端工作站及时打补丁，并更新系统到最新版，以防止客户的“私人密钥”被窃取。

在使用“基于传输层安全的扩展认证协议”的时候，一个次要的关注点就是包含在“认证证书”中的信息和这些信息的收来发去都是自由使用的。认证证书中包含有轻度敏感信息，如员工的姓名、密钥长度和散列算法。如果你关心这个问题，你可以在一个加密的隧道中运行“基于传输层安全的扩展认证协议”，从而保护刚才提到的信息。这种技术被称为“在‘受保护的扩展认证协议’的认证中使用‘基于传输层安全的扩展认证协议’的认证”（PEAP-EAP-TLS），该技术是由Microsoft公司发明的。

4.1.7　PEAP和EAP-TTLS认证方式

在前面的例子中，我们已经看到“扩展认证协议”的方法表示很弱不禁风，因为一个攻击者可以通过离线攻击就可以观察并拿到“认证证书”。例如前面“基于消息摘要第5版的扩展认证协议”和“轻量级扩展认证协议”两个认证方式。在“基于传输层安全的扩展认证协议”中，我们也意识到了，一个使用“认证证书”的认证方法在安全方面是高效的，一旦正确的部署，就很难以破解。不过反过来，对于一个组织来说，EAP-TLS认证方式很难部署，因为想让所有用户都保护好各自的认证证书需要大量额外的维护成本。如果对一些中间数据能提供一些针对EAP-TLS的加密安全技术，那么在方便用户名和密码之间的关联上，算法是更容易让人感觉到满意的。对于这一点，PEAP和EAP-TTLS正好提供了这种将二者优点牵线搭桥，共建新认证方法的功能。

“受保护的扩展认证协议”（Protected EAP，PEAP）和“基于隧道传输层安全的扩展认证协议”（EPA-Tunneled Transport Layer Security，EAP-TTLS）是目前Wi-Fi无线网络中，在基于EAP认证的各种认证算法方式中，拥有最大量、最新安装量的两种认证方式。尽管二者使用了不同的技术，但它们的操作风格却十分相似。下面我们一起来了解这些内容。

无论是“受保护的扩展认证协议”，还是“基于隧道传输层安全的扩展认证协议”，都首先在客户端和认证服务器之间建立一个TLS隧道，并通过这个隧道提供相互认证，然后，通过采用不太安全的“内部认证协议”（inner authentication protocol）经由隧道传送“认证证书”。这条隧道的“内部认证协议”之所以被认为是不太安全的，是因为最初的设计认为在隧道内的网络上实施嗅探是不太可行的，一旦他们处于隧道之中，不太安全的身份认证机制则会被隧道本身的安全机制所保护，这种保护给它一个附加级别的保护以避免“侦听攻击”（eavesdropping attacks）。

例如，我们可以想象一下，如果前面章节中提到的弱“轻量级扩展认证协议”协议，如果该协议的“质疑”和“响应”等信息是通过加密信道进行发送和接收的，那么考虑一下会发生什么？这时攻击者将不能够收集发动“字典攻击”所需要的数据，那么“轻量级扩展认证协议”将变成一个非常安全的身份认证方法。事实上，许多“受保护的扩展认证协议”和“基于隧道传输层安全的扩展认证协议”两个认证方式，在部署的时候，都使用了与“轻量级扩展认证协议”相似的“内部认证协议”。

此外，“传输层安全”隧道不仅是提供了对内部认证证书的保护，而且也为客户端提供了确保认证服务器的身份的能力。这样就实现了可以安全地相互认证的想法，作为客户端通过一个可信任的认证机构的认证服务器来验证“传输层安全”证书认证。

对于“传输层安全”隧道来说，“外部”（其实就是隧道本身）提供了基本的保护，“内部”但以安全的认证，所以“内部”就算我们姑且认为是“潜在的薄弱”，我们也要先将“外部”瓦解后再考虑这些事。下面的攻击主要集中在如何颠覆这条隧道的问题上。

攻击PEAP认证方式和EAP-TTLS认证方式

“受保护的扩展认证协议”和“基于隧道传输层安全的扩展认证协议”纯粹依靠“传输层安全”隧道，为它的用户的“认证证书”提供一种安全可靠的运输，我们自然会将隧道作为我们的攻击目标。问题是，“传输层安全”在绝大多数情况下是安全的，虽然的确存在一些攻击方式，但它们通常非常难以实现，或者是需要在特定的条件下成功地登录到在现实环境中，才有获得成功的可能性。因此，如果“传输层安全”本身在协议上不存在“设计”漏洞，我们就不得不在其程序的“实现方式”（implementation）上找找有没有漏洞可钻。比如我们希望我们的目标网络有配置上的错误；不要焦急，真的有网络管理员无知地帮助我们。

果然，一个意外之喜被发现，在“受保护的扩展认证协议”和“基于隧道传输层安全的扩展认证协议”的配置中，一个客户端上出现了一个常识性错误。该配置跳过客户端上的证书认证操作。以这种方式配置客户端，这个客户端就会潜在的容易受到“AP接入点模拟攻击”（AP impersonation attack）和“中间人攻击”（man-in-the-middle attack）。

想象一下，我们盯上了一个“受保护的扩展认证协议”或“基于隧道传输层安全的扩展认证协议”认证的无线网络。我们配置一个新的AP接入点，该AP接入点与那个我们要“取而代之”的合法AP接入点具有相同的“服务集标识”，并且我们的AP接入点可以向客户端提供更好的服务网络信号强度。这无疑会吸引客户端前来连接。当客户端与我们连接的时候，我们就“偷梁换柱”地将接收到EAP消息通过我们的RADIUS服务器进行传输，但在这个传输中，终止“传输层安全”隧道，并且接受客户的“内部认证协议”。通过这种方式，我们就已经击败了“传输层安全”隧道。

Hostapd程序是一款可以在正常802.11卡之外，创建一个AP接入点的软件，最新版本的hostapd程序，程序内部还内置了一个独立的RADIUS服务器。这大大简化了冒充一个合法“WPA企业模式”认证的部署过程。这个软件逻辑的设计动机毫无疑问，就是专门针对上面这种攻击而定的。这些AP接入点可以完成一定级别上基于EAP等多数认证方法，并且由于软件内置RADIUS服务器的功能，所以也不再需要外部的RADIUS服务器，另一个好处是，像我们这样的黑客也不再需要建立一个完整的RADIUS服务器了。

Hostapd的无线Pwnage版本： hostapd-wpe 　几年前Joshua Wright和Brad Antoniewicz共同开发了一个开源RADIUS服务器的修改版，名叫FreeRADIUS。在这个版本中，FreeRADIUS-WPE是Hostapd的无线Pwnage版本，该版本最适合接收由客户端发送给它的任何认证证书，一旦将认证证书中的密码还原成明文以后，黑客就会重新使用这些密码。最近这些补丁和技术已加入到hostapd的内置RADIUS服务器中了，所以这个项目的后续开发人员就将其命名为hostapd-wpe。

提示

Hostapd-wpe提供许多攻击功能，且并没有指定必须是与“Wi-Fi保护访问”认证相关的认证方式。例如作为客户端版本的“OpenSSL心脏之血攻击” [14] （OpenSSL Heartbleed attack），以及最新版的Karma“骗子”AP接入迭代技术（iteration of the"Karma"rogue-AP technique），这些功能将在下一章进行详细介绍。

安装hostapd-wpe程序是一个简单的过程。

1）首先，该程序的正常使用，有一些必须预先安装的程序，所以在正式安装之前，先要在Linux操作系统上安装这些可能漏装的先决条件。

2）然后，下载hostapd程序和hostapd-wpe补丁程序的源代码，并在这两个程序的下载网站上查找这两个软件的版本信息。

3）现在，应用hostapd-wpe补丁，并在整个工程中编译连接一下。

4）最后，运行一个脚本文件，该脚本文件包含由hostapd-wpe自动生成的一些“自签名证书”（self-signed certificate）。如果读者对定制认证证书感兴趣，可以参考certs目录中的文件，编辑extension.cnf即可完成认证证书的定制操作。

4.1.8　运行恶意RADIUS服务器

在下面的内容中，我们会举例说明一个攻击过程。在这个攻击中，有两个客户端已经被配置为连接到一个与“WPA2企业模式”模式下的网络上，通过“受保护的扩展认证协议”和“Microsoft版的‘质疑响应认证协议第2版’”两个认证方式，并且这两个客户端都已暴露在恶意的RADIUS服务器之中。在下面的这个例子中，我们将模拟攻击虚构的企业网络解决方案，该解决方案命名为“虚构方案”（Foray Solution）。

我们的目标是当遇到下列情况时，确定我们应该采取的行为，以及终端用户可以识别出来的可能的警报：

·在一个网络中，突然出现了一个相同的“服务集标识”，对客户来说，以前使用的“Wi-Fi保护访问版本2”认证突然换成了“Wi-Fi保护访问版本1”认证，这会发生什么？

·当之前一直用来建立“传输层安全”通道的认证突然无法在信任的证书颁发机构进行验证了，这时的客户端会怎么做？

·如果RADIUS认证服务器返回了认证成功的消息，客户端是继续与认证服务器的其他操作？还是盲目地直接进行关联操作？

除此之外，为了后面还有人接着上当，客户端应该信任的证书会做成如图4-10所示的样子。

图4-10　客户端应该信任的证书

在开始使用hostapd-wpe软件之前，我们需要修改该程序的配置文件hostapd-wpe.conf。因为我们是在无线接口上运行的，所以我们将接口设置为wlan0，并且禁用 [15] （disable）掉“驱动程序默认是有线”的那一行。在这个文件中，由当前位置稍微向后移动，我们还会看到有很多与802.11相关的选项，我们还可以将所有的这些802.11的选项都设置为“允许”（enable）。最后，我们找“WPA的版本”这一项，将其值改为“2”以上。更改完成之后的hostapd-wpe.conf文件，看起来应该像下面这样（粗体部分表示修改后的内容）。

为了让这些修改生效，我们可以启动服务器。

1.诱骗Windows 8.1客户端到“骗子”AP接入点上

在AP接入点运行起来以后，我们就可以看到连接这个网络的Windows客户端，还可以调查一下他们所使用的Windows版本是多少。记住，在这种情况下，客户端已被配置修改为连接到ForayCorporateNetwork这个无线网络上，我们就是要看看当有“骗子”AP接入点故意设置使用相同的“服务集标识”可用的时候，这些客户端是如何表现的。

首先，Windows客户端会比较这两个“WPA企业模式”认证网络所宣称的版本号。如果前面的对配置文件修改正确（就是配置文件hostapd-wpe.conf中“wpa=2”的那一行），那么Windows客户端上所做的检测通信，并且没有也没向客户端通知什么信息。如果我们在我们的“骗子”AP接入点中的配置有错误，那么该客户端用户将看到如图4-11所示的警告信息。

图4-11　警告信息

一旦Windows客户端执行完WPA认证时的版本比较后，下一步就是验证在“传输层安全”隧道另一端的”认证证书”是否有效。在Windows 8.1默认设置下，如果“认证证书”验证失败，那么该Windows用户客户端将不被允许连接到该无线网络上。由于该客户端以前是成功地连接到过这个网络的，所以这系统会提示是否要“删除网络连接”（forget the network），如图4-12所示。

图4-12　系统提示是否删除网络连接

这对于攻击者是不利的，因为Windows还没有给我们送来缓存中的“认证证书”。幸运的是，这个配置是由管理员才能进行配置的，所以在没有有效的服务器“认证证书”的前提下，仍然有相当数量的部署“受保护的扩展认证协议”。

一旦“外部”的“受保护的扩展认证协议”隧道已经建立，Windows将会执行一个“Microsoft版的‘质疑响应认证协议第2版’”认证，以便与我们的服务器进行数据交换。这时，Windows允许我们针对以后的“认证证书”发起“字典攻击”。当Windows客户端用户连接的时候，在hostapd-wpe的窗口中，将显示类似于下面的窗口的内容。

我们可以借助于这些值，尝试在离线状态下进行“暴力破解”。但在不久的将来，客户希望我们能够通过对我们自己的认证。因为没有该用户的密码（这时，我们还没有到退出的时候），所以我们也不能认证我们自己。这也就是为什么在后面紧随就是用户的“认证证书”，我们可以从日志文件中，看到下面的输出内容：

由于缺少相互的认证，所以这也是Windows系统中客户端的窗口显示连接断开的主要原因。走到这一步，现在Windows用户也不知道什么地方出了差错，他同样还是会看到之前出现过的那个“无法连接到该网络”（Can’t connect to this network）对话框。

警告

如果你无意中把一个Windows 8或Windows 8.1的客户端骗到你的“WPA1企业”认证的无线网络中，而他这个客户端的本意是想加入“WPA2企业”认证的无线网络，然后，你在“内部”认证方法中证明自己本身也失败了，那Windows会将这种行为视为是一种攻击，Windows会强行删除该无线网络的配置文件。所以这是一定要引起用户和管理员的注意的。当你让hostapd-wpe工作的时候，如果要冒充“Wi-Fi保护访问版本2”认证的无线网络，那么一定要确保在配置文件hostapd-wpe.conf中的“WPA的版本号”设置为“2”。

尽管很不幸，我们没能让Windows客户端加入到我们的网络中，但是我们已要找到我们所想要的东西：那就是用户的“认证证书”。通过这个散列后的认证证书，我们可以通过Asleap程序加载一个离线的“密码猜测攻击”（password-guessing attack）。

通过结合保存在hostapd-wpe日志文件中的Widnows客户端用户的用户名，我们可以使用下列“认证证书”入侵到这个网络“johnny_c/turn_down_for_what！”中去。

2.诱骗OS X 10.9.4客户端到“骗子”AP接入点上

到目前为止，我们已经看到了Windows客户端在面对“骗子”RADIUS认证服务器的时候是如何表现的。下面我们通过比较的方式看看Mac的OS X客户端在遇到同样情况时的表现。

首先，让我们看看在“Wi-Fi保护访问”提供了不正确的版本的情况下，Mac的OS X上会发生什么。类似于Windows，用户收到警告提示（见图4-13）。

图4-13　OS X系统上出现的警告提示

这比我们在Windows 8和Windows 8.1上所看到提示信息更具体，但对于大多数非专业的终端用户来说，这么专业的提示信息也会让他们无所适从。那么，当Mac的OS X客户端接收到一个以前信任的“传输层安全”隧道“不信任的认证证书”（untrusted certificace）的时候，会发生什么呢？

图4-14中的错误提示信息，对于一个普通的无线终端用户来说，肯定很难理解，试想一下，如果“认证证书”上实际上写的是关于目标主机上的一些情况，而不是像图4-14所写的那种“‘鬼鬼祟祟的皮特斯阴谋’服务器证书”（即图中“Sneaky Petes Shady Server Certificate！”），那大家可以想象一下，会有多少人单击“继续”（即图中“Continue”）按钮，来进行继续的认证 [16] 。

图4-14　错误提示信息

假如用户无视上述警告，而单击了“继续”按钮，那么他将被提示需要输入“用户名”和“密码”。正如在Windows显示的一样，这些“认证证书上”将被用于在“Microsoft版的‘质疑响应认证协议第2版’”认证中，用于“内部”的认证方法：

如果我们通过asleap软件运行这些结果，我们就会得出如前面Windows实例中的结论，即结果同样是“johnny_c/turn_down_for_what！？”。

获取Mac上OS X用户的“认证证书”同样有趣，从hostapd-wpe程序的日志文件中，我们就可以注意到客户端并没有断开。看来，OS X的现代版本并不通过“内部”隧道完成相互的“认证证书”。我们不仅得到该用户的“认证证书”，而且我们现在非常适合执行各种“客户端攻击”（client-side attack），终于，其中一个客户端可以让我们在其机器上拥有执行代码的权力。有关在这种至少有一个客户端可以为我们所用的情况下，我们可以做什么的详细细节，请参见下一章的内容。

保护PEAP和EAP/TTLS认证的安全

要防止这类“受保护的扩展认证协议”和“基于隧道传输层安全的扩展认证协议”认证方式的攻击，最关键的点就是要确保你网络中客户端的有效“认证证书”。如果某客户端的认证证书检查失败，那么客户端的设备将永远无法连接到这个无线网络上。

很多人想知道，为什么“连接到失败的证书认证网络”是软件的一个选择项。你可以参考Windows上的“受保护的扩展认证协议”配置属性，为什么它甚至会建立不进行验证的客户端呢？正如许多安全问题一样，答案就是：这涉及金钱或时间。

对于一个需要验证认证证书的客户端来说，要安装本地组织的“证书颁发机构”（Certificate Authority，CA），需要有根认证证书（root certificate）的权限，这个配置操作做起来可能很麻烦，另外，网络上一个“知名的‘证书颁发机构’”（well-known CA）要想发布证书，那么这个网络也需要认证证书，并且这种“知名的‘证书颁发机构’”是需要花钱买的。因此无论是在当地组织的“证书颁发机构”根证书安装，还是“知名的‘证书颁发机构’”发布证书，都是出力不讨好的事。相反，允许用户不做证书认证，则可以避免管理员买认证证书，也可以避免只是为了个无线访问而专门配备一个自己公司的证书认证服务器。

[1] 读者可以结合图4-8理解这一句话。通常情况下，一般来说都是客户端（即发起方）在申请连接前先发送一个“请求”（request），然后服务端（即应答方）回头一个“响应”（response），但在这里是客户端首先发起一个“响应”（在图中Code：为Response（2）），然后服务端开始发起“查询”（该词同样也是request）（在图中Code：为Request（1）），客户端回复这个“查询”，服务端告诉查询的结果（在图中Code：为Success（3）或Failure（4））。这一过程可以从随后的4.2.2节中的流程图看到。——译者注

[2] EAP的“身份响应”数据包中，以明文的方式传送用户名，通过上面的图可以清楚地看到，用户名是“in_user”。在Windows中，认证中，很多用户名的格式是“域名\系统用户名”，因此通过EAP的“身份响应”数据包，结合上面的格式，等于额外地也看到了“域名”。——译者注

[3] “可扩展认证协议”支持多种类型，并且新的类型还在不断地加入，目前最常见的类型有EAP-MD5、EAP-TLS、EAP-TTLS、EAP-FAST、EAP-SIM、EAP-AKA、LEAP、PEAP、EAP-GTC等几种。后面大部分都会陆续详细介绍。——译者注

[4] MD5（Message-Digest Algorithm 5）即“信息摘要算法第5版”的简称，用于确保信息传输完整一致，是计算机广泛使用的散列算法，将数据（如汉字）运算为另一固定长度值的字符串。MD5的前身有MD2、MD3和MD4等算法，但均因算法过时而被淘汰，而MD5现在仍广泛应用于数据加密领域。——译者注

[5] RFC表示Request For Comment，意指“请求评议”，包含了Internet上所有协议的详细讲解，是理解、实现网络协议的最权威文档。RFC的文档在分类后，都会预给一个数字编号，例如RFC 4017的内容就是“Extensible Authentication Protocol（EAP）Method Requirements for Wireless LANs”即“无线网上的EAP方法需求”。——译者注

[6] “隧道”确切地说不是协议，而是一种技术，即当某次通信的时候，需要依次同时采用三个协议，并且两端的两个协议是同一个协议的时候，那么就形成了“隧道”技术。很显然中间那个协议只需要把两端的协议互发的内容，“连同协议和数据”都作为自己协议的“数据”部分就行了。就像某轮渡将一个长途汽车“连车本身带汽车的乘客”一起作为自己的“乘客”运到河对岸一样。——译者注

[7] 其格式参见4.2.1节中的图，以及该节译者的注释。——译者注

[8] “肩窥”是当别人填表、在ATM机输入PIN码，或者在按电话机按键的时候，站在他后面，通过他的肩膀偷看他所做的东西，以便获取信息的方法。“新手偷”就是直接偷听或拿到。二者总的意思就是在模拟世界，由于方式是公开的，信号也没加密，所以偷听是件很容易的事。——译者注

[9] 在需要产生随机效果的函数中，需要用户先提供一个“种子”。相同的种子，会产生相同的随机序列，不同的种子产生不同的随机序列。所以这种随机数都是伪随机数。——译者注

[10] 本书的第一作者。——译者注

[11] RFC4507是“Transport Layer Security（TLS）Session Resumption without Server-Side State”，即“不需要服务端声明的传输层安全（TLS）会话恢复”。——译者注

[12] “跑腿网络”是指两台计算机之间传文件时，直接通过人在两台计算机之间跑来跑去的方式完成。特别是指不使用网络，而是借助于磁盘、光盘、U盘、移动硬盘。其原因只有一个：高安全性。——译者注

[13] PKI（Public Key Infrastructure）就是“公钥基础设施”，是一种遵循标准。利用公钥加密技术为电子商务的开展提供一套安全基础平台的技术和规范。——译者注

[14] 这里有两个问题，首先OpenSSL，则是为网络通信提供安全及数据完整性的一种安全协议，囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议，并提供了丰富的应用程序供测试或其他目的使用。平时看到某个网站用了https://开头，就是采用了SSL安全协议。其次，就“OpenSSL心脏之血攻击”是专门针对使用https（存在此漏洞）的网站发起攻击，每次读取服务器内存中64K数据，不断的反复获取，内存中可能会含有用户http原始请求、用户cookie甚至明文账号密码等。大家经常访问的支付宝、微信、淘宝等网站也存在这个漏洞。而更有网友测试了世界最流行的1000家网站，结果30%～40%的都有问题。——译者注

[15] Linux操作系统中，半角“#”表示注释，所以在行首加上该符号就相当于“禁用”了。——译者注

[16] 言下之意，就是本书只是演示一下入侵方式，所以假的AP接入点故意用“骗子”（rough）、“‘鬼鬼祟祟的皮特斯阴谋’服务器”等夸张的名词。而现实中的黑客肯定不会这样命名，他们完全可以做假做得很逼真，以便让用户信以为真。——译者注

4.2　本章小结

本章涵盖了针对“Wi-Fi保护访问”认证的几种已知的攻击方式。“Wi-Fi保护访问”所提供增强的安全性大大优于其前身（“有线等效保密协议”），不过，这些改进也抬高了“Wi-Fi保护访问”认证系统的价格，这是由这些新的802.11协议所涉及的复杂性越来越高所导致的。幸运的是，这种复杂性对于最终用户来说是透明的（hidden），在任何现代的操作系统连接到一个“Wi-Fi保护访问”保护的网络和连接到一个“有线等效保密协议”保护的网络一样简单。然而，在幕后，在密钥的选择上，在协议的漏洞攻击上，在无线网络客户端的配置缺陷上，攻击者也有过几次良好的，可以充分利用认证算法弱点的机会，进而获得对网络的“非认证的”访问。

直到现在，我们一直在利用无线网络本身的漏洞，使用工具攻击无线网络，在下一章中，我们将看到如何在客户端中直接访问无线网络。

第5章　攻击802.11的无线客户端

最近，随着采用“Wi-Fi保护访问”WPA认证的网络日益增多，攻击802.11网络已变得更加困难。以前那种只要假以时日就可以攻破802.11网络的日子已经一去不复返了。这种攻击上的困难导致黑客将越来越多的兴趣，由原来的攻击802.11网络转到攻击802.11客户端上来。

客户端攻击是独特的，因为它们往往发生在“协议栈”（protocol stack）的多个层次中。在最上层是应用层（application-level）的攻击。这些是大家看惯了的忠告：Java程序中的bug [1] ，Firefox（火狐浏览器）软件中的bug等。吸引客户端攻击兴趣的不是这么多的用来获得代码执行的“bug时代”（bug-of-the-day），而是向攻击者提供操作客户端数据通信所需要的协议层的控制。对于恶意内容的传递，会向黑客提供机会，使他们可以以新的令人兴奋的方式攻击受害者。

本章带你剖析了解一个客户端的攻击过程。在一般情况下，一个客户端攻击的目标是直接攻击软件脆弱的那一部分，而这一部分又常常是被黑客控制的漏洞部分。控制漏洞的目的是通过漏洞获得在远端“代码执行”（code execution）的能力。本章我们先由手工使用浏览器访问基于“Metasploit框架” [2] （Metasploit Framework）的“自动化漏洞使用服务器”（automated exploitation server）开始，该服务器的名称是browser_autopwn。接下来，我们将利用由名为“I-Iove-my-neighbors”的作者开发的，一款叫VM的程序来对客户端进行透明地重定向（redirect）操作。最后，我们在Kali版Linux中，使用I-Iove-my-neighbors开发的VM程序，应用个人攻击技术。也包括一些其他直接注入技术（direct injection technique）。

[1] bug，早期主要指软硬件中的设计或编程中的错误，现在还包括了设计缺陷并可以被用来利用进行网络攻击的漏洞。——译者注

[2] Metasploit是一款开源的安全漏洞检测工具，可以帮助安全和IT专业人士识别安全性问题，验证漏洞的缓解措施，并管理专家驱动的安全性进行评估，提供真正的安全风险情报。这里的“Metasploit框架”可以理解为一个包含多种黑客工具的工具包。——译者注

5.1　browser_autopwn：穷人的漏洞使用服务器

这一整章所介绍的技术，都是在“被占领主机”（victim）上，通过“重定向”操作，利用客户端漏洞获得在客户端的主机上执行黑客代码的能力。我们可以看到形形色色的方法，可以在客户端上的用户毫不知情的情况下，被黑客实施了“重定向”操作，只是，在看到这些内容之前，让我们先看一下当手工通过浏览器（browser）去利用一个服务器漏洞的时候，我们可以看到什么样子。这种攻击发生在如图5-1所示的网络中，其总结如表5-1所示。

图5-1　我们“被占领网络”的布局

表5-1　图中网络配置总结

应用层的攻击方式

在一个典型的客户端攻击中，攻击者从应用层的漏洞中获得“代码执行”的权力。这些类型的漏洞的例子包括：CVE-2014-4114，这是Microsoft公司的Office软件中，一个OLE对象解析方面的缺陷；还有CVE-2014-4111，这是IE浏览器（Internet Explorer）中的一个“内存崩溃”（memory corruption）的缺陷。相对于这些特定的bug，通常需要转瞬即逝的条件，虽可重现，但较难捕获，与其把精力集中在这个上面，还不如通过展示怎么样使用Metasploit中的browser_autopwn程序漏洞功能，借助于对这种漏洞的攻击，更能理解基于浏览器攻击的原理和使用方法。

5.1.1　使用browser_autopwn程序

Metasploit工具包中的browser_autopwn程序是一个功能模块。该功能模块可以方便地检测许多种客户端的bug，这些漏洞根据它们的特点，以及相互间的历史传参关系，组成了一个“树”状的结构，并称为“Metasploit树”（Metasploit tree），凡是“Metasploit树”中的漏洞，browser_autopwn程序都可以检测到。首先，启动msfconsole程序 [1] ，以便加载browser_autopwn模块。指定服务器的端口号（port number），注意要避免使用TCP方式下的80这个端口号，因为我们将在随后不同的攻击中使用该端口。一个无害的URL用于攻击时传送数据使用，设置这个URL需要通过参数“/ads”，如下所示。

最后，在命令中指定一个攻击者可以访问的IP地址，当我们的“外壳”shell程序需要“回连”（connect-back）的时候，就会连接这个IP地址。

现在，我们就可以发动browser_autopwn的“引擎”，让它运转起来了。

正如你从输出看到的，这个版本的Metasploit装了16个独特的客户端漏洞检测模块。如果“被占领主机”可以被定向到http://10.0.1.9：55550/ads ，那么browser_autopwn模块将检测该客户端浏览器的类型和版本，并且向其传送一个相匹配的漏洞攻击。这里获得浏览器类型和版本的方式是通过“JavaScript脚本”和“用户代理解析”（User-Agent parsing）实现的。

1.通过browser_autopwn检测OS X的浏览器漏洞

在下面的例子中，在OS X操作系统上使用Firefox浏览器，在浏览browser_autopwn以前的URL的时候，存在一个Java的“运行时”（runtime）漏洞。假设有一个用户在看到所有关于运行时Jave“超时”（out-of-date）的警告，在发生这种问题的时候，通常会有很多提示信息，图5-2只是显示了其中一个。如果该用户仍然单击通过的时候，你就会在你的msfconsole窗口上，看到如下的信息提示输出出来。

图5-2　提示信息

如果检测成功，你会得到一个新的连接会话（session），通过这个会话你可以看到下面所列的内容。

你也可以与“会话1”（session 1）通过“-i”参数进行交互操作。

提示

你可以从本书的网站上找到如何在Mac的操作系统上远程访问远端的浏览器，进而入侵到邻居网络中的内容。这部分内容的链接是：http://www.hackingexposedwireless.com/chapters/ch04.pdf 。

2.通过browser_autopwn检测Windows 8的浏览器漏洞

和“通过browser_autopwn检测OS X的浏览器漏洞”相似，要通过browser_autopwn检测Windows 8的浏览器漏洞时，如果我们运行了针对Windows的漏洞检测工具，我们就可以得到如下结果。

如果程序工作正常，那么就可以以“会话2”（session 2）的方式给我们提供另一个“外壳”shell界面。

当然，为了browser_autopwn能“正常”工作，我们必须有一个Windows程序，并且还的确存在漏洞。因为Windows自动升级和及时的补丁更新等技术，所以，其实两者都挺难找到的。作为一种攻击技术的研究工作，我们只能通过创建一个无线“骗子”的无线网络，并且引诱“被占领主机”进入到这个网络中，这样，在这个网络中我们就可以主动地实施很多操作了。这样的操作正如你下面将看到的一样。

[1] msfconsole是Metasploit工具包中的一个程序，相当于实施攻击的主程序，该程序可以动态地加载攻击所需要的模块。——译者注

5.2　使用I-love-my-neighbors网络

我们将全面覆盖式讲解的第一技术是创建一个我们自己的“骗子”AP接入点，并操纵用户加入到这个无线网络中。一旦他们关联到我们的AP接入点，我们就可以很容易地将数据包注入到他们的浏览器中。虽然所有这些步骤都可以在一个标准的Linux发布版本上实现，但是Joshua Wright还是创建了一个小的虚拟机（virtual machine）。通过这个虚拟机，很多单调繁琐工作都可以自动完成，比如将一些必要的设置关联起来。这个虚拟机叫作“I-love-my-neighbors”（“我爱我的邻居们”）。读者如果想了解或使用这个工具，可以从下面的地址中下载：http://neighbor.willhackforsushi.com 。

注意

Joshua Wright创建这个虚拟机的目的，就是为了回应那些“蹭”他“Wi-Fi不安全测试网络”的邻居们。

一旦我们下载并开始运行这个虚拟机，你就可以以root身份登录到这台虚拟机上，登录时的用户名是root，密码是sec617。你会很快看到下面的欢迎提示信息。

看来该软件的操作很容易。那我们就按他指的方向，首先连接一个USB网卡，并确保通过这个网卡的eth0接口可以访问互联网，“欲先取之，必先与之”，毕竟我们这个虚拟机要以AP接入点的身份“骗”别的客户端连接后上互联网，所以必要的服务还是要提供的。下面看看我们是否可以重定向一些数据流。

操作的确是很容易，让我们看看这“I-love-my-neighbors”网络是不是在顺利地工作了。使用一个客户端连接到该AP接入点所提供的默认“服务集标识”“victor-timko”上，然后开始浏览任意一个网站。如果一切正常，你应该看到类似图5-3所示的画面。

图5-3　使用I-Love-my-neighbors网络

等一下！那只猫的图片是上下颠倒的，没关系，这是Wired网站的标志（logo）。至于为什么是颠倒的，下面我们就去看看neighbor.sh文件是怎么完成这个壮举的。

5.2.1　创建AP接入点

在neighbor.sh脚本中，我们创建了一个AP接入点，该接入点与用户提供的USB无线网卡相关联，并且需要在命令行中指定这个无线网卡使用接口wlan0，因为其他的配置就和一个普通的AP接入点一样，所以可以直接将某个AP接入点的配置模板与此合并，并创建一个类似下面的配置文件：

当neighbor.sh创建完这个AP接入点以后，只需要执行“hostapd/etc/hostapd/hostapd.conf”命令使AP接入点运行起来。

5.2.2　分配IP地址

当有一个客户端和我们的AP接入点建立关联以后，该客户端要做得第一件事是试图申请一个符合该网络规则的IP地址。在大多数的无线网络中，IP地址的发放使用“动态主机配置协议”（Dynamic Host Configuration Protocol，DHCP）。具有这样功能的程序很多，比如isc-dhcp-server就是一款，“I-love-my-neighbors”虚拟机也包含了一个该软件的模板配置文件（template configuration file），其文件名为dhcpd.conf。具体描述如下。

文件中，关键的值都以粗体显示。值得注意的是，当一个客户端通过DHCP服务器申请IP地址时，DHCP服务器可以同时将默认的路由IP地址和“域名解析服务”（DNS）服务器的地址一并给客户端。路由地址可以使用美国的默认路由，DNS服务器可以使用Google公司的域名服务器IP地址。

5.2.3　搭建路由

很多人一提起“路由”（routing），通常马上会想到那些安装在机架上，价格昂贵的Cisco或Juniper设备。事实上，任何具有两个或两个以上的网络接口，可以进行路由的计算机都可以称作“路由器”。在我们的例子中，虚拟机就是从一个网络无线接口wlan0的“进接口”（inbound）接收到本地客户端数据，通过一个网络有线接口eth0“出接口”（outbound）中将数据发送到互联网Internet上，然后再将互联网返回的数据按相反的路径传送给本地客户端。下面的例子中，假设网络无线接口wlan0使用的IP地址是10.0.0.1。

在Linux操作系统上，我们要完成这个功能，只需要两个命令即可。第一个命令就是设置无线网络接口wlan0的地址；第二个命令就是启用“IP转发”（IP forwarding），即启动路由功能。

我们可以通过使用netstat命令检测“路由表”（routing table），在这里，我们可以看到无线接口wlan0的IP地址是10.0.0/24 [1] ，而有线以太网接口eth0的IP地址是10.0.1/24，默认的路由器地址是10.0.1.1，这是有线接口eth0提供互联网接入的路由地址。如果这种设置让你感觉到迷惑易混，那么记住一个原则：在地址中，“1”的数量越多，就离你越远，就越是属于更远一级的路由。

5.2.4　重定向HTTP的数据流向

为了理解我们的路由表看上去是什么样子，我们现在可以想象一下，如果我们修改了客户端的HTTP数据流向，那么对于客户端会发生什么情况。在考虑这个问题之前，我们得想象一下有一个客户端的浏览器用户要访问wired.com网站时会发生什么情况。首先，客户端解析wired.com这个地址时，需要访问我们为他提供的DNS服务器，随后，DNS服务器会向该客户端的浏览器返回代表wired.com网站的IP地址。然后，这个客户端的浏览器又会与这个IP地址建立一个TCP连接，连接的端口是默认的80端口。连接成功以后，客户端的浏览器就会向这个IP地址发送“HTTP GET”请求。

现在，我们可以很容易地看到这个客户端的浏览器发出了HTTP请求，数据是从无线网络接口wlan0上接收到，无线网格接口的IP地址是10.0.0.1。但是这个HTTP请求的目的地并不是发给我们，这些TCP数据包只是从我们这里经过，换句话说，我们只是捕获到了这些数据包。我们可以尝试制作一个TCP数据包，并将其回送给这个客户端的浏览器，希望通过这种方式“击败”真正的服务器（就是wired.com网站的服务器），不过，还是先把这种想法雪藏起来，以备奇效。相反，在这里我们要做的只是通过使用“IP表”（iptable）来改变客户端浏览器的数据流向。

我们要做的第一件事就是清理我们的防火墙中现有的规则，以避免以前的配置项会对现在的修改有“后遗症”。下面的命令中，前三个命令把我们的防火墙恢复到正常启动状态，最后一个命令是确保任何来自wlan0的数据包，都必须通过防火墙。

在防火墙内核初始化结束后，要拿到有用的默认值，我们只需要改变一个规则，那就是重定向上面这个客户的数据流向。下面的规则设置就是将所有来自于wlan0的、绑定为TCP协议的80端口的所有TCP数据包统统都转到本地主机的3128端口中去。该命令的转发是针对任意IP址的。

这个时候，我们还需要再添加一个规则，那就是让所有从有线网络接口eth0发出的数据，进行一个“网络地址转换” [2] （Network Address Translation，NAT）转换。从技术的角度来说，这个规则不是必需的，我们可以没有这个规则，之所以要做这一个规则的原因是：如果不这样做，那些通过我们的AP接入点的客户端，其向互联网发送的各种HTTP请求的数据包的IP地址就是这些客户端的IP地址，这时我们AP接入点只起到了HTTP请求的“代理”（proxy）服务器的作用。而如果做了NAT转换，那么所有客户端向互联网发送的各种HTTP请求的数据包的IP地址都转换成了本AP接入点（或者说这个NAT转换服务器）的IP地址，这样从外面看起来所有通信数据的IP地址很一致。

总之，作为这两个规则的结果，来自无线网络接口wlan0的数据，将被透明地重定向到10.0.0.1：3128这个地址上。而所有从有线网络接口eth0发出的数据，其源IP地址都将是10.0.1.1。

聪明的读者可能注意到了这个计划的一个缺陷，那就是将客户端的数据重定向到我们的3128端口，可我们主机的这个端口上，根本也没有程序在监听，至于给客户端的请求进行回复，就更是缘木求鱼了。

5.2.5　用Squid软件提供HTTP内容服务

我们需要做的最后一件事情，就是在上一节所说存在缺陷的这个地方放一个“东西”，这个“东西”将响应用户的“HTTP GET”请求，并且给这些客户端的浏览器他们想要的内容。比如说，他最初所请求的网页。这是一个“代理”服务器的工作职责，下面，我们选用现在世界上最流行的一款代理服务器软件，Squid。

在“I-love-my-neighbors”的虚拟机VM中就预装有Squid软件，并且该软件的配置中默认侦听的TCP端口是3128端口。下面我们就可以开始运行Squid软件以及启动它所需要的服务，要完成这样的操作，只需要运行脚本neighbor.sh即可。该脚本会让Squid运行正确的脚本，完成运行。

一旦Squid正常启动运行，并且通过我们AP接入点访问互联网的路是通的，那么Squid就可以“控制”（handle）这个客户端的所有访问互联网的通信数据包了。在上网方面，Squid程序也做了不少合法的优化，比如将客户端用户访问过的网页，在缓存（cache）中保存一份，当用户再次访问的时候，就直接给他缓存中的网页，以便通过使用本地的缓存将带宽（bandwidth）减到最小。再比如可以对客户端用户所下载的内容进行”防病毒”扫描（antivirus scan）。

不合法的方面也不少，而这恰恰是我们所感兴趣的。比如将某个客户端所申请的网站的所有图片都恶作剧地显示成上下倒置的效果，这个功能通过flipImages.pl这个脚本实现。或者，如果我们想稍显恶意地攻击一下用户，那么可以将这个客户端下载的任何可执行文件（executable file）直接替换成我们自己的可执行文件，这个功能通过replaceExes.pl这个脚本实现。读者如果好奇都有哪些脚本，以及这些脚本都能干什么，可以到/optjsquid/sbin目录中找到所有的答案。

提示

不要设置成静态的“服务集标识”，这样的好处是，一旦客户端通过“探测请求”式扫描器查找你的“服务集标识”，如果你设置为动态的“服务集标识”，那么就可以动态地响应对方！要做到这一点，你需要运行hostapd-wpe（注意，不是“stock hostapd”），并且通过“-k”的参数将其设置为“KARMA模式”。

现在，我们了解了当有客户端通过AP接入点上互联网时，我们可以透明地修改他们上网的内容的所有步骤。后面要学习的是对于那些通过别人的AP接入点上网的客户端，我们应该如何应用上面的技术。

[1] 这是一种IP地址和子网掩码地址同时表示的一种书写形式，比如要表示一个C类网络的地址，通常是“X.Y.Z.0/255.255.255.0”，既然这样写的时候，有几位是固定死的，那就可以省略掉，于是简化成“X.Y.Z/掩码中1的个数”，其中“掩码中1的位数”中，每1个255表示8位。所以上面“10.0.0/24”的全写格式其实就是“10.0.0.0/255.255.255.0”；“10.0.1/24”的全写格式其实就是“10.0.1.0/255.255.255.0”。——译者注

[2] 在NAT转换的网络中，内网的所有访问外网的数据，在经过NAT时，由NAT进行转换，换成由NAT所在IP发出的数据，在NAT接到互联网上返回的数据后，NAT再反向转换为内网所用的格式，并返回给内网提出申请的那台主机上。这样，从互联网看内网时，只看到一台NAT主机，而内网看互联网时，并不知道有NAT的存在。NAT技术不仅能解决lP地址不足的问题，而且还能够有效地避免来自网络外部的攻击，隐藏并保护网络内部的计算机。——译者注

5.3　攻击连到AP接入点上的客户端

作为一个AP接入点，由于向客户端提供网络服务，这个时候，如果你要攻击客户端，似乎也不是很难的事。换个角度，如果你加入到一个网络中，你的身份和其他的客户端一样，你也只是一个普通的客户端，那么这个时候难度就大很多了。然而事实上，有很多技术都可以仅仅是通过应用，就达到在网络上攻击其他的客户端的效果。这些技术比如设置DHCP服务器，再比如透明地通过iptable作为代理服务器等等。所以在这种情况下，应用这些技术，你可以滥用权力，与合法的服务提供者争夺资源。还可以针对你的目标主机发动各种类型的攻击，以使和你处于竞争地位的服务器处于“拒绝服务”（denial of service）的状态。

在这一节中，我们将在基于Ubuntu的操作系统上，使用wlan0无线网络接口，攻击那些连接到“all you base”网络上，在第4章中提到的那些使用WPA密钥认证的客户端计算机。

5.3.1　连接上网

首先，我们要将我们的无线网卡连接到目标网络上。完成这样的操作，我们可以使用图形化的“网络管理”（NetworkManager）工具进行连接，也可以从命令行配置网络接口。我们可以把所有可能会干扰我们连接网络过程的程序都停掉，这包括“网络管理”程序本身、dhclient程序和wpa_supplicant程序：

下一步，我们创建一个小的配置文件，该配置文件可以让wpa_supplicant程序运行连接到缺乏抵抗力的网络上。该配置文件在最小配置内容的情况下，如下所示。

下一步，运行wpa_supplicant程序，该程序将关联并认证我们的无线网卡。

现在，作为该网络上一个正常的客户端，我们也得到了一个由使用DHCP授予客户端的客户租约（lease）。虽然这个操作方便，但这会在DHCP服务器的日志文件中留下一个访问记录，通过这个记录，网络的管理员就知道曾有黑客光临过。要避免这种情况发生，我们可以手工地设置我们的IP地址以及默认的路由，并且通过ping命令拿到一个公共的DNS服务器，然后通过这个DNS服务验证互联网上的连接可用性。

“骗子”DHCP服务器

在同一个局域网中，如果你试图入侵一个客户端，那么最好做的事情莫过于你建立你自己的DHCP服务器。虽然每个人都知道DHCP服务器可以通过输出指派客户端的IP地址，但并不是每个人都会意识到，DHCP服务器还可以做另一件隐密的事情，那就是以“推送”（push）的方式主动指派客户端的默认路由器的IP地址和DNS服务器的IP地址。从表面看，这对我们来说是件方便的好事情，但问题在于这种“推送”出来的数据是没有经过认证的（unauthenticated），并且客户端都会无条件地接受。这意味着，如果你在合法的DHCP服务器旁边，再搭建一个DHCP服务器，那么对于客户端来说，通常哪一个DHCP服务器首先对它的申请进行了响应，那么客户端就采纳该DHCP服务器作为自己的配置。

鉴于上面的说法，在这一节中，我们就在Kali版的Linux操作系统上，通过再搭建一个相同的ISC DHCP服务器。这里的ISC指的是“互联网系统协会”（Internet Systems Consortium），搭建这一系统的工具是“I-heart-my-neighbors”工具包 [1] 中的“虚拟机”VM程序。由于这是一个新程序，所以在使用之前需要先安装。

在你搭建你的“骗子”DHCP服务器之前，在有关网络的背景常识中，你至少需要知道4个关键的信息。

·子网（subnet）　你需要选择的子网，必须得和下面你要攻击的那个客户端的子网匹配。这样，任何新的客户端，只要是通过这个DHCP服务器分配到的IP地址信息，都可以与这个已配置好的客户端主机进行通信。

·网关（gateway）　你要掌控这个网络上所有用户在数据通信上的路由吗？这样做的好处很明显，那就是你会看到网上所有客户端与互联网的数据通信，并且可以基于iptable完成很多种透明代理（transparent proxying）和数据修改等操作。这一点和前面所说的功能和过程一样。但是这样做也是有风险的，如果你突然有急事必须要立刻断开这个网络，比如你的电池突然停止供电，再比如安全警卫突然向你追来，那么你配置的所有客户端都将被临时地踢下网络，稍加怀疑，他们就会发现这中间有人在捣鬼。

·域名服务器（domain server）　我们知道，在配置无线网络信息的时候，需要同时提供两个DNS服务器IP地址，如果配置了“主域名解析服务”DNS服务器（primary DNS server）指向的是你的攻击系统，这样你就可以完成上述掌控和修改的各种操作，但同时也应该配置“备域名解析服务”DNS服务器（secondary DNS server）指向的是一个有效的DNS服务器地址。这样，万一你遇上上述所说的那种需要立刻断开这个网络的时候，连在这个网络上的客户端仍然还可以继续与互联网进行通信。

·lP地址的范围　这里的“范围”指的是你要分发给客户端的一组IP地址。理想情况下，这个范围应该与你所要“附着”的网络所使用的子网具有一样的范围，但你所“附着”的网络有自己正常的路由器，有正常的子网，所以如果你的路由器也采用同样的配置，就会因为冲突而无法使用。不过，事实上还是有章可循的，比如，许多家庭网络IP地址分配的范围是X.Y.Z.100~X.Y.Z.200，给我们留下了足够剩余IP地址分配空间，则我们可以使用X.Y.Z.20~X.Y.Z.50的范围。

在下面的例子中，我们假设在10.0.1/24子网范围内。网络原来真正的路由器IP地址是10.0.1.1，我们引导这个无线网络中所有客户端的“主域名解析服务”DNS服务器指向自己的IP地址为10.0.1.9的计算机上。

创建一个合适的配置文件，并保存为“./dhcp_pwn.conf”。操作完成后，打开一个新的终端，然后按如下的命令方式启动DHCP服务器：

在使用DHCP服务的网络中，无论是无线客户端向DHCP服务器申请关联，还是有线客户端在开机连网的时候，都会向DHCP服务器提出“DHCP租约”（DHCP lease）申请的操作。现在，如果一个客户端请求子网的“DHCP租约”，那么你的DHCP服务器和原来这个网络中合法的DHCP服务器就会产生竞争。经验表明，相比其他操作系统来说，Linux操作系统相对会更强劲，并最终赢得这场比赛。这可能是因为大多数以小型办公室或家庭式办公室为主的SOHO（Small Office and Home Office）路由器电源的功率相对较低，或者在广域网WAN的连接中，这些路由器在与DHCP服务器进行通信时，数据在二者之间往返的时间（roundtrip time）较长。所以，如果有朝一日你发现你在这场比赛中总是败北，那就优化DHCP服务器、减少快速响应时间，总之，你这些在时间上的投资，都将是有价值的。

对“骗子”DHCP服务器的应对措施

不幸的是，对于一个网络管理员来说，像DHCP和“引导程序协议”（Bootstrap Protocol，BOOTP）这样的协议，其数据通信都不需要认证，否则拒绝针对这些协议的攻击就不会束手无策了。唯一真正有效的对策是时刻监视恶意DHCP服务器，一旦发现有就快速做出反应。对于勇猛无比的网络管理员，可能还需要将整个网络系统基于IPv4的IP方案向基于IPv6的IP方案做迁移操作，因为在IPv6的方案中，DHCP服务器所担任的角色已明显不再是一个举足轻重的重要成员了。

用Metasploit运行“骗子”DNS服务器

既然我们已经配置好了DHCP服务器，下面就需要配置一个DNS服务器。在使用哪款DNS服务器上，你有许多选择，最简单的一款就是Metasploit软件中的fakedns模块。

下面的命令可以将fakedns服务器配置成查询模式。对于每一个不在程序中标为“TARGETDOMAINS（目标域名）”列表中的查询，该服务器都可以返回正确的答案。在下面的例子中，“TARGETDOMAINS（目标域名）”列表主要是*.cacheheavyindustried.com 网站和www.wired.com 网站上的列表。

现在，我们需要做的是等待客户端续订一个DHCP租约。一旦有客户端续订DHCP租约，我们就可以在DHCP服务器窗口中看到和下面内容类似的信息显示。

如果随后再看这些内容时，那么我们就可以看到一些DNS的查询，就像下面显示的一样。

到目前为止，所有的结果看起来都还不错。但当用户浏览到www.wired.com 网站时，会发生什么呢？不幸的是，这里的查询戛然而止，内容一下子变少了。为了分析原因，我们理一下思路，当通过DNS服务器查询www.wired.com 网络的IP地址时，查询的数据被重定向到我们预设的攻击系统Squid所在的IP地址10.0.1.9上。根据以前的内容，我们知道这是一件好事，因为我们的攻击系统就在那里，但放在这里的攻击系统并没在从80端口上监听到任何东西，这又成了一件坏事。找找原因，原来部署在这里的Squid监听的是3128端口，而现在要监听的却是80端口。由于Metasploit已经处于运行中了，如果不想停掉Metasploit，我们还可以使用其中的http_capture模块，下面我们就展示如何在Metasploit中开启http_capture模块，并在模块中指定攻击系统的IP地址。

注意

如果你已经开始了一个msfconsole程序新的会话（session），那就像在本章前面所说的那样，可以启动一个autopwn模块，这个模块也可以与hup_capture模块一起使用。

现在，当客户端用户用浏览器浏览到目标列表中的某个域名时，该浏览器的所有数据包都将被重定向到攻击者的系统中，http_capture模块将回送这个客户端浏览器一个页面，该页面包括以下内容：

·一个定位到data/exploits/capture/http/index.html文件的模板；

·一个指向AUTOPWN模块的HTML语言的<iframe>页面帧数据；

·一系列<iframe>形式的表单提交页面：http://www.someservice.com：80/forms.html 。

提示

这个http_capture模块在窃取用户的cookie、定制网页显示广告商标等方面，有许多先进的功能。想了解更多关于这方面的内容，可以从data/exploits/capture/http/index.html文件中进行详细查看。

当前模板重定向后会显示黑底白字的“载入中（Loading）”提示信息，如图5-4所示。如果你想换成别的内容，有两种方法，一种方法是通过编辑软件修改index.html文件，还有一种方法就是设置软件中“TEMPLATE（模板）”选项，将其修改指向别的页面文件。在AUTOPWN模块中的iframe项，其主要作用是在那个被我们黑掉的客户端浏览器上进行显示的同时，暗地里做一些其他的事，在“data/exploits/capture/http/”目录中，随后的这一系列iframe帧，可以绕过“HTTP Same Origin Policy”（简称为SOP）软件，在被黑浏览器上显示的同时，可以偷偷地将这个被黑主机上许多浏览器作为访问记录的cookie文件 [2] 偷偷地拿到，回传到我们的AP接入点（就是我们那个Squid攻击服务器）上。

图5-4　载入中

对“骗子”DNS服务器的应对措施

要避免“骗子”DNS服务器式的攻击，最实际的办法是取消由DHCP服务器动态分配DNS服务器的IP地址，改为自己动手静态设置DNS服务器的IP地址。虽然这种技术不一定会阻止一个黑客进入网络，但它将使其攻击的速度慢下来。当对方意识到你的DNS请求是到一个固定IP的服务器时，对方也会相应地调整他的网络设置。关于静态DNS服务器的好处是：静态DNS服务器不像静态ARP的设置（它在很大程度上是不可行的）那样，这种设置通常不会引起很多麻烦。

[1] 注意，名称已由原来的“love”，转换成“heart”。——译者注

[2] cookie本意是“饼干”，但其作用与饼干毫不相关，并且所有的计算机书对本词也都不作翻译，所以本书也仍然采用原称。cookie文件是浏览器在用户的客户端上留下的访问记录。想想我们上某个网，可以让浏览器“记住”以前曾输入过的密码，下次使用的时候不需要再重新输入，其原理就是密码保存到了cookie文件里，可见该文件的作用和重要性。——译者注

5.4　ARP欺骗

另一种通过在捕获网上的数据包，以及发送给目标客户端，进而实施欺骗的技术，叫作“ARP欺骗”（ARP spoofing），其中的ARP指的是“地址解析协议”（Address Resolution Protocol），是一种用于在本地子网上，将第4版IP地址（即IPv4）转换为MAC地址的转换协议 [1] 。早期的主机名和IP地址之间的映射关系是如表5-2所示的关系重建（re-create）的 [2] 。

表5-2　被攻击者和攻击者的地址映射表

我们来想象一下，Windows笔记本电脑在刚刚开机的时候，就像从睡梦中醒来的人脑子一片空白一样，它有一个空的“地址解析协议”地址列表（简称“ARP表”。顺带说一句，ARP表中的项通常每一分钟或两分钟就会刷新一次）。现在它需要与Internet进行通信，可它知道自己的默认网关是在10.0.1.1，却不知道它的MAC地址，现在的问题是，在广域网中，要访问Internet，就必须先连接到局域网中网关的IP地址；而在局域网中，要与某台主机进行通信，使用的是其MAC地址。那么现在这个Windows笔记本电脑要做的第一件事就是发送一个数据包，这个数据包的形式如下：

上面的ARP“who-has”数据包中，是假设有一个IP地址为10.0.1.104的主机以广播（broadcast）的方式发出一个“地址解析协议”ARP数据包，数据包的内容解读为“谁有10.0.1.1这个IP的MAC地址，请告诉10.0.1.104这台主机”。正如你想象的那样，在接收到这样的这个广播信息以后，路由器（router） [3] 将会回应这台主机。

上面数据包的意思很浅显，就是“10.0.1.1这台主机的MAC地址是“00：fe：ed：40：95：b6”。我们其实可以通过Windows笔记本电脑的角度来看这整个过程。在上面操作结束后等上一小会儿，我们就可以通过“arp–a”的命令来检查ARP表的最新状态，这时，你会看到一个非常小的ARP缓存。

现在，如果我们做一些事情，只要该动作可以导致一些数据流向网关，那么上面的ARP表就会因为笔记本电脑向网关发送了ARP“who-has”数据包而发生改变。例如，我们可以ping一下Google的公共DNS服务器的IP地址，虽然我们ping的是外网的地址，但由于ping的数据包经过网关，所以等同于数据流向网关，因而，很快，Google的公共DNS服务器的IP地址就会被加入到ARP表中。

同样的，如果我们如法炮制地把路由器上的“ARP表”也都列出来，我们就会看到在列表中，对于我们自己的这台笔记本电脑，有下面的一项。

所谓“ARP攻击”（ARP poisoning），就是修改客户端主机上的“ARP表”，以及尽可能地修改网络上的路由器中的“ARP表”。例如，如果我们想让某台Windows笔记本电脑相信，其实“我”就是它的“上游路由器”（upstream router），那么，所有我们需要做的，只是在这台笔记本电脑上向外发送一个数据包，在数据包中“说”如下的内容 [4] ：

那么我们可以按如下的命令格式发送命令：

在进一步“ARP攻击”之前，让我们先设想一下，如果从Windows操作系统中通过ping命令测试8.8.8.8这个IP地址，那么将发生什么事。首先，我们的客户端主机会检查它的“路由表”（routing table）怎么做才能连接到8.8.8.8这台主机，随后，我们的客户端发现，要想完成这样的操作，首先得发送数据包到其IP地址为10.0.1.1的上游路由器。然后，为了与10.0.1.1通信，我们的客户端会检查“ARP表”，以便查找IP地址为10.0.1.1的主机的MAC地址。由于在上面的命令中，我们已将10.0，1.1这个IP所对应的MAC地址改成了一个假的00：c0：ca：52：dd：45地址，所以这时我们的客户端会误将这个地址认为是默认网关的MAC地址。最终，上面我们的客户端本来是想通过ping命令向IP地址为8.8.8.8的地方发送“Internet控制报文协议回声查询”（ICMP Echo Request）数据包，结果到了MAC地址为00：c0：ca：52：dd：45的地址上。如果我们恰好有一台Linux操作系统主机的MAC地址就是这个，那么这个数据包就会到达我们这台Linux操作系统的wlan0接口上。

现在，假设我们的Linux操作系统主机就是如上所说地使用那个MAC地址，那么这个主机又会做什么呢？对于接收到任何类型的数据包，一般的计算机处理办法都是一样的。首先，在防火墙（firewall）这一关会应用所有的规则对这个数据包进行审核，能通过则继续，不能通过则扔掉。其次，尽管这个数据包到达的是wlan0无线接口，但其最终目的是8.8.8.8这个IP地址，要知道，这个IP地址可不是我们自己。如果我们的客户端上允许“IP转发”（IP forwarding），那么作为攻击者的系统就可以像一个正常的路由器一样，越俎代庖，将这个IP地址转发到互联网上去。这就是说我们首先会查找自己的“路由表”，然后发现要连接外网的8.8.8.8，必须先与10.0.1.1这个网关联系，然后我们的攻击系统就会询问我们的“ARP表”那个10.0.1.1这个网关的MAC地址，这时查到该MAC地址是00：fe：ed：40：95：b6 [5] ，最后，我们的攻击者会将数据再回到wlan0接口并发送出去。

提示

你可以通过运行“cat/proc/sys/net/ipv4/ip_forward”命令检查“IP转发”的项是不是设置为“允许”状态。

在这一点上，数据包将会按正常的路由线路传出网络，并最终到达8.8.8.8这个IP地址，也就是前面5.2.2节中说的Google网络地址。当这个地方回复以后，那么回复的数据包又会以相反的路由线路，再次回到这个局域网的合法默认网关10.0.1.1这里。现在的问题是，这个回复数据包从网关出来后的线路会是什么样的？是直接送到我们攻击过的那个Windows客户端上？还是回到我们自己这个负责攻击别人的客户端上？

如果你的答案是“直接送到我们攻击过的那个Windows客户端上！”，那就自己表扬一下自己吧，恭喜你，答对了！这个“ARP-Reply 10.0.1.1 is-at 00：C0：CA：52：DD：45”的命令所对应的数据包送到那个Windows客户端上的原因是：我们只是修改了Windows客户端上的“ARP表”，而没有改变路由器上的“ARP表”。

除了上面的“ARP攻击”，如果我们想使用“ARP欺骗”，以便可以看到双向完整的对话内容（有时称为“全双工” [6] （full-duplex）），这时，我们需要传送逆向数据包给“上游路由器”。在这种情况下，需要发送“ARP-Reply 10.0.1.104 is-at 00：C0：CA：52：DD：45”命令，以便再次“欺骗”网关，那个本应给被攻击客户端的数据，先发到发动攻击主机这里。完成上述操作，我们可以通过运行一个名叫arpspoof的程序来自动完成，并且在需要使用最后一项功能的时候，在命令行中使用“-r”参数告知程序。

提示

当我们能够控制别人“ARP表”的时候，你会看到你的Linux操作系统会生成“Internet控制报文协议重定向”信息的数据包。在路由器上，当这个数据包从一个接口进去，然后“返程”（goes back），又从这个相同的接口又发送出来，那么就说明这是客户端配置错误所导致的结果。这里的“Internet控制报文协议重定向”数据包是一种文雅的方式，是告诉那个被攻击的客户端在读取客户端的“ARP表”时，要按表中的顺序进行读取。如果你想禁用掉“Internet控制报文协议重定向”功能，可以使用命令“echo 1>/proc/sys/net/ipv4/conf/all/send_redirects”，在这个命令实例中，“1”表示关闭Linux内核中所有的“Internet控制报文协议重定向”，而只接收和发给“默认网关列表”中，网关的ICMP重定向消息。

使用“ARP欺骗”，通过控制网络的能力，我们可以进一步通过“修改数据包”（packet modification attack）攻击的方式入侵这个网络上的客户端设备。

在Linux内核之外修改数据包

在部署好“ARP欺骗”的网络中，要完成一个攻击，从攻击者这里发送出去，并发向预谋攻击的客户端的数据包，是由Linux内核完成的。这个结论我们可以很容易验证出来，因为我们禁掉内核中的“IP转发”功能（可以通过echo命令echo"0">/proc/sys/net/ipv 4/ip_forward实现），那么IP地址为10.0.1.104的Windows操作系统的客户端就会丢掉所有的网络连接；如果我们恢复内核中的“IP转发”功能，那么那台Windows操作系统的客户端又会开始重建网络连接。

让Linux操作系统内核转发某个被你攻占过主机的IP数据包有几个好处，不但性能稳定，而且速度很快，并且还很少占用CPU资源。但这样做，也有一个特别明显的坏处，那就是你使用内核转发数据包的时候，直到这些数据包被转发出去，你都无法修改这些数据包。

现在，如果我们有一个程序，不是通过Linux操作系统的内核进行数据包转发的，那会怎么样呢？作为一种好的替代方式，这个程序先从一个接口上读取到数据包，然后检查一下数据包的内容，还可能修改一下数据包内容，达到我们想要的效果，然后参考我们的路由表，再将这个数据通过它原来要用的正确的接口发送出来。

Ettercap程序就是一款具有这样功能的程序。这个程序具备作为一个“ARP欺骗”攻击工具的主要特点。不过，如果我们把Ettercap称为“ARP欺骗”工具，那就像我们把IE浏览器称作“一款可以看JPEG图片的程序”一样。是的，Ettercap可以用作“ARP欺骗”，IE浏览器也肯定可以看JPEG图片，但是很显然这种说法缺少点东西。

Ettercap不像以前的例子中还需要通过Linux操作系统的内核才能把数据包转发给我们要攻击的客户端上，相反，现在使用Ettercap时，禁止内核级（kernel-level）的数据包转发功能就可以让Ettercap代替内核，为我们提供数据包转发的功能了，因为Ettercap负责转发数据包的时候，我们有机会修改这些进进出出的数据包。要达到修改数据包的目的，我们只需要使用Ettercap软件中的“过滤功能”（filter feature）就行了。

5.4.1　使用Etterfilter程序编译过滤器

在Linux操作系统的主机上，安装Ettercap程序和安装该程序相关的工具，是件简单且直接的事。

在安装结束，运行之前，我们需要创建一个“过滤器”（filter），并将该“过滤器”编译到Ettercap的二进制文件中，格式如下所示。作为例子，我们假设这个“过滤器”文件名为lolcat.etter。

上面代码是修改的第一部分，其作用是将所有要攻击用户数据包中，HTTP头部的“Accept-Encoding”标识都换成“Accept-Rubbish！”标识。乍看这样做很愚蠢，但这样修改却可以阻止客户端得到的压缩格式数据 [7] ，不过，这种修改有些不切实际。

这个脚本中，下一个修改的部分，是把网页代码中的“<BODY>”（或“<body>” [8] ）标签用一个JavaScript脚本片段代替，将我们要攻击的客户端重定向到任意我们想要的位置。通常情况下会修改这个重定向，让它指向一个事先运行好的browser_autopwn服务器的IP上，这样当被攻击的客户端拿到这个页面以后，会转而访问“自动化漏洞使用服务器”browser_autopwn服务器。不过，如果你感觉到这样做还不够“黑”，那就将这个重定向指向你所喜欢的任何地方。比如，你比较喜欢小猫的图片，那就把它重定向到一个以小猫为主要展示话题的网站上。

要让上面的源代码生效，被最终被Ettercap所实别，还需要通过Etterfilter程序对上面的代码进行编译。完成上面的操作，就可以用Etterfilter程序编译上面的这个过滤器了，其过程如下。

Etterfilter程序只是完成脚本的编译工作，而要使这些过滤生效，还需要运行Ettercap程序，并以参数的方式，将Etterfilter编译的结果“./lolcat.ef”读入并执行。所以，最后一步，我们运行Ettercap程序。

提示

默认情况下，Ettercap程序正常运行时，需要禁用内核级的“IP转发”。如果不禁用，那么对于一个网络接口来说，每进入一个“进接口”的数据包，就会有两个“出接口”的数据包。一个数据包由内核转发，一个由Ettercap程序转发。

Ectercap的命令行各命令之间，以及该程序中很多术语之间，都有很多混乱现象，所以我们要详细地述说一遍。前三个参数指定的依次是：使用基于文本方式的用户交互方式（即“-T”参数）、使用wlan0无线网络接口、我们在前面编译时所用的过滤参数（即“-F./lolcat.ef”参数）。随后的两个参数是让这个被攻击的客户端最终指向哪里。

“-M arp”参数指的是让Ettercap使用ARP“中间人攻击”（Man-in-the-Middle，MitM）技术进行攻击。Ettercap程序将会扫描所有wlan0接口所关系的子网上所有的客户端。在前面的例子中，子网使用的是10.1.0.0/24这样的子网，而这样的子网共有255种IP可能，所以程序会在wlan0这个无线接口上，生成255种不同ARP“who-has”查询数据包。

一旦Ettercap完成了对所有客户端主机的扫描工作，下面就会把所有的扫描结果告诉我们了。如前所述，子网地址是10.1.0.0，其中的10.1.0.104是我们自己。所以扫描器会告诉这个子网上的所有主机“10.1.0.104在扫描你们”，同样，扫描器也会告诉10.1.0.104“网上所有被扫描的主机都在下面列着”。当Ettercap完成扫描过程以后，Ettercap所在的10.1.0.104主机上，“ARP表”看起来如下所示：

一旦扫描工作完成，“被攻击的那个工作站就会转发自己的数据包到实施攻击的黑客主机上。Ettercap就开始显示网络上来来往往的数据包，在你屏幕上显示的速度肯定会远快于你的阅读速度。你可以通过“空格键”（SPACEBAR）暂停屏幕的快速滚动。

一旦上面的操作完成，你就可以通过“h”命令显示在线帮助信息。另外一个有用的命令是“l”（小写字母L），列出目前发现的主机，如下所示：

如果有一个客户端在上面的列表中显示出来，就表示这个客户端的过滤信息已被修改，加之前面脚本代码中，“下一个修改的部分”中，只要过滤完成，就会提示“过滤已执行”（即代码中的“msg（"Filter executed.\n"）；”）的信息。所以这时你就会看到一些“过滤已执行”的提示信息。

Ettercap程序在显示了几条这样的消息以后，客户端的用户就会看到一些可爱的小猫图片。当然，如果我们事情已部署了更坏的念头，那我们就可以直接用browser_autopwn服务器上的内容代替他本应收到的内容。

对“ARP欺骗”攻击的应对措施

要免受“ARP欺骗”的攻击，有好几种保护自己的方法。有一些“防病毒”（AntiVirus，AV）产品会监控你的“ARP表”，如果这些“防病毒”软件发现有任何可疑的东西，它们就会立即提醒你，有程序正在修改“ARP表”，这是个好的开端。一个可以完全杜绝“ARP欺骗”攻击的方法是设置一个静态的ARP接口，并将这个ARP接口设置为默认的网关地址。这个方法在黑客会议上，会经常被黑客推荐，但这种方法需要同时满足两个条件，其一就是必须成功地保护上游网络对客户端系统的各项活动；其二是对于客户端系统，没有再设置类似的静态ARP映射作为默认网关。另一个可以完全杜绝“ARP欺骗”攻击的方法是使用“虚拟专用网络”（Virtual Private Network，VPN），在VPN中，所有“出接口”的数据包收发行动都将被封装（encapsulate）和加密。

幸运的是，对于“地址解析协议”ARP的各项操作中，在Windows操作系统、Linux操作系统和OS X操作系统中，其命令格式都是相似的。比如，在上述所有这些主流操作系统平台上，你都可以使用“arp-a”命令查看当前的“ARP表”，也都可以显示“arp–s”命令手工设置一个静态的ARP“IP地址-MAC地址”映射关系（ARP entry）。下面的例子就展示了如果查询你的ARP表和如果输入静态的映射关系：

在这个例子中，我们说192.168.2.1是你的默认网关，并且你也坚信这个默认网关当前没有被黑客攻击。那么如果你想把这个默认网关的“IP地址-MAC地址”映射静态关系手工地添加到自己的“ARP表”中，进而避免攻击者的“ARP欺骗”攻击，那么你可输入以下命令：

提示

在Windows操作系统中，使用arp命令时，在表示MAC地址的时候，要用半角破折号（即“减号”）代替半角“冒号”来分隔各个数字。 [9]

当然，最迷惑的地方就是你在“ARP表”中做这样的“IP地址-MAC地址”映射关系有什么用？在基于802.11无线网络中，你的这个映射关系其实就等于你无线网络的“基本服务集标识”，或者是当“基本服务集标识”有多个的时候，它是其中的一个。而在基于以太网络中，通过这样的“IP地址-MAC地址”映射关系可以做任何事情。所以，无论是无线网络，还是有线以太网络，“ARP表”都是很重要的安全因素。通过真实的“上游路由器”进行二者的转换固然是好，但如果没有前面的所说的背景知识，我们又该怎样避免“ARP欺骗”攻击呢？最好的办法，就是先找到那个我们想知道MAC地址的主机IP地址，然后随便通过什么办法，与这台主机的IP地址“连接”一下，检查一下你的“ARP表”，你就会发现这台客户端主机的“IP地址-MAC地址”映射关系就会加入到我们的“ARP表”，并且是“静态”的状态。但在做这种事情的时候，必须先保证你所连接的那台客户端主机没有被“ARP攻击”过。否则，即使你连接成功，拿到的也是假的MAC地址。

通过hostapd-wpe（KARMA）动态生成“骗子”AP接入点

在前面的例子中，我们总是通过手工的方式，先把网络的“服务集标识”设置成我们要冒充的那个网络的“服务集标识”，然后静等“认识”那个网络“服务集标识”的客户端来连，但如果被冒充的无线网络“服务集标识”是隐藏的，就至少得等到其“服务集标识”暴露出来，才能冒充。实际上，有一些客户端，当它们在查找某个“服务集标识”网络的时候，会使用“探测请求”数据包进行扫描，在所发送的数据包中包含有这个“服务集标识”，利用这一原理，我们还可以实施一些“骗子”AP接入点，“以动制静”地吸引他们的加入。首先，有客户端在网络中发送寻找AP接入点的数据包，实际上等同于有人在人群中大喊一声“喂，X网络，你在我周围吗？”，似设有个“服务集标识”为“Y”的攻击者看到这些请求以后，就会马上把自己的“服务集标识”由“Y”改为“X”，并回复道“是的，我就是X，我在这儿！”，接到回复后的客户端就会遵照协议进行连接，然后攻击者就可以想尽办法诱惑被攻击的客户端来上我们安排的“骗子”网络了。

第一个实现这种攻击方式的工具，叫作KARMA。这个软件是由Dino Dai Zovi和Shane Macaulay（外号“K2”）于2004年共同完成的。此后，这项技术已经被越来越多的互相迭代引用，最近的软件版本是hostapd-wpe（Hostapd Wireless Pwnage Edition）。有关hostapd-wpe软件详细的获取方式，以及编译过程，可以参见前面相关章节的内容 [10] 。

在下面的示例中，我们在部署hostapd-wpe软件的时候，故意起一个很具诱惑力的名字“免费Wi-Fi”作为我们无线网络上的“服务集标识”。现在有个Windows客户端还没有被我们的这个无线网络“钓到”，该客户端目前也没有连接到我们这个不明无线网络的念头，所以面对这样的“柳下惠”式客户端，我们还真没有好的办法。不过，现在这个客户端的“偏爱网络列表”（Preferred Network List，PNL）中，有一个隐藏网络的“服务集标识”。当这个客户端想连接这个隐藏“服务集标识”网络时，它会发送一个“探测请求”数据包到这个网络的AP接入点。这就像人群中的这个人大喊一声“隐藏网络，虽然你隐藏了，但我知道你的服务集标识，现在我想连接你”。hostapd-wpe听到有人这样喊，它马上就修改自己的“服务集标识”，并将其改为所听到的这个“服务集标识”，然后回复这个客户端说自己就是他要找的那个网络。那么这个客户端就会认为这个客户端就会认为hostapd-wpe正是它想要找的那个无线网络AP接入点。

提示

Windows客户端出于安全的原因，在发出“探测请求”后，对于网络中的回复，如果在“偏爱网络列表”中的，就会拒绝接受。但在任何开放的网络环境中，比如一个支持客人无密码连接的无线网络中（guest network）、在咖啡店、旅馆等的无线网络中，Windows客户端都仍然容易受到“模拟攻击”式的攻击（impersonation attack）。

对动态生成“骗子”AP接入点的应对措施

现代无线客户端，要想防范动态生成“骗子”AP接入点，就需要像上面所说的那样，避免发送直接的“探测请求”数据包，除非它不得不发这样的数据包。具体来说，在Windows操作系统和Mac OS X操作系统中，除非在“偏爱网络列表”中有隐藏的网络中，否则这些操作系统的客户端是不会主动发送这种“探测请求”数据包的。这样做的原因是：在隐藏网络中，AP接入点不会广播该网络的“服务集标识”，所以需要客户端通过发送直接的“探测请求”数据包，才能发现该AP接入点是不是“活”着的。但即使是发送这样的“探测请求”数据包，在数据包中还是包含有“服务集标识”，黑客仍然可以通过嗅探的方式捕获到这个间接拿到的“服务集标识”。所以作为一个用户，避免这种攻击方式的最好办法就是不连接到这个隐藏的网络上。如果你是一个无线网络的管理员，那么你应该确保你所有的无线网络的配置都是非隐藏的，也就是通过广播发送“服务集标识”的网络。

这些无线攻击方式都是黑客们最现实的选择。但在Linux操作系统上，要想高效地使用它们，还需要有一定的Linux使用技巧和工具使用经验。不过，这种困局在逐渐被打破，如一个叫作“Wi-Fi小菠萝”的工具，正在突破黑客最后的这些障碍。

“Wi-Fi小菠萝”针对客户端的攻击

正如在第3章中学到的那样，“Wi-Fi小菠萝”是一个由Hak5组织开发的专用设备，售价是99美元。设备网址是http://hakshop.com/ 。这个设备的目标是极大简化Wi-Fi攻击的复杂性，事实上，设备的发明者最终通过各种措施实现了这一目标。

第五代“Wi-Fi小菠萝”使用一个AR9331芯片组的片上系统（SoC），MIPS处理器，16MB的ROM，64MB的RAM，两个无线网络接口，一个以太网络接口，一个SD卡接口和一个USB接口。使用一个基于流行的OpenWRT项目的Linux分布式版本作为其操作系统。该“Wi-Fi小菠萝”还在Linux操作系统中预先配置了许多必要的黑客工具，通过这些工具，可以借助于无线网络中常见的漏洞实施攻击。更重要的是，“Wi-Fi小菠萝”中缺少的工具，可以很容易地通过访问“菠萝酒吧” [11] （Pineapple Bar）获得。

就像本章中其他的那些攻击技术一样，“Wi-Fi小菠萝”的配置十分简单。比如配置成冒充的一个开放型Wi-Fi的热点网络AP接入点，只需要寥寥几步，这种操作，只需要在“Wi-Fi小菠萝”上，将其默认的“服务集标识”修改成你所要冒充的那个“服务集标识”即可。在程序中完成这个操作，就是单击“网络（Network）|访问点（Access Point）”菜单就可以修改默认的“服务集标识”值。或者，通过使用集成在“Wi-Fi小菠萝”中的KARMA功能，也可以修改默认的“服务集标识”。在“Wi-Fi小菠萝”运行KARMA攻击非常简单，只需要按下面的步骤即可：

1）在登录“Wi-Fi小菠萝”后，单击界面上标为PineAP的“tile条”。 [12]

2）滚动鼠标，将光标移动到“客户端免攻击黑名单”（Client Blacklisting）区域，然后将你自己的所有攻击设备的MAC地址，加入到免攻击黑名单中，以避免在攻击中火拼，误伤自己。

3）关闭当前的“tile条”，返回到主窗口的“tile条”列表上，单击“开始”链接，跳转到MK5版的Karma软件的启动环节。

随着MK5版Karma攻击开始，“Wi-Fi小菠萝”回应了除了“免攻击黑名单”中的那些设备“探测请求”。如果某个客户端正在查找开放的网络，那么KARMA软件将会回复这个客户端，并引诱它到“骗子”网络上。

这个简单的机制，可以在无线网络上发起一次“中间人攻击”，但它对于攻击者的用处是有限的。不过，通过“菠萝网吧”，我们可以很容易地将“Wi-Fi小菠萝”的这个功能扩充成网关的形式，然后借助该网关，可以避开被攻击客户端采用“安全套接层”的通信，解析被攻击客户端的证书认证，以及读取被攻击客户端上的cookie数据。

首先，配置“Wi-Fi小菠萝”，以便它可以通过其以太网口连接到Internet上，或者通过另一个Wi-Fi无线网口连接到一个可用的网络地址上。其次，从系统的主菜单中打开“菠萝网吧”的“tile条”。

在“菠萝网吧”的“tile条”上，单击“菠萝网吧（Pineapple Bar）|可用（Available）”的链接，就可以安装sslstrip和trapcookies的“用户注入”（Infusion）功能。（这里的“用户注入”指的是攻击时所用的脚本，采用由“Wi-Fi小菠萝”提供的脚本。）下一步，关闭“菠萝网吧”的“tile条”，返回到主“tile条”列表上，这时，你会看到两个新的“tile条”窗口出现，整个界面类似于图5-5所示。

图5-5　“Wi-Fi小菠萝”整体界面图

“陷阱Cookie攻击”（Trap Cookie）工具是通过在whistlemaster日志中注入所有观察到的cookie内容。这种信息对于“会话劫持攻击”（session hijacking attack）非常有用，比如，对“火狐插件Cookie管理+”（Firefox add-on Cookies Manager+）这个软件来说，“陷阱Cookie攻击”工具可以将某个被攻击的客户端浏览器中的cookie加载到攻击者浏览器中，那么攻击者的浏览器就可以访问原来只有被攻击的客户端浏览器才可以访问的网站了。运行“用户注入”功能非常简单，只需要在“陷阱Cookie”的“tile条”上单击Start链接即可。

“SSLStrip注入攻击”（SSLstrip Infusion）也是使用whistlemaster工具，利用“中间人攻击”操纵网络上在被攻击主机和其“上游服务器”（upstream server）之间的数据通信。这种攻击方式在Linux操作系统上，最早的程序是由Moxie Marlinspkie实现的。其原理是：SSLstrip工具在网络通信的过程中，一旦接到来自客户端的HTTP头中有“安全套接层”重定向信息，就可以知道这是一个HTTPS的连接（注意，这不是链接），这时SSLstrip就会停止转发这个客户端所发的信息，去掉HTTPS连接中的“s”，将其变为没有“安全套接层”的普通HTTP连接，继续保持着与该客户机的连接，然后从HTTP头中找到这个客户端原本要连接的“安全套接层”连接“上游”的合法服务器，并通过使用“安全套接层”的方式，以HTTPS的方式与“下游服务器”进行通信。这时作为攻击者的“中间人”，与服务器采用的是HTTPS的“安全套接层”通信，而与客户端采用的是HTTP的非“安全套接层”通信。所使用的内容是客户端提供的，所拿到的结果，又是服务器回复的。当一个用户在访问一个网页的时候，如果没有明确地指明“https://www... ”，SSLstrip工具就可以通过“中间人攻击”操纵双方的数据交换，而客户端也不会再使用加密的会话。

要使用“SSLStrip注入攻击”，只须打开程序的“tile条”接口，单击Install链接。然后单击Start链接以便启动SSLStrip攻击。每当有客户端设备连接到“Wi-Fi小菠萝”（这个时候，它的角色是AP接入点），并且通过它，采用HTTP的方式访问一个兼容支持“安全套接层”站点时，“Wi-Fi小菠萝”（这个时候，它的角色就变成了攻击者）就会像上述所说的那样进行内容的“交换”，这里的“交换”除了协议格式的变换，当然中间也包括了证书的认证，以及数据内容的检索。其显示效果如图5-6所示。

图5-6　SSLStrip攻击效果图

“Wi-Fi小菠萝”攻击的应对措施

对于99美元的价格，无论是对任何研究人员，或利用Wi-Fi进行攻击的黑客，“Wi-Fi小菠萝”都是一个明智的选择。从防御的角度来看，未来自己的网络发生无线攻击的可能性，“Wi-Fi小菠萝”的概率最大，原因只是这个工具真的太好用了。

在本章前面描述的许多防御技术都可以帮助你抵御“Wi-Fi小菠萝”客户端的攻击。特别是对于SSLStrip攻击，开发人员在设计程序的时候，应该避免在数据传送中，在功能上同时支持HTTP方式和HTTPS方式，对于安全要求较高的连接，支持采用对于所有连接都只支持HTTPS的方式。在Firefox的插件中，比如由Chris Wilper设计的“HTTP Nowhere”插件就是用于让客户端工作在“只要能用HTTPS方式下，就禁用HTTP方式”的模式下，这对于“Wi-Fi小菠萝”的上述攻击，无疑是一种好的防御方式。

系统管理员应该充分利用“HTTP严格传输安全”（HTTP Strict Transport Security，HSTS）的策略机制，在Web服务器上限制页面头部不安全格式的滥用。在“HTTP严格传输安全”策略机制的制约下，所有支持的Web浏览器以及服务器，在需要安全传输的场合中，都只接受采用“安全套接层”协议和“传输层安全”（Trassport Layer Security，TLS）协议的连接，而不接收二者的HTTP和HTTPS的混合兼容方式。在Microsoft公司的Web服务器Windows IIS服务器上，就有一款可以作为这款服务器的模块，这是一个开放源代码的模块，可以从http://hstsiis.codeplex.com 上下载。也可作为一个配置工具，换用到大多数基于UNIX和基于Linux改的Web服务器上，当用户试图以HTTP的方式访问某个安全网站时，“HTTP严格传输安全”可以防止攻击者执行类似于SSLStrip的攻击。

[1] 如果是反向，将MAC地址转换为第4版IP地址的转换协议，则称为“反向地址转换协议”RARP（Reverse Address Resolution Protocol）。不过，很多书（包括本书）将二者统称为ARP协议。——译者注

[2] 不知道本书原作者这句话的本意和用处。早期（还没有使用DNS服务器）的主机各和IP地址之间，是通过映射文件体现的，但是映射文件中，主机名不能像表5-2这样随意（比如不能有空格）。映射文件的方式至今在很多操作系统中仍然保留着，比如Windows XP/7/8中，默认安装时“C：\Windows\System32\drivers\etc”目录下的hosts文件（注意该文件没有扩展名）中就允许用户设置和保存主机名和IP地址的映射关系。——译者注

[3] 确切地说，回复ARP信息的应该是交换机（switch），而不是路由器。只是现在这两种设备的界限越来越模糊，所以常常混用。另外，也只有交换机会回应ARP协议，其他的主机，即使在自己的ARP表中知道这样的映射关系，也不会做出回应。——译者注

[4] 下面内容中括号内的文字是“注意，这个地址是我们故意写的一个假地址”。——译者注

[5] 这是正确的网关MAC地址，被改的是那个被攻击的客户端，除此之外的客户端并没有出错。──译者注

[6] 其实这不是“全双工”，“全双工”是指通信的双方，在通信的过程中可以随时向对方发送数据包，也可以接收对方随时发送来的数据包。而这里指的是被攻击的客户端发出的数据包在到达对方后，仍然能沿相反的方向按原路返回，有点接近于“栈结构”中“先全压栈，后全弹栈”的“回溯”流程。——译者注

[7] 通过浏览器上网，HTTP头部的“Accept-Encoding”标识表明的是浏览器发给WWW服务器，告诉服务器自己的浏览器所支持的编码类型。该标识之后冒号的后面跟的就是类型，比如“*”号表示所有类型。HTTP头部，并没有“Accept-Rubbish”这个标识，这是黑客故意开的一个玩笑。浏览器在接到无法识别的标识的时候，会过滤掉，但同时因为。“Accept-Encoding”标识被替换掉了，所以没有“Accept-Encoding”标识后，服务器会使用默认的编码类型进行发送，压缩数据不是默认类型，所以服务器就不会再发送压缩数据了，因此上面说“客户端也得不到压缩格式的数据”。——译者注

[8] HTML语言对大小写不敏感，所以这里的“<BODY>”其实包含各种大小写的组合方式，比如除了上例，还包括“<Body>”、“<bOdy>”等各种形式。实际中的“<BODY>”还带有参数，比如“<BODY bgcolor=red>”表示背景色为红色，但一个共同的特点是前5个符号都是“<BODY”，所以下面的代码中，替换的都是“<BODY”，而不是“<BODY>”。——译者注

[9] 其实除了该命令，Windows所有表示MAC地址的场合，几乎都是用减号分隔的。而在Linux中，则都是用冒号分隔的。──译者注

[10] 主要分布在4.1.7节中的内容。──译者注

[11] “菠萝酒吧”是“Wi-Fi小菠萝”中的一个程序，从用户使用的角度来说，这更像是程序中的一个界面。在连网的状态下，该程序会自动连接Hak5的网站，并将所有的工具都列出来，供用户选择下载使用。目前国内很多程序也具有这样的功能，不过，一般叫作“插件下载”或“组件下载”等。——译者注

[12] tile，又写作tally，是电视行业的专用术语，电视台一般俗称“tile条”（发音近似于“台里条”）。是指独立于视频画面之外的各种形式的提示信息。可以是字幕，也可以是走马灯的新闻提示，也可以是鼠标放上去才显示的提示信息，也可以是节目的节目名称、电视台的名称等各种形式的提示信息。在这里，可以简单地理解为某个“窗口”上面的标题栏，或理解为这个窗口。——译者注

5.5　直接的客户端注入技术

当我们试图执行一次无线攻击时，一个常见的问题就是，网络上的AP接入点拒绝在攻击者和被攻击者之间互转他们之间的攻击数据包。这种拒绝担任“中继”（relay）角色，而避免网络客户端之间互相攻击的技术，被称为“客户端隔离”（client isolation）或“公共安全的分组转发”（Public Secure Packet Forwarding，PSPF）。这种类型的安装在一些商业热点和酒店是常见的，这也完全可以理解，网络上的不同身份和来源的客户，真的没有理由互相交谈。但对于“唯恐天下不乱”的黑客来说，这却成了他们实施攻击过程中必须面对的一个问题，解决这个问题的一个方法是完全绕过AP接和点。在Aircrack-ng套件中，就包含一款工具可以帮助你轻松地做到这一点。

通过airtun-ng实现直接客户端注入

从概念上讲，airtun-ng就是上面所说的那个工具。它的工作原理是：创建一个虚拟接口（假设其名称为“at0”），通过这个接口，各个应用程序都可以正常地从中进行太网数据帧的读取和写入操作，这很类似于Linux操作系统上大多数的两层“虚拟专用网络”的实现方式。然后airtun-ng先从虚拟的at0接口上接收到任意的“出接口”以太网数据包，然后将其“以太网的头部”换成“802.11无线网的头部”，然后将这个“802.11数据包”通过无线接口注入到对应的客户端，这时，我们惊奇地发现，整个过程完全绕过了AP接入点，并且这种修改可以为我们提供一个直传通道，该通道是当前黑客的攻击客户端与另一个被攻击客户端之间，一个“只提供传送功能” [1] 的直传通道。

假设我们想发送上述直传数据包的目标客户端，就在我们自己客户端的无线功率覆盖范围之内，那么受害者在接收到这个数据包以后，就会处理这个数据包，因为在它眼里，这个数据的发送源就是AP接入点，并且也会正常回复这个数据包。但是这个客户端会将这一帧数据回送给AP接入点，不过，这没关系，因为既然大家互在对方的功率覆盖范围内，所以作为攻击者的airtun-ng，只要在“监测模式”（monitor mode），就也可以在无线接口wlan0上，通过“嗅探”（sniffing），捕获到一个回复的复制器（copy）。这次通信的数据总源头是以太网上的某个应用程序。所以过程还需要继续，这时airtun-ng随后创建一个以太网数据包，在该数据包中，填上总源头所对应的地址，并将其发送到虚拟接口at0上的应用程序那里，就完成了整个取代AP接入点的工作。总之，通过监听通道和中继作为正常以太网通信中的数据包，airtun-ng程序提供了一种不需要AP接入点合作的“中继数据帧”（relay frame）的能力。

如果你能把这些技术融会贯通，组合运用，那你就可以对指定AP接入点上关联的任意客户端进行读取和写入的操作，并且在不需要做任何修改的前提下，你还可以使用任何你想用的网络攻击工具，做到“指哪打哪”。这些网络攻击工具包含nmap和Metasploit，因为前面所用的所有工具，都是针对数据包的内容实施攻击的，并不关心数据在两个无线传输中，数据的封装（encapsulation）和解封装（de-encapsulation），而这里的airtun-ng，处理的是数据中，对内容的封装与解封装，而不关心内容传的是什么。这个过程如图5-7所示。

图5-7　airtun-ng直接注入攻击示意图

假设你已在无线网络接口上，在所需信道上设置了“监测模式”，那么下面就让我们告诉airtun-ng来建立一个针对某客户端的网络接口：

在上面命令中，“基本服务集标识”是通过参数“-a”指定的，参数“-t 0”是用于将ToDS位设置为0，同时将FromDS位设置为1。然后创建虚拟接口at0将只能与客户端进行通信。

接下来，我们需要配置虚拟接口at0。因为这与以前用过的网络相似，所以我们知道这个网络的地址是10.1.0.0/24，所以我们配置相应的接口如下所示：

请注意，下面我们是如何以明确的方式将TAP接口 [2] 的以太网IP地址，设置为我们真实无线网卡的MAC地址的。如果设置失败，最大可能的原因就是有些不连贯的地址被占用了。

现在，只要网络上，我们和任何一个客户端互在对方的无线信号覆盖范围内，我们就应该能够与它进行通信了。为了加深印象，下面我们对这种能力进行一次专项测试，在使用Nmap工具时，其测试结果如下：

airtun-ng所提供的接口给了我们足够的可靠性，以便我们进行端口扫描（port-scan），而且该软件还可以去掉Nmap软件的数字指纹（fingerprint）。

当然，这个“用户空间层所提供”（userspace-provided）的接口也不是完美无瑕的，对数据包的“重复发包”（duplicate packet）和“丢包”（dropped packet）现象也是常见的。从一个单一的用户空间层进程中，我们基本上是做一个完整的二层协议。事情不会顺利到如同我们真的是通过内核驱动程序进行通信的那种效果的。

提示

当我们在使用airtun-ng并遇到问题时，务必要检查的是，你的数据在发送时所用的MAC地址是否正确。如果不能正确的显示，那就手动设置TAP接口上的以太网地址。

在所用的技术方面，airtun-ng软件最大的优势在于，该软件除了包含其他同类软件中都有的“中间人攻击”技术，还包含了其他软件所没有的特殊“中间人攻击”技术，这一技术即使在AP接入点上已实现了“客户端隔离”（client isolation）的状况下，仍然能够正常工作。另外一个大的优势在于，airtun-ng软件集成了几乎全部基于“骗子”AP接入点的攻击技术，这意味着使用airtun-ng软件的用户可以做到“自己动手，丰衣足食”，在攻击的过程中，使用自己的AP接入点就可以了。避免了传统方式下，使用无线网络合法AP接入点时，还要费尽心机去引诱其他的无线客户端来这个合法AP接入点上进行关联的麻烦事，同时也不会被合法的AP接入点将其各种动作记入日志中。这无疑避免了通过AP接入点日志查到入侵者的行踪的危险。

[1] 由于这种方式只是为了能在各自介质上进行传输，而只修改了无线网络的头部和有线网络的头部，并没有修改其余的部分。换句话说，就是只提供数据内容的传输协议部分，而不对数据内容本身进行修改。——译者注

[2] 在虚拟以太网卡的实现中，有TUN和TAP两种驱动程序。TUN所虚拟的是点对点设备，TAP所虚拟的是网卡设备。利用这两个驱动，可以将TCP/IP协议处理好的网络数据包传给任何一个使用TUN/TAP驱动的进程，再由进程处理后分发到物理链路中。——译者注

5.6　本章小结

本章向你呈现的，都是在基于IEEE 802.11的客户端上获得代码执行权力的许多来自于实践的无线网络攻击技术。从每种攻击技术的应对策略部分可以看出，对于无线网络安全，首要的问题有两点，第一，除非你确实需要通过无线网络上网，否则你应该马上从无线网络上退出来；第二，永远不要连接到一个开放的，或者是隐藏的无线网络中。相比于传统的有线以太网络，在无线网络中，你可以看到无线网络以“广播”的方式收发数据的特性，会使其变得非常容易受到“中间人攻击”方式的攻击。在使用攻击工具的例子中，主要介绍了Ettercap工具和“Wi-Fi小菠萝”工具等黑客工具在使用方便方面的特性，通过这些特性，即使一个入侵者不具备很强的攻击技巧，也可以成功利用被攻击系统的弱点，最终成功攻破其无线系统。

随着商业的Wi-Fi覆盖，是到了更换和调整无线设备的时间了。在下一章中，我们将使用一个完全不同类型的无线设备，那就是“软件定义收发”（SDR）设备。

第6章　在Windows 8上架桥过隙

在推出Windows Vista的时候，Microsoft公司针对无线网络的模式做了重大的改变，这些改变主要体现在两个地点，其一是设计了“网络驱动程序接口规范6.0版本”（Network Driver Interface Specification 6.0，NDIS）模型，其二是设计了“本地Wi-Fi接口”（native Wi-Fi driver）驱动程序，二者共同取代了原有的古板、缺乏特色的Windows XP无线网络接口。在其后继各个版本中，如Windows 7中的NDIS 6.20、Windows 8中的NDIS 6.30、Windows 8.1中的NDIS 6.40，这些版本一起使Windows的无线功能更加强大。Windows的用户可以在“无线协议集”（wireless stack）里享受更大的灵活性，以及在允许新的应用程序运行、在安全模式、在更好地访问无线服务方面，都比以前的版本有了更大的进步。

这种新的访问方式在给Windows使用者带来方便的同时，也同时为黑客提供了一种新的能力，该能力允许黑客从命令行（command-line）或图形用户界面（Graphical User Interface，GUI）将无线协议用于恶意的目的，进而攻击附近的其他网络。在本章中，我们将从攻击者的角度，来检验Windows 7和Windows 8的“本地Wi-Fi接口”驱动程序上的功能，然后借助这些功能，跨越半个地球，去攻击位于另一个远端的一个无线网络。

本章将使用一种解说式的形式，带你穿越“端到端”（end-to-end）的攻击过程，从攻击前的准备，侦察对方的弱点，占领一个无线客户端，到攻击远端的整个无线网络。在这种情况下，我们将着重突出一个常见的攻击线路：在该线路上，攻击者会先在安全薄弱的环节入手，攻击这一个客户端，一直到这里，我们还没有发现这一章与上一个同样是攻击用户客户端系统的章节之间，在内容上有多大本质上的区别。不过，下面的区别就再明显不过了。当这个被攻占过的客户端离开当前的环境，回到了他自己的另一个网络环境（比如他单位的网络或他家里的网络）时，这个原本对于我们来说是“隔断”式的网络环境，突然因为有一个被我们攻击的主机可以合法的进入，而对我们开放了。也就是说，在这个客户端返回到自己网络的时候，借助于该被攻占的客户端的资源，我们通过“架桥过隙” [1] （bridge the air-gap）的方式同样可以访问或攻击他的那个系统上的计算机，甚至是整个网络。

攻击的案例

“无线热点”指的是在公共场所提供的，通过无线局域网Wi-Fi技术接入Internet服务的地点。在这种服务中，用户只要拿着无线终端（手机、iPad等），找到“无线热点”的网络名称（即前面各章中的“基本服务集标识”），如果有密码，则输入密码，随后连接到“无线热点”的无线路由器（即前面各章中的“AP接入点”）上，然后就可以访问互联网了。无疑，“无线热点”的环境为我们攻击客户系统提供了一个极好的机会。通过使用诸如Airpwn这样的工具，可以操控Web浏览器的活动，进而就可以侦听到很多敏感的内容。如没有加保护措施的电子邮件和其他的网络活动，再如冒充网络的服务。总之，一个攻击者有多项选择可以用来对“已占领了的客户端”系统实施操作。当然，如果你不是“打哪儿指哪儿”，而是“指哪儿打哪儿”，那么在完成上面操作的时候，还有一个重要的前提，那就是你得先找到要攻击的目标。

“热点攻击”（hotspot attack）属于投机取巧型的攻击方式，黑客实施这种攻击有两种方式，一种是“打哪儿指哪儿”式，利用这种方式，在攻击的范围，发现有漏洞的客户端后，就对它实施攻击，并在成功后将它们添加到自己的“僵尸网络” [2] （botnet）中。另一种是“打哪儿指哪儿”式，用户先选中一个目标，然后在其客户端上找漏洞，最后实施攻击。无论是哪一种，现在面临的问题都是：选择合适的“热点攻击”的地点。针对一个具体的目标地址，“谷歌地图”（Google Map）可以准确地实施定位，比如它可以告诉你，“这个点”就是某个员工在中午用餐时间经常光顾的餐馆所在的地址。将这种定位技术，结合上述可用的“热点”功能，黑客可以预先在某个商店旁边搭建一个可以实施某种攻击的“热点”，然后诱惑被锁定的用户连接到这个“热点”，并使用该“热点”进行上网的操作。

在几乎每一个大城市中，“无线热点”广受其用户的欢迎，同时也为黑客提供了很多机会。在下面的这次攻击的例子中，我们将描述一个虚构的攻击目标，名叫“羹美食品”（Potage Food）。这是一家提供有“热点”环境的餐馆，并为客户提供免费Wi-Fi服务，所使用的“服务集标识”是“POTAGE”。

在这种攻击中，我们将演示如何颠覆无线客户端系统，让其执行恶意的可执行文件，并授权我们去访问其客户端系统。当这个客户端返回到他家里，开始使用家庭网络的时候，我们将通过“架桥过隙”的方式远程访问他的计算机系统和他的家庭网络系统。在这一章中，用于完成破解这种远程网络的工具，都是使用Windows 7或Windows 8的客户端。

[1] 在计算机领域，air-gap本义是指不与网络相连，也不与“和网络相连的计算机”相连的计算机。严格地讲，根据安全级别，air-gap分为好多种，如任何时候，任何情况下，不得以任何方式（有线、无线、串口组网、USB、磁盘等）“与计算机或网络相连”，又称“物理隔断”；再如某计算机不能在同一时间同时连接两个网络；再如某计算机不能基于TCP/IP协议（可以通过串口或USB直连）与另外的计算机或网络相连。而本章这里指的则更宽松，指的是我无法连接到某个网络，但与我相连的某个计算机可以连到，所以我借助于这台计算机作为“桥”，超过我和那个无法连接网络之间无法逾越的“缝隙”，间接攻击那个我无法连接的网络。——译者注

[2] “僵尸网络”是指采用一种或多种传播手段，使大量主机在感染“僵尸程序”（bot程序）后，形成一种由控制者和被感染主机之间一对多的控制网络。这里的botnet是robot和network的组合词，这里的“网络”不是某种特定拓扑结构下各计算机组成的通信网络，而是由控制者可以通过各种方式进行操控的计算机联合组成的一种关系组合。——译者注

6.1　攻击的准备

要攻击一个对我们实施“隔断”策略的网络，对于这个网络，我们是一个“air-gap”主机，所以即使是再高水平的黑客，也是“巧妇难为无米之炊”。但是现在，我们发现了一个可以合法进入这个网络中的客户端，那么“架桥过隙”式攻击就成了当务之急，首先，我们通过某种方法，确定了我们要攻击的客户端就在某个无线热点所在的区域内。然后，我们建立起发动攻击的基础设施，如图6-1所示。在这里，我们（即图中“Attacker”）将在“热点”环境（即图中“AP SSID：POTAGE”）中定位好事先要攻击的主机系统（即图中下边的“Victim”），在这个客户端返回到他自己的公司网络环境（即图中“AP SSID：VOIP”）之前，我们需要在他的电脑上开启一个“远程访问进程”（remote access process），该进程即使在他（即图中左边的“Victim”）回到他们公司的网络环境之后，仍可以与我们（即图中“Hack Server”）连接，并授权我们访问他们公司的内部网络（即图中“AP SSID：VOIP”）和附近的各种资源。

图6-1　我们的目标和配套的网络环境

作为我们远程访问的一种方法，我们将利用“Metasploit框架”（Metasploit framework）中“Meterpreter有效载荷”（Meterpreter payload）机制进行攻击。在“被占领主机”（comp-romise computer）的Windows操作系统上，通过手动或自动交互的方式使用“Meterpreter有效载荷”可以显示出巨大威力，在攻击成功后，攻击者可以在“被占领主机”上访问文件系统、注册表，在“命令提示符”中运行shell命令，开启系统进程等操作。在利用“Metasploit框架”中，要使用“Meterpreter有效载荷”机制，仍然还是使用在第5章中已多次使用过的msfconsole工具。在我们的“入侵服务器”（Hack Server）平台上，我们将启动Metasploit的msfconsole工具，并启动Meterpreter处理程序，显示效果如下所示。

提示

有关Metasploit如何运行和运行中有什么疑问，请参阅第5章的内容。

提示

在上面Metasploit框架下msfconsole工具的例子中，“LHOST”参数指定所使用的无线网络接口，也就是攻击者的系统将用来从Meterpreter的会话 [1] 中监听和接受“进接口”的连接。如果该值指定为0.0.0.0，则表示Metasploit将接受攻击系统上任意接口上发来的连接。

msfconsole的提示符停留在最后一行，等待Meterpreter客户端连接到系统。在整个攻击期间，我们都把这个进程放在一边，让它处于运行状态即可。对应于上面的TCP连接，就是服务端处于“监听”状态，一旦有Meterpreter客户端的“连接”，则新建一个线程，在新建线程中“接受”客户端的“连接”，然后进行数据“接收/发送”通信，最后双方“关闭”连接。但整个主线程则一直处于“监听”状态，所以上面的msfconsole只需要放在那里，不再需要用户的干预。

下一步，我们要做的就是准备发动“Meterpreter有效载荷”攻击的“原材料”，即创建Meterpreter客户端中要发送的有效载荷，并最终将这些内容发送给被攻击的目标主机。由于许多“防病毒”（antiviru）软件会把Meterpreter的客户端识别为恶意软件，所以我们需要执行一些额外步骤，把可执行文件重新以另一种形式编码，从而避免”防病毒”软件的检测。一个不错的选择就是使用同为“Metasploit构架”中的另一个程序msfpayload，这个工具所生成的可执行文件中，使用的是另一个由Christopher Truncer所发明的机制，这个机制在躲避“防病毒”软件的检查方面，具有更好的检查效果。除此之外，Veil是一个基于Python菜单驱动（menu-driven）的工具，通过这个工具编码生成的二进制可执行文件中，使用了好几种技术，这些技术都可以较好地躲避“防病毒”软件的扫描。这个Veil的下载地址是https://www.veil-eavsion.com 。也就在本书的写作过程中，Veil系统官方支持还只能用在Kali版的Linux分布式操作系统上（http://www.kali.org ），但实际上，该系统还可以在现代较新的Ubuntu版Linux分布式操作系统上使用。

要下载Veil系统，我们使用git下载工具克隆一个GitHub的储存库（repository）。下一步，我们修改Veil的目录，然后运行Veil.py这个脚本文件，这将生成该系统的菜单界面，其显示效果如图6-2所示。

图6-2　Veil系统用于生成可执行编码的菜单驱动界面

Veil系统在生成可执行的有效载荷方面，为用户提供了好几种选择。每种选择都可以较好地躲避“防病毒”软件的恶意程序扫描，包括将一个可执行文件编码成一个PowerShell的脚本，或者是使用PyInstaller或Py2Exe程序生成Python的可执行文件。在下面的这个案例中，我们将使用Viel生成Python的编码机制。

先在Viel的菜单界面上输入菜单项所代表的那个“有效命令”（available command），然后按回车键。在这里，我们选择其中的list命令列出“可用的‘语言/有效载荷’攻击方式”（list avalialbe Lanauage/playload）；我们使用python/AESVirtualVlloc“有效载荷”攻击方式，如图6-3所示。

图6-3　Veil的AESVirtualAlloc“有效载荷”攻击选择

选择完编码机制之后，Veil提醒我们生成shellcode代码。默认情况下，生成的将是Meterpreter下的reverse_ccp的shellcode有效载荷。我们保持默认的设置，使用IP地址和端口号都是“入侵服务器”所提供的IP地址和端口号，如图6-4所示。

图6-4　Veil生成shellcode有效载荷式攻击代码

遇到提示的时候，我们输入一个名字，该名字将作为生成编码可执行文件的文件名，该文件名不需要扩展名。假设我们输入“potage”，然后选择PyInstaller作为可执行文件的生成器。在可执行文件创建成功以后，Veil显示了一个编码过程的总结信息，以便提醒用户。在提示信息中包括了exe文件、py文件的输出路径，如图6-5所示。另外，Veil也提醒我们不要上传这些创建好的可执行到任何带有在线杀毒扫描的网站或提交到杀毒软件中进行扫描测试，这也是该软件在每个许可证书（license）中明确限定的。我们按回车返回到Veil的主菜单，然后输入exit命令退出Veil程序。

图6-5　Veil完成生成可执行文件

最后，我们将生成的potage.exe可执行编码文件复制到USB接口的U盘中，这个文件将在后面的“热点攻击”中使用。使用配套基础设施组件，在攻击完成之后，我们将准备开车去的“热点”的位置部署上去，静待目标出现并使用。

6.1.1　利用“热点”环境进行攻击

虽然有好几次机会都可以用来利用“热点”环境进行攻击，不过，这次我们打算把重点放在攻击“客户端下载会话”（HTTP download session）这个漏洞上，通过“I-love my neighbors”虚拟机的环境（详见第5章中的介绍）进行漏洞检测，并准备把上一节中生成的potage.exe可执行文件，以及其他附加的文档，采用“客户端下载会话”攻击的方式，通过HTTP协议“植入”到用户的客户端中。

重新启动I-love-my-neighbors的虚拟机以后，我们需要为我们以后的攻击做一些设置。首先，我们重新配置设备，仍然使用“I-love-my-neighbors”默认的“服务集标识”名称“victor-timko”配置作为“热点”的名称。好了，部署好无线“热点”以后，“热点”覆盖范围内的用户将在漫游的时候自动找到我们这个“热点”，这既取决于我们的信号质量，也取决于他本地无线网卡的质量。如果他们的无线终端在无线连接的配置文件里将连接方式设置为“自动连接”（automatically reconnect），那么当我们的“热点”添加到他的Windows中的“附近无线站点列表”中时，这对我们来说将是一个非常好的状况。不过，需要记住的是，“服务集标识”是区分大小写的，所以如果你要冒充被攻击客户端的热点环境，就一定要输入一个完全相同的“服务集标识”名称。

从I-love-my-neighbors服务器上的shell命令输入框中，我们可以通过vi命令编辑/etc/hostapd/hostapd.conf.def文件，主要修改的内容是，将其中原来默认的“服务集标识”改为新的标识。即将“SSID=victor-timko”改为“SSID=POTAGE”，这就对应于图6-1中下面的那个AP接入点。

为了实施攻击，我们将在I-love-my-neighbors服务器上使用replaceExes.pl服务，每次当客户端访问网页的时候，我们的AP接入点将会偷偷将/var/www/setup.exe文件，在客户端的浏览器通过HTTP协议下载可执行文件的时候，将其注入到客户端的主机里。在最后一步，由于setup.exe文件其实并不是我们真正想要的，所以我们还会用前面准备工作中，用PyInstaller生成的potage.exe文件代替这里的setup.exe文件。具体的操作就是拿出之前保存potage.exe文件的U盘，然后通过如下格式的命令完成替换操作。

下一步，我们运行neighbor.sh脚本，在这个脚本中，会指示程序使用无线网卡的wlan0接口，“I-love-my-neighbors”虚拟机的以太网卡接口eth0，并且服务文件的名字是刚编辑的replaceExes.pl。当我们要攻击的这个客户端漫游到这个冒名顶替的AP接入点时，我们就可以从控制台上看到有状态信息出现。当然这里的客户端还是相对于我们的AP接入点“POTAGE”而言的，其实这是一个完全独立的笔记本电脑主机。

接下来，我们等待这个要攻击的客户端下载并运行我们蓄意专业为他安排的恶意可执行文件，就是上面的那个potage.exe文件。其实，不难想象，我们的“热点”也是冒名顶替的，而且在现在这个“羹美食品”餐馆里，还有一个名正言顺的正牌同名“热点”也在工作，很有可能我们要攻击这个主机因为离那个热点近，而因为那个“热点”的信号更强而实际连接上了正宗的“热点”。所以如果这个时候，你没有耐心这样傻等，那就使用“I-love-my-neighbors”虚拟机上的第二块无线网卡wlan1，利用“拒绝服务”攻击技术让正宗的“热点”暂时“休息一会”，这样可以让被攻击的主机无可选择，从而加速被攻击主机漫游的过程，这个过程如第3章所描述的那样。终于，被攻击主机就范了，它连到了我们的AP接入点“热点”上，并且开始读取网页，借此机会，我们在它通过HTTP下载任何可执行文件的时候，要下载的可执行文件偷偷地被potage.exe文件所取代，整个过程都是透明的，客户端也无从察觉。与此同时，这个“入侵服务器”上，一个Meterpreter会话偷偷地打开了，这之后，我们可以随时连接具体会话。具体过程如下所示。

现在，我们已在被攻击者的客户端上“植入”了Meterpreter工具，并且具有了随时访问它系统的能力。接下来我们要讨论的技术分别是如何控制客户端、在被攻击的电脑上建立一个持久的立足点，然后利用被攻击电脑控制那个我们无法使用，但他却可以访问的远程无线网络，达到“架桥过隙”的初衷。

6.1.2　控制客户端

一旦可以访问到客户端主机上的Meterpreter服务端 [2] ，我们就可以安装一个永久的系统“后门”（backdoor）机制，以后这个客户端系统在离开当前“羹美食品”这个“热点”环境后换到新的网络中，或者重启了系统后，我们仍然可以方便地重新获得系统的访问。Meterpreter系统中，有一个名为persistence.rb的脚本可以让这件事易如反掌。只要运行该脚本，以后只要这个被攻击客户端上网，那么这个后门就会自动连接攻击者的Meterpreter系统。

首先，我们先运行一次不带参数的persistence.rb脚本，在没有参数的情况下，由于脚本不知道要干什么，就只能把当前所有可能的参数选项列出来，以供参考。接下来，我们运行persistence.rb脚本，使用的参数使得用户在登录的时候，会以每30秒一次的频率与攻击者“入侵服务器”建立连接。

通过使用Meterpreter的persistence脚本，被攻击主机会自动反向回连“入侵服务器”的指定端口，端口就是上面参数中指定的nPort值。好了，终于完成了各项工作，这时，我们可以停止“热点”的“模拟攻击”，让这个被攻击的客户端连回合法的“热点”上，进行其原来的正常上网活动。剩下的，就是等待它最终离开“羹美食品”网站，在它回到自己的企业网络后，再进行下一步攻击。

[1] 这里的会话、监听、接受、连接等都是TCP连接中的专业术语。在TCP连接中，客户端只需要连接、发送/接收、关闭三种主要操作，而服务端则依次监听、接受、发送/接收、关闭四个操作。——译者注

[2] 在本书中，要攻击的主机相对于无线网络的AP接入点，所以它一直是“客户端”的身份，只有我们完成了对它的恶意攻击，并造成了破坏，才是我们理解的“受害者”，所以本书在翻译的时候，更多的使用“客户端”，而不是“受害者”。但作为网络的客户端，同时为我们提供了服务，所以在我们的视角，它成了服务器，所以这一句说是“客户端上的服务端”。——译者注

6.2　本地的无线侦察

虽然我们之前就试过通过自己电脑上的Meterpreter客户端访问被攻击主机上Meterpreter的服务端，Meterpreter可以偷偷地授权我们访问被攻击主机的本地系统。不过，我们的兴趣不在于这个被攻击的主机本身，而在于借助这个被攻击主机的“桥”，去探索和攻击它所在的网络。那个网络对我们来说是无法访问的，但对于这个被攻击主机来说，却可以合法地访问，所以只要它回到它所在的公司网络环境中，就同时给了我们访问其公司网络的机会。当被攻击主机回到公司，它又恢复了客户端的身份，不同的是，这时的客户端有两层含义：一层是对于它公司的网络，这台主机是个客户端；另一层含义是，对于“入侵服务器”上的Meterpreter服务端，它上面被我们偷偷植入的Meterpreter客户端也让它具有了客户端的身份。

使用Meterpreter工具访问被攻击主机，我们可以运行一个shell命令，并进行无线网络的侦察（reconnaissance）。在这一步里，我们可以列举出被攻占主机上的配置（configuration）和它系统中我们关注的无线参数。如有几个无线接口、每个无线接口的使用情况、现在配置中首选连接的网络（preferred network）是哪一个，以及其他敏感的信息细节。首先，我们依次使用Meterprecer工具中的sysinfo命令、getuid命令以及idletime命令，检查一些关于系统的基本信息。

通过这些远端主机的基本信息，我们可以尝试升级通过getsystem和getprivs命令升级我们的系统权限：

在Meterpreter工具中，权力选项称为“技能”，在这个例子中，选择第1个“技能”，Meterpreter工具的getsystem命令可以让我们获得在Widnows 8上管理员的访问权限。在Windows 8操作系统中，几乎没有什么已知的破解工具可以用一类进行权力升级和躲避“用户账户控制”（User Account Control，UAC）的审查，所以“用户账户控制”在被攻击系统中通常都是禁用的。不过，即使没有访问该主机的特权，我们也可以从被攻击主机上进行各种浏览和获得不少数据信息，但是在改变系统设置，并拿到一些敏感认证证书时，我们的访问权限也受到了部分限制。

接下来，我们可以指导Meterpreter直接使用Windows 8自带的cmd.exe程序，cmd.exe程序本来就是Windows 8的shell程序，所以使用cmd.exe可以使我们能够与系统进行交互操作。

注意

在Meterpreter-spawned工具中，通过shell命令就可以调用cmd.exe。在shell中，所有命令返回到屏幕（console）两次。在下面的例子中，为了使界面清楚，我们忽略了多余显示出来的重复命令。

从shell命令的界面中，我们可以在系统目录间随意转换，从中可以查看目录和基本文件的内容，在查看结束后，在Meterpreter工具中输入“exit”命令就可以下载所需要的文件。

在开始使用被攻击者的无线接口来攻击其他网络之前，我们要先确定一下哪个接口正在使用，以及这个接口的配置是什么。最好的情况是，发现我们所“占领”的这台主机当前正在使用一个有线的接口进行网络的连接操作，并且该主机有无线接口，且无线接口可以使用，但却没在使用。要检测这样的网络连接参数，以及这些网络接口是否在使用，可以通过Windows自带的ipconfig命令。

注意

在本章中使用的命令，其显示结果的例子都已被修改，主要为了显示上的简洁，删除多余的回车换行 [1] （carriage return）。所以你在实际使用中看到的例子，和这里显示的例子会略有不同，除了回车换行之外，在每个标题和随后的数据之间，也会为了清楚起见，加入一些换行符。

在这个例子中，你可以看到无线局域网适配器是在“连接断开”（media disconnected）状态，而以太网适配器配置上配置了一个IP地址，说明被攻击者连接其公司网络所使用的适配器是有线接口，而没有使用无线接口。你可以通过Windows自带的netsh命令搜集关于其无线网卡上的更多信息：

“netsh wlan show interfaces”命令输出的是和被攻击主机有关的一些附加信息。比如接口的“全局唯一标识符”（Globally Unique Identifier，GUID [2] ），以及其他描述信息，通过这些信息，我们可以看出被攻击电脑所用的网卡芯片组是“Intel Centrino Advanced-N 6205”。如果接口正在使用，那么命令输出的“状态”（State）显示的是“已连接”（connected），那么下面的附加信息就会显示出“服务集标识”、“基本服务集标识”、无线协议类型（比如802.lla、b、g或n），以及认证及加密数据包的信息，同时也会显示出信号强度的百分比值以及发送和接收的速率。

我们还可以收集更多与驱动程序相关的详细信息，包括驱动程序的创建日期和能力等：

在上面“netsh wlan show drivers”命令的输出格式中，我们最感兴趣的就是“类型”（Type）那一行中的缩写，这里显示的是“本地Wi-Fi驱动程序”（Native Wi-Fi Driver）。这表示这个无线网卡驱动程序是一个“本地”的Wi-Fi驱动程序，这意味着这个驱动程序是基于NDIS6.2规范（网络驱动程序接口规范）编译的，所包含的重要功能都是基于比较过时的“肥”（fat）驱动程序，并且这种驱动程序也可以在Windows 7或Windows 8上使用。

现在，我们知道了，原来这个被攻击的客户端主机所使用的无线网络接口是“本地Wi-Fi驱动程序”，我们可以在这个被攻击的主机系统中再翻翻看，看是否能从其主机上找到它的“偏爱网络列表”中所有曾经访问过的网络信息。

从“netsh wlan show profiles”命令的输出中，我们可以确定所有的“个人定制”（profile information）信息，这些信息都是通过“组策略”（group policy）继承下来的（这些信息在上面的运行结果中并没有显示出来，读者可以通过在自己的计算机上运行该命令看到实例的效果），每个用户都有自己的“个人定制”文件，并且其文件名一般会与网络的“服务集标识”一样。如果在上面命令中指定了名称，那系统就会显示出这个用户“个人定制”选项里的附加数据。

在这个例子中，“POTAGE”这个SSID的“个人定制”信息显露无遗，从中我们可以看到一个开放的网络环境，连安全密钥也没有配置。下面是一个缩短后的例子，它是使用了加密和认证的另一个无线网络例子，作为参照，其显示结果如下。

在这个例子中，一个叫“somethingclever”的“个人定制”信息表明了这个无线网络配置了“Wi-Fi保护访问下的预共享密钥版本2”（WPA2-PSK）的网络认证，使用的是AES-CCMP加密算法。其实密钥就在这个“个人定制”文件中，但是没有显示出来。只有用管理员账户访问这个Windows主机时，我们才能显示出明文的密码来。显示效果如下。

作为一种手工从“被占领主机”上搜集Wi-Fi数据的替代工具，我们还可以使用Meterpreter工具调用“post-exploitation wlan_profile”模块进行搜集。该模块的开发者网名是“@theLightCosine”。

WPA2-PSK密钥的泄露

在使用WPA-PSK和WPA2-PSK这两种认证方式的网络里，维持“预共享密钥”自身的保密是其重中之重，而对它的威胁之一，就是对“预共享密钥”的挑战。许多安全防护组织都采取了措施，防止网络中的用户泄露“预共享密钥”。比如不允许直接从工作站访问网络，或不能通过客户端管理类似于“活动目录组策略”（Active Directory Group Policy）等软件。

然而，任何一个用户，只要他在他的工作站上可以以本地管理员的身份具有运行一个软件的权限，那么他的工作站就可以在访问网络的时候还原“预共享密钥”，或被动地解密来自网络上的加密数据包。此外，一旦某个管理员用户获得“预共享密钥”，他就可以与本机器上任何其他用户分享这个密钥，甚至包括把该用户的认证信息发布到网上。

即使是嵌入式设备，也很容易泄露“预共享密钥”信息。最终，所有加入到WPA2-PSK或WPA-PSK网络的设备都需要至少保存网络认证证书信息，这个信息可以“从设备”运行的内存或配置文件中提取出来。

获得了本地客户端的信息之后，我们可以继续下一步，那就是攻击那台“我们已成功占领主机”功率覆盖范围内的本地网络。

[1] 在打字机中，“回车”和“换行”是两个完全独立的功能。而计算机中，将二者合二为一，但在一些原始的文字处理软件中，特别是一个文字处理软件处理由另一个文字处理软件生成的文件时，还能看到因二者的处理不同，而导致界面显示混乱的现象。——译者注

[2] GUID，即Globally Unique Identifier（全球唯一标识符），又称UUID（Universally Unique Identifier）。GUID是一个通过特定算法生成的长度为128位的二进制数字标识符，用于唯一地标识某一个产品。——译者注

6.3　远程无线侦察

在连接到“被占领主机”之后，我们现在可以通过使用“主动式扫描器”来列举（enumerate）和“发现”（discover）其功率覆盖范围内的网络。几个版本的Windows系统都支持用户通过命令行的方式，找到周围可用的网络，所用的命令就是内置于系统中的netsh命令。

在这次的输出中，我们可以确定发现了多个网络，其中包括一个WPA2认证的“企业模式”网络，其“服务集标识”是“CORPNET”；还有一个使用WPA2-PSK认证的的消费者网络，其“服务集标识”为“tomethingclever”；以及一个带以WEP作为加密算法的开放式身份验证的网络，其“服务集标识”为“VOIP”。

一看到这个三个可用的网络目标，我们就可以很容易地做出将WEP作业适合攻击网络的选择。这个网络的“服务集标识”是“VOIP”，看上去有点像“老式基于IP的手持机”（older VoIP handset）连接的网络，所以这也是将其设定为攻击目标的另一个原因，选定这个目录以后，我们还会做进一步的分析。

使用主机网络中“骗子”AP接入点的功能

在这个案例中，我们通过几个方面试试我们的技术。其一就是在一个远程无线网络中进行探测，查找有用信息；其二就是通过一个“已占领的主机”作为“桥”，有效地从“隙”上跨越过去，到达一个我们原本无法企及的组织网络中。而这里完成跨越的切入点，就是依靠对方网络最脆弱的点，即借助这个“已占领的主机”随后的访问，远程入侵WEP认证的网络。当然，真要使选择WPA2-PSK认证的网络，也不是不行的。

在这个案例中，从“被占领主机”上，虽然有几个曾经访问的网络记录，但还没有哪一个无线网络可以立即访问，可以当成是我们的运气有点背好了。不过没关系，我们可以在随后通过使用“被占领主机”的Windows系统创建一个新的无线网络。

在“网络驱动程序接口规范”（NDIS 6）中，Microsoft公司提供了一个叫作“无线承载网络”（Wireless Hosted Network）的功能，该功能允许Windows Vista或以后版本的主机上，可以使用一个可用的Wi-Fi网络接口创建一个“软AP接入点”（soft AP），该“软AP接入点”就相当于将这个无线网络接口转化成一个无线AP接入点，可以接受其他无线客户端的访问请求，并且“软AP接入点”可以自动桥接本机上的有线接口，通过有线接口实现上网数据的转发。尽管该“无线承载网络”功能上只支持WPA2-PSK认证方式，但攻击者仍然可以使用这一特征，将这个被攻击过的主机（即当年我们“羹美食品”点上的客户端，如今的“被占领主机”）转换成一个“骗子”AP接入点，以便借助于这个AP接入点，实现随后的通过有线网络的访问，虽然只是访问他们的本地内网，而不是访问Internet网，但这本来也是我们的目的。

从一个shell命令，我们可以创建这个“无线承载网络”，设置“服务集标识”为“NAME”，以及选择一个“p@sswOrd”的密码，其启动界面如下所示：

对黑客来说，在“无线承载网络”上还有个功能，那就是允许一个实实在在的本地攻击者通过其无线连接到AP接入点上，然后反向通过“被攻击主机”的有线网络访问该网络的功能。即使攻击者已经通过Meterpreter工具具备远程访问这个有线网络的能力，现在这种通过无线接入网络然后再访问有线网络的方式，在特定的有线攻击方式中会显得更有用。比如，对于一些特定的有线攻击，根本就不适合在Windows操作系统上再通过“隧道技术”（tunneling）实施攻击。

停止“无线承载网络”的无线接口，可以通过“stop”命令。这个命令无疑会停止无线网卡作为“骗子”AP接入点的使命，而恢复为原来的无线接口，并且断开与有线以太网接口上桥接（bridge connection）的那个连接。

6.3.1　Windows的监测模式

在“网络驱动程序接口规范”模型中，Microsoft公司要求所有本地的Wi-Fi驱动程序网络接口都要包括对“监测模式”（monitor mode）访问的支持，这样可以让用户有能力在当前信道上观察到的网络上的所有活动，并且可以按802.11格式搜集所有的通信数据包。该功能很显然是参照了Linux操作系统和OS X操作系统用户多年来喜欢的“监测模式”功能，同时也意味着，对于一个黑客，他开始在Windows上也有新的机会，即通过使用一个“被占领的主机”实施攻击一个附近无线网络的能力。

不过，这并不表示你可以马上使用这样的功能，Microsoft公司在Windows中，既不包括在本地用于在“监测模式”下控制一个接口的用户工具（user-space tool），也不包括可以在监测模式下用于查看和处理捕获数据包的工具。在针对“网络驱动程序接口规范”的“Microsoft开发人员网络文档”（Microsoft Developer Network，MSDN）中，Microsoft公司表示开发人员可以创建自己的工具，并在工具中将接口设置到“监测模式”下，也可以捕获802.11数据包，还可以控制无线接口的信道以及进行“模式设置”，这里的模式是指802.11标准的版本，例如，驱动程序是在802.11b模式下还是在802.11n模式下进行捕获。另外，值得提醒的是，要开发这么一个“轻量级过滤器驱动”（Lightweight Filter Driver，LWF），但开发与使用本功能，都需要在Windows上具有比运行标准的用户应用程序更高的权限级别。

6.3.2　Microsoft公司的NetMon程序

NetMon程序（网络监视器）是一款由Microsoft公司设计开发的数据包嗅探工具，该工具与Windows紧密集成，效仿了很多原本应用于Wireshark中的功能，如数据包的分析、解码和过滤功能。同时，在Windows上，NetMon程序具有作为“Microsoft公司制造”的名声大、值得信赖的应用程序的优势。包括NetMon软件在内，所有的嗅探软件，都是在使用本地Wi-Fi“监测模式”这一功能而做的工具或驱动程序。这可以让我们在远程模式下，在Windows的操作系统上，实现“监测模式”下数据包的嗅探能力。

如前所述，在Windows默认安装中，并没有这个样的嗅探工具，所以，如果要使用NetMon程序，首先，我们需要下载并在目标主机上安装NetMon程序。在Windows操作系统上，“正常”安装一个Microsoft自己编写的程序是件非常容易的事，但是现在的问题在于我们是“不正常”安装，是偷偷地安装在远程“被占领的主机”上，所以就变得有点棘手了。尽管我们可以从命令行安装和运行NetMon程序，以防止安装的时候会创建一些明显的安装痕迹（如用户的桌面会新增一个NetMon图标），但如果要控制无线驱动程序的信道，那么唯一的方法只能是通过图形用户界面来执行安装程序。因此，我们必须在“被占领主机”上有运行图形用户界面的权限和访问能力。

6.3.3　建立远程桌面访问

要获得目标主机远程桌面访问权限，有多种选择可以使用。内置的“远程桌面协议”（Remote Desktop Protocol，RDP）服务可以自动配置所需的参数，并且正当地通过防火墙的监管，然后通过netcat工具所分配的协议重定向功能，主动地推送到攻击者主机屏幕上，但这种方法的缺点是：需要在目标主机上进行几步操作，其中包括Windows防火墙服务的修改。相比于采用“远程桌面协议”进行远程桌面访问，一个简单的选择是利用Meterpreter软件的“虚拟网络计算”（Virtual Network Computing，VNC），通过有效载荷在内存中实现数据包的注入能力。

首先，我们需要确认已将vncviewer工具安装在攻击者的系统上：

如果上面的“which”命令没有返回输出结果，然后查阅一下Linux操作系统分布版在发布时的使用手册，找到“虚拟网络计算”的viewer程序包安装之前所以必须安装的其他程序，然后再继续上面的操作，直到成功。

“远程桌面协议”是Windows自带的一个协议，与此同名，在Windows上还有一个“远程桌面”的程序，通过该程序，在Windows下，一旦有用户通过远程桌面连接，本机的桌面将出现锁屏的状况；而通过该协议，则可以做到不锁屏的前提下使用远程屏幕，但即使如此，当我们有动作的时候，由我们打开的应用程序就会显示在用户本地的屏幕上，所以在运行“虚拟网络计算”客户端有效载荷，使用“被占领主机”电脑的远程桌面时，很显然要等到没有人坐在这个被攻击电脑前时才能进行。那么怎么判断对方没有在使用电脑呢？事实上，我们可以通过Meterpreter工具的idletime命令读取对方的“空闲时间”来间接地判断对方电脑上的“活动水平”（activity level）：

既然现在用户的工作站是闲置的，那么我们就可以运行vncwiewer工具的“反向TCP连接有效载荷”（reverse_tcp payload）攻击方式，来获取“被占领主机”的远端桌面的访问权限。在使用Meterpreter工具的“有效载荷注入”（payload_inject）功能的时候，可以添加“虚拟网络计算”工具的“反向TCP连接有效载荷”到内存中存在的一个会话中。这个过程并不会对“被占领主机”的硬件做任何操作，所以极具隐蔽性。另外，使用这种攻击方式的优点就是对“被占领主机”系统的改变非常小，并且很容易躲开防病毒系统的监视：

运行完“虚拟网络计算”工具的“反向TCP连接有效载荷”攻击以后，“植入”到“被占领主机”上的程序会反向连接（connects back）攻击主机，连接的方式是TCP，使用的端口是5900。所以在进行上述操作之前或同时，最好先在我们自己的主机上运行vncviewer程序的服务端。一旦服务端程序运行，就可以接到由“被占领主机”上程序授予的访问对方桌面的权力。在上面运行cmd.exe的shell程序，对方就会自动接受由vncinject程序注入的有效载荷，对方运行的shell程序名叫“Metasploit绅士外壳”（Metasploit Courtesy Shell），这时的程序界面如图6-6所示。

图6-6　通过“Metasploit绅士外壳”看到的“被占领主机”的桌面视图

一旦我们获得了“被占领主机”的图形用户界面，就可以在其主机上安装NetMon程序了。

6.3.4　安装NetMon程序

随着我们可以使用“图形用户界面”的方式访问“被占领主机”，我们就可以在“被占领主机”的本地用Web浏览器访问Microsoft公司的下载页面，下载NetMon程序，并运行安装。因为“虚拟网络计算”的桌面屏幕刷新相对滞后，所以这个过程看上去是相对较慢的，因此，我们应将尽可能从命令行上运行，而只在必要的时候才用“图形用户界面”运行。

在攻击者的服务器上，我们将下载最新版本的NetMon程序（在写这本书的时候，最新版是3.4），解压缩可执行文件，可以显示嵌入式“MSI安装器” [1] （MSI installer）。提醒读者注意该安装包中包含两个安装器：一个是安装具有嗅探功能的NetMon程序本身，其文件名是“netmon.msi”；一个是安装解析器（parsers）程序，该程序主要是解析由NetMon程序在嗅探过程中保存的数据包文件，其文件名是“NetworkMonitor_Parsers.msi”。我们将二者都上传到“被占领主机”上，以便在安装此工具后，既能捕获数据包，也能解析数据包。

提示

要查询NetMon程序的最新版本，可以到Microsoft公司的“微软公司下载中心”（Microsoft Download Center）进行查询和下载，其地址是http://www.microsoft.com/downloads/ 。

返回到Meterpreter的Shell程序，上传netmon.msi安装程序包到“被占领主机”的临时目录中：

接下来，我们可以使用Windows内置msiexec工具，“悄悄地”运行“NetMon的安装程序”。为了避免安装程序在“被占领主机”的桌面上为NetMon程序工具创建图标，我们将在安装NetMon程序之前，在“所有用户的桌面”目录中暂时申请一个“只读访问控制列表”（read-only access control list）的权限：

随着NetMon程序安装完成，我们可以充分利用当地的无线网卡的能力，去攻击之前三个网络中最弱的那个，即“服务集标识”为“VOIP”，采用WEP认证的那个无线网络。

6.3.5　监视模式捕获数据包

NetMon程序为我们提供了一个“图形化网络监控”（GUI Network Monitor）的进程，大多数NetMon的用户使用这个程序的目的就是使用其数据包的捕获（capture）和数据分析（data analysis）的功能。然而，在我们的攻击设计中，我们安装和使用NetMon程序，目的是为了在我们攻击过程中管理那些NetMon安装配套的可执行文件。

NetMon程序中的一个工具，名叫nmwifi，可以与NetMon的LWF过滤器进行交互式的命令操作。通过nmwifi程序，我们可以控制无线接口的访问，将无线网络接口设置为“监测模式”或“托管模式”（managed mode），以及指定一个信道和“物理层”（PHY）通信协议（如802.11a协议或802.11b协议）。不幸的是，nmwifi只能从图形用户接口才能使用，因为NetMon程序安装程序会自动在系统搜索路径“PATH变量”（即Windows的环境变量中的“PATH”）中添加一个“网络监控程序目录文件”（Network Monitor Program File）的值 [2] ，所以我们既可以从图形用户界面通过Windows中使用“开始（Start）|运行（Run）”系统级菜单运行nmwifi，也可以从Meterpreter的提示符状态启动该程序。一旦启动成功，nmwifi的图形用户界面将显示一个可用的“本地Wi-Fi驱动程序”的下拉列表，该下拉列表中的选项可以使系统处于“监测模式”，也可以控制信道的设置，如图6-7所示。

图6-7　可用的“本地Wi-Fi驱动程序”下拉列表

提示

如果你正在使用的这个无线“连接”控制“被占领主机”时，不要试图把它设置为“监测模式”，这样做的后果，就是当你把这个无线接口设置为“监测模式”时，系统会中断（terminate）所有使用该接口访问的所有连接，进而导致监测连接的丢失。

为了攻击“服务集标识”为“VOIP”的无线网络，我们选择“切换到监测模式”（Switch to Monitor Mode）复选框，然后在“选择一个层和一个通道”（Select a layer and channel）的文本框中，将“通道”设置11，将“层”设置为IEEE 802.11g。上面的这些参数都是在之前基于“netsh wlan show networks”命令时输出的结果。完成上述设置以后，单击“应用”（Apply）按钮。当下面的状态栏中显示“监控模式：对，已选择”（Monitor Mode：On，Select），并且在状态栏的右边显示出刚才输入的正确的信道（即图上“Channel”）和物理层类型（即图上“Layer”）时，我们将nmwifi程序最小化显示。

警告

如果关闭了nmwifi程序，系统的无线接口将由“监测模式”恢复到“托管模式”，并且会禁用“监控模式”的访问。所以最小化nmwifi程序，让程序保持运行状态，以便在随后，其他的程序还能在“监测模式”下捕获会话数据包。

回到Meterpreter cmd.exe的shell程序上，我们可以启动命令行的NetMon抓包工具，它的名字叫nmcap。通过这个工具，我们可以设置捕获数据包的无线接口，过滤后只保存无线数据包，以及将结果保存到voip.cap文件中。

这些跟在“已接收”（Received）之后的值表示通过nmcap进程所发现的数据包（frame）的数量，随后跟在“已保存”（Saved）后面的值表示的是匹配到保存在voip.cap文件中的Wi-Fi.Data过滤器的数据包的数量。我们可以留着这个进程在目的网络上运行捕获数据帧，直到我们抓获了约100000个数据包为止。一旦完成后，按Ctrl+C组合键终止Meterpreter在这一信道上的捕获操作，然后通过Meterpreter中ps命令和kill命令关闭nmcap进程。

注意

不幸的是，在“被占领主机”上，通过使用本地Wi-Fi的驱动程序，利用“ARP重播”攻击（ARP replay）或其他WEP认证，是不能完成Windows操作系统上加速攻击的。究其原因，是因为这些在NetMon的LWF过滤器中，而在这种情况下，缺乏“数据包注入”的能力。

下一步，我们将捕获到的voip.cap文件传到我们攻击者的系统中：

既然我们已完成了在被占领的Windows主机上的数据捕获操作，下面就可以删除nmwifi.exe进程，清理一下现场。

在“被占领主机”上，利用Windows操作系统操作远程无线功能，我们就可以在对方的网络中，在“监测模式”下搜集通信的数据包，并且保存这些数据包捕获文件。下一步，还要利用这些信息攻击这个“服务集标识”为“VOIP”的无线网络。

Microsoft的消息分析器

Microsoft公司在2010年6月24日推出NetMon3.4版本的发布以后，就停止了NetMon软件的开发工作。取代NetMon程序的是一款新的工具，其名称为Microsoft的“消息分析器”（Message Analyzer）。与传统的单纯依靠捕获数据包的网络监视器不同，“消息分析器”使用“基于Windows的事件根据”（Event Tracing for Windows，ETW）机制作为要捕获的数据源，可以允许用户动态地捕获到多种信息，这不仅包含传统基于网络接口的数据包，也包括Windows防火墙的、系统代理服务器（WebProxy）的，以及VPN适配器的全部信息，并且如果涉及加密，还可以包括加密前、加密后、解密前、解密后的全部信息。

和NetMon程序一样，“消息分析器”也是免费的，并且可以直接从Microsoft公司的“微软公司下载中心”（Microsoft Download Center）下载，该文件的下载地址是：http://www.microsoft.com/en-us/download/details.asps?id=40308 。尽管从“消息分析器”程序的宣传中，我们知道相比于NetMon程序，该程序有很多新的、吸引眼球的特色功能加入，但与NetMon程序是在“监测模式”下捕获数据包有所不同的是，“消息分析器”程序并不支持在“监测模式”进行数据包的捕获。这些令人印象深刻的特点中，比如在很多相关事件之间建立一种关联，比如在数据包捕获文件和其他结构数据源（比如日志文件中的）之间就存在这种关联。那么通过“消息分析器”程序可以互查和一并显示。不过，从攻击者的角度来看，上面这种特点并没有多大意义，因为对于一个黑客来说，建立这种关联本来就是小菜一碟。所以如果坚持要在“被占领主机”的Windows系统下使用无线网卡“监测模式”下对嗅探技术的支持，那你只需要继续使用Microsoft公司著名的NetMon程序即可。如果你要使用“消息分析器”工具，也是要付出一点代价的，比如，就算你只是想使用新的“消息分析器”程序看看NetMon程序所截的数据包，那你要花一些时间熟悉这个软件了。不过，就“消息分析器”程序中的“数据测试”（Diagnoscics）功能还是挺强大的，在NetMon程序所截的数据中，通过该功能，你可以查看那些“畸形”的数据包。

[1] MSI安装器指的是通过Microsoft Installer生成的一种安装，该安装中，除了要安装的程序，还包含安装这些程序所需要的信息，以及多种安装模式和卸载模式下所需的指令和数据。比如安装序列、目标文件夹路径、系统依赖项、安装选项和控制安装过程的属性。——译者注

[2] 在Windows中运行一个程序时，系统会首先在当前目录下查找要运行的程序，如果找不到，则到系统目录下找，如果还找不到，就到PATH中所指向的那些目录中找。上面过程中，如果前一个目录中找到，则直接运行，不再找下面的各个目录，如果上述所有目录均没有，则报告“报不到要执行的文件”错误。——译者注

6.4　对无线目标网络攻击

nmcap进程创建的这个数据包捕获文件保存了大量数据，这些数据足以攻击WEP认证，还原“服务集标识”为“VOIP”的网络的密钥。然而，Microsoft公司的NetMon程序，在保存这些数据包捕获文件时，是以自己定义的格式保存的，不是以libpcap格式进行保存。而libpcap格式是像Aircrack-ng这样的工具所需要的格式，虽然新版的Wireshark也可以解析NetMon程序的数据包格式了，但是Wireshark也只是能查看这种格式，而不能将其转换或导出为libpcap格式的文件。幸运的是，我们可以通过nm21p工具软件将这种格式的文件转换为libpcap格式的文件。

用nm2lp转换数据包格式

nm2lp工具的设计目的是将Microsoft公司的NetMon程序所捕获到的无线数据包专有格式转换为嗅探界事实上的工业标准libpcap格式，该格式可用来做通用的libpcap分析，并且可以被Aircrack-ng、Ettercap和Wireshark等软件使用来作为攻击工具。nm2lp程序已被移植性重写，现在可以运行在Linux操作系统上，用于取代运行在Windows操作系统上的1.0版本。nm21p程序目前需要libwiretap库和libpcap库的支持，这两个库文件都可以在Ubuntu系统上，通过apt-get命令下载并安装。命令显示如下。

安装nm2lp程序的依赖库后，就可以下载nm21p.tgz的源代码和“make”命令创建这个工具软件了。然后通过运行“sudo make install”命令安装文件，如下所示：

nm21p命令的用法非常简单，我们指定NetMon程序所捕获的数据包所在文件的文件名，再指定一个输出libpcap格式的数据包捕获文件名即可。

现在，这个voip.pcap文件已经是libpcap格式的数据包捕获文件了，下面我们可以通过aircrack-ng程序来还原其中的WEP密钥。

拿到了WEP密钥，我们就可以启动解密进程检查捕获到的数据包了。首先，我们使用airdecap-ng工具，将加密的libpcap数据包的捕获文件转换到一个解密文件的libpcap文件中。

输出文件voip-dec.pcap，是由airdecap-ng程序创建，其格式是libpcap格式，所以看上去和通过以太网上捕获的数据格式相似。这种格式可以和很多不同的主流分析工具格式兼容，包括Massimiliano Montoro设计的Cain程序，该程序的下载地址为http://www.oxid.it 。将这个解密文件复制到一个Windows操作系统里，我们就可以快速方便地进行流量识别，当然识别的目的是为了获得明文密码或其他敏感数据，显示如图6-8所示。在这个例子中，Cain分析了解密的数据，并显示出这是两次“IP电话”（Voice over IP，VoIP）的语音对话。在Cain软件中，右击选中的“IP电话”列表中的项，就可以选择和播放所录的音频对话文件。

图6-8　Cain软件上的“IP电话”语音对话

在那个“服务集标识”为“VOIP”的无线网络上，由于我们知道它使用的是WEP密钥的背景知识，所以我们可以在“被占领主机”上配置，让它的无线网线接口也连接到这个网络上。这对于我们后面在“被占领主机”所在的网络中继续其他工作是很有用的；否则，我们就不能从“被占领主机”的以太网连接访问这个网络。对于这部分的攻击，我们需要访问一个有Windows操作系统的主机。

注意

在这个例子中，我们研究了如何用命令行从“被占领主机”的系统中连接到无线网络，所使用的方法就是组合使用了攻击者的Windows主机和“被占领主机”的Windows主机。在整个运行过程中，将“图形用户界面”在不能关闭的前提下，采用最小化的方式是一个不错的选择，因为在“被占领主机”上，图形界面最小化可以在任何时候躲避被检测到的可能。不过，即使如此，你还可以用其他的办法，如借助于以前我们创建的VNC连接，通过使用反向的VNC连接，在“被占领主机”上单独完成所有这些步骤。

在攻击者的主机上，如果使用的是Windows 8或更新版本操作系统，那么按下WinKey+I组合键就可以打开Windows桌面的“魅力边栏”（charm sidebar），然后单击上面的“无线网络图标”（wireless network icon）。下面选择的不是从可用的网络图标中选择一个，而是选择“其他网络”（Other Network）图标。在“手动连接到无线网络”（Manually Connect To A Wireless Network）的对话框中输入设置，其内容是“被占领主机”附近的目标Wi-Fi网络，主要包括一些安全参数。取消“自动连接到网络”的选项。完成该向导之后，单击“完成”（Finish）按钮关闭“手动连接到无线网络”（Manually Connect To A Wireless Network）的对话框。

一旦当前用户的“个人定制”文件被添加到攻击者的主机中，我们就可以以XML配置文件的格式导出上述配置，并将其传送到“被占领主机”的系统中。下面的命令就是在攻击者的系统中，导出新的网络配置文件的步骤：

XML文件创建成功，我们就可以如上所述地把它复制到负责攻击的服务器上。下一步，我们就可以返回到Meterpreter的shell中，上传上面刚刚生成并改为voip.xml名称的XML文件，复制到“被占领主机”上。

仅仅是上传复制voip.xml文件还不够，要使文件的配置生效，还要在“被占领主机”上完成导入操作。现在，我们可以在“被占领主机”上运行一个cmd.exe shell，并在命令提示符中运行netsh命令。在这里，要做的是导入XML文件中的配置信息。

因为我们创建的“个人定制”文件中，有一个选项是不要“自动连接到网络”，所以下面需要手工连接到“VOIP”网络上。注意，有许多无线适配器在取消“监测模式”，恢复为“托管模式”的时候，需要重启一下无线网卡适配器才能生效。在图形用户界面，这种“重启”操作其实是由“禁用”（disable）和“恢复”（enable）两步完成的，在命令行的界面中，不但有这样的命令，而且其原理和方式也是一样的。我们可以在命令行中，按如下的命令格式和序列完成这一操作。

在“被占领主机”上，我们现在有了访问“服务集标识”为“VOIP”的无线网络的权限，即我们可以回到Meterpreter的接口上，开始浏览这个内部网络。如果想快速访问，并在访问中识别出可用的系统和端口，有一个很实用的工具可以胜任，这个工具的名字叫作MSFMap，这是Meterprecer程序自带的一个模块。

MSFMap是Meterpreter程序的一个可加载模块，是由Spencer McIntyre和SecureState LLC共同编写。该模块的下载地址是http://code.google.com/p/msfmap 。通过使用MSFMap，我们可以使用“被占领主机”上的TCP栈，可以通过其Windows系统进行内部网络的扫描。这种方法比传统方法快，因为这种方法使用的是“被占领主机”本地的TCP协议栈进行扫描的，而不是在传统方式下，在攻击者的系统上借助于Meterpreter的隧道技术所进行的远端主机方式下的扫描。

安装MSFMap的步骤很简单：下载源代码，运行安装脚本，设置将其作为模块进行调用的主程序Metasploit的位置即可。整个步骤如下所示：

返回到Meterpreter会话上，通过“load msfmap”命令，Meterpreter程序就可以加载MSFMap模块。如果在加载的时候没有带参数，那么MSFMap模块并不会真正执行，而是将其所有的选项参数以列表的方式全列出来。

在“被占领主机”上，通过Windows操作系统使用MSFMap模块，我们可以快速扫描大量主机的一些常用端口。

注意

在上面的例子中，由MSFMap模块所进行的“端口扫描”（port scan）中，考虑到显示结果中空间的限制，大多数扫描结果都没有列上去。

从MSFMap结果中，我们看到几个系统可以作为进一步分析优选的目标。Meterpreter程序也可以提供网络的“绕轴旋转攻击”（pivoting attack），也就是在攻击者的电脑上，通过端口重定向实施对远程目标系统的攻击。例如，如果攻击者想要通过MSFMap模块攻击IP地址为10.0.0.2的“文件传输协议”（File Transfer Protocol，FTP）服务器，我们就可以设置本地攻击程序的攻击端口为FTP常用的21端口，并设置重定向本地主机，其命令格式如下：

portfwd命令可以在攻击主机的Metasploit系统中，打开一个新的端口，端口号是2121。随后Metasploit程序就会监听这个端口，任何与攻击者本机建立连接并发向2121端口的数据都将被Meterpreter的会话进行重定向。然后通过Windows的无线网卡，转发到上面IP地址为10.0.0.2的主机上21号端口，完成对这个FTP服务器的攻击。

通过上面的访问方式，我们可以完成对远程主机的侦察、分析和入侵，其示意图如图6-9所示。

图6-9　攻击者借助于“被占领主机2”通过架桥过隙的方式对“被占领主机1”实施重定向攻击

无线网络的深度防御

在这一章中，我们通过一步步分解最终完成了一个完整的攻击案例。首先是针对我们虚构的“羹美食品”餐馆无线环境实施入侵，并占领其中一个客户端系统，然后借助这个客户端系统对其内部网络的访问，我们又破解了更多的内部系统。针对这种风格攻击的应对措施，也同许多我们已经贯穿全书描述的防御机制一样，对这些防御机制的深入的应用可以阻止来自无线客户端的攻击方的进一步攻击，从而避免危及企业内部全部网络的威胁，避免网络被扫描和内部主机被对方进行目标的列举，主要的应对措施有：

·禁止开放的网络。允许外界用户访问的开放网络（open network），比如一些免费的“热点”环境，这是将攻击者“引狼入室”的请柬。攻击者可以利用软件升级机制（如使用本章中所描述的技术），或其他存在弱点但却非常主流的协议（如DNS协议）进行攻击。其抵御方式就是：通过在用户工作站上的管理控制可以中止开放的网络，继而限制客户端暴露给攻击者。

·上层加密。如果你的外界用户必须要访问开放的网络，即必须为对方提供开放式的访问的话，则可以考虑要求上层加密（upper-layer encryption）的服务来强制安全政策，例如，如在支持“Internet协议安全性”（IPSec）的“开放标准的框架结构”上使用的VPN技术，就可以很好地防止攻击者的侦听，防止攻击者操纵客户端的活动。

·禁止未经过滤的“出接口”数据包。在本章中，攻击者在成功占领一个客户端系统后，利用Meterpreter工具集中的Metasploit程序，使用了从“被占领主机”到攻击者系统之间所架起的Metasploit VNC模块隧道技术，实现了获得对内部整个网络的访问机制。如果在公司的网络中，通过防火墙、强制代理服务器系统来禁用未经过滤的“出接口”数据包，那么从整个网络来看，就可以限制攻击者由外部向内部网络的访问，从而缓解随后网络访问机制所带来的风险。

6.5　本章小结

在这一章中，我们看到在一个“端到端”的攻击，即在盯一个客户端在一个不安全的“热点”环境中下载和运行软件安装工具的时候，攻击者借助于使用Veil编码工具，将带有Meterpreter工具的“反向TCP连接有效载荷”攻击方式“植入”到一个可执行文件中，并用这个可执行文件代替这个客户端要下载和安装的可执行文件。一旦用户运行这个可执行文件并中招，这个客户端就成为我们的“被攻击主机”，我们可以控制“被攻击主机”的系统，并躲避其防病毒软件的监看。随后，当“被攻击主机”离开这个“热点”环境，回到他的公司网络的时候，我们使用Meterpreter工具的persistence.rb模块，就可以获得访问“被攻击主机”的系统的能力。至此，我们相当于完成了“架桥”的工作。

在远程访问“被攻击主机”系统的时候，我们可以攻击那些由于物理距离上的限制而无法采用各种方式访问的无线网络。使用内置的工具和其他Microsoft公司软件，我们能够将Windows Vista的“被攻占主机”作为一个不情愿的参与者加入到对WEP网络的攻击行列，在列举附近首选的无线网络配置以后，就可以使用Microsoft公司的NetMon去完成远端数据包的收集。在另外的网络中，例如WPA2-PSK的网络，或一个开放的未加密的网络环境，也可以通过相同的方式进行攻击。

一旦收集到足以破解还原WEP密钥数量的数据以后，nm2lp程序可以将我们的数据格式从NetMon的格式转换成libpcap的格式，这样我们就可以采用包括aircrack-ng在内的通用攻击工具。一旦我们破解还原了密钥值，就可以以被动的方式解密所捕获的数据包，并可以从VoIP数据通信中提取敏感的信息。其次，我们返回到“被攻击主机”的系统中，添加了一个目标网络作为一个新的连接配置“个人定制”文件的内容，然后连接到这个“被占领的网络”上，从攻击者主机通过被控主机之间进行路由，最后利用发现的目标“架桥”跨过中间的“缝隙”连接到新的被控网络上。

在有些情况下，“被攻击主机”上没有可用的无线网络，这时，你就可以使用Windows“无线承载网络”的功能，将“被攻击主机”的系统变成一个“热点”环境。虽然这需要物理上接近“被攻击主机”所在的网络，但攻击者可以在Windows主机上放弃Meterpreter远程访问连接的限制，还可以通过“被攻击主机”连接到新成立的WPA2-PSK系统上。结合Windows系统，“桥接功能”（bridging functionality）的自动使用，攻击者可以访问“被攻击主机”的有线网络，就好像自己通过有线直接插到对方的有线网络中一样。

Microsoft公司“本地Wi-Fi模型”（Native Wi-Fi model）在Windows主机上增加了超强的功能，这给开发人员提供了与无线网络进行交互的新能力。这个模型还为攻击者利用“被占领主机”去攻击远程无线网络提供了新的机遇，通过这种能力，即使某无线网络在攻击者的物理覆盖范围之外，也变得可以访问。对那些只想依靠物理距离就避免无线连接的组织来说，又增加了危险。

第二部分　蓝牙网络的安全

·第7章　传统蓝牙模式下的扫描和侦测

·第8章　低功耗蓝牙模式下的扫描和侦测

·第9章　蓝牙侦听

·第10章　攻击和使用蓝牙

案例学习：入侵看不到的东西

“欢迎莅临Apparatchic购物商场，先生，需要我帮忙吗？”

有些客户对这些店员开始有些生气了，因为15分钟前，在他们进入这个商场的时候，店员对他们也都是同样的开场白，然后就对他们熟视无睹，不再理睬了。不过Jarod并没有生气，相反他只是笑了笑，因为他知道在店员眼里自己是下一个很快就没人答理的人。Jarod是一个既不帅也不丑，既不胖也不瘦，即不高也不矮的人，在这个商店的顾客群里，他只是一个“扎人堆儿里就找不到”的那种人。

没有人注意到他，不过，这正是他想要的效果。

Jarod这种“大众脸”的形象仅仅是一个人格特质，他在自己工作和生活中，早已习以为常。Jarod是蓝牙技术专家，而蓝牙（Bluetooth）就是只有少数人真正了解其来龙去脉的一种通信协议。就像Jarod是一个看上去不起眼的专家一样，蓝牙技术非常有效，但却不为人所见，其作用远超各种普通的无线感应技术。由于在无线组织中，蓝牙技术经常被忽视，所以也没有多少人去查找这种技术，对于蓝牙的嗅探也缺少必要的分析。但对于Jarod来说，他所做的这种研究工作很值。

“如果你已完成购物，我们乐意你结账后离开。”

Jarod将他所购的东西交给那个健忘的店员。当然，这个知名的高档服装店，试图通过将蓝牙设备设置为“非可发现”模式（non-discoverable mode），以便让顾客看不出他们提供了支持在蓝牙上刷信用卡（credit card）的事实，但这种雕虫小技，对于别人还有效，对于Jarod只不过是一个“温和的绊脚石”。在确定了主设备（master device）的“设备地址”以后，Jarod很快开始捕获数据帧。虽然除了蓝牙协议之外，剩下的协议部分仍然是一个谜，但这根本也不是什么问题，就像这不需要一个火箭科学家去认信用卡的卡号，也不是让他去从网络的痕迹中认识CVV模式，而只是从捕获的数据中，找到一些必要的数据即可。

“先生，我能把这次购买的价格打到你的存储费用上吗？”

在店员使用蓝牙接口的条码扫描仪扫描了商品标签时，Jarod把自己交易用的信用卡递了过去。从商店里店员的角度来看，条形码扫描仪只是在扫的时候把条码数据翻译成键盘上按的一串数字而已，而在Jarod的眼里，则是另一番景象。俗话说，“工程师向来‘非出我手我不用’”（not invented here [1] ），Jarod也认为：条形码扫描仪只是人机接口设备的小部件，你只要把它看作一个键盘就行，所以根本不能吸引他的兴趣，他真正关注的则是这个条码扫描仪使用的是蓝牙接口！Jarod很清楚，通过那个接口，他可以随意“注入”（inject）任何按键到扫描仪里，还可以下载并运行任意他想运行的代码。

“谢谢你在Apparatchic购物，McDonald先生。欢迎你下次光临。”

Jarod二话不说，拿起他的购物袋就走了。明知店名报错了他的名字，这名字根本也不是他信用卡上的名字，但他也无睱纠正，因为他根本就不想让这次入侵对方蓝牙系统的行为留下任何蛛丝马迹。

整个过程根本就没有人注意到他，而这，正是他所喜欢的。

[1] Not Invented Here，简称NIH，意指“非出我手我不用”。是指人，特别是技术人员或团队拒绝使用不是自己发明的技术。因为在他们眼里，他们会认为别人的东西不可靠、不安全，只有用自己做的才踏实。痴迷程序较深的，甚至可以称为“非出我手我不用症”。——译者注

第7章　传统蓝牙模式下的扫描和侦测

同任何成功的入侵方式一样，对蓝牙系统的攻击步骤，也是包括了解目标背后涉及的技术，然后进行扫描和侦测分析，最后是攻击和使用。在本章中，我们将会讲解蓝牙“传统的”规范，这里的“传统”指的是在“智能蓝牙规范”（Bluetooth Smart specification）之前的所有蓝牙技术。随后介绍蓝牙扫描和侦测的工具和技术。这里主要推荐一款可以用于蓝牙分析的硬件设备，即一些商业的蓝牙设配器和其他特殊目的的设备。本章内容还包括多种可以确认你身边的蓝牙设备的方式，一旦你找到它们的时候，下面就可以一步一步地访问这个目标。最后要介绍的内容是，在移动平台上，我们使用本地操作系统（OS-native）和第三方的工具，使用“主动式扫描器”对蓝牙进行扫描，进而验证我们技术的有效性。

注意

我们使用惯用术语“传统蓝牙”（Bluetooth Classic），是指“蓝牙4.0规范”（Bluetooth 4.0 specification）之前的蓝牙设备，而符合“蓝牙4.0规范”的则称为“低功耗蓝牙”（Bluetooth Low Energy）或“智能蓝牙”（Bluetooth Smart）。具体而言，传统的蓝牙设备包括“蓝牙基本速率”（Basic Rate，BR）设备和“增强数据速率”（Enhanced Data Rate，EDR）设备，而对于“低功耗蓝牙”则在下一章中介绍。第8章中的蓝牙设备与这一章的蓝牙设备规范不同。当然，无论是“传统蓝牙”，还是“低功耗蓝牙”，都简单地统称为“蓝牙”。

7.1　“传统蓝牙”技术概述

本节的目标是在一个较高的层次上描述蓝牙设备之间的数据交互操作，不会涉及底层协议的重要知识。主要讲解的内容是一些基本的概念，例如，“设备发现”（device discovery）、跳频（frequency hopping）和“微微网” [1] （piconet）。

“传统蓝牙”规范在2.4GHz的ISM波段上定义了79个信道，每个信道有1MHz的带宽。设备在这些信道中以每秒1600次的频率进行跳转，换句话说，就是每微秒625次跳转。这项信道跳转技术被称为“跳频扩频”（Frequency Hopping Spread Spectrum，FHSS），这时的蓝牙设备中，用户最大可以达到3Mbps的通信带宽，最大约为100米的传输距离。“跳频扩频”通过在射频（Radio Frequency，RF）频谱中快速地移动，针对噪声信道为通信提供鲁棒性（robustness）。

任何通过蓝牙技术进行无线通信的设备，需要通信双方在同一时刻处于同一信道之内，如下图所示。通过协调的方式进行跳频的所有设备可以相互进行通信，它们共同组成了一个蓝牙的“微微网”。“微微网”是两个或者多个蓝牙设备之间使用的基本网络模型。每个“微微网”都有一个“主设备”（master）和一个到七个“从设备”（slave）。“微微网”中的通信是严格在一个“从设备”和一个“主设备”之间进行的。“微微网”中使用的信道跳跃的顺序是伪随机性的（pseudorandom），它只能通过“主设备”的地址和时钟产生。

7.1.1　“设备发现”技术

就像所有的无线协议一样，使用蓝牙进行通信时，也同样需要确认在功率覆盖范围内是否有可能的“接入点”（peer），这个似乎并不难，只要大家同一频率，使用相同的通信协议握手即可，而当使用“跳频扩频”技术的时候，这个问题会变得非常复杂。假定在某一段时间内，有两个蓝牙设备已经在“微微网”中开始交互操作，这当然意味着它们两个设备的跳频的序列是一致的。但是每一个设备同样是“可发现的”（discoverable），这意味着这个蓝牙设备会周期性地广播它的“蓝牙设备地址”（Bluetooth Device Address，BD_ADDR）到其他还没有加入到这个“微微网”的蓝牙设备上，以便这些设备可以通过它的广播找到它。在这种情况下，这个蓝牙设备就必须暂时地停止它在“微微网”中的跳频动作，然后进入“监听”状态，以便监听是否有其他可能的蓝牙设备正在找自己，如果有，则对那些请求做出回应，然后回来找到原来那个跟自己在“微微网”中通信的蓝牙设备，继续之前的通信过程。这种定期检查其他设备是否在找自己的机制，称为“可发现的”。

许多蓝牙设备默认都不是“可发现的”，所以你需要专门开启这项功能，这通常需要一段时间该操作才能生效。在你打开一些以iOS作为系统内核的移动设备的蓝牙配置“设置”（Settings）页面时，系统会默认进入“可发现的”模式，其界面的显示如图7-1所示。如果某设备无视其他设备的“发现请求”（discovery request），或者也不主动寻找其他设备的“发现请求”，那么这个设备就称为“非可发现的”（non-discoverable）设备。要与这种“非可发现的”设备进行通信，唯一的方法就是通过其他一些手段，在拿到它的“蓝牙设备地址”以后，再通过“蓝牙设备地址”进行通信。

图7-1　 Apple公司iOS内核的蓝牙设置（进入“可发现的”模式）

7.1.2　协议概述

在一个蓝牙网络中，可能使用着的协议数量足以令人咋舌。这些协议通常可以分成两类：一种是在“蓝牙控制器”（Bluetooth controller）之间通信使用的，另一种是在“蓝牙主机”（Bluetooth host）之间通信时选择使用的。因为本书属于无线网络安全的主题，所以上面所说的“蓝牙主机”就是我们从笔记本电脑上运行攻击程序所攻击的对象。“蓝牙控制器”则是内置在笔记本电脑里的USB芯片组（chip），或是USB加密狗（dongle），接受“蓝牙主机”的命令，并解释执行这些命令。

图7-2显示了蓝牙协议栈中各层（layer）的组织结构，以及在每一层中，具体实现了哪些协议。从图中可以看到，“蓝牙控制器”负责跳频，基带封装（baseband encapsulation）并且将适当的结果返回到“蓝牙主机”。“蓝牙主机”负责处理更高层的协议，尤其是“主机控制接口”（Host Controller Interface，HCI）连接，它是“蓝牙主机”（你的笔记本电脑）和“蓝牙控制器”（你的蓝牙适配器中的芯片组）之间的通信接口。

图7-2　蓝牙主机和控制器之间的交互

在和蓝牙打交道的时候，需要把这个“蓝牙主机”/“蓝牙控制器”的模型放在你的脑海中。但作为黑客，我们最渴望的是对设备绝对的控制权，以便于可以操纵它的行为。如果将图7-2中的“蓝牙控制器”部分从整个模型中分离出来，那就意味着对于“蓝牙控制器”控制的那部分功能，我们都只能任由摆布而无可奈何。无论我们想让“蓝牙控制器”做什么，比如“始终保持在信道6上，不要再接收后面的包”，除非将这些要求转换为一系列的“主机控制接口”请求，或者通过另一种方式实现这些功能，否则无法达到预期的目的。最终导致我们对于这个无线设备没有那么多的控制能力。

（1）射频通信协议

“射频通信协议”（Radio Frequency Communication，RFCOMM）是蓝牙设备中采用的传输协议，使用该协议的蓝牙设备，一般是那些需要稳定的基于“流”（streams-based）的传输，这点和TCP协议很相似。“射频通信协议”被广泛应用于模拟串口通信，向电话设备发送AT命令集（又称“Hayes命令集” [2] ），在“对象交换协议”（Object Exchange，OBEX）协议上传输文件。

（2）逻辑链路控制及适配协议

“逻辑链路控制及适配协议”（Logical Link Control and Adaptation Protocol，L2CAP）是基于数据报文（datagram-based）的协议，该协议主要用于传输更高层的协议，比如“射频通信协议”和其他上层协议。一个应用层的程序员可以将“逻辑链路控制及适配协议”作为一种传输层协议使用，由于它是基于数据报文的，所以它的运行和UPD协议的运行很相似，是不可靠的连接方式，采用的是基于消息的数据传送机制。

（3）主机控制接口协议

如前面所说，蓝牙标准规定了使用“主机控制接口协议”的接口层来控制蓝牙芯片组，这些芯片组就是上面提到的“蓝牙控制器”。对于开发者来说，要访问标准蓝牙硬件的协议栈，远程“友好设备”（device-friendly）名称检索，连接建立以及终止，“主机控制接口协议”位于他们所能访问到的协议栈的最底层。

（4）连接管理器协议

“连接管理器协议”（Link Manager Protocol，LMP）位于“蓝牙控制器”协议堆栈的顶部，通过特定的硬件才能够访问它，换句话说，没有特定的硬件，这个协议是不可访问的，因此“连接管理器协议”主要用于处理那些“低层次加密”（low-level encryption）、信息验证（authentication）、数据配对（pairing）等操作。虽然通过控制“蓝牙主机”也可以完成这些功能，并可以明确地请求这些操作，但是“蓝牙控制器”的职责就是决定应该发送哪种类型的数据包，以及如何处理结果。

（5）基带层

和“连接管理器协议”层类似，开发者在没有特定硬件工具的前提下，是无法访问基带（baseband）层的。蓝牙的基带层主要规定了空中传输的参数（比如传输的速率），数据包最终在哪一层是形成帧，以及确定传送和接收的信道。

（6）蓝牙设备地址

“蓝牙设备地址”是一个48位（共6个字节）的数据，如下图所示，由三部分组成。

·非必要地址部分　“非必要地址部分”（Nonsignificant Address Part，NAP）有16位长度，位于“蓝牙设备地址”的前16位，是“组织唯一标示符”（Organizationally Unique Identifier，OUI）的一部分。这一部分被称为“非必要”的原因是这16位不会在跳频和其他蓝牙派生函数中使用。

·高位地址部分　“高位地址部分”（Upper Address Part，UAP）有8位，是“组织唯一标示符”的后8位部分。

·低位地址部分　“低位地址部分”（Lower Address Part，LAP）有24位，用来标识一个独一无二的蓝牙设备。

不像其他的无线协议中地址是公开并广泛使用的参数，在蓝牙网络中，“蓝牙设备地址”是作为一个秘密信息，不对外公开的。在以太网以及Wi-Fi无线网中，数据帧中都包含有地址，而在蓝牙通信中，“蓝牙设备地址”并会不包含在数据帧的头部进行传输，从安全的角度，这样就防止了攻击者使用侦听技术轻而易举地发现“蓝牙设备地址”的值。更为巧妙的是，恰恰是没有“蓝牙设备地址”信息，所以攻击者很难发现网络中正在使用的跳频规律，从而更增加了数据通信数据包的侦听难度。

7.1.3　蓝牙支持协议规范

“蓝牙技术联盟”（Bluetooth Special Interest Group，SIG）是一个负责定义蓝牙规范的国际组织。除了结构化的各层蓝牙协议栈之外，“蓝牙技术联盟”还规定了多种用户层的协议规范（application-layer profile）。这些协议为使用蓝牙提供了额外的功能和安全机制。这些协议规范可以在本机上编程实现，也可以不通过特定的硬件就可以随意地操纵它们。这些协议规范包括“服务发现协议”（ervice Discovery Protocol，SDP），“高级音频分发规范”（Advanced Audio Distribution Profile，A2DP），“蓝牙耳机规范”（Headset Profile，HSP），“对象交换规范”以及“个人局域网规范”（Personal Area Network Profile，PANP）。

7.1.4　加密和认证

加密和认证是直接包含在蓝牙标准规范中的，它直接在“蓝牙控制器”的芯片组中实现，这对于使用者和开发者来说是一种节约成本的措施。加密和认证使用与否是可选的，协议的开发商可以既不认证，也不加密；或者二者选择其中之一；或者两者皆用。

蓝牙的认证或者使用“传统配对”（traditional pairing）方式，或者使用在“蓝牙2.1规范”（Bluetooth 2.1 specification）中新设计的“安全简化配对”（SSP）方式。下面的内容中，我们将会讲解这两种认证机制。

1.传统配对

在当前大多数的蓝牙设备上，尽管“传统配对”认证的交换方式仍然在使用，但在“蓝牙2.1规范”中，“传统配对”方式被“安全简化配对”方式所取代。在使用“传统配对”方式中，当两个设备第一次相遇的时候，它们会完成一次配对交换，在这个过程中，每个蓝牙设备都从“蓝牙设备地址”中会派生出一个“安全密钥”（security key）、一个“个人识别号码”（personal identification number，PIN），以及一个随机数，其中的“安全密钥”又称为“连接密钥”（link key）。当交换过程结束的时候，两个设备都会将“连接密钥”信息存储在本地的“非易失性存储器”（local nonvolatile memory）中，以便在之后的认证交换中使用，以及需要使用的时候，用来派生“加密密钥”。

如果一个攻击者捕获到用于派生“连接密钥”的“传统配对”方式交换过程，同时也捕获了随后的认证交换过程，那么他随后攻击所选择的“个人识别号码”是完全有可能的。通常来讲，这是通过“个人识别号码”的“暴力攻击”（brute-force attack）来实现的，也就是通过猜测的“个人识别号码”计算，生成一个可能使用的“连接密钥”，随后将本地计算的认证结果同合法交换过程中的结果进行比较，最终检验所猜测的“个人识别号码”是否正确。详细的计算过程和攻击技术细节，我们会在第10章中进行讲解。

2.安全简化配对

在我们刚刚介绍的“传统配对”策略中，存在的最大问题就是这个实施被动式攻击的攻击者在捕获配对数以后，能够迅速地还原得到“个人识别号码”和存储的“连接密钥”。如果这个攻击者成功地拿到“连接密钥”，那么他就可以通过蓝牙网络解密所攻击的这一对蓝牙设备上的所有数据包交换，还能伪造合法设备参与其中。“安全简化配对”方式则会阻止这种被动式攻击的攻击者获得“连接密钥”，并且对于不同的蓝牙设备类型，提供多种认证选项。

“安全简化配对”方式通过采用“公钥密码学”（public key cryptography）的策略来改善蓝牙认证交换过程中的安全性，特别是通过“Diffie-Hellman [3] 椭圆曲线密钥”（Elliptic Curve Diffie-Hellman，ECDH）算法实现交换机制。一次Diffie-Hellman的密钥交换允许两台对等的蓝牙设备先交换“公钥”（public key），然后从中派生出一个“共享密钥”（shared secret），这个密钥对于捕获者来说是无法再生成的。这个产生出来的密钥被称为DHKey（即Diffie-Hellman key）。最终“连接密钥”由DHKey派生，并在随后的认证和加密过程中使用。

通过DHKey交换算法的使用，一个强大的“熵池” [4] （entropy pool）可以用来派生双方设备上的“连接密钥”。这个强大的“熵池”解决了“传统配对”派生中最大的问题，那就是在“熵池”，每一个单一的资源只是一个很小的“个人识别号码”值。

在介绍完了蓝牙技术的组成之后，我们就可以以攻击者的视角来讲解蓝牙了。同样我们会讲解各种攻击蓝牙技术的方法，深度挖掘支持这一全球标准的各相关技术和组件。

[1] piconet，用蓝牙技术把小范围内装有蓝牙通信模块的各种设备组成的微型网络，其范围一般在10～100米，俗称“微微网”。——译者注

[2] 早期数模转换设备中，最早的调制解调器Modem就是Hayes公司（中文名称“贺氏”）发明的，不过，Hayes在完成自己的使命以后，就退出了历史舞台，尽管如此，之后的Modem都统统宣布“贺氏兼容”。该调备的通信命令都以“AT”（即Attention）开始，所以统称AT指令集。现在这个指令集仍然广泛使用。——译者注

[3] Diff ie-Hellman　由Whitf ield Diff ie和Martin Hellman在1976年公布的一种密钥一致性算法。该算法是一种建立密钥的方法，而不是加密方法。——译者注

[4] 熵是信息论里的概念，简单地说，就是信息有效性的程度。比如“这个密码由4位数字组成”，那么这个信息相当于告诉你这个密码共有10000种可能，而“这个密码是我生日的4位数字”，那么这个信息相当于告诉我们这个密码只有366种可能。——译者注

7.2　准备一次攻击

先花费一些时间为蓝牙攻击做一些预先的准备工作，你会从这个实用的系统中收获很多，因为这个系统中有很多“拿出来不改即可用”（out-perform off-the-shelf）的组件（component）。在这部分中，我们会在选择蓝牙攻击设备和攻击技术上提供一些指导，以便读者能将这些设备和技术扩展到更大的使用范围。

7.2.1　选择传统蓝牙攻击设备

在准备你的“传统蓝牙”攻击军火库装备的时候，首选且最重要的决定是选择一个“传统蓝牙”的接口，以后，就是在这个接口上来发起你的攻击。这个决定可能看上去有些不值一提：随便挑一款老式蓝牙接口插到笔记本电脑上不就行了吗？的确，如果你真的这么草率地做的话，你的起步会非常顺利。然而，如果你足够幸运的话，尽管这个方法可能同实验室环境中的运行效果很类似，但在你攻击现实目标的实战中，你会有一种完全不同的感觉。

1.“传统蓝牙”接口的功率等级

“传统蓝牙”规范书中定义了三种功率等级，要求生产商在生产蓝牙无线接口的时候参照生产。在这些等级中，影响着“传统蓝牙”技术的使用效果的决定性因素是通过设备发射器的“最大输出功率”（maximum output power）来确定的。举例来说，一只“传统蓝牙”耳机设备的通信距离并不会太长，因为它一般是同用户口袋中或者就近桌子上的电话进行配对。所以，为了让蓝牙耳机的电池发挥最好的功效，生产商在设计耳机输出功率的时候，将其最大输出功率设计成远大于大家所需要的距离，这种设计思路很显然是不可取的，所以大部分的“传统蓝牙”耳机都会在无线接口中采用中等的输出功率。

为了满足不同“传统蓝牙”设备的需要，“蓝牙技术联盟”定义了三种不同的功率等级，范围从1~100mW（毫瓦）。功率等级是根据连接到“传统蓝牙”接口天线上的输出进行测量的，其有效的范围如表7-1所示。

表7-1　“传统蓝牙”接口的功率等级

然而，对于蓝牙的开发者，会根据他们设备特定应用所要求的功率，从或大或小的三种不同的蓝牙射频输出功率做出选择；但对于蓝牙的攻击者，则通常会选择最大的发射功率，以便获得最大的有效攻击范围。“第1级”（Class 1）设备的发射功率是100mW，它的功率覆盖范围和Wi-Fi无线设备的功率覆盖范围相似，并且通过配备外置天线（external antenna）还可以再扩大它的功率覆盖范围。幸运的是，作为蓝牙攻击产品的销售团队意识到了这个商机，所以他们会在产品的外包装上标明：该设备接口可以提供“第1级”的功率覆盖范围。

对于攻击者来说什么时候“功率覆盖范围不是黑客的首选考虑因素”？

在某些情况下，能够提供最大覆盖范围的蓝牙接口反而不是我们最想要的。比如说，考虑一种情况，那就是假设你想要建立一个蓝牙攻击实验，在这个实验中，负责攻击的“目标蓝牙设备”将用来开发攻击技能、进行攻击研究和试验。如果这个“实验蓝牙设备”在物理距离上越来越靠近我们的“目标蓝牙设备”，即“实验蓝牙设备”已经进入到“目标蓝牙设备”的功率覆盖范围内，但“目标蓝牙设备”还没有进入“实验蓝牙设备”的功率覆盖范围内，那么同样无法完成后续的各项攻击任务。但与此同时，你可能会不经意间扰乱，甚至攻击了该未被授权的设备。同样，蓝牙在2.4GHz的波段中使用了“跳频扩频”技术，所以一个高功率的适配器可能会和许多Wi-Fi设备进行交互，这会导致其他的发送器占用拥挤的波段。

如果这些情况都是你所在的机构遇到的问题，那么我们就需要一个“加密狗”来限制其功率发射范围，因为一个“传统蓝牙”加密狗可以将其发射功率调到第2级。如果缩小了功率覆盖范围，但问题仍然存在的话，那么就考虑再加一个“射频阻断”（RF-blocking）设备吧，比如“法拉第笼” [1] 就可以达到这样的效果。

2.扩展蓝牙的功率覆盖范围

对于一个蓝牙攻击接口来说，一个非常渴望的属性就是能够扩展通信的有效覆盖范围。这个不难想象，通常情况下，攻击者会选择一个“第1级”加密狗，它的传输能力有100mW，但即使在没有任何干扰的情况下，它也只能传到100米的范围，如果我们还是期待它能有更好的性能。要实现更大的覆盖范围，你可以使用“定向天线”来指定从蓝牙攻击接口发出的射频辐射方向图（RF radiation pattern）。

因为蓝牙设备和IEEE 802.11g设备一样，都是工作在2.4GHz的波段，所以有很多种天线都是可以选择使用。你可以从类似于http://www.fab-corp.com 和http://www.netgate.com 这样的网站上购买到拥有不同增益特性和传播特性的天线，它们的售价在25~140美元。

在商业上使用的“传统蓝牙”适配器，只有其中的少数几种可以使用外天线连接器（external antenna connector），这些具有连接器的适配器通常都是为了工业应用而设计的。其中的一个样例产品，名叫“SENA Parani UD-100”适配器，它拥有“反极性SMA”天线连接器，只有在http://www.sena.com 网站上的认证零销商处才能够购买到。在编写本书的时候，它的售价是40美元。这款产品对于从事蓝牙攻击接口的攻击的黑客来说，是很有吸引力的。该产品的接口采用的是基于CSR芯片组，并使用了相对结实的连接器结构。产品实物图如图7-3所示。

图7-3　“SENA Parani UD-100”适配器

[1] 法拉第笼（Faraday cage）是防止电磁场（EM f ield）进入或逃脱的金属外壳。一个理想的“法拉第笼”由一个未破损的、完美的导电层组成。在实际中这种理想状态是不可能达到的，但是，通过使用细网的铜筛可以近似达到。——译者注

7.3　侦查

在蓝牙攻击的侦查（reconnaissance）阶段，我们可以借助“目视检查”（visual inspection）和“组合发现”（hybrid discovery），通过“主动式发现”（active discovery）和“被动式发现”（passive discovery）方式，在附近区域，检查并确定“要攻击的”蓝牙设备。这里的“发现”进程就是确定存在的蓝牙设备，以及寻找到每个设备的48位“蓝牙设备地址”。

一旦你发现了一个蓝牙设备，就可以开始枚举这个设备上所使用的服务，确认可能的攻击目标。还可以采集远端设备的特征值（fingerprint），使用蓝牙嗅探工具（sniffing tool）捕获“微微网”中的数据，进而获得访问机会。下面，我们就详细讲解这些步骤。

7.3.1　主动式设备扫描

“蓝牙侦查”扫描的第一步只是简单地查询功率覆盖范围内各设备的信息。在蓝牙规范中，这个被称为“询呼扫描”（inquiry scanning），其过程是设备在一系列频率上都主动发送查询扫描信息，然后监听有没有回应信息。如果在上面这个功率覆盖范围内，有蓝牙设备处在“可发现的”模式，它会对“询呼扫描”信息进行“询呼应答”（inquiry response），在“询呼应答”中，包含它的“蓝牙设备地址”、时钟信息（也称为“设备时钟”，或简写成CLK）、设备种类信息。设备种类信息包括电话号码、可佩带设备、玩具、计算机等。

在不同的平台上有很多种主动式“设备发现”的工具，其中有简单的命令行工具，也有复杂的图形界面工具。下面我们会讲解不同平台上的一些工具，以便了解在不同的平台上有哪些工具可供选择。

在Windows上使用BluetoothView进行设备发现

BluetoothView是一款Windows操作系统下，免费的闭源代码（closed-source）的主动式“发现扫描”工具，程序由NirSoft公司才华横溢的Nir Sofer编写，软件的下载地址是：http://www.nirsoft.net/utils/bluetooth_viewer.html 。BluetoothView软件提供一个简单的界面，可以自动检测可用的蓝牙适配器，并扫描处于“可发现的”模式的蓝牙设备，扫描结果是以表格显示的，如图7-4所示。

图7-4　蓝牙设备扫描结果

BluetoothView软件在查询到蓝牙设备后，会确定设备的“友好名称”（device-friendly name）和“蓝牙设备地址”，以及设备的“类型”（device type）和“发现时间戳”信息，如第一次看到的时间和最后一次看到的时间。双击一个已被发现的蓝牙节点，BluetoothView程序将显示该节点的详细信息，如图7-5所示。一个简单的HTML报告也会同时生成，单击“查看（View）→HTML报告-所有的项（HTML Report-All Items）”菜单项，程序会弹出该节点属性对话框，其显示效果如图7-6所示。

图7-5　HTML报告-所有的项属性对话框

图7-6　BluetoothView软件的HTML扫描结果报告

虽然BluetoothView软件只是一款简单且方便的软件工具，但该工具既不能显示目标蓝牙设备上“发现服务”（discoverable service）的列表，也不能显示设备的信号强度。所以要想获得蓝牙设备上更多的详细内容，我们还需要转向其他平台上的工具试试看。

Android上的蓝牙发现工具

在Windows操作系统上，使用BluetoothView工具进行蓝牙扫描是件简单而方便的事，因为你可以在外置蓝牙USB加密狗上，方便地通过不同的天线选择而获得不同的信号增益。然而，如前所述，在Windows中，针对蓝牙发现方面的“应用程序接口”（Application Programming Interface，API）没有提供读取发现的设备“信号强度”（signal strength）信息的调用函数。而对于“信号强度”的信息，又是我们在追踪对方时测算相对距离和估计对方节点位置的重要依据。

为了获得蓝牙设备的“信号强度”信息，以及与其他蓝牙节点的详细信息，在“谷歌玩家市场”（Google Play marketplace）上，有一款可用的Android工具可以做到这一点。这个工具不需要“访问Android平台”的权限，也就是说，在Android平台上，要正常使用这个软件，既不需要“root权限”，也不需要以root用户登录。程序只需要有访问蓝牙设备“扫描”（scanning）和“访问”（access）的标准权限即可。从开发的角度来看，就是需要“android.permission.BLUETOOTH”权限和“android.permission.BLUETOOTH_ADMIN”权限。虽然目前该工具不支持外置式蓝牙适配器，但是就目前所提供的功能来说，Android系统上的这些工具已经获得了Windows操作系统所不具备的优势。

“Bluetooth Finder”是一款由JoséLuis Costumero设计的，用于蓝牙发现的简单扫描工具，可以通过“谷歌玩家市场”下载。在启动该应用程序之后，单击“当前未扫描状态”（Scanning Off）按钮，“Bluetooth Finder”就开始扫描，此时“当前未扫描状态”按钮也自动变成了“当前正在扫描状态”（Scanning On）按钮。在扫描过程中，将搜索附近蓝牙设备，并将发现的蓝牙设备的一些参数显示出来，主要有“蓝牙设备地址”、友好名称、频繁更新的信号强度信息（单位是dBm），某次扫描的实例如图7-7所示。图中的信号强度值越高，表明被扫描的那个蓝牙设备离我们越接近，反之，则表示离我们越远。由于该值是负值，所以体现在数字上，信号强度越高，值越大，越接近于数字0，在图上表现出来的就是那个“进度条”中填充的部分越多。

图7-7　“蓝牙寻找器”扫描结果

“Bluetooth Finder”的优势很明显，特别是通过信号强度，可以大致估算对方蓝牙设备和自己的设备之间的距离，但是该软件并没有提供这样一种接口，即将单个蓝牙设备的扫描结果集中汇总，然后通过对该蓝牙设备的综合实时信息，对其实施跟踪或追踪。不过，通过上面的分析可以看出，一个变通的办法就是只要我们一直朝着“信号强度”增大的方向走，最终总能找到一个“可发现的”蓝牙设备。不幸的是，这款“Bluetooth Finder”软件，并不试图枚举发现蓝牙设备上的所有服务。

计算信号发送者和接收者之间的距离

“信号强度”的信息单位是dBm，通过“信号强度”的数值，可以大约估算出蓝牙信号的“发送者”（transmitter）和蓝牙信号的“接收者”（receiver）之间的距离。假设蓝牙信号的“发送者”是一个“第2级”设备（Class 2 device），其发射功率是2.5 mW，那么你可以参考“接收信号强度指示”（Received Signal Strength Indication，RSSI）所给出的参数，其中：距离为1米时，信号强度为-55 dBm，波段为大约2.4 GHz时的“传播常量”（propagation constant）值为3，其计算发送距离中，单位为英尺 [1] （feet），也就是公式中的“d”，其公式如下。

d=10（-55-rssi）/（10×3） ×3.2808

使用编程语言Python [2] ，我们可以很容易地计算出距离。只要在蓝牙扫描过程中，将看到的“信号强度”值代替上面式子中的参数rssi即可。“传播常量”可以在2和4之间进行调整，以便适应不同的射频环境。增加“传播常量”的值意味着蓝牙信号在传播中，遇到障碍物后射频信号衰减得很多；减少“传播常量”的值意味着蓝牙信号在传播中，遇到障碍物很少，因而射频信号衰减得很少。

这种技术不需要考虑许多射频传播的因素，而只是作为一个估算值。如果你需要估算一个“第1级”发射功率的前提下，“发送者”和“接收者”之间的距离，那么“发送者”测试“信号强度”时，在距离为1米的地方，可以使用平均的“接收信号强度指示”标准作为公式中参数rssi的值。

作为“Bluetooth Finder”工具的替代品，btCrawler在“谷歌玩家市场”上的售价是0.99美元，主要用于标识周边蓝牙设备的应用，可以扫描到的值主要是“设备类型”、商备开发商（这个值主要是从“蓝牙设备地址”中分析“组织唯一标示符”的值，然后再进行匹配分析）、以及“接收信号强度指示”信息，一次实战扫描结果如图7-8所示。

在btCrawler软件中，选择一个发现了的节点后，还有一个显示的选项，可以列举出这个蓝牙设备上发布的服务，这个功能显然是“Bluetooth Finder”软件所不具备的。对于一个在Mac OS X 10.9.1“冲浪湾” [3] 版上，“服务发现”输出界面的显示如图7-9所示。

在扫描蓝牙设备的过程中，btCrawler在本地数据库中保存了扫描的结果。这个数据库中的数据可以导出为csv格式的文件到系统的SD卡上。在Android设备上，没有物理SD卡插槽，这时可以将文件导出到安卓的“虚拟SD卡”（virtual Secure Digital Memory card）。要完成这个操作，只要选择程序的“菜单（Menu）→数据库导出（Export Database）”菜单命令即可。由于csv格式是以逗号隔开的纯文本格式，所以文件格式非常小，并且可以在任何文本编辑器中查看和修改。

无论是“Bluetooth Finder”，还是btCrawler，都是“蓝牙发现”类工具中很有用的应用程序，这对一般用户来说，应该是够用了。但这两个程序在发现设备后，所显示的设备信号中都缺乏一些细节描述，对于黑客来说，似乎还缺少一些信息。要想获得蓝牙设备上，有关蓝牙发现和服务列举方面更详细的信息，你就需要使用Linux操作系统上基于命令行的工具了。

图7-8　btCrawler蓝牙节点的“服务发现”实例

图7-9　btCrawler“服务发现”的运行实例

Linux上使用hcitool进行设备发现

Linux的标准命令hcitool可以用来进行“蓝牙发现”和基本的“服务枚举”。与前面各工具相比，该命令具有一定的智能化，即当在扫描的时候，hcitool程序会缓存所有已扫描好的蓝牙设备的相关信息，这意味着，如果有某个蓝牙设备离开了自己信号覆盖的有效范围后，程序仍然能够潜在地告诉你。当然，如果你对这个功能没有兴趣，你只想关注当前自己信号覆盖以内的蓝牙节点，也就是说强制hcitool程序不要对结果进行缓存，那么可以通过“--flush”参数进行指定。另外，默认情况下，hcitool程序只会显示扫描到蓝牙设备的“蓝牙设备地址”和“设备名称”两项信息，如果你想获得更详细的信息，可以通过加上“--all”参数来实现。

提示

如果不以root用户权限运行hcitool程序进行扫描，那么扫描结果中，对于扫描到的蓝牙设备信息，在明显的时候，只显示有限的信息。

对于每一个蓝牙设备，在接到查询命令时，都会做出回复，而hcitool程序正是从这些回复中提取设备的信息。这些信息可以包含“蓝牙设备地址”、设备名称和设备类型、无线生产商（radio manufacturer）、“连接管理器协议”的版本号，以及详细的枚举信息。

注意

对于黑客来说，“连接管理器协议”版本号非常重要，因为通过版本号，黑客可以知道这个版本的蓝牙设备支持哪种安全特性（言下之意，还存在哪些漏洞）。在上方的示例中，“连接管理器协议”的版本号是2.1。在蓝牙规范中，在2.1版本之前都没有“安全简化配对”机制，而在2.1版本时，引入了这个机制，所以这暗示了我们，这个版本是支持“安全简化配对”机制的，支持这一版本之前的各破解工具，现在不一定能继续使用。

Linux上使用BTScanner进行设备发现

虽然使用hcitool命令行工具进行快速的蓝牙设备扫描是很方便的，但是这个命令没有持续扫描的能力，这个命令只在发现有蓝牙设备在自己功率覆盖范围之内时更新一下显示结果。要解决这个不足，让对于这种类型的扫描一直处于持续进行中的显示状态，那么Linux上的BTScanner工具则是一个更好的选择，这个工具在持续扫描蓝牙设备的同时，提供一种简单的、基于文本的接口，将每个发现的蓝牙设备，都以一行内容的效果显示出来。虽然只用一行信息显示，但并不意味着这个工具显示的内容少，可以这么说，除了配对（pairing）信息之外，BTScanner工具会尝试收集尽可能多的信息。如果用户选择显示某个指定的蓝牙设备时，这个工具会提供一个与这个蓝牙设备相关的详细信息视图。

BTScanner软件的下载地址是http://www.pentest.co.uk ，同样也可以使用apt-get命令通过Unbuntu安装包管理系统，或者是Synaptic安装包管理器来安装它，安装的步骤和方法同Linux下其他同类安装包的安装过程类似。

要使用BTScanner程序，首先打开一个Linux上的终端（terminal）窗口，然后以root权限运行命令btscaner，所以其命令的格式为“sudo btscanner”。运行后的BTScanner程序会开启一个浅灰色的背景，并在屏幕底部的“状态栏”（status window）中显示“热键”（hotkey）列表。用户可以通过这些“热键”来控制BTScanner开始扫描、停止扫描、将当前的结果保存到日志文件中，或是针对某个蓝牙设备开始某种攻击。表7-2列举了可用的“热键”以及该按键所对应的作用。

表7-2　BTScanner软件的热键选项

要开始扫描周边的蓝牙设备，按下“i”键。BTScanner程序在“状态栏”上显示“开始询呼扫描”的状态行，然后在主窗口中显示被发现的蓝牙设备信息，这些信息包括某个蓝牙设备被发现时的“时间戳”（timestamp），设备的“蓝牙设备地址”，蓝牙设备的“系统时钟信息”，“设备类型”，“友好名称”等信息，如图7-10所示。

图7-10　扫描发现的蓝牙设备信息

提示

如果你的扫描设备上存在不止一个蓝牙接口的话，BTScanner程序会同时使用所有的蓝牙接口，一起进行扫描。这项特性使得BTScanner工具在发现和枚举设备的速度上快于那些只能使用单个蓝牙接口的工具。

BTScanner中存在的bug

bug像瘟疫一样遍布在许多新的程序中，许多黑客工具也都难于幸免，BTScanner程序也不例外。现在的BTScanner程序，其原作者已经多年没有对它进行维护升级了，这导致程序中存在的bug至今仍然存在着。

消失的设备　在BTScanner程序的显示中，设备列表中正在显示的蓝牙设备，会突然莫名其妙地消失。在遇到这种问题时，要想找回消失的蓝牙设备，一个变通方案是：如果设备从显示列表中突然消失，则按小写字母键“o”打开“选择一种排序方法”（Enter A Sort Method）对话框，然后随便按什么排序，以便改变当前的显示顺序，然后再按小写字母键“f”和“回车”键回到上一级显示中，这时消失的设备就会因为重新排序而出现。

无法启动BTScanner程序　在“终端”窗口中，运行BTScanner程序需要终端窗口至少有80个字符的显示宽度 [4] 。如果你尝试在小于这个宽度的终端窗口中打开BTScanner程序运行的话，你会看见“状态栏”显示“已完成读取OUI数据库”（Finished reading the OUI database）的状态信息提示，然会返回到Shell外壳命令行提示状态。所以，在开启BTScanner程序之前，首先确认你的终端窗口至少有80个字符的宽度（最好有24个字符的高度）或者更大。

调整尺寸时会崩溃　如果你在BTScanner程序运行的时候，尝试调整“终端”显示窗口的大小，那么BTScanner程序就会崩溃，并提示“分段的‘段地址’访问错误”（Segmentation fault）。避免这种情况，需要在开启BTScanner之前，先确认你要使用的窗口大小是否合适，如果不合适，马上调整，直到“终端”窗口的尺寸合适了，再运行程序，否则，在退出BTScanner程序之前，不要尝试调整“终端”窗口的大小。

BTScanner程序最大的特征之一，是程序为每个被发现的蓝牙设备所生成的日志信息。当你运行BTScanner程序时，它会在用户的主目录下创建一个名为bts的目录。在这个目录中，BTScanner程序会根据设备的“蓝牙设备地址”，为每一个被发现的节点再各自创建一个目录，不过，因为冒号不适合做文件名和目录名，所以BTScanner程序会把“蓝牙设备地址”中冒号分隔符替换为下划线分隔符（比如00_02_EE_6E_72_D3）。

提示

BTScanner程序创建的所有目录和日志数据都只有root用户才能够访问，所以如果在使用cd命令转换到bts目录时遇到了“禁止访问”（Permission denied）的提示信息，则需要运行“sudo su”命令切换到root权限才行。

在每个设备目录中，BTScanner程序都会创建两个文件：“时间戳文件”（timestamps file）和“信息文件”（info file）。“时间戳文件”中包括BTScanner每次收到蓝牙设备回应的时间。在跟踪移动蓝牙设备的时候这个记录会非常有用，可以根据时间来判断，在某一段时间里，这个蓝牙设备是否在或者不在自己的功率覆盖范围之内。

“信息文件”包括详细的设备信息，包括“蓝牙设备地址”、“设备制造商名称”、“蓝牙设备地址”所关联的“供应商名称”、“组织唯一标示符”编码，“MAC地址前缀”，以及一份详细的设备所有服务列表。

除了BTScanner程序存在一些bug（详见前面“BTScanner中存在的bug”的内容）之外，BTScanner程序的日志存储和分析功能对于确认“可发现的”蓝牙设备是非常有用的。遗憾的是，BTScanner程序的作者不再进行升级开发这个程序了，因此本程序，将来恐怕也难看到任何bug的解决方案了。

iPhone平台上的发现工具怎么样

还有一些工具可以用来进行蓝牙设备的扫描工作，但在实战中我们不推荐使用，因为这些工具通常易用性很差，进行扫描的操作十分复杂，或者程序缺少扫描工作所需要的必要功能，也没有什么特色。举例来说，“越狱版”（jailbroken）的iPhone可以使用Cydia程序来安装SweetTooth蓝牙扫描程序。在我们编写本书的时候，SweetTooth也还只能显示“可发现的”蓝牙设备的设备名称，还不能读取到“蓝牙设备地址”、“设备类型”和其他相关信息。

另外，比较悲剧的是，Apple公司限制开发者使用“本地iPhone蓝牙功能”（native iPhone Bluetooth functionality）来进行蓝牙设备的扫描操作，因此iPhone用户除了上述软件，并且是在越狱设备上可以使用外，其他就再没有可用的“蓝牙发现”工具了。

主动扫描技术的防御技术

针对蓝牙设备，主动式扫描工具要求蓝牙设备处在“可发现的”模式下才可以识别出它们，这就意味着蓝牙设备主动扫描是一种机会主义的攻击方式。原因很简单，攻击者只是识别出那些应答了“询呼请求”的那些蓝牙设备，所以攻击者也很容易地就能够确认它们，对于不做应答的蓝牙设备，攻击者也无能为力。同时，防御此类攻击的方法非常直接：不要让你的蓝牙设备处于“可发现的”模式。

这个建议听起来很容易，但是要做到，有些时候却是很困难的，这里的困难不是指设备的协议不容易通过程序实现，而是因为“牵一发而动全身”，很多蓝牙相关的通信协议本身就需要以这个功能作为前提。举例来说，在初始“配对交换”（pairing exchange）过程中，许多蓝牙设备要求另一个蓝牙设备处于“可发现的”的状态，如果对方没有处于“可发现的”状态，则无法继续，而一旦对方处于“可发现的”状态，则又为攻击者创建一个新的窗口，然后借助于网络提供的机会实施攻击。现实中，另有一些蓝牙设备也容易受到黑客的攻击，这些蓝牙设备的实现方式粗制滥造，所以在使用无线接口与其他蓝牙设备连接的时候，每次都要求用户进行发现和选择，用户只要稍不注意，就是使该蓝牙设备处于“可发现的”模式中。

前面我们列举的这些工具的共同特点是：要扫描的目标蓝牙设备必须处于“可发现的”模式下，扫描程序才能够识别和确认。同时，我们也提到，要想蓝牙设备安全，最好的措施是在“配对交换”结束后，终端用户将他们蓝牙设备调整为“非可发现的”模式，从而防止“主动式扫描”工具发现它们，这样等于又增加了一层安全。现在，我们介绍在对方蓝牙设备处于“非可发现的”模式下可以使用什么技巧来识别这些蓝牙设备。

7.3.2　被动式设备扫描

在蓝牙规范中，并不要求两个需要通信的蓝牙设备之间通过“询呼扫描”（inquiry scan）进行数据的交换。因此，如果你通过一些第三方的外部技术，获得了某个蓝牙设备的地址，比如你是通过阅读文档找到的。那么对方的蓝牙设备，区分不出你现在所发起的连接，是在获得“蓝牙设备地址”后是直接发起的，还是通过主动式的扫描后，从扫描中拿到“蓝牙设备地址”后发起的。无论是哪一种，都会涉及“蓝牙设备地址”，所以这部分的介绍，全都是被动式捕获“蓝牙设备地址”的技术。

目视检查

有时候，要确认一个蓝牙设备，简单的“目视检查”（Visual Inspection）足矣！因为前面所谓的蓝牙设备，其实并不存在这样一个叫“蓝牙”的设备，而是说某个设备具有蓝牙功能的通信接口，因此具有蓝牙接口对于许多设备来说是很值得自夸的一个功能，凡是具有此功能的产品，都会在产品上打上“蓝色的LED灯”图案，或者蓝牙的“蓝牙技术联盟”的标志。举例来说，看一下图7-11中所示的设备，这幅照片是作者在当地的超市中拍摄的，这个超市的所有收款台都配有手持的条形码扫描仪，与传统有线的条形码扫描仪相比，对于一般小件物品，二者相差不大，但对于扫描大件物品时，由于蓝牙手持的条形码扫描仪不需要连线，可以在一定范围内随便移动，不受连线的限制，因而其优势十分明显。上面的蓝牙标志清楚地标明，这个设备是使用蓝牙技术进行通信的。

注：蓝牙技术联盟的标志是：，而蓝牙的标志是该标志左边椭圆型的蝴蝶标志。并且由于其名字的原因，蓝牙通常会使用蓝色作为其图案的主色调。——译者注

图7-11　蓝牙手持条形码扫描仪

在付款台附近进行一次非正式扫描之后，我们发现所有的蓝牙手持条形码扫描仪现在的配置都处于“非可发现的”模式中。这就意味着，如果我们想对它们实施攻击，那么前面提到的主动式扫描发现是不可行的，这该怎么办呢？仔细地观察这些扫描仪的底座，可以发现每个底座上都有一个条形码，而该条形码正是这台手持条形码扫描仪的“蓝牙设备地址”，如图7-12所示。拿到这个条码值，结合前面对“蓝牙设备地址”的介绍，我们知道这个地址的前3个字节是“00：0C：A7”，分别是“非必要地址部分”、“高位地址部分”部分，共同组成了IEEE“组织唯一标示符”的生产商编码。这个生产商编码可以通过http://standards.ieee.org/regauth/oui/oui.txt 查询所对应的生产厂家。通过查询，我们可以知道该蓝牙手持条形码扫描仪的设备生产商是“码捷（苏州）科技有限公司”（Metro（Suzhou）Technologies Co.，Ltd）。访问“码捷科技”的网站，知道这是“码捷科技”（Mecrologic）的一个子公司，并且这款蓝牙手持条形码扫描仪的型号是MS9535 VoyagerBT。从“码捷科技”公司的公司网站上，我们还可以找到有关这款扫描仪的一份PDF版本的用户指南，在上面描述了这款设备的默认“个人识别号码”信息。

图7-12　手持条形码扫描仪的条形码

把“蓝牙设备地址”信息印贴在设备外壳上是很普遍的现象。由于两个蓝牙设备之间，必须共享“蓝牙设备地址”信息才能完成“配对交换”的操作，所以要与某个蓝牙设备进行联系，必须通过某种方式输入对方的“蓝牙设备地址”信息。可以通过蓝牙设备自动完成的“询呼请求”/“询呼应答”过程，也可以通过手动输入操作，还可以通过其他第三方的一些方式来完成。对于那些结构简单的蓝牙设备，由于缺少“LCD显示屏”，并且没有什么可配置的选项，所以手动输入“蓝牙设备地址”信息的方法并不可行。虽然使用“主动式扫描发现”是可行的，但是当扫描时，同时发现多个蓝牙设备的时候，对这些设备进行区分又变成了麻烦事，因为此时虽然知道在你的功率覆盖范围内有几个蓝牙设备，也知道每一个蓝牙设备的“蓝牙设备地址”信息，但哪一个蓝牙设备对应于哪一个“蓝牙设备地址”呢？或者说，你要与哪一个蓝牙设备进行“配对”操作呢？这时，最有效的办法，就是直接将每一个蓝牙设备的“蓝牙设备地址”信息印在或写好贴在设备上。

7.3.3　组合式扫描

在确认识别某个蓝牙设备的时候，如果“主动式扫描发现”和“目视检查”都无法奏效，那么不妨试试下面几种组合发现机制。

Wi-Fi和蓝牙在地址上的“大小差一”

当一个设备制造商在生产一个需要带有多个接口的产品时，就必须为每个接口都配置一个MAC地址 [5] 。通常来讲，单个设备上的多个MAC地址之间通常都是彼此相关的。从技术的角度来看，那就是这些MAC地址之间的前5个字节都是相同，但是最后一位在数值上相差1，这个称为“大小差一”（Off-by-One） [6] 现象。比如，某个蓝牙设备有两个接口，如果设备制造商给第一个接口配置的MAC地址是00：21：5C：7E：70：C3，那么第二个接口的MAC地址通常是00：21：5C：7E：70：C4。根据这种设备制造商的习惯性行为，有些系统就可以将MAC地址相连的两个接口，识别为是一个设备上的，这种想法已经被“无线入侵检测系统”（Wireless Intrusion Detection System，WIDS）的供应商用在判断网络上的恶意AP接入点的算法上了。其原理是，在通过一个“网络地址转换”连接的网络上，如前所述，作为无线IEEE 802.11访问网络中，其“基本服务集标识”其实就是AP接入点的MAC地址，而有线网络中，其“网络地址转换”的MAC地址当然还是网卡硬件的MAC地址，如果这两个地址相差1，这足以说明这两个MAC地址位于同一个设备上，那么，一个设备为何需要既通过无线上网，又通过有线上网呢？唯一的可能就是“这是一个AP接入点”，而一个单位中，有限的几个AP接入点在“无线入侵检测系统”中都登记在案，既然没有被登记，那很可能就是一个恶意的AP接入点。回到本节的主题上，同样的逻辑判断方法，我们也可以判断一个产品上的蓝牙接口，比如说某iPhone，一般同时提供了用于无线网卡的“基本服务集标识”地址和用于蓝牙的“蓝牙设备地址”地址，而这两个地址通常情况下都会相差1。

打开较早期的iPhone手机，Apple在给Wi-Fi无线网络接口分配的MAC地址和给蓝牙接口分配的MAC地址就存在“大小差一”现象，蓝牙接口分配的“蓝牙设备地址”地址比Wi-Fi无线网络接口分配的“基本服务集标识”地址大1或小1。如果你想确认一下是不是，可以通过单击iPhone手机上的“设置（Settings）|常规（General）|关于（About）”菜单进行查看，某个实例的效果如图7-13所示。

图7-13　 Apple公司iOS手机上蓝牙设备地址和Wi-Fi的MAC地址的相关性

知道了这种产品制造商的习惯性行为以后，一旦我们确认了Wi-Fi和蓝牙二者MAC地址之间的关系，我们还可以借助这种关联互相判断二者的行为。比如，我们通过某iPhone手机在无线网络上，以客户端身份所做的操作拿到其Wi-Fi的“基本服务集标识”地址，然后将加减1以后的“逻辑‘蓝牙设备地址’”地址，在蓝牙网络中进行测试。并且，在实战中，我们也不需要把在Wi-Fi无线网络中查到的所有“基本服务集标识”地址一一地进行蓝牙的“蓝牙设备地址”测试。既然知道对方的手机是iPhone，那么它的设备“组织唯一标示符”编码应该是Apple公司。所以它的“蓝牙设备地址”的前三位，是不是也应该是Apple公司的前三位代码呢？在我们编写本书的时候，共有18997个“组织唯一标示符”编码被分配，其中Apple公司共分配到284个 [7] 。“组织唯一标示符”编码仍然是前面提到过的：http://standards.ieee.org/regauth/oui/oui.txt 。

在“监测模式”下使用Wi-Fi无线网络接口，我们可以使用Wireshark工具集中基于文本（text-based）的tshark程序来捕获“探测请求”（probe request）数据包。在下面的应用中，由于只是查找客户端的MAC地址，所以我们只要监听和捕获发自客户端所在系统中的数据包即可。在下面的示例中，我们通过“-i wlan0”参数指定了无线网卡第一个接口，然后通过“-Nm”参数告诉tshark程序要对MAC地址的前缀进行解析，这样如果该设备可以在上面“组织唯一标示符”编码表中查到，则直接显示公司的名称，便于你的识别。然后再通过“-R wlan.fc.type_subtype eq 4”参数，告诉tshark程序告诉“显示过滤器”（display filter）在显示的时候，只是显示“探测请求”数据包。还要通过“wlan.sa”参数告诉tshark程序的是，在显示的时候，只在界面上增加无线通信的源地址即可。该源地址还会作为附加的字段进行显示，这是通过“-z proto，colinfo，wlan.sa，wlan.sa”参数实现的。默认情况下，tshark程序会以行为单位显示每一个扫描到的结果，这个行称为“标准包汇总行”（standard packet summary line），在每一行中，主要显示“源地址”，但是通过“-z”参数可以实现“二次配置”，将其作为静态选项，显示成既有对前缀解析过的（prefix-resolved），也有未对前缀解析过（prefix-unresolved）的MAC地址格式，以便进行前后对照。其显示效果如下所示：

注意

在无线网络中，使用airmon-ng命令进行嗅探的时候，通常习惯于将无线网络接口在信道1中设置为“监测模式”。而无线设备在发送“探测请求”数据包的时候，是向所有信道发送，以便可以捕获到那里活动的无线设备。所以上面例子中，由于信道选择的原因，只能扫描到所选频率上存在的无线设备。

从上面的输出结果中，你可以看到两个“探测请求”数据帧。第一个“探测请求”帧来自前缀是HonHaiPr的设备，因为它不是iPhone，所以可以选择忽略 [8] 。下一个“探测请求”帧的源MAC地址为“Apple_58：94：D6”，这个明确标明了就是从一个Apple设备发送过来。除此之外，作为与前面MAC地址的前缀解析格式进行参照，在后面扩展的统计显示区域内，也以全地址的格式显示了MAC地址，即E4：98：D6：58：94：D6。

提示

如果在上面tshark的命令后面，再加上“|grep Apple”参数，那就等于是增加一个对关键字“Apple”的筛选器，这样，在输出的结果中，就只会显示带有“Apple”字样的设备了。

一旦通过Wi-Fi无线网卡的方式获得了这个Apple手机的MAC地址，就可以通过这个无线网卡的MAC地址尝试获得蓝牙通信中的信息了，比如使用hcitool命令可以获得蓝牙“友好名称”（friendly name）。其原理和方法，还是如上所述，首先从得到的Wi-Fi无线网卡的MAC地址上，将最后一个字节的值加1，然后将新的MAC地址值作为“蓝牙设备地址”。当然，为了保险，你也可以考虑将Wi-Fi无线网卡的MAC地址中最后一个字节减1，作为在加1后失败的一个后选方案，这样看上去更加周密。

提示

记住！上面无论是“加1”，还是“减1”，都是以十六进制的方式进行的。比如，下面以“加1”为例，如果某次扫描拿到的Wi-Fi无线网卡MAC地址的最后一字节是44，那么你可以在hcitool命令中，推算该蓝牙设备的MAC地址的最后一字节是45。而如果最后一个字节的值是39，那么推算出的值最后一个字节就是3A，而不是40。

Wi-Fi和蓝牙“大小差一”问题的防御措施

对于一个攻击者，要想使用“大小差一”分析方法进行“蓝牙设备地址”的发现扫描，那么对方的设备必须有多个接口，并且每个接口都可以观察得到。所以防御“大小差一”式分析的方法是：尽可能关闭那些不使用的接口，包括Wi-Fi适配器，这样即使对方知道我们的设备存在这种问题，也会因为拿不到Wi-Fi无线网卡的“基本服务集标识”地址，而无法猜测“蓝牙设备地址”，进而从环节上，减少相关地址信息的泄露。

Wi-Fi无线网卡的“基本服务集标识”地址和“蓝牙设备地址”之间的这个“大小差一”问题，对于确认一些设备是很有帮助的，但这种方法并不适用于那些只有一个蓝牙接口，或者接口的编号不连续的设备。在这种情况下，攻击者可以使用其他技术，比如通过被动式通信数据包的嗅探来监听并提取出一部分“蓝牙设备地址”。

7.3.4　被动通信数据包分析

如前所述，一个“传统蓝牙”的数据包中的包头位置，并没有包含“蓝牙设备地址”信息，这一点不像IEEE 802.11的Wi-Fi无线网络通信数据包，也不像以太网有线通信的数据包。不过，对于蓝牙通信，在蓝牙设备在加入“微微网”的时候，“从设备”采用的是一个没用的“逻辑传输地址”（Logical Transport Address，LT_ADDR）。这个地址将在之后的通信中，作为该设备之后所有通信的“逻辑源地址”（logical source address）或“逻辑目标地址”（logical destination address）。“逻辑传输地址”只使用了3位来表示“逻辑源地址”，而不像“蓝牙设备地址”有48位，在保存的时候也得全部保存。

这种设计非常重要，因为这意味着即使通过捕获数据包，检验MAC地址的头部信息，也无法确定某个“活跃”（active）的蓝牙设备完整的“蓝牙设备地址”。不过，通过检测其他各个“活跃”蓝牙设备的MAC头部，至少离拿到完整的“蓝牙设备地址”的目标更近了一步。这一点你会在随后的内容中看到。

促使每一个数据包在蓝牙网络中传输，是由一系列“数值”（value）和“字段”（field）组成的，这些“数值”和“字段”统称为“访问码”（access code）。“访问码”由3部分组成：“前导码”（preamble），“包尾”（trailer），“同步字”（sync word）。

“同步字”是蓝牙“微微网”中发送的每个数据包的重要组成部分。每次一个“从设备”或者“主设备”收到一个数据包，“同步字”都会在基带头部数据开始传输之前，帮助无线接口稳定接收数据。对于一个给定的“微微网”，“同步字”也可以用来确认通信数据包的来源，因为不同的“微微网”之间，“同步字”都是唯一的。这样的好处就是在同一片物理空间中，可以有多个蓝牙网络彼此接近，或互相重迭运行，都不会在识别自己“微微网”数据包的时候导致模棱两可的结论，也不会在接到一个数据包后，不知道这个数据包是来自于哪个“微微网”。

如下所示，“同步字”由3各部分组成：“BCH纠错码”（BCH error correcting code）、“低位地址部分”、“巴克序列”（Barker Sequence）。其中，“BCH纠错码”用于检查和纠正接收到数据中的错误，BCH是由其发明者Bose、Ray-Chaudhuri、Hocquenghem三人的首字母组合命名的；“低位地址部分”如前面7.1.2节所述，是“蓝牙设备地址”的低24位；“巴克序列”用于数据间的互相关联，提高数据包检查中数据正确性的概率，减少数据包看似正确、实际错误的概率）。对于想拿到“蓝牙设备地址”的黑客来说，“低位地址部分”字段无疑是最令他们感兴趣的，因为它包含了“蓝牙设备地址”中的末尾3个字节，也就是24位。

通过将“主设备”的“低位地址部分”编码到“同步码”中，在“微微网”中的任何蓝牙设备在接收到某个数据包之后，都可以确认这个数据包是不是给自己的，这样就能够区分处于同一物理空间中的两个或者更多的“微微网”。对于黑客来说，则可以借助于从一个“活跃”的“微微网”中拿到的“同步字”，得到“主设备”的“蓝牙设备地址”的“低位地址部分”部分。

而且，此时也可以判断处于“非可发现的”模式的蓝牙设备中“蓝牙设备地址”的“高位地址部分”部分。这是因为“蓝牙MAC层”（Bluetooth MAC-layer）的包头包含一个称作“头部校验和纠错校验”（Header Error Correction，HEC）和的字段，该字段的结构如下图所示。其中的“头部校验和纠错校验和”本身只是MAC层数据的一个简单的校验和，没有特殊的含义，但是，这个校验和在计算的时候，需要将“高位地址部分”作为输入，这就意味着，“高位地址部分”的值可以通过这个校验和获得。通过收集多个蓝牙数据包，你可以准确地判断出“高位地址部分”的值，并排除假的值 [9] 。结合上面读到的“低位地址部分”值，就等于是拿到了48位“蓝牙设备地址”中的32位了。

不幸的是，标准的蓝牙接口并不提供“同步字”的内容。对于这些设备，由于设计者并不希望用户对这些底层的信息感兴趣，所以这些设备缺少捕获这类底层蓝牙数据包信息的接口。幸运的是，在一些开源硬件和软件项目中，多多少少会涉及这方面的内容，通过这些可用信息的组合，可以帮助我们间接确认这些信息。

超牙的被动式发现

“超牙项目”（Project Ubertooth）是一个开源的硬件项目，由Great Scott Gadgets团队的Michael Ossmann开发。在这个项目中，Ossmann使用一个自定义的电路板界面开发了一个接口，这个接口可以检测出“传统蓝牙”和“低能耗蓝牙”中发现“蓝牙主机”系统的底层的通信数据包，其通信链路采用的是一个USB接口。超级的硬件系统，目前处于版本为1的阶段，称为“超牙一号”（Ubertooth One）。通过这个工具，可以创建你自己的“传统蓝牙”和“低能耗蓝牙”底层的通信数据包捕获工具。目前可以通过几个在线零售商店买到，售价大约为120美元。从http://greatscottgadgets.com/ubertoothone 网址可以查到该接口的详细资料。

“超牙”系统在与“蓝牙主机”之间的通信功能是通过另一个开源的项目完成的。该项目生成的开发支持包，包括“蓝牙基带通信库”（Bluetooth Baseband Library libbtbb）、“Linux版的蓝牙库”（Linux Bluetooth library）、一个名为“BlueZ”的libbluetooth库，以及其他相关的开发资料。对于Ubuntu操作系统，安装超牙的“蓝牙主机”系统软件时所需要安装的依赖项及其安装方法如下所示。对于“蓝牙基带通信库”中当前的最新功能，可以通过最新版的软件获得，而最新版的软件，则可以通过git拿到源代码，然后进行编译连接后使用。

下一步，安装超牙软件，如上所述，这可以通过git拿到源代码，然后进行编译连接后使用。

该超牙项目还包括一个满足Linux操作系统中udev配置规则的文件，该文件允许usb组与超牙的硬件进行交互（interact）操作。这意味着你可以使用你的超牙硬件在没有root权限的前提下将udev规则文件复制的“udev配置目录”（udev configuration directory），然后在usb组中添加您的登录账户，其步骤如下所示：

完成上述操作以后，注销系统，然后重新登录，以便上面组成员的变化得到应用。

下一步，将超牙设备插入到一个可用的USB接口中。检查您的安装，要确保超牙功能状态是正常。这种检查操作可以通过超牙工具ubertooth-util程序，核查超牙固件的版本号：

在这个例子中，超牙固件的版本号是在2012年10月发布的。要能够访问超牙连接的“断开功能”（breaking feature），还需要将这个固件的版本升级到最新版。固件源程序的发布版可以从超牙的git网站上查到，但是如果要在ARM架构中使用的蓝牙接口，则还需要再重新编译一遍。编译的方法是先下载gcc编译器的ARM版本，然后通过“/opt”参数解压缩这些编译工具到你的Linux“蓝牙主机”上。其命令格式如下所示：

注意

随着时间的推移，gcc-arm-embedded项目变更后的发行版中，有个launchpad.net文件将在未来停止支持。访问https://launchpad.net/gcc-arm-embedded 可以确定自己的gcc-arm-embedded是不是最新的版本。

在gcc-arm-embedded软件安装好以后，你就可以编译最新版的超牙固件，用于蓝牙分析了。

提示

如果你对上面的编译过程不太熟悉，或者不想下载基于ARM的编译器，或者是不想自己动手编译那个最新版超牙固件的源代码，那么你也可以换一种方法，直接从超牙的网站https://github.com/greatscottgadgets/ubertooth 下载到最新版的发布版，然后将这些下载的固件文件，加载到“ubertooth-one-firmware-bin/”目录中。

当一个固件完成了编译，就可以刷新超牙设备用户的ubertooth-util目录，如下所示。

当固件刷新的进程结束运行后，删除拔出并重新插入超牙装置。现在，你再通过ubertooth-util程序看一下超牙设备的版本号是不是发生了改变。ubertooth util标识符不同版本的固件，也可以从通过git下载的gcc-arm-embedded程序的版本号上反映出固件现在使用的是哪个版本：

要测试超牙的功能，你会得到一个基本的频谱图，在频谱图中显示了2.4GHz频段的所有活跃点。该超牙设备是由Spectools项目提供支持的，程序由Mike Kershaw编写。可用的下载版本网站是https://www.kismetwireless.net/spectools 。不幸的是，Ubuntu系统上的软件包管理尚未赶上Spectools的新功能，所以在Ubuntu系统上，你需要先安装Linux上必要的依赖程序和依赖库，然后再下载和编译Spectools的源程序，如下所示：

下一步，在不带参数的情况下，运行spectool_gtk程序。然后选择已连接的超牙接口，就可以启动频谱活动的显示界面了，界面显示如图7-14所示。

图7-14　频谱活动的显示界面

当系统上的超牙配置和当前的固件版本匹配了以后，就可以捕获底层的蓝牙数据包了，这时，即使是“非可发现的”蓝牙设备，只要在自己的功率覆盖范围内，都可以进行捕获。从命令行运行ubertooth-rx工具，该工具就可以从活跃蓝牙发射节点中提取出“蓝牙设备地址”中的“低位地址部分”的值，如下所示：

尽管这些蓝牙设备配置为“非可发现的”模式，但从上面ubertooth-rx程序的输出中，我们还是找出两个蓝牙“低位地址部分”值——A6：56：F7和CB：B8：7A。拿到了“低位地址部分”的值，我们随后就可以继续使用“超牙扫描”（ubertooth-scan），提取“高位地址部分”的值。

提示

当一个蓝牙设备扫描其他处于“非可发现的”模式的蓝牙设备的时候，会将“低位地址部分”的值设置为Ox9E8B33 [10] 。这个地址是保留给“查询设备扫描”（Inquiry Device Scan）时使用的，表示的是这个地址是由发起“主动式扫描”的蓝牙设备发出的，而不是表示发起“主动扫描”的蓝牙设备的“低位地址部分”值是这个数字。

“超牙扫描”通过超牙接口，使用ubertooth-rx工具，还原了“低位地址部分”的值。但是还得用Linux上那个名为“BlueZ”的libbluetooth库所提供的接口，加上一个传统的Linux加密狗，才能拿到已被确认了“低位地址部分”地址的蓝牙设备的“非必要地址部分”的值。在这种方式中，“超牙扫描”可以通过清除那些“格式没错，但数据有错”（false-positive）的数据包，可以加快还原“非必要地址部分”的速度。

注意

“超牙扫描”程序默认情况下的操作，都使用第一个可用的蓝牙接口，在Linux操作系统上的接口名称是hci0。要指定不同的蓝牙接口，可以通过“-d”参数，并在参数后面跟上你要使用接口的名称，就可以改变为所指定的蓝牙接口。

在这个例子中，“超牙扫描”已经识别出两个“传统蓝牙”设备，并还原了二者的“低位地址部分”和“高位地址部分”的值。等到“蓝牙设备地址”的信息还原以后，“超牙扫描”显示出“自适应跳频”（Adaptive Frequency Hopping，AFH）表，该表的作用是避免使用射频干扰（RF interference）的信道。

有了“低位地址部分”和“高位地址部分”的值，我们就等于还原了蓝牙MAC地址48位中的32位，现在还缺的是“非必要地址部分”。即使没有“非必要地址部分”的值，我们仍然可以使用标准蓝牙接口，以及Linux上的BlueZ工具与“非可发现的”模式的蓝牙设备进行交互操作了，通过交换操作，又可以还原出“设备名称”，以及“基本接口”信息（basic interface information）。在实践操作中，任何工具和程序都需要完整的“蓝牙设备地址”，但既然上述操作并不需要“蓝牙设备地址”值中的“非必要地址部分”部分，那么我们在上述操作中，完全可以在需要填写“非必要地址部分”的地方随便用其他的值代替。下面的例子用00：00来代替。

被动式服务发现的防御措施

对于一个黑客来说，“被动式发现”（passive discovery）是一项神奇的技术，可以用来发现即使是处于“非可发现的”模式下的蓝牙设备，并能在“微微网”中获得“主设备”蓝牙的“蓝牙设备地址”中的一部分。使用超牙的硬件，并配以ubertooth-rx程序进行的“低位地址部分”发现，就是一个被动式操作。如果在这个分析过程中，没有新的活跃节点生成，那么，上面的超牙扫描也无法生成，对监视这个“微微网”的黑客来说，他也就得不到读“低位地址部分”值的机会了。

相比之下，在还原“高位地址部分”的过程中，由于“超牙扫描”并不需要使用黑客所猜测的候选“高位地址部分”进行主动式扫描，所以检测一个攻击者所使用的技术是可能的。然而，在蓝牙的安全领域，监控蓝牙活动和检测蓝牙攻击的商业工具实在太少，以至于这种可能变成了极不可能。

一种针对“被动式发现”的防御方法，就是在“同步字”（sync word）的字段中，避免使用敏感的“蓝牙设备地址”。我们可以设计一个蓝牙组件，该组件可以防止蓝牙“匿名”（anonymity）模式下，“唯一可识别”（uniquely identifiable）的蓝牙数据的泄露。该组件中，蓝牙网络也将每次使用一个由“微微网”中蓝牙“主设备”生成的不同的“蓝牙设备地址”。不过，在蓝牙设备会话期间，由于攻击者会在蓝牙网络中进行嗅探，所以限制了“低位地址部分”值的可用性，而且，这个看似不错的方法有两个明显的局限性：

·并不能完全解决威胁　因为攻击者从主动的会话中拿到当前的“低位地址部分”，最终，负责通信的“微微网”一旦形成，攻击者仍然可以使用这些信息来攻击“微微网”。当网络再次形成的时候，虽然使用了另一个由“主设备”生成的“蓝牙设备地址”，但是攻击者也可以简单地再次重复“低位地址部分”的嗅探操作，很快他就会生成新的“低位地址部分”信息。

·并不能广泛部署　蓝牙的“匿名”模式还没有在蓝牙设备中被广泛的采用。目前大多数蓝牙设备还不能对用户提供这样一个配置选项。

到目前为止，我们通过各种工具来检验各种发现蓝牙设备的技术。这些工具中，“主动式扫描”的工具有Windows系统上的BluetoothView、Android系统上的“Bluetooth Finder”，“被动式扫描”的工具有ubertooth-rx，将“主动式扫描”和“被动式扫描”合二为一的“组合式扫描”的工具有ubertooth-scan。另外我们也发现，即使没有“蓝牙设备地址”中的“非必要地址部分”，我们也可以使用已还原的“高位地址部分”和“低位地址部分”，通过查询的方式扫描蓝牙设备，以实现比较隐蔽的攻击机会。

[1] 注：1英尺等于0.3048米。——编辑注

[2] Python是一种面向对象的解释型计算机程序设计语言，其语法简洁、清晰，具有丰富和强大的类库。它常被昵称为胶水语言，能够把用其他语言制作的各种模块（尤其是C/C++）很轻松地联结在一起。——译者注

[3] 苹果计算机操作系统OS X的子版本号中，10.9以前的版本都以大型猫科动物命名，如10.0为猎豹（Cheetah），10.1为美洲狮（Puma），10.2为美洲虎（Jaguar），10.3为黑豹（Panther），10.4为老虎（Tiger），10.5为豹子（Leopard），10.6为雪豹（Snow Leopard），10.7为狮子（Lion），10.8为美洲狮（Mountain Lion），不过，10.9以后，则改为旅游地的名称，如10.9为加州北部的“冲浪湾”（Mavericks），10.10为加州北部的某国家公园的名字（Yosemite）。——译者注

[4] 计算机在显示的时候，一直有两种显示模式，一种叫文本模式，另一种是图形模式。图形模式好理解，就是整个屏幕由m×n个像素点组成，各点两两之间没有任何关联，每个像素点可以根据自己的需要显示任意RGB颜色。文本模式，则是将屏幕分成p×q的几个块，各块两两之间大小和形状都完全一样，又可以分为m×n的小区，每个小区只能显示一个ASCII字符，文中所说的宽度指的是这里的p，高度指的是这里的q。由于两种模式各有利弊，并且都有很大的应用市场，所以即使是现在广泛存在的图形操作系统（很显然用的是图形模式）中，也会仿真出文本模式。比如Windows下的“命令提示符”；Linux下的“终端”，都是仿真出来文本模式。——译者注

[5] 在通信的概念上，有线网卡的地址即“介质访问控制”（Media Access Control，MAC）地址；无线网卡的地址称为“基本服务集标识”地址，蓝牙的地址称为“蓝牙设备地址”地址。三者各有区别，但本质相同，所以本书的英文版在很多地方混用了三个概念，在介绍相关性的时候，有时会统一称为MAC地址。——译者注

[6] “大小差一”（Off-by-One）最早出现在编程领域，并且虽然名为“差一”，实际特指“大一”。在编程中，如果定义一个长度为100数组，很多编程语言习惯将序号定义为0～99，但生活中的习惯认为是1～100，而在使用第100位的时候，本应使用99，如果写成100，就产生了“大小差一”的错误，更重要的是，编译器并不能识别出这类错误，最终导致在可执行文件中存在因这种错误而导致的bug。本处引用，其实只是借用值大小上相差1这个现象，并不存在bug的问题。——译者注

[7] 顺便提一下，在本书原书第二版的时候，共有12 756个“组织唯一标示符”编码被分配，其中Apple公司共分配到17个。并且此处的“编写本书的时候”也是指原版，而不是本翻译版。——译者注

[8] 自己不生产硬件的手机品牌（包括各大名牌手机），无疑手机的配件都是全球采购的，所以无线网卡的MAC地址和蓝牙MAC地址很难保证存在上述“大小差一”的现象。——译者注

[9] “校验和”的算法，通常都是多对一的函数。因此不能反向推算，或者说如果非要进行反向推算的话，会同时得到多个可能的值，并且其中只有一个是正确的。如果能捕获到多个数据包，就意味着拿到同一个值的多个校验和，或者将一次反推的多个值代入到后面的校验和运算，然后比较运算结果；或者是将每次反推的多组多个值进行比对，找出相同的那个值，最终都能确定出原始的“高位地址部分”。——译者注

[10] 该值前面的“0x”表示这是由十六进制表示的数据，该值称为“通用查询访问码”（General Inquire Access Code，GIAC），值固定为：0x9E8B33。——译者注

7.4　服务的枚举

“服务发现协议”是一个由“蓝牙技术联盟”定义的一个蓝牙协议。该协议用于识别或公布某个蓝牙设备上所有可用的服务。“服务发现协议”的创建，主要是满足蓝牙网络中的一些独特需求，比如枚举出远程蓝牙设备上的服务的“功能”（function）、“类型”（class），或者其他属性，例如一些操作功能，还有一些“私人的配置”（profile）。当一个蓝牙服务的开发者在设备上实现蓝牙栈（Bluetooth stack）的时候，他必须挑选出哪些服务可以告诉远端蓝牙设备，并能够通过“服务发现协议”识别出这些服务。而从攻击者角度来说，“服务发现协议”可以允许你识别并确认远端“蓝牙主机”上可能的服务，还可以看到不同的蓝牙“私人配置”文件。而这些配置文件的内容，正是需要连接到服务上所需要的详细信息。

使用sdptool工具枚举蓝牙上的所有服务

前面我们已经介绍了几个“主动式发现”的工具。这些工具都可以枚举和显示最基本的“服务发现协议”记录信息。这些工具使用起来很方便，但是在以下几个方面都存在局限性。

·这些工具只能用来攻击“可发现的”模式的“蓝牙主机”，对于通过其他方式识别出的“非可发现的”模式下的“蓝牙主机”，则不能显示“服务发现协议”信息。

·这些工具对“服务发现协议”记录数据，通常是汇总成主要的“私人配置”格式，在内容显示上，没有连接到该“蓝牙主机”所需的必要细节。

·这些工具在枚举服务时可能会忽略那些可以使用但未在目标设备上进行声明的服务。

而Linux上的sdptool命令则可以让你列举出目标蓝牙设备上的所有服务。这个工具没有图形化界面，并且该工具显示的结果看上去很生硬，看着吃力，但是它却是在蓝牙“服务发现”方面，可用的工具中综合指数最好的一款。在本例中，我们使用sdptool来识别一台名为“MacBook Air”的笔记本电脑，这台电脑运行在OS X 10.9.1“冲浪湾”版上，看看它的“传统蓝牙”适配器上的所有服务信息。

在这个输出中，你可以看到OS X笔记本电脑运行了五个服务：

·“A2DP音频源”服务（A2DP Audio Source）　蓝牙设备使用“高级音频分发配置文件”（Advanced Audio Distribution Profile，A2DP）生成“流媒体音乐”（stream music）到A2DP的接收器上（比如蓝牙耳机）。

·目标设备的AVRCP控制服务（AVRCP Target）　可以通过“音/视频远程控制协议”（Audio/Visual Remote Control Protocol，AVRCP）进行远程控制的蓝牙设备。

·蓝牙与PDA同步服务（Bluetooth-PDA-Sync）　蓝牙设备通过“蓝牙与PDA同步服务”和手持设备进行数据交换。

·耳机音频网关（Headset Audio Gateway）　蓝牙设备使用“耳机配置文件”（Headset Profile，HSP）服务作为网关，在设备和耳机之间，用于接收和发送音频。

·组间ad-hoc无线自组网络服务（Group Ad-hoc Network Service）　蓝牙设备允许远端设备在连接网络的时候，使用“蓝牙网络封装协议”（Bluetooth Network Encapsulation Protocol，BNEP）。

从sdptool命令的输出，可以看到结果中为每个服务的配置文件都提供了额外的配置信息。下面让我们更详细地阅读输出内容中的每一个项。

“服务名称”（Service Name）和“服务描述”（Service Description）字段的内容是由编写服务程序的开发人员提供的。由于开发人员的个人因素，经常会看到多个“蓝牙主机”上，相似的服务，名称却出现很多不一致的现象。无论是“服务名称”，还是“服务描述”，其实都只是一个识别标志，只要用户想要查看某个“可发现的”模式蓝牙设备的信息，那么该用户的操作系统都会通过一个“可用服务列表”（list of available service）的形式把这些服务都列出来，并且大多数用户都可以直接在操作系统中看到它们。

“服务记录句柄”（Service RecHandle）表示的是“服务发现协议”服务记录的句柄（handle）。该句柄与这个服务关联，是一个32位的数字值，并且对于任何一个给定的“蓝牙主机”，该值都是唯一的，但对于不同的“蓝牙主机”，即使是相同的服务，也允许该值不同。通常情况下，每一个蓝牙在编程实现时都会使用一个特定的“服务记录句柄”记录特定的配置文件。例如Apple的OS X系统中蓝牙栈总是使用0x10006作为“A2DP音频源”服务的句柄。

随后的“服务类型ID列表”（Service Class ID List）字段，表示用于识别特定的蓝牙配置文件，这些文件就是为这个服务的实现而定制的。在这些例子中，“音频源”的配置定制文件主要是通过将一个数字的ID值分配给该配置文件，这个值是由“蓝牙技术联盟”分配的，可以确保数字的唯一性。并且该文件主要用于向“音频接收器”（Audio Sink）设备发送高质量的“音频流”内容。

提示

蓝牙定制配置文件信息的重要来源，是“蓝牙技术联盟开发者配置文件入门综览”（SIG Developer Portal Profiles Overview）页面，该页面的网址是http://en.wikipedia.org/wiki/Bluetooth_profile 。

网站

接下来的“协议描述列表”（Protocol Descriptor List）是用于支持所使用的配置文件。在上面的实例中，这些配置文件是通过“音频源”向蓝牙服务提供的配置文件。在本例中，“逻辑链路控制及适配协议”（Logical Link Control and Adaptation Protocol，L2CAP）实际使用的是“协议服务多开关选择器”（Protocol Service Multiplexer，PSM）协议，所用的端口值是25，该值相当于是蓝牙的端口值。还有“音/视频发分布式传送协议”（Audio/Video Distribution Transporc Protocol，AVDTP）。有关操作和使用“逻辑链路控制及适配协议”和“协议服务多开关选择器”这两个协议方面更详细的背景解释材料，可以参阅本书的配套网站http://www.hackingexposedwireless 下载。

对于一些配置文件来说，“语言基本属性列表”（Language Base Attr List）主要显示在服务实现的过程中，用于人可阅读的语言描述字段。对于我们来说最感兴趣的是code_ISO639字段，即ISO签署的639号规范，这个规范是用双字母表示某个国家或地区的语言名称。在本例中，0x656e是小写字母“en”的ASCII码值，在“ISO 639”规范中代表“英语”（即English的前两个字母）。通常情况下，在一台主机上所有的服务所使用的语言都是一样，这取决于你当初安装本地操作系统的时候所选的语言类型。如果你想尝试传送一个破解用的工具包，那么你需要指定用一个和远端主机系统上语音包相同的工具包，由此可见，这个字段的信息对于你选择合适的语言包（language pack）还是很有用的 [1] 。

提示

一份以十六进制方式表示双字母国家码的“ISO 639”规范文档修订版，可以从http://www.willhackforsushi.com/resources/iso639.txt [2] 上获得。

在前面的例子中，我们使用“sdptool browse 00：00：CE：E3：96：EB”命令通过“服务发现协议”读取了某个蓝牙设备的服务列表。虽然我们使用的“蓝牙设备地址”并不完整，但通过这个“模糊查询”的方式，对方“很好地”完成了“服务发现协议”的枚举操作，最终得到了完整的可用服务列表。然而，有一些“蓝牙主机”就不会这么友好地回复我们的枚举操作了，当我们如法炮制地向这些“蓝牙主机”发出枚举命令时，它们会尝试阻止向我们回复“服务发现协议”的信息。例如，当我们用同样的命令查询一个Pebble牌蓝牙智能手表的时候，其命令如下。

幸运的是，sdptool命令也设计了一组参数，即使目标蓝牙设备尝试隐藏可用的服务，该命令也能够拿到“服务发现协议”的服务枚举列表。其原理是，虽然该蓝牙设备不在对方要求服务枚举的时候提供服务列表，但是当对方明确提出要读取某一个指定服务的时候，这个蓝牙设备就不得不提供该服务的完整服务信息，否则，其他的蓝牙设备将无法与该蓝牙设备进行正常的通信。现在的问题是，怎么知道对方有哪些服务（因为这本来也就是我们要枚举的目的）？这就涉及一个“公共服务句柄基值”（common service-handle base value）的问题，如前所述，蓝牙服务中，每一个服务都有一个“服务记录句柄”，所有的“服务记录句柄”都是在“公共服务句柄基值”的基础上加一个数字。因此，我们可以基于这个“公共服务句柄基值”做出一个“可能存在服务”的列表值，sdptool命令会按照列表中的值，依次探测目标蓝牙设备上的服务，凡是该蓝牙设备上有的服务中，都如实回复，而该蓝牙设备上没有的服务，则不作回复，这等于间接地读到了所有的服务。要实现该命令，可以带上“records”参数后，通过sdptool命令实现。

注意

在编写本书的时候，sdptool工具的当前版本为“BlueZ 4.98”，如果要通过上面的方式进行“服务扫描”，会基于“公共服务句柄基值”向上累加384次，并分别使用每次新的“服务记录句柄”通过“sdptool records”进行读取操作。言下之意就是：如果某个蓝牙设备中的服务值在“公共服务句柄基值”~“‘公共服务句柄基值’+384”，那么该蓝牙设备上所有的服务都将被枚举出来；如果某一个服务的句柄超出了“‘公共服务句柄基值’+384”，则该程序将会漏掉该服务。实际中的蓝牙设备，很少能同时使用这么多服务的，因此，这个值在实践中，应该是足够了，毕竟盲目扩大该值所带的代价就是要花费更长的等待时间和更大概率上无功而返的结果。

提示

无论是“sdptool records”命令，还是“sdptool browse output”命令，其结果都是以“树型结构”（hierarchical tree format）显示的。这是其默认的显示形式，如上面的这些例子所示的效果。其实，还可以通过在上述两个命令中，在“records”和“browse”关键字后面，通过加上“--xml”参数，使得结果以XML的格式直接输出到另一个程序中，这样sdptool工具就可以和一些具有复杂分析机制的程序，通过标准数据编码格式，进行交互操作了。

服务枚举的防御措施

要防御服务的枚举，是一项困难的任务。蓝牙设备要在“射频通信协议”通过串口进行通信，要在“协议服务多开关选择器”协议中进行通信，以及要向对方提供“语言包”（language pack）信息，都需要将服务信息回复给查询方，所以完全杜绝服务枚举是不可能的。只不过，现在唯一可以考虑的是，只有与合法的对等蓝牙用户进行连接的时候，才会提供上述信息。

一个推荐的方法是将蓝牙设备设置成“非可发现的”模式。这样，攻击者在不能确定“蓝牙设备地址”的情况下，无法从目标设备获得“服务发现协议”记录。但是就像我们之前所看到的，如果一个攻击者使用了合适的攻击工具，那么这种方式只能使对方的服务发现变得更困难了一些，并不能从根本上阻止他们获得完整的“服务发现协议”服务列表。

防止“服务发现协议”信息泄漏的最好方法是在“蓝牙主机”中只打开那些需要用的服务。通过禁止掉不使用的服务配置文件，攻击者就只能获得更少的“服务发现协议”信息，从而减少了目标设备上可能被攻击的可能。考虑到有些“服务发现协议”服务是禁不掉的，但是这些服务确实又不需要运行，你可以配置蓝牙规则，使这些服务始终处于系统中最低的使用权限。总之，禁止所有你用不到的服务，对于禁不掉的服务，就将它们的权限降到最低。

不幸的是，上面这项技术通常都是不可能做到的，因为许多蓝牙设备都不允许终端用户指定支持哪些设备。在这些情况下，剩下的唯一防御方法就是知道你的蓝牙设备上服务信息是通过“服务发现协议”协议泄漏的。

[1] 对方的操作系统一旦选好语言类型，如果你上传的语言包与操作系统的语言包不同，则会产生乱码的现象。这个不仅与对方的语言有关，更重要的是所用的语言编码库是不是一样。如果一样，即使语言不一样，同样还是可以看的。比如英文版的Windows也是可以查看中文的信息。一般比较保险和通用的办法就是都只用英文ASCII编码库，基本上所有的操作系统都支持。——译者注

[2] 如果链接无法访问，可以从http://userpage.chemie.fu-berlin.de/diverse/doc/ISO_639.html获取。——译者注

7.5　本章小结

本章介绍了蓝牙规范，以及通过该规范选择和准备蓝牙攻击接口设备的技巧。一旦组建好了自己的蓝牙攻击接口设备，就可以选择可以在这个接口设备上使用的工具，通过从这几个工具中选择使用的工具，甚至是组合使用，你可以发现，在蓝牙功率覆盖范围内，有几个配置成“可发现的”模式的蓝牙设备。要识别这些设备，最常见的办法就是对其进行蓝牙分析。而为了阻挠我们的分析，我们发现很多用户会将蓝牙适配器设置成“非可发现的”模式。

当蓝牙适配器被配置为“非可发现的”模式时，攻击者仍然可以通过“超牙”和一个标准的蓝牙接口在该蓝牙设备发送数据的时候进行识别。一旦攻击者得到了完整的“蓝牙设备地址”，甚至是包括“高位地址部分”和“低位地址部分”在内的部分“蓝牙设备地址”，黑客就可以开始进行服务枚举，通过“服务发现协议”在目标蓝牙设备上进行所有运行服务的扫描。

尽管在本章中我们也介绍了一些防御方法，比如，将设备设置成“非可发现的”模式下的设备扫描和服务枚举。但是在蓝牙攻击中，对于那些拥有足够耐心，和便利攻击工具的黑客来说，这些防御措施也都会土崩瓦解。在下一章中，我们会继续对蓝牙的攻击和防御技术进行综合的评价，只不过，与这一章不同的是，第8章我们的关注点将从本章的“传统蓝牙”设备转移到“低功耗蓝牙”设备上。

第8章　低功耗蓝牙模式下的扫描和侦测

在2010年“蓝牙技术联盟”（Bluetooth Special Interest Group，SIG）刚刚推出低功耗蓝牙规范后，“低功耗蓝牙”（Bluetooth Low Energy）的设备就尾随而至。与前面几代蓝牙设备不相同的是，“低功耗蓝牙”设备更节能，因此，适用于大量垂直市场 [1] 和应用。对于像“基本速率蓝牙” [2] （Bluetooth Basic Rate，BR）和“增强数据速率蓝牙”（Enhanced Data Rate，EDR）设备这样的“传统蓝牙”类型来说，这些低功耗的功能都是不切实际。

在早期的蓝牙设备中，对于物理层的设计，通常首要考虑的因素是通信效率的优先，即使对于像“射频干扰”（Radio Frequence interference）这样的环节也不例外；而“低功耗蓝牙”设备在设计的时候，考虑因素是在实现了“射频干扰”的鲁棒性前提下，通过更简单的无线通信机制来实现整体性能的提升。流线型的连接建立的做法，固定频率的自我广播信道和一个不太复杂、成本也不太高的“栈”，在实现方式上都为“低功耗蓝牙”的成功提供了重要的保障。

虽然使用条件总是在决定电池的寿命上起着重要的作用，但“蓝牙技术联盟”声称，通过一个纽扣电池，“低功耗蓝牙”设备可以使用几个月到几年。这个重要的因素会在很多领域给“低功耗蓝牙”带来一个新的市场机会，比如在体育和健身设备领域、健康和保健的应用领域、电子消费领域和可穿戴计算设备领域。同时，在不久的将来，我们期待的“低功耗蓝牙”的成功会使“低功耗蓝牙”在其原有领先的领域内继续起到行业引领作用，如在汽车制造领域、医疗保健领域和智能家居产业领域。

在“低功耗蓝牙”早期的成功案例是Apple公司的iBeacon产品。它采用“低功耗蓝牙”技术，首先将“室内定位跟踪”（indoor location tracking）和“消息机制”（messaging mechanism）嵌入在全球数以百万计的Apple的iOS内核设备中。Apple公司和“蓝牙技术联盟”的友好合作强调了一个重要的现实，即“低功耗蓝牙”非常容易集成到各个设备中，这个现实也直接影响到了“低功耗蓝牙”的成功。作为竞争对手的ZigBee和IEEE 802.15.4技术（低速率无线个人局域网），从能量守恒的角度虽然更有效，但是对“低功耗蓝牙”的支持已经“先入为主”，成为大多数移动设备用户的强制性要求。使用相同的天线和软件特性，利用修正后的蓝牙芯片，就可以为“低功耗蓝牙”提供应用上的支持，并且是直接针对移动手持设备制造商的，这无疑会继续让移动手持设备制造商增加对这项技术的采用程度。

在本章中，我们主要介绍“低功耗蓝牙”设备背后基本的技术细节，着重强调的是“低功耗蓝牙”设备和“传统蓝牙”设备之间的不同。我们会核实一些“低功耗蓝牙”的关键应用，当然肯定会包括Apple公司的iBeacon，同时也会对识别和评估“低功耗蓝牙”安全方面的工具和技术进行详细的分析。

注意

我们一直说的“低功耗蓝牙”设备，或者使用它的简称“BLE”，其实是在描述一个基于“蓝牙4.0规范”（Bluetooth 4.0 specification）的蓝牙设备，而这个4.0版本的蓝牙规范主要是通过一个更简单的物理层结构来改善并提升电池寿命。在其他市场材料方面，也能见到使用了“低功耗蓝牙”技术。“智能蓝牙”（Bluetooth Smart）是“蓝牙技术联盟”为了保证程序的兼容性，而提出的一种叫法，并不是这里提到的“低功耗蓝牙”。

[1] 以行业作为主要划分对象的市场分类方法，如电信行业市场、金融业市场等。——译者注

[2] “基本速率蓝牙”是指蓝牙1.0版本；后面的“增强数据速率蓝牙”是指蓝牙2.0版本；“高速蓝牙”HS（High Speed）是指蓝牙3.0版本；现在的“低功耗蓝牙”是指蓝牙4.0版本。——译者注

8.1　“低功耗蓝牙”技术概述

“低功耗蓝牙”是蓝牙技术以另外的方式进行演化的过程中的一次颠覆性改变。早期“基本速率蓝牙”1.2设备的设计速率是1Mbps，后来“增强数据速率蓝牙”2.0设备的设计速率达到了3Mbps。“高速蓝牙”3.0的技术进一步扩展蓝牙协议，通过在Wi-Fi上跑蓝牙，使其达到了蓝牙的高速访问 [1] ，甚至被称为“交替使用介质访问层/物理层的蓝牙”（Bluetooth Alternate MAC/PHY，AMP）。蓝牙在速度上步步提升，根据这种趋势，似乎最终要与Wi-Fi一决高下了。然而，蓝牙4.0就是我们现在要介绍的“低功耗蓝牙”，其数据传输的速率，突然“峰回路转”，又回到了1Mbps的原点。

在摒弃传输速度不停增长的大趋势背景下，“低功耗蓝牙”开辟了在低功耗应用的新机遇。这时，这个“另外的方式”不再试图追求更快的数据传输速率，转而向使用蓝牙进行通信的软硬件开发者提供了一个新的替代品。这个替代品意义重大，同样能产生高的效益，那就是：较低的电池利用率。

“低功耗蓝牙”的设计旨在给开发者和消费者一种能力，也就是通过一个硬币大小的电池提供相当长的一段时间，在这段时间里，在保证效率的前提下，提供设备以轻量级的数据传输。因为“传统蓝牙”已经提供了功率守恒的特性，所以“低功耗蓝牙”的设计中，除了保持这一优点，还为一系列新的应用和设备创建了一种强大的使用机会，使这些应用和设备都能充分利用这一机会。

因此，在蓝牙技术重点的这一次转移过程中，“低功耗蓝牙”与以前版本的蓝牙规范有显著的不同。“低功耗蓝牙”所进行的重大变化不仅体现在底层物理层的操作特性中，而且还体现在上层设备发现和数据交换行为中。我们将在这一节中研究这些特性，在阅读对“低功耗蓝牙”的扫描技术和高层协议操作之前，先介绍“低功耗蓝牙”的工作原理。

8.1.1　物理层的行为

“低功耗蓝牙”仍然使用2.4GHz频谱，通过“高斯频移键控”（Gaussian Frequency Shift Keying，GFSK）进行调制，这一点和“传统蓝牙”中的“基本速率传统蓝牙”是一样的。此外，“低功耗蓝牙”也使用“跳频扩频”技术来避免干扰。不过，与“传统蓝牙”不一样的是，“低功耗蓝牙”的频率跳转非常简单，并且设备在跳频期间占用某一个信道的时间也更长了，其实就是在每个信道的停留时间（dwell time）更长了。并且，从设备软硬件的实现角度来看，通过“低功耗蓝牙”的跳频方式也是更简单，比如，在“低功耗蓝牙”中，系统共使用了40个信道，其中允许跳频的信道有37个，还有3个信道专用于发送“通告数据”（advertising）。不过，对于“低功耗蓝牙”跳频行为的深入介绍将安排在下一章。

为了最大限度地节能，“低功耗蓝牙”设备的发射功率限制为10mW。这有限的发射功率使设备达到一个合理的传输距离，那就是10米左右。不过，这时的系统却可以保持在一个较低的整体功率预期之内。

8.1.2　操作模式和连接的建立

“低功耗蓝牙”一共可以从五种远程操作状态中，选择其中之一作为当前的操作状态。

·待机状态（Standby State）　在待机状态，一个设备不再接收和发送数据包，此时的功耗最小，对设备来说，也是最节能的状态，这时允许设备关掉发送和接收接口。

·通告状态（Advertising State）　一个处于通告状态下的设备将定期在其配置的“通告信道”（advertising channel），以所配置的速率值发送“信标通告”（beacon advertisements）。该速率的变量名为“Beacon_Max_lnterval”，一般情况下，该值设置为1秒或2秒。处于“通告状态”的设备一般也被称为“通告者”（advertiser）。

·扫描状态（Scanning State）　当设备处于扫描状态时，“低功耗蓝牙”设备会监听“通告信道”中有哪些设备处于“通告状态”。处于“扫描状态”的设备一般也称为“扫描者”（scanner）。

·初始化状态（Initiating State）　一个设备处于“初始化状态”，那么它会监听特定设备所发的通告，一旦有设备发出通告，就会回复这个设备，并在随后建立一个连接。处于“初始化状态”的设备一般也称为“初始化者”（initiator）。

·连接状态（Connection State）　设备可以从“初始化状态”或“通告状态”转换到“连接状态”，完成这一操作的设备，既可以是“主设备”，也可以是“从设备”，两个角色都允许。

·“主设备模式” （master mode）　“主设备模式”下的设备初始化一个到特定目标设备的连接，又称为“发起方模式”（initiator mode）。

·“从设备模式” （slave mode）　“从设备模式”下的设备接收来自“主设备”的查询连接，并将其应用于一个需要认证的阶段，以便完成连接的进程。

这个专为设备操作模式而定义的结构，被灵活地借用到产品设计上，以便降低复杂性。例如，对于一个设备，如果只扫描处于“通告状态”的“低功耗蓝牙”设备是不是存在，那么这个设备就完全没有必要具备发射功能，这样做可以降低电池消耗量，最大程度减少设备成本。

要在两个“低功耗蓝牙”设备之间创建一个连接，“扫描状态”的设备会在“通告信道”里察看信标通告，然后决定要连接的目标设备。当接收设备选择好，“扫描状态”的设备就发送连接请求。在这一点上，回复的设备就会协商连接参数并同“主设备”建立一个连接。在连接建立之前，这个回复的设备的身份还不是“从设备模式”。

8.1.3　数据帧的配置

“低功耗蓝牙”使用有限的“有效载荷”（payload）的大小作为其整体节能策略的一部分，该“有效载荷”的长度为2~39字节。基本的“低功耗蓝牙”数据帧是由“前导码”（preamble）、“访问码”（access code）、“有效载荷”和“循环冗余校验”（Cyclical Redundancy Check，CRC）校验码组成。其中的“访问码”有时称为“访问地址”（access address）。整个结构如下图所示。

“低功耗蓝牙”数据包中，“有效载荷”长度的变化取决于“访问地址”的值和接收设备的状态。例如，一个数据包如果遵循“逻辑链路控制及适配协议”，那么它的内容就是一个长度是16位的头部，后面跟着变长的“有效载荷数据”（payload data），然后是一个可选的“信息完整性检查码”（Message Integrity Check，MIC）。这时，这些数据头部的各个字段意义分别如下：

·逻辑链路ID （Logical Link Identifier，LLID）字段　“逻辑链路ID”进一步说明了这个“有效载荷”数据的作用。比如0x01表示该数据包是一个帧的延续内容，或者这是一个空的“逻辑链路控制及适配协议”数据包；0x02表示一个“逻辑链路控制及适配协议”数据包的开始；0x03表示这是一个“逻辑链路控制”数据包的内容。

·下一个期望的序列号（Next Expected Sequence Number，NESN）字段　“下一个期望的序列号”是用于对接收到的数据包进行确认。

·序列号（Sequence Number，SN）字段　“序列号”主要用于发送数据包时，接收方确认该值是针对于“下一个期望的序列号”的下一个数据包。

·更多数据（More Data，MD）字段　“更多数据”主要是为了说明发送方是否还有要发送给接收者的数据。

·保留字段（Reserved）　未使用的位，虽然目前没有使用，但建议都填成“0”。目前接收者会忽略该位。跟在“长度”字段后面也有个“保留”字段，意义与此相同。

·长度字段（Length）“长度”字段表示的是包含“信息完整性检查码”在内的“有效载荷数据”的长度，以字节为单位的。

这种数据帧的格式更详细地显示如下所示。

同样，一个“通告”数据包的有效载荷使用的也是一个16位的头部，后面跟的是通告的有效载荷数据，其完整的描述如下：

·类型字段（Type）　有效载荷内容的类型，通过这一字段确定该数据包是一个“通告”数据包，也可以是一个扫描请求或响应，或者是一个连接请求。“类型”字段中，大部分可能的值都会保留，以供将来使用。其中的“通告”数据包包括“有向通告”（directed advertisement）、“广播通告”（broadcast advertisements）、“非连接通告”（nonconnectable advertisement）或“通告征集扫描”（advertisement solicitation scan）。

·发送地址字段（TX address）　这个1位字段表示如果发送方将正在使用的生成的MAC地址用作私用，那该位就为“1”，否则如果MAC地址可以被无线接口使用，则该位就为“0”。

·接收地址字段（RX address）　这个1位字段意义同“发送地址”字段意义一样，但是应用于接收地址上。

·有效载荷长度字段（payload length）　这个6位字段指的是“有效载荷数据”（payload data）的长度（不包括头部内容的长度）。值得注意的是，尽管这个值在填写的时候，最大可以填到63个字节（2⁶ -1），但实际有效的值是0~37。

·保留字段（Reserved）　未使用的位。在“通告信道”头部，这个位是保留的，并且建议目前都填成“0”。注意，共有两个“保留”字段，一个在“类型”字段后面，另一个在头部的最末端，二者意义相同。

这种数据帧的格式更详细地显示如下所示。

“蓝牙规范”4.0中，描述了“逻辑链路控制及适配协议”有效载荷数据的格式，包括所有定义的数据帧类型的格式。就像前面各版“蓝牙规范”一样，“逻辑链路控制及适配协议”层句柄的数据被编码到顶层协议中。但与前面各版“蓝牙规范”不同的是，“低功耗蓝牙”中，“逻辑链路控制及适配协议”并不提供“重传”（retransmission）、“碎片整理”（fragmentation）、“数据重组”（reassembly）等功能，这样做的目的是为了在一个简单的协议栈中实现最基本的功能。“逻辑链路控制及适配协议”规范在蓝牙4.1设备中又得到了进一步扩展，新加了对带有“流量控制”（flow control）的“面向连接信道”（connection-oriented channel）的支持。

8.1.4　蓝牙支持协议规范

就像以前版本的蓝牙规范（如7.1.3节提到的是“传统蓝牙”的规范，这里是“低功耗蓝牙”的规范），“低功耗蓝牙”设备所提供的设备配置文件服务具有良好的结构，简化了蓝牙栈的实现。“逻辑链路控制及适配协议”的服务作为底层的基础，介于链路层规范和上层协议之间。

·“属性协议” （Attribute Protocol，ATT）　通过“逻辑链路控制及适配协议”的信道，用于传递少量数据。包括设备在功能形成时的数据交换。

·“通用属性协议” （Generic Attribute Protocol，GATT）　在“属性协议”的顶部，“通用属性协议”提供了一个用于对“属性服务器”（attribute server）和“属性客户端”（attribute client）实现“服务发现”、读取属性、写入属性的操作。

·“安全管理协议” （Security Manager Protocol，SMP）　用于在一个连接的“逻辑链路控制及适配协议”信道上，交换设备之间与安全相关的数据。

·“通用访问配置文件” （Generic Access Profile，GAP）　代表了“低功耗蓝牙”设备的基本功能，包括完成设备发现，启动和完成连接，完成服务发现的能力。

“低功耗蓝牙”协议的功能使用了基本的数据结构定义。这种结构定义可以适应众多厂商使用蓝牙技术的要求。比如，一个供应商实现了一个“低功耗蓝牙耐体温监测系统”，那么他就可以使用“通用属性协议”的特性定义一组数据，然后发送到接收设备上，该系统可以唯一地识别出这些数据，各数据之间可以相互区分开来。这个功能已经被用于蓝牙广告产品“Apple iBeacon”中了，在该产品中，Apple公司使用了针对iBeacon的特定属性定义这个协议。这使得Apple公司可以创建一个与其他厂商的竞争或合作协议。

8.1.5　“低功耗蓝牙”的安全控制

作为“通用访问配置文件”的这些属性，“低功耗蓝牙”提供了新的功能，用于通过物理层的无线接口（air interface）或者是高层的“属性协议”，保护机密性和数据完整性。产品设计师可以选择实现那些安全的功能，因为这些功能最适合他们的产品需求组合：没加密没认证、有认证但没有加密、既有加密也有认证。此外，“低功耗蓝牙”实现了私有人增强功能，对黑客通过拿到的“蓝牙设备地址”破解用户本地数据的攻击，具有减轻此类攻击的能力。

1.加密和信息认证

“低功耗蓝牙”使用“高级加密标准-计数模式和密码块链消息认证码协议”（AES-Counter Mode Cipher Block Chaining-Message Authentication Code Protocol，AES-CCMP），采用128位密钥进行加密和完整性保护。这种加密支持力度类似于IEEE 802.11规范中的WPA2，所以该认证的全称是“基于‘高级加密标准-计数模式和密码块链消息认证码协议’的‘Wi-Fi保护访问下的预共享密钥版本2’认证”，简称WPA2 AES-CCMP。

使用加密“和”/“或”认证的决定，是由软硬件开发人员和“低功耗蓝牙”安全模式共同选择的。

（1）安全模式1

“低功耗蓝牙”的“安全模式1”运行在无线的物理层接口（air-interface layer），提供三选一的安全级别：

·安全模式1的级别1 　不加密不认证。

·安全模式1的级别2 　通过未经认证的配对后衍生出的一个密钥；在密钥衍生之后，设备就加密数据。

·安全模式1的级别3 　通过经验认的配对后衍生出的一个密钥；跟在加密数据的后面。

安全模式1所使用的加密，依靠产品设计师选择实现的级别。但是该模式并没有使用消息真实性的检查，使其很容易受到“中间人的畸形数据”（malformed data man-in-the-middle）攻击和“重播”攻击（replay attack）。

（2）安全模式2

安全模式2运行在“属性协议”层，主要提供对上层的支持，用于一个或两个安全级别上，提供完整性保护上的“数据签名”（data signing）。

安全模式2的级别1 　通过未经认证的配对后衍生出的一个密钥；在密钥衍生之后，数据包的“有效载荷数据”是加密的，并且有效地使用了一个“消息认证码”（Message Authentication Code，MAC）。

安全模式2的级别2 　同“安全模式2的级别1”一样，不同的是，设备必须是通过认证的配对。

在“安全模式2”的任一级别上操作，在信息的接收方会使用一个“消息认证码”验证数据的完整性。“消息认证码”的使用减轻了“中间人的畸形数据”篡改攻击的威胁，但这并不能减轻“重播”攻击。幸运的是，蓝牙规范也要求使用重播计数器，而在“安全模式2数据帧”下，重播计数器作为“消息认证码”MAC计算的一部分，如下所示。

“签名计数器”（signature counter）字段从零开始，每发送一个数据包，“签名计数器”都会自动增加1。接收设备验证数据包中的这个签名，是用实测的有效载荷内容计算“消息认证码”，然后再用计算出来的这个“消息认证码”和观察到的“消息认证码”作比较，如果这两个值是匹配的，那么接收方检查“签名计数器”的值，来保证数据以前没有看到过，以避免“重播”式攻击。如果“签名计数器”的值大于最后观察到的“签名计数器”的值，那么这个数据包的处理和接收方就会记录观察到的“签名计数器”，以便以后验证使用。

2.私有特征

“低功耗蓝牙”规范引入很多只有这个版本才具有的“私有特征”（Privacy Feotur），这样做的目的就是为了使攻击者在一段时间内破解一个蓝牙设备变得更困难。比如，在以前的版本中，对于任意一个蓝牙设备，它在所有的连接中都会使用相同的“蓝牙设备地址”，这个地址不妨称为“静态地址”，而在“低功耗蓝牙”规范中，蓝牙设备使用一个生成的地址取代以前定义好并分配的“静态地址”，并持续一段时间。“私有特征”共支持两种生成的地址：

·可以解析的“私有地址” （resolvable privacy address）　设备可以选择生成一个“私有地址”，这个地址可以反推出“静态地址”，与该设备共享一个加密的密钥。要解析这个私有地址，允许客户端设备对每一个连接都产生一个新的“私有地址”，但是在与通信的另一个蓝牙节点之间，却是通过“静态地址”维持认证关系。

·不可解析的“私有地址” （non-resolvable privacy address）　不可解析的“私有地址”的使用情况是：在蓝牙设备建立连接的时候，连接的发送方并不想把“静态地址”透露给连接的接受方。因此不可解析的“私有地址”无法反推出“静态地址”。

[1] 蓝牙3.0的速率可达24Mbps。——译者注

8.2　扫描和侦听

对于“低功耗蓝牙”功能的设备，你可以通过扫描和枚举找到这些“低能耗蓝牙”，并将其列为目标设备。目前，有许多能够发现和列举“低能量蓝牙”设备的工具还不太稳定，也不太可靠，不过，随着“低功耗蓝牙”设备越来越多，这些工具可能会变得越来越稳定，功能越来越丰富。

Android系统下的设备发现

Android版BlueScan软件可以使用“低功耗蓝牙”的接口，能够扫描和识别设备的基本信息。选择“低功耗扫描”（Low Energy Scan）提示条上面的“开始扫描”（Start Scan）按钮，程序就开始扫描，这个按钮也会自动变成“停止扫描”（Stop Scan），扫描的结果会记录到本地的数据库文件中，其界面效果如图8-1所示。

BlueScan软件会记录蓝牙的“设备供应商名称”（这个值是通过MAC地址中的“组织唯一标示符”推算出来的）、“设备类型”（是“双模”类型还是只有“低功耗”类型）、“设备的友好名称”（device-friendly name）和接收到的“信号强度信息”（signal strength information）。在扫描到的结果列表中，单击某个扫描到的设备，可以列出该蓝牙设备的详细信息，包括“设备地址”和“历史扫描结果”（historical scan result），比如观察到的“接收信号强度指示”信息和“全球定位系统”坐标信息，如图8-2所示。

图8-1　BlueScan软件的“低功耗扫描”结果截图

图8-2　BlueScan扫描到设备的详细视图

如果单击图8-1上的“数据库”（Database）按钮，BlueScan程序的显示界面就会由“实况扫描”切换到“历史扫描数据”上。在这个视图中，“数据下载”（Download Data）的按钮变成了可用状态，允许你取得数据库中的内容，并将其上传到其他应用服务中，比如上传给电子邮件的客户端程序，上传给Dropbox程序，上传给“谷歌驱动”程序（Google Drive），或者随便实施其他各种共享的操作。

iOS系统下的设备发现

与Wi-Fi扫描不同，Apple公司允许第三方应用程序开发人员使用蓝牙系统的“应用程序接口”来创建蓝牙设备扫描程序。“基于iOS系统的‘低功耗蓝牙’扫描器”（iOS app BLE Scanner）可以用来扫描“可发现的”模式下的蓝牙低功耗设备，并读取到“设备名称”“接收信号强度指示”和“通用唯一标识符”（Universally Unique Identifier，UUID），这些信息都是从“通用属性协议”服务中获取的，如图8-3所示。

“基于iOS系统的‘低功耗蓝牙’扫描器”可以提供“可发现的”节点的基本信息，但却无法读取到该蓝牙设备上与所提供服务有关的更多信息。一个可选的iOS系统上的app应用程序名叫LightBlue，这款程序是通过“低功耗蓝牙发布的“通告信息”读到“信号强度”信息，并列举了“设备属性”，如图8-4所示。

图8-3　基于iOS系统的“低功耗蓝牙”扫描器的扫描结果

图8-4　通过“通告信息”读取到的结果

虽然这些工具都可以用来发现和列举“低功耗蓝牙”设备，但是它们的能力都很有限。不过，要拿到“可发现的”设备的详细信息，我们可以使用Linux操作系统下包括在BlueZ开发包中的一些工具试试。

Linux系统下的设备发现和枚举

正如在第七章中所看到的，你可以使用BlueZ开发包中的hcitool工具发现处于“可发现的”模式下蓝牙设备的存在状况。在那里，要扫描“基本速率蓝牙”设备和“增强数据速率蓝牙”设备，需要使用一些参数，而在“低功耗蓝牙”的扫描中，你不再需要那些参数，而只需要使用“lescan”参数，就可以扫描到这些低功耗的蓝牙设备。在写本书的时候，这个hcitool工具有个bug，即当你通过使用“lescan”参数使用hcitool命令时，经常会返回一个错误，不用管这些错误，再次重新运行这个命令，有时甚至需要多次重新运行这个命令，才能完成正常的低功耗设备扫描。如下面的例子所示。

与直接使用“hcitool scan”命令不同，当带上“lescan”参数以后，那么hcitool工具就在扫描和识别蓝牙设备，并对每一个“可发现的”蓝牙设备的扫描结果重复显示好几次。如果要将hcitool工具输出的内容重定向到文件中，并且每隔一分钟或几分钟，就中断一下扫描过程，那么就可以通过该文件查看扫描结果，不过，鉴于这个文件里有很多重复的扫描行，所以可以通过排序功能，从扫描结果中对每一种结果中各取一行，最终生成一个没有重复行的扫描结果，如下所示：

在这个输出结果中可以看到有些设备的重复信息，比如说，“蓝牙设备地址”为90：59：AF：28：17：A2的设备共出现了两次，第一次显示设备名称为“活动力监控器”（Activity Monitor），第二次显示的则是一个“（未知）设备”（unknown）。对于这样的扫描结果，你可以通过“可发现的”设备，借助于“蓝牙设备地址”进行服务枚举的扫描，以便获得更详细、更准确的内容。

在hcitool工具，通过“lescan”参数的输出数据中，那个“蓝牙设备地址”为90：59：AF：28：17：A2的设备是一个“iHealth牌活动力监控器”（iHealth Activity Monitor），设备实物图如图8-5所示，主要用于记录佩戴者所走的“步数”、“卡路里的消耗值”（calories burned）、“所走的距离”（distance traveled）和“睡眠的程度”（sleep pattern）。本设备会不停地在“通告信道”中“通告”（advertise）它的“蓝牙设备地址”，即使和某一个目标设备配对成功，该操作也不会停止，这样做显然使该设备很容易被识别和扫描。

图8-5　iHealth牌活动力监控器

对于Linux操作系统最新版本的BlueZ工具包中，包含了一个名为gatttool的工具软件，该软件可以列举一个“低功耗蓝牙”设备上的服务和个性化特点。这款gatttool工具可以在命令行中使用，也可以以交互的模式查询目标设备上的主要服务，其命令行的运行效果如下所示：

注意

如果作为目标的蓝牙设备出于安全考虑，使用了一个随机地址作为自己的“蓝牙设备地址”，那么你需要在上面命令行的最后，加上一个“-t random”的参数告知gatttool程序。

对于gatttool程序来说，命令行版本的输出和交互式版本的输出，其结果和格式都是相同的。两者都可以显示出这个蓝牙设备上四个主要的服务。其中的服务信息，在显示的时候，是以“通用唯一标识符”格式显示的。“通用唯一标识符”格式所表示的是由标准的16位“通用属性协议”服务码组成的，该服务器又是通过“蓝牙技术联盟”定义的。这16位“通用属性协议”服务码定义如下所示。这些服务码中，每一位所代表的具体意义，可以通过“蓝牙技术联盟”的“开发者门户网站”（Developer Portal site）进行查询。“蓝牙技术联盟”开发者门户网站的网页地址是：https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx 。由“iHealth牌活动力监控器”所展示的这四个“主要服务”信息的详细描述见表8-1所示。

表8-1　“iHealth牌活动力监控器”设备主要的服务信息

除了“主要服务”信息，还可以识别目标设备的“服务特性”信息（service characteristic）。命令跟上面的命令一样，不过要获取服务特性，就不能使用“--primary”参数了，因为这个参数是读取服务信息，而要将参数换成“--characteristics”，其格式和效果如下所示：

“通用唯一标识符”信息是从上面带有“--characteristics”参数的“特性扫描”返回的。显示的格式和前面“主要服务”信息格式一样，同样是以16位的值作为“服务分配码”。这个特性模式下的“服务分配码”和“服务描述”显示如表8-2所示。为了格式的紧凑、节省显示的空间，其中“通用唯一标识符”这一列已删除掉了。

表8-2　“特性服务”信息列表

提示

一个关于在“服务分配码”和“服务描述”的列表，包含在一个Linux上的源程序BlueZ的源代码中，该源代码可以从http://git.kernel.org/cgit/bluetooth/bluez.git/tree/uuid.c 下载。

有了“主要服务”信息，你可以继续评估目标设备，通过“--char-read”参数，可以拿到与每一个“通用唯一标识符”关联的信息。其显示效果如下所示：

在这个例子中，我们从“通用唯一标识符”中“服务分配码”为0x2a00的“服务描述”得知这个“服务分配码”的意义是：这是一个“设备名称”（Device Name），然后我们就可以从这个“服务分配码”中读信息了。结果读到的是一串十六进制的数字，这些十六字节的数字代表的是设备名的ASCII码，我们可以通过Python进行解码，可以看到解码后的内容是“Activity Monitor”。当我们评估目标设备时，我们应该测试所有返回的“通用唯一标识符”，这样可以识别潜在的信息泄露威胁。对于这个iHealth设备，一些“通用唯一标识符”返回基本信息，反之就返回其他的错误信息（就像目标设备所需要的认证状态可以获取一些敏感信息），如下所示：

关于“iHealth牌活动力监视器”的一个有趣的属性是，这个在特性列表中的设备使用一个保留的“通用唯一标识符”（“服务分配码”为0x2a30）。从这个“通用唯一标识符”返回的数据是一个ASCII字符串，内容是“com.jiuan.AMV10”。这个域名“jiuan.com”注册于Andon组织，这是一个专业从事共享健康信息的设备开发组织的OEM版 [1] 。很显然，是该公司开发了这个“iHealth牌活动力监视器”。

扫描和侦查的应对措施

扫描和枚举“低功耗蓝牙”设备的信息是许多攻击的前兆，其目标就是利用低功耗蓝牙协议或规范在实现时的不足，将其作为目标实施攻击。从事蓝牙设计、生产的组织应该尽量限制扫描或侦查信息的搜集工具，使其尽可能少地暴露其他蓝牙设备上的信息。

不幸的是，可以用来限制这些信息暴露工具的可用项很少。将“低功耗蓝牙”设备配置为“非可发现的”模式，在一定程度上有助于限制信息暴露，但通过一些更复杂的攻击技术，可以克服这种级别的安全措施。细数这里复杂的攻击技术，有“低功耗蓝牙”的“侦听攻击”（eavesdropping attack），这个内容详见第9章，在可能的情况下，一个单位组织应该配置“低功耗蓝牙”设备限制外界对其服务的访问，并按本章所描述的步骤应用，使对方不能从敏感设备上列举和解压数据，也使对方不能在设备投入生产使用之前查到他们的详细信息。

[1] OEM，英文Original Equipment Manufacturer的缩写，按照字面意思是原始设备制造商，指一家厂家根据另一家厂商的要求，为其生产产品和产品配件，俗称加工贸易。——译者注

8.3　本章小结

“低功耗蓝牙”是蓝牙技术发展的一个重要变化，从根本上改变物理层、设备安全和协议的应用层组件。通过这些变化，“低功耗蓝牙”已经在一个新的应用和技术系列领域内变成了一个令人兴奋的无线技术，这些领域涵盖了医疗设备、体育设备、健身器材。

有多个工具可用于“低功耗蓝牙”设备的发现扫描，这些工具可以支持Android、iOS和Linux等多种操作系统。虽然iOS和Android的工具使用起来很方便，但在你确定了目标以后，这些工具能从这个蓝牙设备上读取的数据量很有限。

使用Linux操作系统中的BlueZ工具包，包括其中的hcitool程序和gatttool程序，可以通过枚举得到“低功耗蓝牙”设备上可用的服务列表，并可以将这些从设备上提取的数据作为你的侦察和扫描分析的一部分。在下一章中，我们将注意力转移到那些能在“基本速率蓝牙”、“增强数据速率蓝牙”和“低功耗蓝牙”设备上进行侦听的攻击方式，并且，随后的几个攻击技术都可以应用在对第10章中的那些设备的攻击上。

第9章　蓝牙侦听

通过无线从一个主动交换的数据通信中不动声色地搜集来来往往的数据包，无疑是无线网络中最大的风险因素之一，其实蓝牙的通信网络也不例外。无论你是在评估单位里一个蓝牙设备的暴露程度，还是通过攻击一个无线网络来操控设备，侦听（eavesdropping）数据都是分析的必要组成部分。

本章中，在我们有几个工具可以用来对蓝牙进行攻击之前，还是看一看一些必要的背景资料来了解蓝牙侦听的机会。首先，我们看看“基本速率蓝牙”（Bluetooth Basic Rate，BR）和“增强数据速率蓝牙”（EDR）上的侦听方式，目前，这两种蓝牙技术被合称为“传统蓝牙”（Bluetooth Classic）。随后，就是“低功耗蓝牙”的侦听。从种类上，我们会涵盖开源的蓝牙工具和商业工具；从位置上，各处其位，不过，由于部分工具的侦听功能在传统的“基本速率蓝牙”、“增强数据速率蓝牙”和新型的“低功耗蓝牙”之间产生了重叠，所以对于这一部分，我们会在到达那一部分内容的时候指出。

9.1　传统蓝牙的侦听

“传统蓝牙”网络因为各种各样的应用广受欢迎，从蓝牙键盘和鼠标，到无线“PIN密码输入设备”（PIN Entry Device，PED），都无处不在。这里的PIN指的“个人识别码”（Personal Identification Number），通过“PIN密码输入设备”可以用于信用卡的验证。然而不像Wi-Fi无线网络和其他无线标准在物理层特性上很相似，“传统蓝牙”网络的物理层差别较大。因此，要想在这些“微微网”上捕获蓝牙的通信数据包十分困难。其原因如下所示。

首先，“传统蓝牙”采用的是“跳频扩频”（Frequency Hopping Spread Spectrum，FHSS）技术，由于频率不停地切换，所以发送方（transmitter）和接收方（receiver）需要共同知道并共同按照某一个频率顺序一起跳变，并在共同跳变期间完成数据交换。对于每一个“微微网”，频率跳变模式都是基于蓝牙“主设备”的“蓝牙设备地址”，所以它们跳变顺序也是互不相同的。跳频的频率，正常情况下是每秒跳1600次，这意味着，在切换到其他频率之前，蓝牙设备只能在很短的一个时间段内发送和接收数据，这个很短的时间段称为“时隙”（time slot）。在大多数情况下，我们知道，“微微网”中“主设备”的“蓝牙设备地址”都是与其他蓝牙设备进行通信不可或缺的重要元素。

其次，对于黑客来说，要在“微微网”内相互通信，只知道“蓝牙设备地址”，来推算出其他蓝牙设备的跳频顺序是不够的。要想知道双方的“跳频顺序”（frequency-hopping pattern），还必须知道在这个“跳频顺序”下，负责侦听的嗅探程序要了解在每一个给定时间内该蓝牙设备位于哪个频率点上。在“传统蓝牙”的规范中，使用了另外一个重要的信息，这就是“主设备”的时钟，简称“CLK”。这个时钟用来按照信道顺序的数组中的每一个值，来跟踪设备当前应该使用哪一个信道。这里的时钟值与我们平时所说的用于表示每天年月日、时分秒时间的时钟没有关系，它只是一个由“微微网”中的“主设备”控制的，每312.5微秒就增加1的28位的值计数器。所表示的，其实也只是一个相对时间。

最后，对于黑客来说，“传统蓝牙”的接口并不是简单地只为被动地侦听而设计的，所以“传统蓝牙”的接口没有Wi-Fi无线网络接口那样的“监测模式”可供使用，同时“传统蓝牙”的接口也不存在“本地嗅探”，以及在基带层（baseband layer）搜集网络信号等说法。你可以在Linux操作系统中，使用像hcidump工具一样在“主机控制接口协议”上嗅探到本地所有的通信数据，但是这种类型的嗅探并不会显示低层信息或者蓝牙设备的活动状态，它需要一个“微微网”中的主动连接，然后才能显示出“到”或由本地系统中“出”的那个活动状态。你可以把它看作是一个“非混杂”（nonpromiscuous）模式下的嗅探，并且它只能显示会话层（session-layer）的信息。

除了这些原因之外，“传统蓝牙”的侦听是一个很有价值的话题，不论是从安全角度、开发角度，还是工程角度，都值得人们去克服。正因为如此，所以黑客们设计了一些开源的或者商业的项目，专为克服这些挑战而来。

9.1.1　传统蓝牙的开源侦听技术

正如你在第7章中看到的一样，超牙是一个开源的硬件和软件工程，其设计目的就是利用“超牙一号”的硬件进行蓝牙网络的嗅探。作为一种低成本的硬件设备，超牙具有非常广泛的应用者范围，研究人员和黑客都可以使用，通过它可以捕获和评估低级无线信号的活动状态，当然，这里也包含了“传统蓝牙”网络中的数据包。

超牙对传统蓝牙的嗅探

超牙主机上的软件提供捕获“传统蓝牙”的通信数据包的能力，以及“微微网”中，伴随着跳频识别“低位地址部分”和“高位地址部分”的能力。首先，我们需要识别出“微微网”中“主设备”的“低位地址部分”和“高位地址部分”部分，然后就可以使用ubertooth-scan工具（需要超牙设备和标准蓝牙加密狗），或者是ubercooth-rx工具，进行数据的侦听。不过，要使用ubercooth-rx工具，则只需要超牙设备，还需要该超牙设备具备一种能力，那就是在拿到“高位地址部分”的能力之后，还可以排查“格式没错，但数据有错”（false-positives）数据包的能力。

在这个例子中，你可以看到超牙发现了“微微网”中的两个蓝牙设备，并依次破解了它们的“低位地址部分”和“高位地址部分”。在发现部分“蓝牙设备地址”之后，ubertooth-scan就尝试识别这两个设备的“友好名称”（friendly name），并且在处理的过程中，根据实例中分别为“Joshua Wright的键盘”（Joshua Wright's Keyboard）和“Joshua Wright的鼠标”（Joshua Wright's Mouse）的两个“友好名称”，揭示每个设备最可能的设备角色，分别是键盘和鼠标。

有了部分“蓝牙设备地址”，我们就可以使用ubertooth-follow工具在指定的蓝牙设备上进行侦听。这个ubertooth-follow工具和ubertooth-scan工具很像，都既需要有一个可用的超牙设备，也需要一个标准的蓝牙设备，为了从目标蓝牙设备上捕获通信数据包，需要先与目标设备建立信道间跳转的跳频规则，ubertooth-follow工具使用蓝牙接口频繁地查询目标蓝牙设备的时钟，并快速地调整超牙设备的信道，使之与“微微网”中的频率匹配起来。

在下面的例子中，我们通过指定“高位地址部分”为0x43，指定“低位地址部分”为Oxa36fa0，来侦听“友好名称”为“Joshua Wright的鼠标”的蓝牙设备。很显然，这里的数值和名称都是在上面步骤中通过ubertooth-scan工具读到的。其扫描效果如下，不过，下面的内容不是ubertooth-follow工具实例中的全部输出，为了显示清楚，有一些不太重要的输入内容都删掉了。

这个输出格式相当多而杂，不过，在我们感兴趣的内容中，一些重要冠以“类型”（Type）的字段，其意义解释如下。

·类型：空（Type：NULL）　这样的输出表示ubertooth-follow捕获到了一个空（NULL）的蓝牙数据包，所谓“空数据包”表示的是该数据包的有效载荷（payload）为空，其发送目的主要是为了让对方确认一下，所以这个数据包的后面，往往会跟着一个主动的“确认”（acknowledgement）数据包。

·类型：DM1 （Type：DM1）　“DM1”类型的数据包，表示的是这个数据包中装载有数据。这个数据以中等的数据速率，占用了一个时隙（或者说，占用了两次跳频的一个间隙）。因为这个数据包包含了数据，所以ubertooch-follow工具就会根据8.1.3节的格式说明，对数据包中“有效载荷”进行进一步解码。

·逻辑设备地址（LD_ADDR）　“逻辑设备地址”是“微微网”在蓝牙设备加入的时候分配给蓝牙设备的。当“逻辑设备地址”的值为1时，表示这个设备是微微网中的“主设备”，该值为0表示这个地址用于表示广播信息。

·逻辑连接ID （LLID）　“逻辑连接ID”是“逻辑链路控制及适配协议”许多蓝牙数据包包头的第一个字段。如果该值为2，就表示这个数据包是一个新信息的开始；反之，如果“逻辑连接ID”的值是1，就表示这个数据包是前一个信息的继续；如果“逻辑连接ID”的值是3，表示这个数据包所用的协议是“连接管理器协议”协议。

·流量控制（Flow）　“流量控制”位用于流量控制，是告诉发送方因为队列管理的需要而停止发送信息。

·有效载荷长度（Payload length）　该字段指的是有效载荷的长度，以字节为单位。

·有效载荷数据（Data）　“有效载荷数据”就是要传输的数据本身，ubertooth-follow工具并不打算对有效载荷数据的内容进行解码，而是将解码的工作留给分析程序来完成。

·类型：拉（Type：POLL）　以“拉” [1] 方式发送的数据包，是由“微微网”中的蓝牙“主设备”发送的，发送的目的是征取能得到“从设备”的响应。

使用超牙和一个标准Linux操作系统蓝牙接口，我们可以捕获“传统蓝牙”的数据包，并解码一部分字段。然而，这个接口的能力是有限的，并且缺少一个复杂的解码接口来帮助我们检查侦听到的数据。在写这本书的时候，“超牙项目”（Project Ubertooth）的团队正在努力工作，以便能开发一个基于libpcap的蓝牙数据包捕获的标准格式，这样，侦听过程中捕获到的数据将可以由类似于Wireshark一样的程序来负责解码工作。如果你对“超牙项目”感兴趣，可以通过网址http://ubertooth.sourceforge.net 了解该团队在这项开发进度中最新的消息。

通过超牙对传统蓝牙嗅探的防御措施

作为一个价格并不算贵的蓝牙分析设备，Ubertooth工具不管是对于安全分析人员还是对于黑客来说，无疑是一个非常有价值的工具。然而，在该设备也存在很多不足，主要体现在该设备捕获“传统蓝牙”网络活动点的能力上。

超牙设备只能捕获“基本速率蓝牙”在网络中的活动，而不能捕获后来的“增强数据速率蓝牙”在规范改进后的设备在网络中的活动。所以，对于一个单位来说，应该将老掉牙的“基本速率蓝牙”遗留设备的硬件升级到支持“增强数据速率蓝牙”的硬件版本上，以减免来自超牙数据包侦探的威胁。另外，各单位也应该换用强大的加密协议来保护蓝牙数据的机密和数据的完整性。

“增强数据速率蓝牙”中的问题

在蓝牙2.0的规范中，“蓝牙技术联盟”增加了对“增强数据速率蓝牙”通信技术的支持。如前所述，在蓝牙1.0规范中，传统的数据传输速率是1Mbps，使用的是“高斯频移键控”（Gaussian Frequency Shift Keying，GFSK）调制方式，而蓝牙2.0并没有使用这些技术，而是使用了2Mbps或3Mbps的数据传输速率，调制方式呢，如果速率是2Mbps则改成“四相相对相移键控”（Differential Quadrature Reference Phase Shift Keying，DQPSK）调制方式；如果速率是3Mbps则改成“差分相移键控”（Differential Phase Shift Keying，DPSK）方式。这对于特别能消耗带宽的蓝牙应用来说，无疑是个天大的好事。例如高保真的立体声音频耳机就是个实例。但是对超牙项目来说，这些改变又变成了一个重大的挑战。

在1 Mbps速率的蓝牙连接中，基带数据包通过无线发送时，开始于“访问码”（access code）、数据包的“包头”（header）和“有效载荷”（payload）。通过“访问码”我们可以推算出“低位地址部分”，通过“包头”我们可以还原出“高位地址部分”。这些字段都是采用“高斯频移键控”调制方式调制编码的，其调制的结构如下所示。

对于“增强数据速率蓝牙”网络中的通信数据，“访问码”和“包头”信息仍然通过1Mbps速率的“高斯频移键控”调制方式，但一旦数据包的开始这两个部分发送完成，经过一个“守候”（guard）和“同步期”（synchronization period）之后，发送方就切换到“四相相对相移键控”调制方式或“差分相移键控”调制方式。守候和同步期的作用形同其名，就是留出一定时间，让发、收双方都能适应改变调制机制，改变数据速率的一个缓冲时间段。该过程的时序如下所示。在数据帧的前面，保留“高斯频移键控”调制的原因是让传统蓝牙设备可以检测到这是一个“增强数据速率蓝牙”发送器，从而避免后面的数据冲突。

“超牙一号”的硬件使用了“得克萨斯仪器公司CC2400”（Texas Instruments Chipcon CC2400）芯片作为其设备的无线收发器接口，所以设备解调的能力也仅限于该芯片的解调能力。“得克萨斯仪器公司CC2400”芯片可以适应“频移键控”（Frequency-Shift Keying，FSK）和“高斯频移键控”的解调，但是却无法适应“四相相对相移键控”解调和“差分移相键控”解调。从实践的角度来看，ubertooth-rx工具和ubertooth-scan工具可以识别老旧的“基本速率蓝牙”和“增强数据速率蓝牙”的活动，因为这个数据包的头部信息是通过“高斯频移键控”调制发送的。然而，ubertooth-follow工具无法捕获“增强数据速率蓝牙”的“有效载荷数据”，因为“得克萨斯仪器公司CC2400”芯片不支持“四相相对相移键控”和“差分移相键控”调制机制。目前，只有商业工具包括解调“增强数据速率蓝牙”通信数据包的能力，这个我们将在下面的内容中介绍。

9.1.2　传统蓝牙的商业侦听技术

只有少量的商业蓝牙侦听工具可以使用，却个个贵的出奇，毕竟，要想让蓝牙开发者看得上眼，就得帮他们解决蓝牙产品实现方法上的问题。这些商业产品的设计是以满足开发工程师在软硬件开发上的需要，而不是特定为黑客制作的。当然，万物同理，关键看谁来用，作为黑客，你完全可以使用这些工具中的通用功能，实施对蓝牙网络的侦听和攻击。

前线蓝牙协议分析器600侦听器

“前线测试设备”（Frontline Test Equipment）简称“前线”（Frontline），主要用于基于个人电脑上，针对各种各样的协议所做的一个“协议分析器”（protocol analyzer）。该程序的目标人群是系统集成商、软硬件开发者、系统排障工程师。“前线”系统的销售策略是“卖硬件，送软件”，而软件当然是与硬件相关联的。软件的侦听范围包括SCADA系统 [2] 、RS-232串口通信、Ethernet以太网通信、ZigBee网络通信，以及蓝牙网络技术。“前线”的蓝牙侦听产品，名称一般称作“蓝牙通信探测协议分析系统”（Bluetooth ComProbe Protocol Analyzer System，CPAS），可以通过“蓝牙协议分析器600蓝牙通信探测接口”（Bluetooth Protocol Analyzer 600 Bluetooth ComProbe interface）和“通信探测”（ComProbe）软件，允许开发者观察和记录“微微网”上的活动。由于协议对“主机控制接口协议”（HCI）层的数据包捕获没有任何限制，所以“蓝牙通信探测协议分析系统”工具组也允许用户访问“连接管理器协议”（Link Management Protocol，LMP）协议的数据，和部分基带层数据的头部。这里的基带位于蓝牙网络通信层次中的第二层（layer two），但是“蓝牙通信探测协议分析系统”通过“蓝牙协议分析器600蓝牙通信探测接口”接口无法捕获类似于“数据包包头纠错”（Header Error Correction，HEC）字段。

“蓝牙通信探测协议分析系统”可不是个便宜货！有趣的是“前线测试设备”的设计者不允许公布设备的价格信息，不过，很显然，这个价格，对于很多业余级发烧友来说，肯定是可望而不可即的，如果你想知道这个确切信息，那就访问他们的网站吧，该网站的网址是http://www.fte.com 。当然，从功能上，这个工具对于分析和在蓝牙网络中排查问题确实很有用。

在购买了“蓝牙通信探测协议分析系统”之后，用户就可以访问连同“蓝牙协议分析器600蓝牙通信探测接口”硬件在内的软件工具集了。该设备的硬件如图9-1所示。使用这个硬件以及运行在硬件上的软件，我们就可以捕获蓝牙网络上的通信数据包，以备将来分析使用，或者作为一个攻击者，利用蓝牙部署的弱点进行攻击。因为很多蓝牙设备所交换的数据包都是不加密的，所以简单地捕获蓝牙网络上通信的数据包本身，就可以读到很多对入侵者很有用的敏感信息。

图9-1　“前线蓝牙协议分析器600通信探测”设备

注意

“前线蓝牙协议分析器600通信探测”设备支持“基本速率蓝牙”、“增强数据速率蓝牙”和“低功耗蓝牙”几个版本的蓝牙网络，不过，这里主要关注在前两版本蓝牙网络中的侦听技术，后一个版本的蓝牙网络侦听技术将在本章后面的内容中介绍。

在运行“蓝牙通信探测协议分析系统”工具并初始化捕获数据包工具以后，你就可以看到程序的主界面上显示的是数据源（Datasource）选择工具，这个工具允许你查看“前线蓝牙协议分析器600通信探测”设备的详细配置信息，将其指定为嗅探模式（sniffer mode）。可选的嗅探设备类型有“只对低功耗蓝牙进行嗅探”（Low Energy，即图9-2中“LE Only”单选项）、“只对单连接的传统蓝牙进行嗅探”（Classic，即图中“Classic Only Single Connection”单选项）、“双工模式下进行嗅探”（Dual Mode，即图中同名单选项）、“只对多连接的传统蓝牙进行嗅探”（Classic Only MulLiple Connections，即图中同名单选项）四种。然后再指定一个要监视的设备的“蓝牙设备地址”信息，如图9-2所示。

“蓝牙通信探测协议分析系统”的无线嗅探组件需要分别与“终端用户”（end-user）和目标蓝牙网络进行关联，以便能捕获到完全的数据。要初始化一个数据包的捕获，“终端用户”必须指定这个“微微网”设备的“蓝牙设备地址”，不过，在“前线蓝牙协议分析器600通信探测”设置的“无角色”（roleless）模式的连接获取支持系统中，不需要指定哪个是“从设备”，哪个是“主设备”。如果当前的设备处于“可发现的”模式，那么，“前线蓝牙协议分析器600通信探测”设备就使用“查询扫描”（inquiry scan）攻击方式，这时需要使用界面上“可被发现的设备”（Discover Devices）选项卡进行选择并设置。如果对方的蓝牙设备已在此之前通过“蓝牙通信探测协议分析系统”软件已经发现，那么用户就可以从下拉列表中，选择要攻击设备的“蓝牙设备地址”信息了。另外，如果蓝牙设备的地址是通过前面第7章中的其他发现手段获得的，那么用户就可以手动地输入那个以“0x”为前导的十六进制数，以便指定这个设备或服务作为攻击目标。其实是0x是一些可以涉及较低层的高级编语言（如C语言和C++语言）对十六进制数据表示格式的一些约定。

图9-2　数据源选择工具界面

不幸的是，“蓝牙通信探测协议分析系统”系统所用的“时钟同步”（clock synchroni-zation）技术需要“前线蓝牙协议分析器600通信探测”设备查看由“主设备”给“从设备”的“初始页请求数据包”（initial page request frame）。这一要求有效地限制了在一个新形成的“微微网”中，捕获通信数据包的能力。“前线蓝牙协议分析器600通信探测”设备无法从一个正在处理的进程中，从一个“微微网”中嗅探通信数据包。从攻击的角度来看，这个缺点让我们感觉很不顺手，但是它其实是符合“前线蓝牙协议分析器600通信探测”设备的操作意图的：一个软硬件工程师在捕获蓝牙产品的故障时，当然是希望在“微微网”形成之前就开始捕获，否则一个攻击者就可以从一个已存在的网络连接中进行数据采集了。幸运的是，对于捕获蓝牙数据包，也存在着替代的技术，你会看到在本章的后面看到，即使是对已经建立的网络，攻击者仍然可以进行蓝牙数据包的捕获工作。

一旦“前线蓝牙协议分析器600通信探测”设备对于所需要的时钟同步配置好了以后，那么很快就可以获得“主设备”和“从设备”上的“蓝牙设备地址”信息。用户可以在设置好“将捕获到的数据包放到内存中进行缓存”（buffering the captured packets to memory）选项以后，单击工具栏上的“开始”（Play）按钮发起新的数据包捕获动作。这里的“缓存”选项除了缓冲到内存之外，也可以在用户停止这次捕获动作以后，缓存到文件中，还可以在捕获过程中，直接缓存到文件中。最后，在停止数据包捕获后，“前线蓝牙协议分析器600通信探测”设备会对捕获的数据包内容进行解析和解码，然后，用户就可以通过选择单个帧的内容，或者是通过协议进行过滤，如图9-3所示。

图9-3　对捕获的数据包内容进行过滤

“前线蓝牙协议分析器600通信探测”设备所捕获的文件查看程序的界面和Wireshark程序的界面看上去很像。两者都允许用户选择一个帧，然后在一个“导航树”（navigation tree）的结构中，查看其详细的解码内容。数据包的内容在显示的时候，可以是ASCII码的形式，也可以是十六进制的形式（这个要看该程序上的“radix”参数怎么设置），还可以是二进制的形式。单击数据包列表上面任意一个协议或配置文件的选项卡，下面的数据包列表都将会依据该选项卡的名称，对所有数据包类型进行过滤，最终排除那些不包含该名称所对应的协议的那些数据包，而只显示出与选项卡名称所对应协议一致的数据包内容。

由于“前线蓝牙协议分析器600通信探测”设备可以捕获到这个“微微网”中所有蓝牙之间的所有通信，所以所捕获到的数据类型当然也是五花八门，如果所捕获的数据包类型是如下几个蓝牙协议所支持的类型之一，那么“前线蓝牙协议分析器600通信探测”设备上的软件“蓝牙通信探测协议分析系统”就会自动地对数据进行解析和解码工作，并且它们将还原成初始的文件格式，便于人们阅读。目前，所支持的协议主要有“对象交换规范”OBEX（Object Exchange Profile）、“耳机的音频规范”（Headset Audio Profile）、“同步规范”（Sync Profile）、“打印规范”（Printing Profile）、“图片规范”（Imaging Profile）等。对于攻击者来说这是很有帮助的一项功能，因为几乎捕获结果中的所有数据包都可以被提取出来，重新转换成原始格式。进一步来说，用户不需要为“蓝牙通信探测协议分析系统”软件指定数据集或者规范。用户可以单击“视图（View）|获取数据（Extract Data/Audio）”菜单打开“数据/音频解码设置”（Data/Audio Extraction Settings）对话框。可以选择需要提取数据的协议（或者选择所有支持的协议），指定输出目录和文件名前缀，如图9-4所示。

图9-4　“数据/音频解码设置”对话框

在提取前，请先确保输出目录已经存在。“蓝牙通信探测协议分析系统”CPAS软件会根据所选的协议类型，然后依次处理被选协议的所有帧，再通过数据重组，达到解码提取，并将最后的结果通过文件保存起来。如果原始文件名已知，则以这个文件名进行保存，如果文件名不是已知，那么就用特定的文件名前缀，后附一个序号作为文件名。

注意

网站

如果想看到“蓝牙通信探测协议分析系统”软件针对这些特性的演示功能，有一个在实战中保存的数据包捕获文件可供大家观摩使用，这是一个通过“名片交换”（business card exchange）过程中数据包捕获序列。文件的下载地址是：http://www.hackingexposedwireless.com/files/09/ ，文件的名称是72105_BCard_exchange.cfa。使用“蓝牙通信探测协议分析系统”软件的数据提取功能可以从数据包捕获内容中获取已经传输的“名片”，保存的文件名为Bean，_David.vcf。

“前线蓝牙通信探测协议分析系统”侦听的防御措施

“蓝牙通信探测协议分析系统”工具，借助攻击者已经知道的“主设备”的“蓝牙设备地址”，就可以在“微微网”中捕获通信数据了。但是这个蓝牙设备的“蓝牙通信探测协议分析系统”产品就不能辨别一个“非可发现的”模式的设备，所以攻击者必须使用另一种机制来确定“微微网”中蓝牙设备的“蓝牙设备地址”信息。

正如你看到的一样，攻击者仍然可以通过超牙设备和其他分析技术，识别“非可发现的”模式的蓝牙设备。虽然将设备设置并保持为“非可发现的”模式会使超牙工具在捕获数据包的时候变得更加困难，但这很显然不是一个全面的防御措施。相反，应该假设攻击者可以从无线蓝牙接口中捕获到来往的数据包，然后使用更强大的加密和认证系统来保护数据包通信。

Ellisys“蓝牙资源管理器400”侦听器

Ellisys公司的“蓝牙资源管理器400”，简称BEX400，设备如图9-5所示，是一个独特的蓝牙数据通信捕获系统。

图9-5　蓝牙资源管理器400

当被侦听的蓝牙设备在信道发生跳频时，对于超牙工具和“蓝牙通信探测协议分析系统”工具只能尝试在一个窄带（narrowband）无线接口上疲于奔命，频繁地同步切换，以便能捕获这个蓝牙设备在“微微网”中的活动。而“蓝牙资源管理器400”BEX400设备却使用了不同的方法进行应对。Ellisys公司的“蓝牙资源管理器400”BEX400使用了一个宽带（wideband）的接收器，可以同时侦听蓝牙整个79MHz的所有频谱，如图9-6所示。

图9-6　Ellisys公司的宽带蓝牙捕获接收器

通过这个无线接入方法，“蓝牙资源管理器400”设备使捕获蓝牙数据包和评估蓝牙活动变得很容易。在“蓝牙资源管理器400”设备宽带接收能力的强大支持下，我们可以同时捕获蓝牙所有的活动，且不需要指定“蓝牙设备地址”信息。此外，该“蓝牙资源管理器400”设备在捕获一个“微微网”上蓝牙的通信数据时，既可以在连接建立后进行捕获，也可以在连接建立前就进行捕获。

注意

同“前线蓝牙协议分析器600通信探测”设备一样，Ellisys公司的“蓝牙资源管理器400”设备支持“基本速率蓝牙”、“增强数据速率蓝牙”和“低功耗蓝牙”等几个版本的蓝牙网络。

与“蓝牙资源管理器400”设备相配套的软件，名叫“蓝牙分析”软件（Bluetooth Analyzer software），这是一个计算机程序。在计算机上安装好“蓝牙分析”软件之后，就可以通过USB口连接上作为硬件的“蓝牙资源管理器400”设备，然后运行“蓝牙分析”软件，随后单击“录制”（Record）按钮就可以初始化数据包的捕获操作。这时的界面如图9-7所示。

“蓝牙资源管理器400”设备在随后就开始捕获和处理“微微网”上所有通信的数据包，并通过USB口将蓝牙的活动状态反馈给“蓝牙分析”软件，这时的界面如图9-8所示。

图9-7　Ellisys蓝牙分析程序

图9-8　蓝牙资源管理器捕获解码的结果

提示

Ellisys的“蓝牙资源管理器”软件可以自由下载并使用，网址是：http://www.ellisys.com/better_analysis/bex400a_latest.htm 。这个版本的“蓝牙资源管理器”也包含一个数据包的捕获样例，通过在“蓝牙资源管理器”程序中使用该样例，可以了解“蓝牙资源管理器”的特征，以及这款产品都可以完成什么功能。

在这个例子中，我们通过使用“蓝牙网络交换协议”（Bluetooth Necwork Exchange Protocol，BNEP）的配置文件，借助于“蓝牙资源管理器400”设备，捕获了在“从设备”和“主设备”之间的一次“活动”（activity）。这次活动的主体是通过一部手机与网络相连后的各项动作。在这里，“蓝牙资源管理器”允许我们不仅可以看到底层蓝牙的活动，还可以看到高层的TCP协议数据。而且，我们可以把这次高层“蓝牙网络交换协议”的通信数据包导出到一个PcapNg包的捕获文件中，其流程是单击“文件（File）|导出（Export）”菜单，然后在“导出”（Export）对话框中，选择“导出为互联网协议”（Internet Protocol Export），然后保存数据包捕获文件即可，如图9-9所示。

图9-9　“导出”对话框

Ellisys的“蓝牙资源管理器”软件会提取“蓝牙网络交换协议”或“拨号网络”（Dial-Up Networking，DUN）协议的通信数据包，然后将数据转换成以太网中的数据格式，这样，就可以使用Wireshark或其他与“PcapNg-”兼容（PcapNg-compatible）的计算机软件工具进行查看，如图9-10所示。从Wireshark软件中，可以将PcapNg捕获的数据包转换成通用的libpcap格式。要完成这个操作，只需要单击“文件（File）|导出指定数据包（Export Specified Packets）”菜单即可。

图9-10　用Wireshark软件显示由Ellisys“蓝牙资源管理器”导出的文件内容

Ellisys公司的“蓝牙资源管理器400”设备是一个功能强大的蓝牙嗅探工具，该设备的功能非常丰富。不过，这些特性功能的价格成本也是极高的，这可能也是“只有制造蓝牙产品的专业组织会用，而蓝牙业余爱好者和黑客却望而却步”的唯一原因了。要想知道关于“蓝牙资源管理器400”设备更详细的信息，可以登录Ellisys公司的网站，网址是http://www.ellisys.com/products/bex400 。

通过“蓝牙资源管理器400”实施PIN入侵

“蓝牙资源管理器400”除了是一个功能强大的蓝牙数据包嗅探工具之外，还是一款能够对“老式配对”（legacy pairing）方式实施自动PIN入侵的工具。这里的PIN仍然是前面提到过的“个人识别码”（personal identification number），而上面提到的“老式配对”指的是采用“安全简化配对”（Secure Simple Pairing，SSP）协议。“蓝牙资源管理器400”设备的使用手册中，针对这个特性，非常一板一眼地提到：“对于‘个人识别码’的配对，分析类的程序可以对其进行解密，计算出‘连接密钥’（link key），然后再解密所有相关的数据包，整个过程完全不需要用户的干预。”

在实践中，用户只须启动“蓝牙资源管理器400”设备就可以捕获到两个蓝牙设备之间以老式的配对交换过程的数据包。所有加密的数据包也会通过“蓝牙资源管理器400”设备进行解密，并以未加密的格式显示。

Ellisys“蓝牙资源管理器400”侦听防御措施

在“蓝牙资源管理器400”设备宽带接收机的功能中，对于捕获通信数据包的功能，目前，几乎没有什么好的办法可以避免。一个使用“蓝牙资源管理器400”设备的攻击者所要做的，也只是找定一片地方，简单地打开该设备上捕获数据包的功能，然后该设备就开始对这片区域内所有蓝牙的捕获活动，并对其进行解码。就像防御“前进蓝牙通信探测协议分析系统”的防御策略一样，网络管理员应确保所有的网络通信都进行了加密，以此来加强系统的保密性。不幸的是，许多蓝牙在设计实现的时候，并不愿意完全遵守这一基本原则，最终导致安全信息明显暴露，在本章的后面会详细介绍。

到目前为止，你已了解了好几种“传统蓝牙”网络的侦听技术，如果选择商业设备，那么可能只需要简单地访问和分析工具就可以实现。所完成的也主要是对“基本速率蓝牙”和“增强数据速率蓝牙”蓝牙活动点的捕获。下面将目光转向在“低功耗蓝牙”网络中进行通信数据包的捕获。

[1] 在计算机通信中的一种数据传送策略，由发送方主动完成的方式称为“推”（push），由接收方主动要求完成的方式称为“拉”（pull，有时也写成poll）。以设备采集为例，某个温度计有两个功能，一个功能是实时检测当前的温度；另一个功能是当温度高于80度就报警。那么对于这个温度计来说，对于实时的温度值就可以采用“拉”的方式，采集的频率取决于监测程序的灵敏度：监测程序要得快，就给得快；监测程序要得慢，就给得慢。而对于高温报警的值，由于是个小概率事件，并且灵敏度要求较高，就可以采用“推”的方式，报警出现，就立即发送。——译者注

[2] SCADA（Supervisory Control And Data Acquisition System）是“监控与数据采集系统”。可以简单地认为这是一种针对设备的，集采集、汇总、展示、反馈、应急等设备监控为一体的大型一体机。——译者注

9.2　低功耗蓝牙的侦听技术

从复杂性的角度来看，“低功耗蓝牙”的侦听比Wi-Fi无线网络上的嗅探难，比“传统蓝牙”网络上的侦听容易，正好介于二者之间。在低层技术上，“低功耗蓝牙”和“传统蓝牙”一样，都使用“跳频扩频”技术。在这一技术下，发送方和接收方都按照一组共同的信道序列在各个信道之间跳转。要想捕获这些通信过程中的数据包，进而侦听“低功耗蓝牙”网络，攻击者就必须事先识别出这两个蓝牙设备在各个信道之间跳转的信号序列，以及发射方在一个单一信道上停留多长时间，又叫“跳转间隔”（hop interval）。

不同于“传统蓝牙”的方面就是，“低功耗蓝牙”网络中的频率跳转远没有“传统蓝牙”中的那么复杂、并且要使用的信道数少了很多。在2.4GHz带宽中，“低功耗蓝牙”网络总共使用了40个信道，并且在这40个信道中，还保留了3个信道用于网络通告，剩下的37个信道才用于数据的传送，如表9-1所示。同时，另一个和“传统蓝牙”不同的方面是，“低功耗蓝牙”网络使用了一个更简单的频率跳转序列，这个顺序的生成由一个开始的“通告信道索引”（advertising channel index），一个“跳转间隔”（hop interval）和一个“跳转增量”（hop increment）值共同组成。

表9-1　“低功耗蓝牙”信道表

当一个“低功耗蓝牙”网络建立成功，“主设备”会发送一个“连接请求数据包”（connection request packet）到“从设备”所在的一个“通告信道”上。这里透露蓝牙“微微网”的几个重要的网络特性：

·访问地址（access address）　这是一个4字节的整数值，由“发起方”蓝牙设备在初始化的时候随机生成，其作用是唯一地识别一个连接。

·连接事件间隔（connection event interval）　这就是上面所说的“跳转间隔”，这个时间值，是发送方和接收方从变到某个信道上，到开始跳到下一个信道之前，在这个信道上所停留的总时间。

·跳转增量（hop increment）　两个信道之间的“距离”，主要用于判断在下一跳的时候，是跳转到哪一个信道中。

·循环冗余校验校验初始化种子 [1] （CRC initial seed）　一个3字节的随机数，被“发起方”（initiator）生成，用于初始化数据包的CRC校验计算功能。

这个连接请求数据包的例子，是通过Ellisys公司的“蓝牙资源管理器400”设备捕获并发现的。程序界面如图9-11所示。通过这些信息，“主设备”和“从设备”就可以发送和接收数据包了。无论是“主设备”，还是“从设备”，要想将与自己正建立连接并实施通信的另一方，和其他与自己连接的“低功耗蓝牙”设备区分开来，需要使用“访问地址”（access address）。该地址位于每一个“低功耗蓝牙”数据包结构中的开始部位。从侦听的视角，更重要的因素是设备在某一个信道上停留的“跳转间隔”，和设备在37个信道中选择哪一个作为下一个信道的“跳转增量”的定义。

图9-11　“低功耗蓝牙”连接请求数据字段

“低功耗蓝牙”使用一个简单的信道选择机制，紧跟着就是“连接请求交换”（connection request exchange）。从信道0开始，“跳频增量”的值主要用于增加当前信道的序号，然后将“和”对37做“求模”运算 [2] 。例如，在Python系统中，我们可以快速地计算出一系列信道序列的号码，而该序列号码与“低功耗蓝牙”求跳频序列号的方法近似，如下所示：

每一次发送方和接收方在信道间跳来跳去的时候，它们都会在继续跳向下一个信道之前，在当前的信道上停留一定的时间间隔。因此，想要借机得到“访问地址”、“跳转间隔”、“跳转增量”、“循环冗余校验校验初始化值”的侦听者，可以在“低功耗蓝牙”网络进行侦听，并且验证所接收数据包的内容。

注意

有一些蓝牙规格的属性增加了信道跳频过程的复杂度。例如，并不是所有的设备使用了所有37个数据信道，取而代之的方法是事先定义一个“使用信道的列表图”（channel map），这个“使用信道的列表图”是由所有“使用的”信道组成的一个列表，即所有信道列表的一个子列表，然后设备在跳转期间，只会在这个列表中存在的信道之间跳来跳去，而不会跳转到这个列表之外。即使这样，算法还有改进，那就是“从设备”也不需要完全按照“主设备”的每一次信道的跳频事件进行跟随，只要按照共同的算法约定，在指定必要的几个信道中，同样可以收到数据。这样做很显然是为了节约电源，同时也是参考了蓝牙规范中有关“从设备不工作则潜伏”（slave latency）这一特性要求而实现的。有关这方面的更多信息，请参见《蓝牙核心规范4.1》第6卷B部分，第3.3.2节和第4.5.1节的内容。网址是：https://www.bluetooth.org/en-us/specification/adopted-spcifications 。

9.2.1　捕获低功耗蓝牙的“连接建立”过程

一种“低功耗蓝牙”设备对基带通信的嗅探能力，那就是一次可以监控三个“通告信道”中的一个，进而从这一个“通告信道”中获得请求数据包，然后计算出“访问地址”、“跳转间隔”、“跳转增量”、“循环冗余校验校验初始化值”，不过，这需要一个前提，那就是必须事先嗅探到这个“低功耗蓝牙”设备之前已经完成的“连接建立”（connection establishment）过程。

要想嗅探“低功耗蓝牙”通信中，能够捕获“连接建立”过程，我们至少有三个选择。第一个选择，可以通过Ellisys公司的“蓝牙资源管理器400”设备进行嗅探，这个设备可以用来捕获“连接建立”的过程数据包，并帮助我们对捕获到的数据包进行解码。不过，需要说明的是，后一步对捕获到的数据包进行解码的操作并不是必须的，在后面的内容会涉及。第二个选择，就是“前线蓝牙协议分析器600通信探测”的产品，用户只需要在“数据源选择”窗口（参见前面“9.1.2节）中选择“只对低功耗蓝牙进行嗅探”（LE Only）单选项，作为数据包的捕获类型，然后就可以“坐等渔利”，等待设备捕获“连接请求”的数据包。还有一个选择就是超牙设备，如前所述，超牙设备针对不同的蓝牙规范，具有不同的应对工具，所以如果我们要使用超牙设备，就需要换成一个不同的，专门针对“低功耗蓝牙”网络的工具，这个工具毫无疑问，也包含在整个超牙工具包中，要通过超牙完成对连接建立的捕获，请看下面的内容。

超牙工具

由于“低功耗蓝牙”采用“高斯频移键控”的调制方式，“传统蓝牙”也采用这一种调制方式，所以我们可以使用相同的超牙硬件，即能捕获“传统蓝牙”的数据包，也能捕获“低功耗蓝牙”的数据包。要捕获和跟踪“低功耗蓝牙”的连接请求，我们需要使用其配套的ubertooth-btle工具。

ubertooth-btle工具由Mike Ryan开发，使用一个超牙在三个“低功耗蓝牙”通告信道中的一个信道中进行侦听，看看是否有连接请求数据包出现。默认情况下，ubertooth-btle工具侦听的通告信道是第37信道。一旦有一个连接请求被侦听到，ubertooth-btle工具就会立即分析该连接的参数，然后开始跟着被侦听的“低功耗蓝牙”设备的信道跳转而进行信道跳转。步骤如下所示。

注意

由于上面ubertooth-btle工具的实例输出内容较多，考虑到显示上的空间限制，凡是与本主题关系不大的内容都删除了。

在这个例子中，ubertooth-btle将捕获到的数据包都保存到一个pcap文件中，也就是命令中的“-c btle.pcap”参数所要求的，并且只捕获连接请求，就是后面“-f”参数。随后，ubertooth-btle工具识别出一个CONNECT_REQ类型的数据包，从这个数据包中，得到了好几个重要的参数，比如“跳频增量”是“9”。在侦听到这个数据包之后，ubertooth-btle工具立即就开始随着这个“低功耗蓝牙”的连接开始同步跳频。所有“低功耗蓝牙”设备的开始信道序号都是0，这意味着下一个数据包将出现在信道9上，随后的信道序号将依次为18、27…。

ubertooth-btle工具会从每一个报告的数据包中，解码出一些数据，这些数据包包括“逻辑链路控制及适配协议”数据包的开始帧中数据包有效载荷的内容。不过，如果没有一些辅助解码的内容，单单从字节本身上来看，这些数据并没有多大意义。幸运的是，Wireshark工具在1.12及之后的版本中，开始对“低功耗蓝牙”数据包进行解码，这无疑是让上面的工作峰回路转。

在“连接建立”之后的数据包捕获技术，主要是用来捕获在一个“安卓Nexus 4”（Android Nexus 4）设备和“Polar FT-7健身心率监测器”（Polar FT-7 fitness heart rate monitor）之间的活动。“Polar FT-7健身心率监测器”设备实物如图9-12所示（由Mike Ryan提供）。我们打开Wireshark程序，将之前捕获到的数据包读入程序，然后设置关键字“btatt.handle==0x0011”进行过滤显示，程序马上搜索到所对应的20个数据包，其内容是都是在“安卓Nexus 4”和“Polar FT-7健身心率监测器”之间来往通信的，用于读取心率数据的事件记录。该程序的界面如图9-13所示。有关使用“蓝牙心率测量特征”（Bluetooth Heart Rate Measurement characteristics）的个人配置文件，可以从蓝牙开发的网站上下载（https://developer.bluetooth.org/gatt/characteristics/Page/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml ）。在这个示例中，我们可以解码值为“16：54：cb：02：dc：02”的设备，其结果如表9-2所示，其中显示了很多心率测量信息。而且，这些信息可以通过简单的命令行工具进行收集和长时间进行解码，如下所示。

图9-12　Polar FT-7健身心率监测器

图9-13　Wireshark对“Polar FT-7健身心率监测器”的解码报告

表9-2　Polar FT-7健身心率数据的数据意义

在这个例子中，tshark命令读取一个ubertooth-btle工具所捕获的数据包，通过“btatt.handle==0x0011”参数设置，可以通过过滤显示出与这个指定的“心率报告句柄”（heart-rate reporting handle）相关的数据包。默认情况下，tshark程序并不会在tshark输出中打印出心率信息的有效载荷数据，所以我们特定添加“-z”参数用于指定这个字段。将这个输出结果发送到UNIX操作系统中的awk工具就可以得到心率数据字节，并将其中的十六进制格式转换为十进制格式。

在蓝牙硬件上使用ubertooth-btle软件，使得在“低功耗蓝牙”BLE连接上进行侦听的可能。另外一个低成本的选项对于本次任务也有作用。对于Windows用户，如果想要一个对“低功耗蓝牙”数据包捕获和分析的简单界面，那么选择一个得克萨斯仪器（Texas Instruments）公司的“SmartRF数据包嗅探工具”（SmartRF Packet Sniffer tool）是个不错的选择。

得克萨斯仪器公司的SmartRF工具

得克萨斯仪器公司是一个著名的芯片制造商，生产的许多商业产品，包括“低功耗蓝牙”嗅探器。作为一种帮助软硬件开发人员的机制，该公司创造出“得克萨斯仪器芯片”产品，同时还提供了几个基于SmartRF平台原型的故障排查（troubleshooting）工具。

SmartRF是一个开发者通过使用得克萨斯仪器，在设计、创建和故障排查射频集成电路方面进行软硬件开发的平台。在硬件和软件的解决方案方面，“低功耗蓝牙”网络中SmartRF设备还提供排除故障的功能，包括一个非常有能力的“低功耗蓝牙数据包嗅探器”和低成本的USB加密狗。

得克萨斯仪器公司的“CC2540 USB接口评估模块”（CC2540 USB Evaluation Module）套件，其实物如图9-14所示。这是一款价格为50美元的可编程的“片上系统”（System-on-Chip，SoC）产品，支持2.4GHz无线接口和一个集成了的8051微处理器。这款“CC2540 USB评估模块”是可编程的，包括一个“联合测试行动小组”接口和两个按键，按键可用于任何自定义应用程序的需要，但是在出厂时，固件默认的配置是能够捕获“低功耗蓝牙”的通信数据。使用附带的“得克萨斯仪器SmartRF数据包嗅探器”软件，我们可以使用“CC2540 USB评估模块”在捕获到连接请求数据包以后，随着蓝牙设备之间的通信而同步跳频。

图9-14　CC2540 USB接口评估模块

提示

“CC2540 USB评估模块”可以从很多热卖的在线电子商品零售商那里买到，这些零售商的网址有：http://www.digikey.com ，http://www.mouser.com ，http://www.newark.com ，和http://uk.farnell.com ，在这些网址中，该产品准确的产品型号是CC2540EMK-USB。

购买了产品以后，就是安装。首先，从得克萨斯仪表公司的网站上下载“SmartRF数据包嗅探器”（SmartRF Packet Sniffer）软件，网址为http://www.ti.com/tool/packet-sniffer 。然后，在你的Windows操作系统上通过安装向导来完成软件的安装。下一步，将“CC2540 USB评估模块”硬件插入到可用的USB口中，启动数据包嗅探软件。在整个过程中，你要做的工作就是选择一个可用的硬件接口，如图9-15所示。单击“开始”（start）按钮就可以启动数据包嗅探器的安装过程了。

图9-15　选择一个可用的硬件接口

在“SmartRF数据包嗅探器”的窗口中，允许你通过配置定制捕获流程。在窗口的底部有几组设置，选择不同的设置，意味着不同的捕获流程。下面的配置中，有开始监听的信道序号，该值默认为37信道，设置好以后，该设备只在此信道是侦听“连接请求”的数据包。另一个重要的配置项就是指定要侦听的蓝牙设备的“发起方地址”（initiator address）。还有一个配置项是是否解密已侦听到的通信数据包。在本书第10章中，我们会通过此项检验“蓝牙加密攻击”（Bluetooth encryption attack）技术。你可以修改上述这些配置，也可以不加考虑地单击“开始”（Start）按钮，通过当前的配置项开始数据包的捕获。

当“CC2540 USB评估模块”在通告信道中捕获到通告数据包时，“SmartRF数据包嗅探器”就会滚动显示出所选择的通告信道中新捕获到的活动数据包。一旦发现有“连接请求”数据包出现，“CC2540 USB评估模块”就会自动开始计算其信道跳转值，并跟着“微微网”中通信的这两个蓝牙设备的跳频一起在各个信道间跳转，更重要的是，在跳转期间侦听二者之间的数据通信，解码并显示所侦听到的数据，程序界面如第9-16所示。

图9-16　SmartRF数据包嗅探器侦听到的数据包

注意

网站

一个被称为“Fitbit一号”（Fitbit One）的设备，也可以对数据包进行捕获，然后使用“SmartRF数据包嗅探器”软件的界面对其捕获的文件内容进行显示，这时就不再需要“CC2540 USB评估模块”设备。在本书的配套网站上，有一个通过“Fitbit一号”设备捕获的文件可以作为读者的研究样例。其下载网址是http://www.hackingexposedwireless.com/files/09/fitbit-smartrf.psd 。

“SmartRF数据包嗅探器”软件还包括一些可以改变数据包内容显示效果的功能，比如隐藏或显示所选的字段，以及通过过滤器显示指定类数据包的功能，这样可以让我们集中精力到我们所关注的数据包类型上，而不必浪费多余的时间忙于查找想要的数据包。然而，“SmartRF数据包嗅探器”软件还是缺少一些功能，另外在使用方便性方面还是不如Wireshark软件。幸运的是，你可以将“SmartRF数据包嗅探器”在捕获“低功耗蓝牙”设备通信数据包之后，将生成的文件由“SmartRF数据包嗅探器”的文件格式转换成Wireshark软件软件支持的libpcap文件格式。

要完成上面的转换操作，其实并不需要复杂的编程，只需要一个脚本足矣。tibtle2pcap.py工具，就是这样一个基于Python语言的脚本程序，该程序可以读取“SmartRF数据包嗅探器”软件生成的Sniffer.psd文件，然后将其转换成libpcap格式的文件，后者是和Wireshark兼容的，同时也和本章前面描述的btle插件兼容。要下载tibtle2pcap工具，可以从网站http://www.willhackforsushi.com/code/tibtle2pcap.zip 处下载。你也可以在Windows操作系统或Linux操作系统中使用tibde2pcap.py脚本完成上述转换功能，不过这个脚本需要在Windows上安装一个Python的解释器。如果你采用后一种办法，那么需要完成如下操作：

输出文件fitbit-smartrf.pcap，就可以被Wireshark软件和btle插件所识别。其中Wireshark软件的显示界面如图9-17所示。

图9-17　SmartRF数据包转换后在Wireshark中的解码显示

注意

smartRFtoPcap程序是一个和“SmartRF数据包嗅探器”程序功能相似的工具类软件，该软件所属的项目是由Geoffrey Kruse使用C语言编写而成，相关资料可从网站https://github.com/doggkruse/smartrftopcap 上查到。

廉价的“CC2540 USB评估模块”设备，配上“SmartRF数据包嗅探器”软件，再加上tibtle2pcap.py脚本的“三英组合”，还是很有吸引力的，这其实就是“低功耗蓝牙”网络数据包嗅探的一种低成本的上佳组合。不幸的是，“CC2540 USB评估模块”设备的固件并不支持对已建立连接情况下捕获蓝牙通信数据包的能力。这对于当黑客意识到有蓝牙设备在通过“微微网”已经进行通信的前提下，再打开上面软硬件组合，开始侦听来说，似乎太迟了，而这一限制，对之后的侦听攻击、数据解码等工作也成为不可能。幸运的是，这正是ubertooth-btle的亮点。

9.2.2　低功耗蓝牙的混杂模式跟踪

当对“低功耗蓝牙”进行攻击时，必须在“低功耗蓝牙”还没有建立连接之前进入侦听状态。这种限制条件对黑客来说是不现实的。比如，假设我们要开发一个手持的“个人识别码输入设备”（Personal Identification Number Entry Device，PED），该设备使用“低功耗蓝牙”传送信用卡（credit card）信息到一个接收器上，接收器再将数据回传到一个有效的认证系统上。“个人识别码输入设备”在电源接通，设备打开后，就会和接收器之间建立一个连接，并且在此后的使用中，这个建立好的连接也会持续相当长的一段时间。还记得吗？“前线蓝牙协议分析器600通信探测”设备和得克萨斯仪器公司的“SmartRF数据包嗅探器”都得通过嗅探到“连接请求”数据包，然后才能识别出“访问地址”“跳转间隔”“跳转增量”“循环冗余校验校验初始化种子”等值，并推算出蓝牙设备的跳频序列数组，然后才能按照和“低功耗蓝牙”相同的跳频顺序进行同步。回顾这个流程，如果嗅探不到“连接请求”数据包，就得不到后面的这些值，也就谈不上在后面加入到跳频的交换了。

相比之下，Ellisys公司的“蓝牙资源管理器400”设备分析产品可以同时侦听所有蓝牙信道，因为该设备不依靠信道间的跳频，所以“蓝牙资源管理器400”设备也不需要通过追踪某个“微微网”上通信的蓝牙设备的跳频序列去捕获分布在不同信道中的数据包。不幸的是，像“蓝牙资源管理器400”设备这种绝好的黑客利器，却因为其超常的价格而将许多爱好者拒之门外，迫使我们去寻找另一种解决方案，使之能在连接建立以后，仍然能捕获“低功耗蓝牙”网络上的通信数据包。

进入超牙系统，换一种使用ubertooth-bde功能的操作方式，这次我们使用“-f”参数，以便超牙可以在“低功耗蓝牙”网络中，捕获“连接请求”的消息，如果我们处在“混杂模式”（promiscuous mode），那么对于“低功耗蓝牙”的侦听来说，导出的信息就显得十分必要了。现在的问题就是，如何让超牙进入“混杂模式”，这需要使用“-p”捕获参数。这时的超牙会组合使用几种技术来获得“低功耗蓝牙”网络中，对于“信道跳转”和解码来说十分必要的信息。

1）ubertooth-btle程序开始运行，就意味着，这之后捕获到的数据是充满着数据包和干扰噪声（noise）的比特流（bitstream）数据。要想确定一个数据包的开始，ubertooth-btle程序需要首先识别“空数据包”（empty packet）的“公共头部”的值（common header values），“公共头部”后面的4个字节数据，就可能是“访问地址”。照这样的过程重复几次，ubertooth-btle程序就能够通过计数和匹配操作，推算出一个有效的“访问地址”。

2）利用还原好的“访问地址”，就可以识别一个数据包，通过观察常见的数据包类型和反向使用“线性反馈移位寄存器”（Linear Feedback Shift Register，LFSR）算法，可以计算出“循环冗余校验校验”的初始化值：先用数据包的数据和“循环冗余校验校验”值进行运算，可以反向还原“循环冗余校验校验”的初始值，一旦“这些”“循环冗余校验校验”的初始值被救还原，就可以在“混杂模式”下嗅探进程中，检验后续数据包的有效性。

3）下一步，“跳转间隔”的还原，是通过听同一个信道和观察连续两个回收数据包。利用这两个数据包接收的时间差（也就是Delta值）除以37，就可以得出“跳转间隔”。

4）最后，“跳转增量”的还原。ubertooth-btle工具在数据信道上侦听数据包，很快它就能如愿捕获到一个数据包，并且该蓝牙设备会跳到下一个信道上，假设该蓝牙设备开始于信道1，马上要跳到信道2，因为“跳转间隔”已经在上一步中还原出来，所以当我们看到一个数据包到达下一个信道中的时候，我们就可以根据检查两次读到的数据包的时间上的不同，计算出“跳转增量”值。

还原了上面几个重要的参数值，下一步就是对这些值进行处理，然后得到这两个“低功耗蓝牙”设备的跳频序列，并跟随着一起边跳边侦听，这个过程听起来很复杂，但如果通过ubertooth-btle工具实现起来却很简单。只要通过“-p”参数简单地运行即可。作为可选项，如果还想将数据包中的数据也保存起来，可以再带上“-c”参数，剩下的就是等待ubertooth-btle工具根据上面还原出来的必要信息，计算这个“微微网”的跳转步数，该过程如下所示：

在上面的例子中，ubertooth-btle在“混杂模式”时，将在信道17上开始捕获数据包。信道17的频率是2.440 GHz，当从空的“逻辑链路控制及适配协议”数据中确定了“访问地址”是“AA”以后，一旦“AA”被还原，ubertooth-btle就继续还原“循环冗余校验校验”的初始值、“跳转间隔”、“跳转增量”。最终，跟随这个“低功耗蓝牙”网络的跳频，ubertooth-btle工具就可以还原数据包的值。这些步骤正如这个例子所示。

现在我们已经研究了几种在“低功耗蓝牙”网络中进行侦听的技术，下面我们通过一些实例，了解究竟哪种侦听攻击最适合黑客。

[1] 在一个“确定系统”中是无法产生随机数的，计算机就属于“确定系统”，但是如果能引入一个随机数，就可以产生一个随机序列，那么引入的这个随机数，称为“种子”（seed），同时这种通过引入随机数后，再生成的随机数序列，称为伪随机数。——译者注

[2] 如果你对“求模”运算不太了解，那么你可以简单地理解为这是“求余数”的运算。——译者注

9.3　通过“侦听攻击”技术攻击蓝牙网络

通过在蓝牙网络上捕获数据包的能力，我们就可以开始评估这些数据的性质了。方法是通过这些连接，发送识别信息以查看威胁程度。蓝牙网络的风险可能因网络规范不同而存在显著不同，这取决于数据传输的性质及是否通过加密算法来保护蓝牙数据通信的保密性，有关对蓝牙网络加密算法的攻击，详见第10章的内容。接下来，我们通过两个具体的例子来检验蓝牙网络上的“侦听攻击”（eavesdropping attacks），特别强调的是针对“传统蓝牙”和“低功耗蓝牙”方面的威胁。

传统蓝牙的键盘侦听

也许在使用普及程度上，仅次于蓝牙耳机的蓝牙设备就是蓝牙键盘和蓝牙鼠标了，这两样装置在生活中也是很常见的。相比于其他便宜的运行在27 MHz频率的同行，蓝牙键盘要求频率范围更大，也更可靠。它根据至少一个制造商，通过使用“工业标准加密”（industry standard encryption）技术来达到更高的安全性。有关“工业标准加密”的内容详见http://download.microsoft.com/download/1/d/8/1d8e6b48-4702-4dae-86bc-020ece4b9ea4/MicrosoftHardwareBluetoothWhitePapter.pdf 文档的第6页内容。

乍一看上面的“工业标准加密”，蓝牙无线键盘似乎是一个了不起的技术，它提供了对通信数据的加密和连接的认证服务，蓝牙使用了一个很强的安全机制，完全可以胜任对外周计算设备的应用，足以防止对键盘和鼠标类设备常见的攻击，如“无线键盘记录攻击”（wireless keystroke logging）。蓝牙“人机接口设备”（Human Interface Device，HID）配置文件定义了一个对键盘设备的敏感性质需求的特别设置。有关“蓝牙人机接口设备”的详细内容，可以参见http://tinyurl.com/mor802 中的第4.5节。

蓝牙的安全措施有不少，例如身份认证、关联（bonding）、加密。可是当设备使用蓝牙作为“人机接口”时，这些安全措施除了键盘（keyboard）、按键面板（keypad），以及其他类型的生物识别或识别信息传输设备之外，其他的蓝牙设备都只是将这些安全措施作为选项，而不是必用项。同样，“蓝牙主机”或“蓝牙主机”应用程序，可能会从一个蓝牙键盘或键盘接收敏感信息，因此这些设备也会要求通过安全连接传输数据，这样做的一个明显好处就是：用户不必再被自己的蓝牙键盘到底提供，还是没提供安全措施而困惑，也就是说，所有蓝牙键盘必然是有认证的，建立过关联的，通信的数据也必然是加密的。键盘的蓝牙通信的设计者，很显然也是想通过这种明确的增值的安全方式，使蓝牙键盘在市场占用率上，超过其他类无线键盘。

尽管在“人机接口”的规范中，强烈地要求“人机接口”必须提供安全措施，但蓝牙键盘技术没有你想象中那样认真地遵照执行。例如，我们可以想象一下，在一台个人电脑上，在电脑主机启动但还没有进入操作系统时，访问系统“基本输入输出系统”（Basic Input Output System，BIOS），这时使用的是蓝牙键盘。在蓝牙“人机接口”的规范中，明确指出电脑主机必须对正在初始化的安全设置进行响应，然而没有任何类型的蓝牙，在电脑主机操作系统的启动之前支持这一要求，因为“基本输入输出系统”根本就没有包含对“蓝牙主机”协议栈的功能。

为了在这种情况下提供对蓝牙的支持，“传统蓝牙”的“人机接口”规范中指出：增加一种新的输入模式，称为“启动模式”。在“启动模式”中，蓝牙加密狗再回归到一个简单的USB接口“人机接口”设备的层次上，在蓝牙键盘和电脑主机接口之间所用的连接蜕变成了不加密的连接。作为一个USB接口的“人机接口”设备，其实也只是一个最基本的接口。这时系统之所以能认识这个设备，也只是因为这时的蓝牙接口键盘，在系统眼里，实际上只是一个USB键盘的输入设备而已，那么这个时候，虽然表面看上去，系统可以通过蓝牙接口访问了“基本输入输出系统”，但实际上也只是使用了该蓝牙设备中最基本的接口功能。

许多蓝牙产品支持的“启动模式”的功能，通过该功能可以为最终用户创建一个简单的接口，借助于该接口使用传统的（Classic）键盘方式。例如，罗技“MX5000蓝牙键盘和鼠标二合一组合”装置在流行的电子商店就有供货，在该设备的用户指南中称，该设备有一个叫作“快速配对”（Quick Pairing）的功能。该产品的文档中，有专门的内容指导用户将包括蓝牙USB适配器，插入到电脑主机系统，然后单击“添加新硬件”向导（Add New Hardware wizard）对话框上的“取消”按钮。该设备的实物图如图9-18所示。按着接口适配器上的按钮直到LED指示灯闪烁，在蓝牙USB适配器指示灯闪烁的时候，按下键盘和鼠标产品上的小按钮完成“启动模式”配对过程。

图9-18　罗技“MX5000蓝牙键盘和鼠标二合一组合”设备实物图

通常使用蓝牙键盘的情况，是在蓝牙“人机接口”的“启动模式”中对系统进行配置。或者通过pyroduct产品写好的说明书（就像前面所描述的罗技MX5000采用的快速配对模式），或者直接进行设备配置，蓝牙键盘用户很少会采用完整的蓝牙“人机接口”模式，该模式下既支持加密，又支持设备验证，这样他们的按键记录很容易受到被动侦听的攻击。

注意

对于Apple公司的iOS设备来说，蓝牙键盘也非常受欢迎。据笔者的测试，苹果iOS在使用蓝牙键盘时，蓝牙“人机接口”是需要加密的，不允许键盘在“开机模式”操作。

通过使用蓝牙嗅探器，可以捕获蓝牙键盘上的按键操作，再将按键操作进行解码，这就相当于创建了一个被动式远程的“按键记录器”（keystroke logger），这个过程很简单。首先，在物理距离上先接近要攻击的蓝牙设备系统，然后，捕获该设备之间的蓝牙通信数据包。图9-19所示的例子中，我们使用Ellisys公司“蓝牙资源管理器400”设备分析产品捕获蓝牙键盘和电脑主机之间数据通信。类似的分析也可以用低成本的超牙完成，不过对内容的解码仍然要libpcap库的支持。

图9-19　通过Ellisys公司的“蓝牙分析器”对键盘通信数据包的捕获

在图9-19捕获界面的这个例子中，我们除了对数据包进行捕获之外，还使用了关键字“hid”对所捕获的数据包内容进行了过滤操作。所以现在在Ellisys公司的“蓝牙分析器”界面上显示的都是过滤后带有“hid”字段的“人机接口”数据包列表。在界面左边的列表中选中某个数据包，那么右边的窗口中则会显示出该数据包详细的各项细节，从中我们可以看到，这个数据包是未加密的“传统蓝牙”的数据包，对内容进行解码以后，我们知道了这个“人机接口设备”所表示的内容是按了一个键盘上的“s”键。

有了这些信息，我们可以确定这个蓝牙键盘当前处在“启动模式”，通过调查我们也发现，每次按键都会产生一个数据包，所以我们只要将所有从键盘上按键所组成的数据包进行重新组合，就可以知道该蓝牙键盘上所有的按键操作。当然上面的操作也包括一些像Shift键、Alt键等“状态辅助键”（modifier key）的状态。不过，Ellisys公司的“蓝牙资源管理器400”软件并不支持将这些单个的按键信息重组成一个容易由人来读取的可读格式。不过，如果我们将这些包含按键信息的数据包导出成文件，并通过一个Python下的工具，就可以还原这些按键信息。

在Ellisys公司的“蓝牙资源管理器400”软件上，单击“文件（File）|导出（Export）”菜单。然后在弹出的界面中，选择“蓝牙原始数据和有效载荷”（Bluetooth Raw Data And Payload）作为要导出的数据类型。下面采用导出向导的默认值，然后在最后一步，在“导出格式”（Export format）列表中选择导出为“CSV格式（用半角逗号数据分隔）”CSV（Comma Seperated Values）的格式，这时的“导出”向导界面如图9-20所示。

图9-20　“导出”向导界面

由图9-20也可以看出，所导出的文件位于作用的桌面上，文件名叫作：ellysis-keyboard.csv。使用这个导出好的CSV格式，我们可以使用btaptap程序提取并重组键盘的按键。这个btaptap程序是libbbtbb工具包中的一个程序。

注意

网站

上面的这个实例中，包含捕获数据包的导出文件ellysis-keyboard.csv，读者可以从本书的配套网站上下载，该文件的网址是http://www.hackingexposedwireless.com/files/09/ellysis-keyboard.csv 。

从btaptap程序的输出可以看出，由于数据没有加密，所以这个被攻击“蓝牙主机”上作为信息输入的键盘采用的是不安全的蓝牙键盘。（示例中被解码的这段内容摘录自Kevin Mitnick所著的《线上幽灵：世界头号黑客米特尼克自传》，该书在2011年由利特尔&布朗出版社出版）。由于作者可怜的打字技巧，所以在输入过程中，有很多错别字，以及对错别字的修改 [1] ，再加之在数据包的捕获过程中，数据漏捕（dropped packet）现象时有发生。不过，在被攻击的电脑主机大约40英尺 [2] 的距离，所捕获到的内容对于拿到可读的文字内容，已经足够了。如果这个时候，用户正在输出电子邮件，或者输入银行信息，或者是输入密码登录到某个系统中，那么这些通过键盘所按的按键也都会同样以这种方式显示出来。

削弱对传统蓝牙侦听的攻击

为了削弱来自“被动式蓝牙键盘侦听攻击”的威胁，很显然，就是避免使用“人机接口”的“启动模式”这一机制，因为这一机制上，蓝牙传输的是明文的数据包内容。取而代之的方法，是在“蓝牙主机”的蓝牙协议栈上，通过使用加密和认证选项进行数据通信，并将其应用于整个蓝牙“人机接口”规范的使用过程中。

在大多数蓝牙键盘用户指南的介绍文档中，鼓励用户避免使用简单的连接设置模式。因为现在大多数用户指南中，通常都是“按下蓝牙USB接口上的按钮，然后在键盘和鼠标上按下相似的按钮”，但这样做通常都会建立“启动模式”连接，导致蓝牙会话暴露在“被动式攻击”的威胁之下。这时，我们可以从客户机的操作系统上配置“蓝牙主机”系统，使用“传统蓝牙”的协议栈管理工具，使“蓝牙主机”提供对“人机接口”的支持。

加强传统蓝牙键盘的安全

尽管许多“传统蓝牙”键盘在“人机接口”模式下并没有使用加密措施，但是可以使用完整的“传统蓝牙键盘规范”（Bluetooth Classic Keyboard Profile）中的措施来加密所有通信的数据包，以此来防御侦听攻击。也就是说，对于我们来说，要坚持在“传统蓝牙”的“蓝牙主机”协议栈上支持“传统蓝牙”键盘，而不是仅仅使用“人机接口”模式。并且，在“传统蓝牙”设备上配置“蓝牙主机”协议栈时，要确保所有可用的加密选项都被选中，这样才能更好地防止攻击者捕获按键信息并记录、保护敏感数据不被泄露。

Fitbit低功耗蓝牙设备的侦听

Fitbit公司生产过一系列“低功耗蓝牙”的健身用的活动追踪设备（activity-tracking device），它们都深受消费者的欢迎，因为这些设备易用性很强，很容易集成到主流的移动设备和社会上的网络中。“Fitbit一号”是一款小巧的活动追踪设备，戴了一个小夹子形状的屏幕。通过这个屏幕可以显示用户走了多少步、走了多远的距离，爬楼梯爬了多少层，还有一些其他指标。默认情况下，“Fitbit一号”会将上述信息以“妙语连珠”（chatter）的形式推送到屏幕上供使用者查看，让用户感受到它功能“强大”，以便吸引更多用户参与健康运动的活动。该设备的实物如图9-21所示。

图9-21　“Fitbit一号”实物图

通过使用本章前面提到过的“低功耗蓝牙”嗅探技术，攻击者可以通过数据同步侦听这款Fitbit设备和接收器之间的数据包，这既包括移动设备蓝牙接口，也包括传统的Mac操作系统和Windows操作系统上的蓝牙设备接口。下面我们以前面提到过的得克萨斯仪器公司的“SmartRF数据包嗅探器”软件为例来说明，其过程是，在启动该数据包嗅探器软件后，单击主界面工具栏上的“播放”按钮就可以开始捕获操作。“SmartRF数据包嗅探器”会先在默认的“通告信道”（advertising channel）中开始捕获通告数据包，如前所述，默认的“通告信道”就是第37个信道，其频率是2.402 GHz。一旦“SmartRF数据包嗅探器”软件发现一个数据连接，就会马上开始与该“Fitbit一号”蓝牙设备一起同步跳频，进而在跳频的信道中捕获“Fitbit一号”的所有网络活动。

在某一个场景中，“Fitbit一号”的使用者将该设备配置为“自动与移动蓝牙设备同步”，攻击者启动“SmartRF数据包嗅探器”，等待“SmartRF数据包嗅探器”功率覆盖范围内其他蓝牙设备之间进行数据连接。很快，“SmartRF数据包嗅探器”就通过数据包捕获获得了“Fitbit一号”信道序号的变化，这时“SmartRF数据包嗅探器”软件的状态如图9-22所示。最后，当数据同步完成之后，移动设备终止了连接。完成了此次嗅探工作的“SmartRF数据包嗅探器”也会返回到默认的“通告信道”37信道，等待下一次嗅探工作。

图9-22　“SmartRF数据包嗅探器”显示从“Fitbit一号”上捕获的数据包

虽然“SmartRF数据包嗅探器”软件本身也提供一些解码能力，但Wireshark软件的协议分析功能远比它强大复杂得多，所以我们还是选择在Wireshark软件中进行分析。要在Wireshark软件中查看“SmartRF数据包嗅探器”软件所保存的数据包，又需要使用cibde2pcap工具，将“SmartRF数据包嗅探器”软件生成的psd文件格式转换为Wireshark软件识别的libpcap格式。其操作步骤如下所示。

在软件Wireshark中显示由cibde2pcap工具转换后的fitbit-sync.pcap文件，如果读者感兴趣，同样可以从本书的配套网站上下载到该软件后的文件。其网址为：http://www.hackingexposedwireless.com/files/09/fitbit-sync.pcap ，通过图9-22可以看出，该文件中有近6111个数据包。不过，这其中的绝大多数数据包都是我们没兴趣关注的垃圾数据包，对分析“Fitibt一号”活动没有意义，要从这里数据包中，挑选出我们感兴趣的数据包，最简单的方法当然还是使用Wireshark的显示过滤器，其过滤命令格式如下。

在上面这一行显示过滤器的命令中，所表示的意义是“删除其中的‘通告数据包'”（即“btle.advertising_header.pdu_type==0”）和“删除有效载荷为空的数据包”（即“btle.data_header.length==0”），言下之意，就是只留下“有实质内容且不是通告的数据包”。这一过滤很有效，数据包总数由原来的总共6000多条，迅速锐减为符合条件的130条，然后我们就可以快速检查剩余的130条。我们从检查中看出了我们感兴趣的内容：

·“Fitbit一号”的数据通信使用的是没有加密的“低功耗蓝牙”接口。在Fitbit的数据通信中，定期发送的同步消息都是不加密的，其数据包中所传的数据也都是明文的。

·在设备小屏幕上定时更新的“妙语连珠”提示信息。同步过程会定期地向“Fitbit一号”提供新的提示信息，如图9-23所示。

图9-23　Wireshark软件显示“Fitbit一号”的同步数据

·活动追踪计数器的显示也是明文。由“Fitbit一号”发出的跟踪活动的信息，会在“低功耗蓝牙”的通信中，以“提醒明文”（ATT messages）的方式显示，并且使用一个固定的“写命令名柄”，该名柄值一直都是0x000E。在一次作者亲身体验中，我们通过“SmartRF数据包嗅探器”显示从“Fitbit一号”上捕获的数据如下所示。

其实，除了知道上面的数据是某次数据包的有效载荷之外，具体到格式中的每一位，我也看不懂。尽管如此，其中的值“00：1b”所对应的正是作者漫不经心状态下所走的步数27（十六进制的0x001b对应于十进制格式27）。随后再走几步，分别查看该值，发现这个值所对应的正是我所走的步数。同样的方法，后来还可以发现其他每一个数据所对应的属性值，包括爬楼梯爬了多少层的值。

从威胁的角度来看，通过侦听并公示“Fitbit一号”的活动信息，这件事本身并不重要。然而，重要的是利用“纸功耗蓝牙”通信中的这种脆弱性，结合其他漏洞，再加上前面对“Polar FT-7健身心率监测器”设备的侦听攻击，让我们意识到，在上面这些蓝牙设备中，有一个令人不安的趋势，那就是对蓝牙通信的攻击。用户会越来越多地使用这类蓝牙通信的仪器搜集遥测信息，比如“运动和活动数据”（exercise and activity data）信息、食物摄入量（food intake）的信息、血压（blood pressure）信息、体重（weight）信息、体脂肪测量（body fat measurement）信息、体温（body temperature）信息等，所以，采集设备越多，被攻击者侦听的机会越大。一个计步器中每次锻练时所走的步数被攻击者侦听似乎微不足道，连威胁都算不上，但如果我们有关于活动和健康的信息被攻击者侦听就会有很多终端用户关注了。那么如果有个人隐私被攻击者侦听呢？其结果就不言而喻了。

对Fitbit设备被侦听的防御措施

从Fitbit设备被侦听攻击上来看，要想减少此类风险的发生，用户可以禁用Fitbit应用的“全天候同步”（All-Day Sync）功能，图9-24显示的是Apple公司的iOS系统下禁用此功能的界面截图，在Android类操作系统中，也有类似的功能。禁用了该功能以后，Fitbit用户就只能手动地控制应用程序，让“Fitbit一号”向移动设备的应用程序，或者是向Fitbit的“云服务器”（cloud server）发送活动统计信息。除此之外，也可以让应用程序自己选择一个时间要求“Fitbit一号”发送，比如在家或在另一个地点才对“Fitbit一号”进行同步操作。这样做的原因，其实就是让蓝牙用户可以减少一些让攻击者侦听的机会，即使我们身处攻击者的信号覆盖范围内，攻击者也会因为侦听不到自己蓝牙设备的连接操作，而无从知晓我们在做什么。

图9-24　Apple iOS系统下禁用“全天候同步”功能的界面

[1] 在上例中，凡是方括号“[]”括起来的内容，表示的是作者按了某个功能键，而不是实际的输入内容。比如前4个“[Reture]”表示先有4个回车，“*[Backspace]”表示先输入一个“*”，发现输入错了，又按了“回退键”（Backspace）后删除。——译者注

[2] 40英尺约为12.19米，这对于蓝牙来说，通常的蓝牙键盘传输距离约为10～15米。所以这个距离属于可用，但数据不稳定的距离。——译者注

9.4　本章小结

在这一章中，我们研究了几种不同的技术，通过这些技术，攻击者可以通过使用数据包嗅探技术的方式，侦听蓝牙网络通信数据包。商业攻击工具和开源攻击工具，都为作为攻击方的最终用户提供了不少不同的有效功能。

对于“传统蓝牙”设备来说，开源超牙项目允许攻击者捕获“基本速率蓝牙”的活动，但它缺乏支持捕获“增强数据速率蓝牙”活动连接的支持。而作为商业攻击工具，“前线测试设备”和Ellisys公司的“蓝牙资源管理器400”则克服这一局限，可以对蓝牙设备的连接进行攻击，但这两个设备都存在因价格过高而导致装备成本太大的缺点。

对于“低功耗蓝牙”的设备，超牙项目通过一款名为ubertooth-btle的工具，以及低成本的得克萨斯仪器公司的“SmartRF数据包嗅探器”工具，可以识别一个网络连接的建立过程，并且利用收集到的信息，实现与发射方和接收方同步信道跳频。此外，ubertooth-btle工具可以使用“混杂模式”来确定信道跳频和数据包捕获所需的网络特性，即使在两个蓝牙设备已经建立连接之后的“微微网”蓝牙通信网络。

最后，我们研究了使用蓝牙侦听手段攻击蓝牙网络的技术，通过这个技术，可以攻击“传统蓝牙”设备和“低功耗蓝牙”设备。在下一章中，我们还会继续介绍以这些技术为基础，针对蓝牙网络的攻击和使用。

第10章　攻击和使用蓝牙

许多机构通常都不会太重视蓝牙设备所具有的安全威胁。他们宁愿花费大量的精力，通过“漏洞评估”（vulnerability assessment）、“渗透测试”（penetration test）或者“道德入侵约定”（ethical hacking engagement）来部署和加固Wi-Fi无线网络，但是在蓝牙网络的安全上却置若罔闻，很少有所作为。

至于为什么几乎没有机构愿意花费资源来评估他们蓝牙网络上的威胁，其中的原因是他们有这样一个普遍的风险意识的误区：“我们漠视蓝牙安全是因为蓝牙网络根本就不会威胁到我们的重要财产。”即使有机构意识到了蓝牙所带来的威胁，也很少有人具备蓝牙软硬件开发方面的技能，以及专业知识来成功地进行蓝牙渗透测试，或者由在道德约定的前提下，对指定的蓝牙设备进行入侵测试。

在本章中，我们会消除人们对于“蓝牙技术不会带来威胁”的误解，给予读者攻击蓝牙网络所需要的指导和专业知识。我们也会通过几个针对蓝牙网络不同的攻击方式，来测试和验证出在蓝牙网络中，既有某个蓝牙设备在设计实现时存在漏洞，还有在蓝牙规范的设计中存在漏洞，在老掉牙、即将淘汰的蓝牙产品中存在漏洞，在新兴的、刚设计出不久的蓝牙产品中也存在漏洞，包括最新的Apple iBeacon产品。读完本章后，我们会体验很多在本章中使用过的攻击工具，你也可以应用这些技术成功地攻击某一个蓝牙网络，识别和暴露出蓝牙技术中存在的风险，同样也可以成功地进行一次渗透测试。

10.1　蓝牙网络中的“个人身份码”攻击

传统的蓝牙 [1] 设备，主要是指“蓝牙规范2.1版”以前的各版蓝牙设备，以及使用“安全简化配对”（Secure Simple Pairing，SSP）协议的蓝牙设备。这些传统的蓝牙设备仅仅依赖于“个人身份码”（Personal Identification Number，PIN）的有效性作为唯一的认证规则，只要通信双方的蓝牙设备使用了相同的“个人身份码”，就认为通过认证，否则就认为没有通过认证。“个人身份码”只是一个由1位到16位数字组成的一个号码。在很多产品中，“个人身份码”都是在产品生产的时候，直接由产品静态定义的，终端用户也无法修改。在“安全简化配对”的蓝牙设备中，主要是指“基本速率蓝牙”和“增强数据速率蓝牙”，而二者在本书中统称为“传统蓝牙”，并且，这两种蓝牙设备都支持多种认证方式，主要有如下几种。

·“数字比较”认证（Numeric Comparison）　在两个蓝牙设备上显示一个六位数字，提示用户判断两个数字是否相同，相同就选“配对”（Yes），否则就选“不配对”（No）。

·“只比较不确认”认证（Just Works）　尽管这种认证方式同“数字比较”的认证方式使用了相同的认证策略，但这种方式下并不提醒用户来验证这两个六位数字是否相同。

·“密码输入”认证（Passkey Entry）　在特殊场景下的认证方式，该场景中，一方设备有一个显示器，而另一方有一个数字输入键盘。这时，有显示器的一方会在显示器上显示一串六位数字，然后要求用户通过另一方设备的键盘上输入所看到的这个六位数字来进行验证。

·“带外认证”OOB认证（Out of Band）　“带外认证”OOB认证利用第三方的技术交换“认证数据和派生的密钥”，这种第三方技术如：近场通信（Near Field Communication，NFC）。

“传统蓝牙”中，基于“安全简化配对”功能的设备通常使用“数值比较”认证方式、“只比较不确认”认证方式，或者是“密码输入”认证方式。无论是哪种认证方式，都使用“Diffie-Hellman椭圆曲线密钥”（Elliptic Curve Diffie-Hellman，ECDH）算法加密通信的数据，以便防御侦听攻击。此外，“数值比较”认证方式和“密码输入”认证方式都对防御“中间人的畸形数据”（MitM）攻击提供了保护措施，而“只比较不确认”认证方式并不能对防御“中间人的畸形数据”攻击提供保护；“带外认证”认证是否对防御“中间人的畸形数据”攻击提供保护，则取决于所选用的第三方的“带外认证”协议是否对于被动式侦听和“中间人的畸形数据”攻击提供防御措施。

随着“低功耗蓝牙”的引入，“蓝牙技术联盟”（Bluetooth Special Interest Group，SIG）简化了对设备认证的支持，其目的是为了降低“蓝牙控制器”（Bluetooth controller）的成本，并将“从设备”的复杂度降到最低。“低功耗蓝牙”设备上仍然还保留有“数值比较”“只比较不确认”和“带外认证”等认证方式，但“密码输入”认证方式在“低功耗蓝牙”上并不支持“安全简化配对”功能。虽然“低功耗蓝牙”支持上面多种认证方式，但是在“低功耗蓝牙”设备上，由于不再支持“Diffie-Hellman椭圆曲线密钥”加密算法，所以缺乏对被动式侦听攻击的防御保护措施。

从实际开发的角度来看，蓝牙“安全简化配对”SSP功能是难以利用。在蓝牙“安全简化配对”SSP功能处理过程中，被动式侦听也不能获得足够的信息可以发起一次还原“派生的加密主键”（derived encryption key）的攻击，很显然，这个“主键”正是数据可以解密的最关键元素。

尽管使用“Diffie-Hellman椭圆曲线密钥”加密算法，但蓝牙“安全简化配对”功能已在几个实例中证明，该功能是容易受到“中间人的畸形数据”的攻击的，主要是当攻击者可以干扰2.4GHz频谱，使原来处于活动状态的一对蓝牙设备不得不重新配对（re-pairing），加之在“只比较不确认”认证方式中，配对方式是“哑状态”（dumb down）下进行的，所以“中间人的畸形数据”就可以通过强制双方蓝牙设备使用“只比较不确认”认证方式静悄悄地完成攻击，有时，这种合二为一的攻击也称为“BT-NINO-MITM攻击”。虽然这种攻击方式被几个学术论文证明肯定是存在的，但到目前为止，还没有公开的、实际的工具是可以直接拿来使用的。

尽管存在这样的限制，仍然有基于蓝牙数据包捕获的公开、可访问的攻击工具，可以用来攻击“传统蓝牙”和“低功耗蓝牙”设备上的数据交换。这里所说的数据包捕获，主要是指超牙设备的数据包捕获功能。

10.1.1　传统蓝牙中的个人身份码攻击

正如在第7章中所看到的一样，两个设备可以通过配对，派生出来的一个128位的连接密钥（128-bit link key）。该密钥用在认证中，用于识别“呼叫设备”（claimant device）和加密所有通信的数据。这个“配对交换”（pairing exchange）只能在“传统蓝牙”中通过一个“个人身份码”值进行保护。

两个“传统蓝牙”设备之间的配对过程存在一个点的重大的漏洞，那就是攻击者在观察整个配对交换过程的前提下，可以加载一个离线的、针对“个人身份码”选择的暴力攻击。在配对过程完成后，后续的连接可以使用之前保存的128位的连接密钥用于认证和密钥派生。这种技术在当前对于攻击来说是有点不切实际的。

为了破解“个人身份码”的信息，攻击者必须首先单独地还原如下信息：

·“发起随机数” IN_RAND，由“发起方”（initiator）向“响应方”（responder）发送。

·两个“COMB_KEY值” ，“发起方”和“响应方”都会发送。

·“认证随机数” AU_RAND，由“认证呼叫方”（auchentication claimant）发送

·“签署响应” SRES（Signed Response），由“验证确认方”（authenticaLion verifier）发送

注意

在这里我们使用术语“发起方”和“响应方”，主要是想表明这是两个完全独立的“实体”（entity），其中一方发起了一“配对交换”，而另外一方对“发起方”进行了响应。在大多数情况下，从“配对”的角度来看，“主设备”是“发起方”，“从设备”是“响应方”，但是这个不是绝对的。“从设备”也有可能发起“配对交换”，“主设备”对此作出响应。

由于“传统蓝牙”的认证机制属于是“相互身份验证”（mutual-authentication），也就是说“从设备”的身份由“主设备”进行认证，反之亦然，所以攻击者有两次机会识别“发起随机数”值和“签署响应”值。这时的攻击者主要的精力全部放在完成认证的操作上，对于“配对交互”本身，攻击者反而不必关注太多，势在必得的重要数据是“主设备”或者“从设备”的“蓝牙设备地址”。此外，攻击者既要知道“从设备”的“蓝牙设备地址”，也要知道“主设备”的“蓝牙设备地址”，因为这两个地址“配对交换”的过程中并不会进行无线传送，所以只能通过上面“相互身份验证”过程中，捕获“发起随机数”值和“签署响应”值。

注意

要想加载一个针对“个人身份码”的暴力攻击，攻击者需要有完整的“蓝牙设备地址”。只知道“低位地址部分”和“高位地址部分”是不够的，还需要指定正确的“非必要地址部分”。

使用BTCrack攻击“个人身份码”

BTCrack是一款Windows操作系统中的蓝牙“个人身份码”PIN破解工具，工具的开发者是Thierry Zoller。有关这款工具的详细介绍及下载地址的网页链接是：http://blog.zoller.lu/2009/02/btcrack-11-final-version-fpga-support.html 。这款工具非常容易使用，尽管在对每项攻击技术进行打分的时候，我们在“难易度”上只给了它一个相对较低的分数（即上面的“3”分），但是通过捕获“配对”数据，进而对“个人身份码”进行破解依然是一个挑战性的问题。

要使用BTCrack软件，首先要进行“配对交换”数据包的捕获。在这一点上，可选的工具非常多，超牙系统、Wireshark软件、“前线蓝牙协议分析器600通信探测”设备、Ellisys公司的“蓝牙资源管理器400”，都可以在两个通信的蓝牙设备之间捕获“配对交换”数据包，并从中识别出“发起随机数”、两个“COMB_KEY值”、“认证随机数”、“签署响应”等值，一旦这些字段的值被捕获到或计算出，随后就可以确定“个人身份码”的最大长度，通过这个值，BTCrack软件就可以发起一起还原“个人身份码”的攻击了。对于BTCrack程序来说，上面的操作只需要单击“破解”（Crack）按钮即可，随后Crack程序就会通过暴力破解的方式对“个人身份码”进行破解，直到最终破解成功，拿到“个人身份码”的值；或者将字典中，所有可能的“个人身份码”全部用完，仍然没有正确的“个人身份码”，这时就意味着破解失败。

注意

BTCrack程序允许你指定一个程序所要破解的最大“个人身份码”长度，无论什么情况下，最大的“个人身份码”长度值只能达到16个字符的长度。但实际使用中几乎没有什么人会设置这样的长度，因为大量蓝牙产品，在基于“个人身份码”的认证中，通常都只使用4位长的数字“个人身份码”值。

提示

BTCrack的图形用户界面GUI在实施“个人身份码”攻击的时候，会让用户感觉反应很迟钝，有时会在某个“个人身份码”破解的时候，程序看上去像“卡死”在那里。

但这只是程序界面响应上没有处理好，程序还是会继续运行，并最终完成破解工作。

在BTCrack程序的界面上，就像你从程序的输出看到的一样，在成功地破解“个人身份码”值之后，BTCrack程序会显示出正确的“个人身份码”值，同时，作为攻击的一部分，程序还会将128位的“连接密钥”（link key）一同显示出来。同时，如果BTCrack程序破解成功，界面上还会显示出破解密钥所花费的总时间；如果BTCrack程序破解失败，那界面上显示的就是将密码字典中所有可能的“个人身份码”值都用完所花费的总时间。此外，在程序底部的状态栏上还会显示每秒破解的“个人身份码”的数量。在图10-1的这次攻击实例中，作者的2.7GHz主频的i7-2620M系统，每秒进行了大约50万次“个人身份码”破解。

图10-1　BTStack攻击实例

使用BTCrack OSS攻击“个人身份码”

BTCrack OSS是BTCrack引擎的开源版本，程序剥离的图形用户界面，而改用命令行程序，该程序是由Eric Sesterhen和Thierry Zoller共同开发，并由Mike Ryan进行了改进以实现跨平台使用（cross-platform use）。BTCrack OSS工具最常用于Linux操作系统和其他UNIX的变体系统。在Windows版的BTCrack程序中，还增加了一个小的性能方面的改进，并且这个针对Windows所做的改进版，其源代码也可以到Linux操作系统下编译运行，并正常使用。

就像前面提到的BTCrack软件，你必须先识别出“发起随机数”、两个“COMB_KEY值”、“认证随机数”、“签署响应”等值，以及“主设备”的“蓝牙设备地址”和“从设备”的“蓝牙设备地址”，才能进行随后的破解工作。其中命令行中的“#threads”参数所表示的是程序所用“线程”（thread）的数量，主要是告诉BTCrack OSS程序同时使用多个CPU内核来加速破解的进程；要想获得最好的破解效果，可以指定一个比你系统中CPU数量大“1”的一个值作为“线程”的数量。

在BTCrack OSS软件的输出结果中，各项字段数据的排列顺序很古怪，因为数据结果的输出顺序，与我们在进行破解操作时按时序流程“数据先发送再接收”的自然顺序不一样。举例来说，就是你在指定顺序的时候必须按“主设备认证随机数”、“从设备认证随机数”、“主设备签署响应”、“从设备签署响应”的顺序，而不是按实际破解过程中，原本的“主设备认证随机数”、“从设备签署响应”、“从设备认证随机数”、“主设备签署响应”的顺序。在本例中，我们使用下面的“配对交换”数据值作为BTCrack OSS软件还原“个人身份码”的参数，其中的“顺序”字段（Order）是按使用该字段出现的先后顺序排列，所有参数如下所示：

注意

其实，BTCrack OSS程序奇特的参数输入顺序有时会造成一定的误解，表面看，这些参数使用信息表明，在这些字段顺序中，“主设备”总要是放在第一位的，即“主设备”总是先发起“配对交换”，然后“从设备”对其响应。然而，事实上，“从设备”也可以发起“配对交换”，在这种情况下，所有“从设备”和“主设备”的数据将会发生互换。如果真的是这样，“从设备”首先发起了“配对交换”，那么只需要在使用BTCrack OSS程序的时候，将本来应该给“从设备”的参数，替换成“主设备”的，反之亦然，对于本来应该给“主设备”的参数，现在替换成“从设备”即可。

如果你按BTCrack OSS程序所要求的顺序指定了配对数据，那么就可以获得你想要的结果，如下所示：

为个人信息码PIN破解提供蓝牙设备地址信息

尽管从“配对交换”过程捕获到的数据包中，我们能够获得大部分用来攻击“个人身份码”选择的数据，但是攻击者还是需要手工提供完整的“蓝牙设备地址”信息。如果参与“配对”的蓝牙设备处于“可发现的”模式（discoverable mode），那么通过hcitool工具的扫描，就可以从扫描结果中轻易地找到这些地址信息。但如果两个设备中的一个或两个都配置为“非可发现的”模式（non-discoverable mode）下，那么问题就变得麻烦了。

幸运的是，在连接建立过程中，捕获到的数据包可以帮助我们在“跳频同步”（Frequency Hop Synchronization，FHS）数据包内获得“蓝牙设备地址”信息。如果是在连接建立之前，这些数据包所包含的是“主设备”的“蓝牙设备地址”，同样，如果“主设备”和“从设备”交换角色的话，那么泄漏的就是“从设备”的“蓝牙设备地址”了。使用超牙工具，可以对“基本速率蓝牙”的数据包进行解码输出，我们从“跳频同步”数据包中，通过拼接“非必要地址部分”、“高位地址部分”和“低位地址部分”三部分的数据获得“蓝牙设备地址”。

防止个人身份码被攻击的措施

蓝牙自身存在的漏洞导致了“个人身份码”遭到攻击，同时这也是开发“安全简化配对”（Secure Simple Pairing，SSP）认证机制的主要动机之一。如果可能的话，用户应该尽可能地使用“安全简化配对”来取代传统“个人身份码”认证，这样做主要是在”配对交换”过程中，削弱针对“个人身份码”认证的攻击。

通常情况下，用户在蓝牙产品的“配对”机制上，并没有选择的余地。考虑到黑客在使用BTCrack和BTCrack OSS这样的工具进行攻击的时候，他需要捕获蓝牙设备之间的“配对交换”，所以要避免在这段时间内受到攻击，用户应当尽量选择在攻击者无法实现侦听的区域内再进行配对过程。换句话说，用户不要在商店、购物中心或者其他公众场合内进行蓝牙的配对过程。

另外，如果必须使用这一机制，那么用户应在设置“个人身份码”值的时候，选择使用最大的长度，也就是16位长度的“个人身份码”。这对于愿意花足够时间进行破解攻击的黑客来说虽然无效，但是，这个足够大的“个人身份码”熵值会大大增加黑客在没有密码的情况下加速破解该资源的困难程度。

10.1.2　低功耗蓝牙中的个人身份码攻击

“低功耗蓝牙”的“配对”很容易遭到脱机“临时密钥”（Temporary Key，TK）攻击，该攻击主要针对“低功耗蓝牙”中的“只比较不确认”和“密码输入”这两种“配对”认证方式。攻击者在两个设备之间通过捕获“配对交换”，可以还原“临时密钥”，然后由该值派生出“长期密钥”（Long Term Key，LTK），“长期密钥”用于加密随后“低功耗蓝牙”的数据交换。

通过Crackle工具破解低功耗蓝牙

Crackle程序是一款“低功耗蓝牙”的“临时密钥”破解和数据包解密工具，是由Mike Ryan编写。该程序的设计初衷，是能对libpcap格式的数据包捕获文件进行分析和解密，至于这个格式的数据包，可以是通过超牙或其他兼容的工具进行捕获的。Crackle程序可以用直接的方式，对“低功耗蓝牙”中“只比较不确认”和“密码输入”这两种“配对”认证方式中的“临时密钥”TK进行还原。

要在系统中安装的Crackle程序，需要从GitHub库中检查代码，然后编译和安装Crackle程序，步骤如下所示：

如果运行crackle命令的时候，没有附带参数，那么将会显示Crackle程序的使用信息：

要还原“临时密钥”，所捕获的数据包，必须包括整个“配对”过程；任何“配对交换”部分的缺失（比如说因为一个CRC校验错误而导致的系统将一个或一些数据包直接扔掉），都会将阻止攻击者还原“临时密钥”。一个通过Crackle程序对“临时密钥”TK成功的还原过程如下所：

在这个例子中，“临时密钥”TK的值被成功地还原出来，为“000000”，这是一个在“只比较不确认”认证方式中也使用的一个公共值。你可以有选择地使用Crackle程序解密捕获到的数据包，也可以指定一个文件名，将其捕获的数据包输出到一个文件中。

当一个数据包的捕获通过Crackle软件进行解密的时候，Crackle软件也会显示“长期密钥”。这个值在即使蓝牙设备远成“配对交换”的情况下，也可以用来解密“低能耗蓝牙”的通信数据包。

在上面这个例子中，第一次尝试使用Crackle软件还原“临时密钥”是失败的，失败的原因是在“配对交换”过程中缺少必要的数据包。然而因为我们在前面的步骤中，已经捕获到“长期密钥”，所以我们可以在命令行程序中通过“-l”（小写字母L）参数指定这个“长期密钥”，然后再破解这些数据。

作为一个攻击工具，Crackle程序是简单而有效的，但是只能在“配对交换”已经捕获到的前提下，或者是“长期密钥”已经被破解的前提下，才有效。这个条件制约了该产品对于“低功耗蓝牙”的攻击效果，因为“配对”过程通常只发生在蓝牙设备初始化的时候，同时，不是每次设备在加电开启的时候，或者连接到另一个蓝牙外设的时候，黑客都能事先等在旁边架好了设备，不断侦听，随时等着“配对”的出现。

防止临时密码被攻击的措施

既然“低功耗蓝牙”的“配对交换”容易招来“临时密钥”猜测攻击（TK guessing attack），那么用户应该只在黑客无法从事侦听攻击的场所进行“配对交换”的操作。比如在工作单位、在自己家里，对于极端要求安全的情况下，甚至可以考虑在一个“法拉第笼”（Faraday cage）里进行。反过来，不合适的场所，当然就是那些咖啡店、Verizon无线商店，和其他黑客可以以合理的角色很方便参加的活动场所，在这些地方，都是不鼓励进行蓝牙“配对交换”的。

10.1.3　实用的个人信息码配对破解

如同前面看到的那样，如果攻击者能够对“配对交换”进行捕获，那么对“个人识别码”进行破解，或是对“低功耗蓝牙”的“临时密钥“TK进行就简单的多了。然而，这个威胁只是短暂的，一旦设备“配对”成功之后，就不再使用“配对”策略了，因而对于这种基于“配对”的攻击方式下，蓝牙通信的漏洞就不存在了。

从机会主义攻击者的角度来看，我们经常会看到人们在公共场合进行蓝牙“配对”操作，如购物中心的美食广场，以及咖啡店。在笔者所在的城镇中，当地的星巴克咖啡店就在AT&T移动设备商店的旁边，所以经常有消费者走进咖啡店，一边喝着咖啡，一边拆掉产品的包装，将新买的手机同蓝牙耳机进行“配对”。

如果你正在攻击一个已经完成“配对”操作的“微微网”，那么，还有一种其他的方法能够迫使设备进行“重新配对”（re-pair）。有关这种攻击，第一次以论文方式发表是在Yaniv Shaked和Avishai Wool共同发表的论文《破解蓝牙个人识别码PIN》（Cracking the Bluetooth PIN）中，该论文的全文可以从网址http://www.eng.tau.ac.il/~yash/shaked-wool-mobisys05 上看到。对于攻击者，可以使用“重新配对攻击”（re-pairing attack），操纵事先保存好的两个设备之间的配对状态冒充两个蓝牙通信设备中的一个或两个“蓝牙设备地址”。

重新配对攻击

在“重新配对攻击”中，攻击者先假定“微微网”中一个或两个蓝牙设备的“蓝牙设备地址”。一旦他假设的地址同被攻击的目标蓝牙地址相匹配，那么攻击者就会尝试与这个目标蓝牙设备进行连接。这个连接理所当然会失败，因为攻击者并不知道初始时的“配对交换”中使用的“连接密钥”（link key）。连接失败之后，许多蓝牙设备会因为有攻击者的新的“蓝牙设备地址”而废弃掉之前所保存的“连接密钥”，并认为远程蓝牙设备上肯定也会删除这个“连接密钥”。对于不同的蓝牙设备，略有不同的是“传统蓝牙”设备使用的是“连接密钥”，而“低功耗蓝牙”设备使用的则是“长期密钥”。然而，这时对方的合法蓝牙设备并不知道这些，于是当这个合法蓝牙设备与被攻击蓝牙设备的再次尝试连接的时候，被攻击蓝牙设备上，之前与合法蓝牙设备所共同创建的“连接密钥”就不再有效了，最终导致当前的连接失败，然后双方的蓝牙设备都会提示各自的用户重新进行“配对”，而这一机制，正好为攻击者创造了一次捕获“配对交换”的机会。

要加载一个成功的“重新配对攻击”，那么攻击者老板娘同时获取到如下几个值。

·基于CSR芯片的蓝牙接口　不是所有的蓝牙无线设备都可以改变自己的“蓝牙设备地址”，但是基于CSR [2] 芯片的无线蓝牙设备却通过Linux操作系统下的bdaddr工具普遍支持这一功能。所以，实施这种攻击，我们需要有一个基于CSR芯片的蓝牙接口。

·之前配对的“主设备”的“蓝牙设备地址” 　攻击者必须知道之前“配对”成功的那个“主设备”的“蓝牙设备地址”。这个“蓝牙设备地址”也正是攻击者在对被攻击蓝牙设备进行连接时所要冒充的“蓝牙设备地址”。

·被攻击设备的“蓝牙设备地址” 　攻击者必须知道要攻击设备的“蓝牙设备地址”，在攻击中，这个设备处于“从设备”的位置。攻击者需要使用“主设备”的“蓝牙设备地址”攻击被攻击者，强迫其“重新配对”。

·蓝牙数据包的捕获　攻击者必须能够捕获到随后的“配对交换”数据包。捕获数据包的工具可以使用第9章中介绍的超牙设备，或者是其他商业蓝牙侦听设备。

·在物理距离上接近被攻击设备，并且可以建立连接　攻击者必须能够发起一个连接到被攻击设备上，才能发起“重新配对攻击”方式。也就是说，攻击者的蓝牙设备，要在物理距离上离被攻击的蓝牙设备很近，近到双方可以建立一个连接的距离之间，“重新配对攻击”才有实施的可行性。

标准Linux操作系统上，并没有能够冒充“蓝牙设备地址”功能的工具。而要完成这种攻击，就得从第三方工具中查找，比如，我们可以使用bdaddr工具。bdaddr程序是由Marcel Holtmann编写的，这个人也是Linux操作系统上BlueZ程序的作者。目前这个程序已被作者多次修改，解决了软件中的多个bug。如果要手工下载和从源代码的级别上创建应用程序，其步骤显示如下。

使用bdaddr工具以及标准Linux上的hcitool工具，我们将加载一个“重新配对攻击”。第一步，我们开启数据包的捕获，然后使用被攻击设备的“蓝牙设备地址”作为目标地址，并在随后与该设备同步进行跳频操作，这些操作的实现细节，请参阅第9章。接下来，改变我们本地的基于CSR芯片的蓝牙接口，将其原来的“蓝牙设备地址”改成“主设备”的“蓝牙设备地址”，而“主设备”的“蓝牙设备地址”则可以从本攻击之间，侦听到的“主设备”与“从设备”的“配对”通信中计算出来并保存的。最后一步，我们通过领先的“蓝牙设备地址”创建一个到被攻击设备上的连接，以便使用hcitool工具强制发起“重新配对攻击”。在这个例子中，我们伪造的“蓝牙设备地址”是00：00：33：E4：f2：80，这是作者Pebble牌智能蓝牙手表的“蓝牙设备地址”，要攻击的蓝牙设备是作者的商标为Nexus 7的Android操作系统平板电脑，其“蓝牙设备地址”是d8：50：e6：31：49：4b。

在攻击者连接到Android平板电脑之后，就尝试通过协议协商支持加密的通信，这个协议协商必然会因为地址错误而导致“连接密钥”失败的事件，更重要的是Android设备会在随后废弃以前的密钥数据，并且拒绝Pebble手表设备使用以前建立的密钥值进行随后的数据通信。当这个被攻击的设备确认到对方设备不会再连接后，就会启动“重新配对”的连接，重新生成密钥。而这样做，对于攻击者来说，是正中下怀的事，因为攻击者正好可以趁着这个设备“重新配”的时候进行侦听。所以对于这时的Pebble手表来说，它的“重新配对”将自己暴露了在了侦听者的圈套里。侦听者在捕获到“重新配对”过程之后，就可以发动针对“个人身份码”和“临时密钥”的还原攻击。

要将攻击者的蓝牙加密狗返回到原始的“蓝牙设备地址”BD_ADDR配置，我们可以使用Linux下bccmd工具中的coldreset命令实现，其操作步骤如下。

重新配对攻击的防御措施

假设收到一个请求，该请求看上去“很像”（seemingly）以前的“配对”设备，但是没有“连接密钥”，该怎么办？幸运的是，不是所有的蓝牙设备都会在收到这样一个请求时废弃当前的连接，这一机制，对于抵御“重新配对攻击”来说，无疑是一个好的作用，因为它限制了你的设备暴露在这种攻击的危害性。如果攻击者的攻击是成功的，那么用户就会被迫同设备进行“重新配对”，并重要创建一个窗口，在该窗口中，重新输入“个人身份码”的值或的值。

我们建议用户只在那些没有潜在安全威胁的场所输入他们的“个人身份码”PIN。比如说，如果在公众场合，或者黑客会议上，你的蓝牙设备突然提示你去输入“个人身份码”PIN值，那么我们的最佳建议是立即停止使用蓝牙功能，直到返回那些不会受到蓝牙侦听攻击的地方，再重新启动该功能，进行蓝牙数据通信。

通常情况下，在“杀机四伏”的场所，比如黑客大会上，禁用蓝牙功能是一个明智的选择。不过，一个非常普遍，且有点令人不安的现象是：我们常看到有黑客大会的参与者手拿移动设备，它的移动设备甚至被设置为“可发现的”模式。请记住，这相当于向一满屋的黑客发出“攻击我吧”的请柬！

[1] Legacy Bluetooth，注意这与“传统蓝牙”不完全等价！──译者注

[2] CSR首先是一个公司名，即英桥无线电子贸易有限公司（Cambridge Silicon Radio），但在这里，更多的是指该公司生产的一种同名无线蓝牙芯片。——译者注

10.2　伪造设备的身份

蓝牙设备采用多种身份机制向外界传达本设备的各项信息，比如“设备功能”（capability）、“服务分类”（service classification）、“设备地址”（address）以及“友好名称”（friendly name）。根据想要攻击设备所处的目标环境，你可能会发现修改攻击系统的身份对于攻击目标是非常有帮助的。

10.2.1　蓝牙服务类别和设备类别

每个蓝牙接口都是用一个“服务类别标识符”（service class identifier）和“设备类别标识符”（device class identifier）来表示，分别被称为“服务类型”（Class of Service）字段和“设备类型”（Class of Device）字段，二者总共有24位，如图10-2所示。“服务类型”信息是一个11位的字段，它通常表示蓝牙设备上运行的服务，可以分成多种类别，包括定位设备（位置识别）、渲染设备（打印机、扬声器）、采集设备（光学扫描仪、麦克风）等。

图10-2　蓝牙设备的“服务类型”字段和 “设备类型”字段

“设备类”信息又可以分为两个子字段，它们分别是“主要设备类型”（major class）和“次要设备类型”（minor class）。“主要类型”字段定义了10种不同的设备类型，如表10-1所示。

表10-1　“主要设备类型”的类型

“次要设备类型”字段表示是给定的“主要设备类型”设备之下，再进行的二级细分。比如说，当主要类是“电话类型”（“主要设备类型”的值为0x02）时，根据“次要设备类型”字段就可以区分到底是移动电话（“次要设备类型”的值为0x01）、无绳电话（“次要设备类型”的值为0x02）、智能电话（“次要设备类型”的值为0x03）或者是有线调制解调器（“次要设备类型”的值为0x04）。

通常情况下，“服务类型”、“主要设备类型”和“次要设备类型”字段对于一个具体的设备来说都是一成不变，但是一个例外的设备类型，就是“网络接入点”（即“主要设备类型”是0x03），当“主要设备类型”是0x03时，“次要设备类型”经常会动态地变化，变化的原因是因为其使用率的变化。比如，现在“次要设备类型”为蓝牙网络链接的，有1%~17%的使用率将“次要设备类型”归为0x01，而另外83%~99%的“次要设备类型”使用0x06。

有关蓝牙的“服务类型”、“主要设备类型”、“次要设备类型”的完整列表都有文档化的资料。可以在“蓝牙技术联盟”SIG公布的《蓝牙编号分配-基带》（Bluetooth Assigned Numbers-Baseband）文档中查到。这份文档原本形成于蓝牙的早期版本的规范中，但是为方便能更频繁地维护升级，这份技术文档被移动到了bluetooth.org网站上。现在的网址是http://www.bluetooth.com/en-us/specification/assigned-numbers/baseband 。

在“服务类型”字段和“设备类型”字段的最后两位是“格式类型”（format type）字段，主要用于表示版本标识符。当前这个数值都为“00”，但是“蓝牙技术联盟”需要其他字段来区分更多的设备，就会在重新定义以后，修改这里的版本标识符，所以这个字段在未来也可能是其他的值。

第7章中，我们介绍并通过实例检验了许多蓝牙侦听类的扫描器，通过这些扫描工具，对每一个扫描到的设备，都可以获得设备的“服务类型”和“设备类型”信息。在Linux操作系统的命令行下，我们可以扫描“可发现的”模式下的“基本速率蓝牙”和“增强数据速率蓝牙”蓝牙设备，并且读取它们的“服务类型”和“设备类型”信息。完成读取命令，是通过hcitool命令完成的，命令格式如下：

在上面输出的结果中，这个设备的“蓝牙设备地址”为00：1B：63：5D：56：6C，并且它的“服务类型”和“设备类型”字段是0x3a010c。我们可以将这个值转换成二进制形式，然后依次检查每个独立的字段，从而获取“服务类型”和“设备类型”信息，对应的信息如下所示：

0x3a010c=001110100000000100001100

服务类型　00111010000　设置了音频，对象传输，采集和网络

主要设备类型　00001（0x01）　主要类型是电脑

次要设备类型　000011（0x03）　次要类别是笔记本电脑

格式类型　00　目前一直为00

我们可以通过使用btclassify工具自动对类型信息进行解码，该程序由Mike Ryan编写。该命令的使用格式如下所示：

一旦知道了“设备类别”和“服务类型”字段的意义，就可以识别对方是什么设备，也可以使用这样的信息来伪装作为攻击者的“设备类型”，以便迷惑被攻击者。

修改服务类型和设备类型信息

正如在本章的前面部分所看到的，许多设备使用“服务类型”和“设备类别”信息来区分蓝牙设备的功能。许多蓝牙设备对与自己连接的蓝牙设备类型还是比较“挑剔”的，如果对方的“服务类型”和“设备类型”信息与自己所要求的类型不匹配的话，这些蓝牙设备会拒绝远端设备的连接请求，或者会显示本地设备不存在的信息给对方。

举例来说，iPhone手机的蓝牙功能非常“挑剔”，除了蓝牙音频设备或蓝牙耳机之外，其他的外围蓝牙设备统统不予支持。也就是说，iPhone手机的蓝牙模块通常会忽略那些“设备类型”和“服务类型”的设定与“音频类型”和“耳机类型”不匹配的外围蓝牙设备的连接，而只会支持那些“设备类型”和“服务类型”的设定与“音频类型”和“耳机类型”相匹配的外围蓝牙设备的连接。

在Linux操作系统上，我们可以使用hciconfig命令检查本地的蓝牙设备的类型信息，如下所示：

幸运的是，hciconfig也同样能够对“服务类型”和“设备类型”信息进行解码，在上面的例子中，我们可以看到这个蓝牙设备的配置的“服务类型”是“网络服务”（即上面的输出结果中的“Networking”），它的“主要设备类型”是“计算机”（即上面的输出结果中的“Computer”），“次要设备类型”是“笔记本电脑”（即上面的输出结果中的“Laptop”）。

在root权限下，我们可以修改“服务类型”和“设备类型”信息，然后伪装系统的身份，变成我们想要的效果。举例来说，我们将“服务类型”和“设备类型”信息修改为Oxf00704，根据上面的定义，这时我们的系统的“主要设备类型”为“可穿戴的设备”（wearable device），“次要设备类型”为“腕表”（wristwatch）。

通过修改“服务类型”和“设备类型”信息，当该设备出现在iPhone的蓝牙设备扫描结果的时候，其扫描实例如图10-3所示。从中可以看到，设备的名称“NotReallyAWatch”是在上一步操作中定义的。由于该设备的类型不是iPhone设备的蓝牙能接受的类型，所以iPhone拒绝了该设备的连接。

图10-3　扫描结果

对修改服务类型和设备类型信息攻击的防御措施

不幸的是，对任何一个特定的蓝牙设备，在蓝牙规范中并没有使用任何机制来约束“服务类型”和“设备类型”信息要怎么写，必须怎么写。这就意味着攻击者只要将设备类型设置为“其他任何蓝牙设备类型”，就可以任意配置或修改自己系统中的蓝牙设备信息。正常情况下，这个缺点并不一定代表是个多大的问题，最多只能算是个bug，因为“设备类型”的值本身也只是仅供参考。不过，如果你的系统涉及安全类的信息，比如设备远程类信息验证，那么，你应该认识到，攻击者可以冒充任何装置，规避过滤机制，对你发出连接的请求，所以一个较为安全的办法就是向iPhone手机学习，在设计蓝牙连接的时候，只接受特定“设备类型”的连接。

10.3　蓝牙规范的滥用

许多有关蓝牙设备在软硬件实现中的漏洞识别和报告，其成因实际上都是蓝牙规范本身在设计实现上存在的漏洞。比如，在第7章中，我们曾看到有各种各样蓝牙“服务发现”类的工具。通过这些工具，可以读取蓝牙设备上的所有服务，以及指定服务以后，可以读取该服务的详细信息。以其中BlueZ开发包中的sdptool程序为例，该工具可以浏览目标蓝牙设备上的服务，也可以在明确地指明某个服务后，向目标蓝牙设备发出请求服务信息，然后借助于读取到的目标蓝牙设备服务信息，我们可以发现，这些服务都是各自为政，独立地使用系统的安全控制参数，而这些服务中，经常会有某个服务会为攻击者提供未授权的访问权限。

在蓝牙设备上，有些服务通常会要求身份认证或者数据加密，比如耳机规范，或者蓝牙免提规范中要求用户的通信必须进行数据加密，并且通信前必须经过认证，这本身当然是好事。但是蓝牙设备的开发者除了遵守上面的约定之外，为了自己的需要，会加入一些其他的规范，这些新增的规范却需要更低的安全性要求。比如，如果要通过“对象交换规范”（Object Exchange Profile，OBEX）接收一个由远端蓝牙设备上以“推送”（Push）的方式发来的名片（business card），这看起来应该是一个在安全方面平淡无奇的服务。这个服务不需要远端蓝牙设备在本地进行的认证，所以使用凡是能最大程度地保证了信息共享的简便性的协议就可以。这时，设计者往往会从其他服务中进行选择，比如“文件传输规范”（File Transfer Profile，FTP）成为首选，并且为了简易性，蓝牙的设计者在使用这个协议的时候可能也不要求简单验证，并且在蓝牙接收方发现并扫描文件内容之前，还会选择将所有要传输的文件暂时存放在一个他自己认为是已“隔离”的目录中。

针对上述情况，一旦用户通过工具发现这些“虽然不是蓝牙规范设计上，而是蓝牙规范使用上”的漏洞，攻击者就可以绕过那些在蓝牙设备上精心配制的安全措施，在目标设备设置触发“拒绝服务”（Denial of Service，DoS）的条件，然后在要攻击的目标系统上执行任意命令。尽管历史上，蓝牙规范中存在着不少漏洞，但是由于移动手机的快速发展，这些漏洞的寿命越来越短暂，因此，在下面的内容中，我们不会讲解那些已经被修补的漏洞，因为它们在最新的设备中几乎已经不存在了，相反，在接下来的内容中，我们会将关注点转向利用已知或者从前没有公开的漏洞，配合以恰当的工具对重要数据进行枚举（enumeration data）的方式，对目标蓝牙设备实施入侵。

10.3.1　测试连接访问

要想进入某个蓝牙系统，并对其进行评估，我们面临的第一个障碍是判断是否可以在“逻辑链路控制及适配协议”层上同远程蓝牙设备建立一个连接。如果在“逻辑链路控制及适配协议”的访问被对方所拒绝，那么你就不要想获得更高一层的协议上的各项功能了。

对于一个给定的目标，创建一个到远程系统的连接，就可以通过“主机控制接口协议”层的嗅探工具hcidump命令查看一个连接状态。hcidump工具通常是一个对Linux操作系统发行单独的工具包，但是，它也是Linux操作系统上BlueZ开发包的一个组件。在基于Debian的系统中，可以安装hcidump工具，其命令格式如下所示：

一旦hcidump程序安装完毕，我们就可以检查在本地蓝牙接口和远程蓝牙设备之间，“主机控制接口协议”层以及更高层之间的连接性。运行不使用任何参数的hcidump命令，工具就开始收集和显示hci0接口上的信息。hci0接口是该命令在默认情况下的选择，如果你想改变这个默认值，让命令检测其他hci端口上的值，则需要使用“-i”参数，并在后面跟上要改变的端口值，就可以指定显示其他的接口上的信息。另外，如果再在命令行后附加上“-t”参数，我们还能够在结果中增加显示读取时的“时间戳”（timestamp）信息，命令的格式及实例效果如下所示：

再打开一个窗口，并在新的这个窗口中运行hcitool命令，并附带一个“cc”参数。该参数的作用是指定的是远端设备的“蓝牙设备地址”。这是创建一个与所指定这个目标蓝牙设备之间的连接。

回到前面的hcidump命令所在的窗口中，你会看到程序尝试连接的状态。在这个例子中，通过hcitool命令所建立的连接是成功的，因为本地设备执行了“主机控制接口协议”的“Create Connection”命令，这表示这两个蓝牙设备之间的连接会话支持这两个蓝牙设备之间建立这个层次的连接特性。另外，这里的改变后的“传送时隙”（transmission slot）的个数也可以设置为默认值，以便将来使用，通过该值可以查询远端设备的“友好名称”（friendly name）信息。在整个命令序列的最后，程序终止了会话。

提示

在hcidump命令的结果中，“小于号”和“大于号”表示的是“主机控制接口协议”层数据通信数据包的流向。从“高堆栈层”（upper-stack layer）流向低堆栈层（lower-stack layer）的时候，就用“小于号”（即实例中的“<”）；从“低堆栈层”流向高堆栈层的时候，就用“大于号”（即实例中的“>”）。另外，这些符号除了表明数据在本地设备上协议栈之间的流向之外，也同时表明了数据在本地蓝牙设备和远端蓝牙设备之间的流向，通常情况下，“小于号”表示数据通信数据包从本地蓝牙设备流向远端蓝牙设备，“大于号”表示从远端蓝牙设备返回到本地蓝牙设备。不过，在某些情况下也有例如，比如“命令”状态（即实例中部分“Commmand”）中，数据是直接由“主机控制接口协议”层本身而来，而不是从远程蓝牙设备发送而来的。

下面显示的是一个在连接尝试中失败的例子。由于在命令行中添加了显示详细信息的“-V”参数，所以该命令在之后返回的结果中，以尽可能详细的格式显示所接收命令的状态。

在上面的例子中，你可以看到远端蓝牙设备拒绝了我们尝试连接的请求，返回的原因代码是“无法接受的‘蓝牙设备地址’所导致的拒绝连接。”（即实例中最后一行的“Error：Connection Rejected due to Unacceptable BD_ADDR”）。这样的结果表明远端蓝牙设备使用了“蓝牙设备地址”过滤措施，这为攻击者同远端蓝牙设备进行连接多设置了一道障碍。

注意

如果我们知道拒绝连接设备所在“微微网”的“主设备”蓝牙地址，那么可以使用BlueZ测试工具集中的bdaddr工具来伪装成授权设备，从而绕过这个限制。

一旦同目标蓝牙设备建立了一个基本的“逻辑链路控制及适配协议”连接，我们就可以继续攻击远端设备上可用的服务了。

10.3.2　未授权访问个人局域网

蓝牙“个人局域网”（Personal Area Networking，PAN）的规范被设计为一个或多个设备之间创建ad-hoc网络连接 [1] 。如果再与“蓝牙网络封装规范”（Bluetooth Network Encapsulation Profile，BNEP [2] ）组合，那么使用蓝牙通信的设备可以通过蓝牙接口模拟出一个以太网络，无缝地（seamlessly）通过蓝牙的网络介质传输以太网格式的数据帧。通过“个人局域网”和“蓝牙网络封装规范”，两个设备可以使用任何上层协议交换数据，就像IP堆栈的分层结构一样，只是将IP堆栈的最低层换成了蓝牙“个人局域网”。“个人局域网”的规范会在以下两种情况下用到。

对于蓝牙“个人局域网”来说，第一种部署是在“网络接入点”（Network Access Point，NAP）服务中，在这种情况下，既然是作为接入点服务，那么这时的蓝牙设备所担当的角色往往是负责访问授权控制的设备形式，桥接器（bridge）、路由器（router）或者代理服务器（proxy），蓝牙设备传输的一端是蓝牙“微微网”，另一端是一个上游网络（upstream network），如一个以太网的局域网LAN。在这种情况下，蓝牙“个人局域网”规范的外在表现形式，就不一定非得是我们想象的蓝牙设备的模样了。比如这时的这个蓝牙设备从外表看上去，完全可以是一个Wi-Fi的AP接入点装置，但其内部运行的仍然是蓝牙“个人局域网”的规范，只是将蓝牙作为了无线通信的介质而已。

对于蓝牙“个人局域网”的第二种部署是在“组间ad-hoc无线自组网络”（Group Ad-hoc Network，GN）服务中，用于“微微网”中两个或者多个无线蓝牙设备之间创建“点对点”（point-to-point）的连接。这种使用案例和IEEE 802.11 ad-hoc网络配置很相似。“组间ad-hoc无线自组网络”服务和“网络接入点”在部署时的选项上有很大的差别，“组间ad-hoc无线自组网络”服务允许“微微网”中横向的“主设备”参与到与其他设备的数据交换中，而“网络接入点”服务只是负责在纵向的“上游设备”（upstream device）和“下游设备”（downstream device）之间转发数据帧。

许多蓝牙设备都支持通过“网络接入点”和“组间ad-hoc无线自组网络”这两个协议来使用蓝牙介质为上层的协议堆栈服务。其中，“网络接入点”服务通常用在向上游网络提供授权和提供资源，比如我们通过笔记本电脑上的蓝牙接口与手机的蓝牙接口连接后，就可以借助于手机建立“全球移动通信系统”模式的网络连接，使得笔记本电脑达到上网的目的。由于“组间ad-hoc无线自组网络”服务和“网络接入点”服务很相似，所以“组间ad-hoc无线自组网络”服务也支持ad-hoc文件共享，或者其他“短时网络服务”（short-term networking service）。尽管默认情况下这两种服务都处于关闭状态，但是在OS X操作系统的10.4版本和之后版本的设备中都提供这两种服务，一旦开启之后，我们就可以通过标准“服务发现协议”扫描发现它们，其格式和效果如下所示，不过，由于篇幅考虑，所以对本例中一些紧密度不大的内容进行了删减：

从攻击者角度来说，“网络接入点”服务为攻击者提供了一个机会，通过这个机会攻击者可以跨越目标蓝牙设备访问在蓝牙设备另一侧的网络资源。由于另一侧的网络资源可以是蓝牙资源，也可以不是蓝牙资源，所以这意味着，攻击者还可能利用蓝牙连接通过以太网或者IP网络攻击其他主机。对于“组间ad-hoc无线自组网络”协议，攻击者的兴趣就相对弱一些了。因为尽管这时攻击者发现某个蓝牙设备上也存在漏洞的话，也可以对这个目标设备可以枚举出它的服务，以及使用这个蓝牙设备，但归根结点，这时的攻击者也只能攻击目标设备本身而已。

“蓝牙技术联盟”的规范文档中，对于“个人局域网”规定了一个高强度的安全措施，那就是在“个人局域网”中应该应用“网络接入点”服务和“组间ad-hoc无线自组网络”服务，并且还要包括“连接管理器协议”认证和加密。同时还包括高层的认证选项，比如IEEE 802.1X也不例外。不过，尽管有这些建议，最终并不是所有的“个人局域网”都实现了这些所需要的认证方式，也不是所有的“个人局域网”都在访问的时候建立了加密的密钥值。

Blekin F8T030是一个使用蓝牙作为其无线传输介质的“网络接入点”，当然也是遵照“网络接入点”服务规范运行的。默认情况下，F8T030设备并不会尝试认证或对连接进行加密，而只是“桥接”到一个本地的以太网接口上。同时，它也会在设备的“友好名称”中泄露网络IP地址信息，如下所示：

我们可以使用BlueZ开发包中的pand工具，将Linux操作系统的蓝牙接口连接到蓝牙AP接入点上：

在这个例子中，我们通过“modprobe bnep”命令，装载了基于“蓝牙网络封装协议”的Linux内核模块，然后我们又运行了pand命令，并通过“-c”参数指定目标蓝牙的“蓝牙设备地址”，然后通过“-n”参数在进程中延时（delay）等待一会儿，直到连接建立成功后将其变成后台守护进程。pand进程对自身进行通告广播，并在数秒后识别出一个新的接口bnep0已经被创建好。这时我们使用ifconfig命令将这个接口设置为“开放”（up）状态。

注意

作为一个可以取代bnep命令的命令行工具，Blueman程序可以提供一个图形界面。通过Blueman程序，可以建立“个人局域网”连接。如果你对该工具感兴趣，可以检查一下你的Linux发行包，看该版Linux操作系统是否提供了安装Blueman的程序包，如果没有，可以从网站https://github.ocm/blueman-project/blueman Blueman获取（这是Blueman开发网站的网址）。

一旦我们创建好bnep0接口，下面就可以通过Belkin F8T030拥有一个以太网网桥，通过这个网桥可以连接到位于Belkin F8T030后面的有线网络。在本例中，我们可以运行tcpdump工具，跟踪IPv6和IPv4在网络中的广播通信数据包在网络上的传送。或者，我们也可以在局域网上，为bnep0接口手工配置一个IP地址，或者使用“动态主机配置协议”客户端自动请求一个动态的IP地址，其步骤如下所示：

当你想要关闭pand命令所创建的接口时，可以在再次运行pand工具时，指定“-K”参数来结束所有的pand连接：

注意

关于使用pand工具，获得更多的调试信息，你可以通过“/var/log/syslog file：tail–f/var/log/syslog”命令进行查看。

一旦我们通过个“个人局域网”规范获得对局域网LAN的访问，那么就可以访问那些存在漏洞的网络设备，尽管数据传送的速率很低，就好像不存在蓝牙设备，而是直接与那个局域网建立了物理连接一样。

恶意的蓝牙网络

Belkin F8T030蓝牙AP接入点不太可能成为目标网络中的“弱点短板”（stumble）。依作者的经验来看，比起蓝牙接入点来说，笔记本、台式电脑和手机等蓝牙设备，更有可能被黑客发现正在运行“个人局域网”服务而视为弱点攻击对象。然而，类似Blekin接入点这样的设备，虽然不会成为“弱点短板”，但却完全有可能会出现在另一种无线攻击手段中：恶意的“骗子”接入点。

恶意的“骗子”接入点其实就是一个“骗子”无线设备，它被“放置”到要攻击的某个目标机构的网络中，其目的就是借助于这个“骗子”接入点，使攻击者能够从“安全的距离” [3] 访问该网络。上面所说的“放置”接入点，对于攻击者来说，可以有多种途径：突破对方物理安全设备的保护，然后安装一个接入点，比如将接入点偷偷部署在大厅的某个隐蔽的角落中；欺骗业务不精的员工（less tech-savvy staff）让他们在不知情或被误解的情况下帮你部署接入点；或者买通那些意在报复雇主的内鬼，让他们操刀完成部署。

越来越多的机构开始使用“无线入侵检测系统”（Wireless Intrusion Detection System，WIDS），其目的就是在他们的设备中监控无线设备的活动。对于黑客来说，要逃避对方的检测，在对方的目标网络中部署一个属于自己的恶意的“骗子”接入点，变得比以前更加困难了。然而幸运的是，对于黑客来说，现在基于IEEE 802.11的“无线入侵检测系统”目前并不太适合鉴别蓝牙无线设备的本质特点。因而如果能成功部署一个基于蓝牙的“骗子”接入点到目标网络中，相对于基于Wi-Fi的“骗子”接入点要容易很多。

如果攻击者想要在一个使用了“无线入侵检测系统”的目标机构中部署一个恶意的“骗子”接入点，那么他只需要简单地将蓝牙代替Wi-Fi作为传输机制就可以了。只是通过微小的硬件改动，或者商用适配器，Belkin的接入点就可以转变成一个恶意的“骗子”接入点，甚至，这款设备可以通过“以太网加电”（Power over Ethernet，PoE）端口通过网络远程开机。更进一步来讲，F8T030的电路板非常小，它足以隐藏在任何“看似无害”（innocuous-looking）的设备中，比如烟雾探测器（smoke detector），或者其他环境监测设备，增加了攻击者躲避检测的可能性。

10.3.3　对文件传输的攻击

另一种蓝牙设备通信中常见的服务，是向远端蓝牙设备传输文件。有两种蓝牙规范支持文件传输功能，可以在多种使用场合。

第一种支持文件传输功能的蓝牙规范，叫作“对象推送规范”（Objecc Push Profile，OPP），“对象推送规范”使用“对象交换”（Object Exchange，OBEX）协议进行有限的文件传输操作。“对象交换”为“对象推送规范”所用，主要用于在“对象交换”客户端和服务端之间建立和中止会话。同时也会保存和读取文件，中止进程中的文件传输。“对象推送规范”并没有实现列出远端蓝牙设备上的文件系统的功能，所以要想获取一个文件，必须是基于事先就知道要获取的文件名，而获取文件名又只能借助于其他第三方的协议，因此客户端通过“对象推送规范”读取服务端上的文件这一应用使用不多。相反，使用这个规范实现的简单的文件交换方式是客户端主动通过“推送”（push）的方式将一个本地文件传送到蓝牙通信远端的服务端，或者通过“电子名片”（VCards [4] ）规范进行单向（unidireccional）或者双向（bidirectional）的联系信息的交换。

第二种支持文件传输功能的蓝牙规范就是“文件传输规范”（File Transfer Profile，FTP [5] ）了。与“对象推送规范”简单地交换模式相反，“文件传输规范”具有更多访问远端文件系统的功能，比如允许用户浏览、传送和修改远端文件系统上的文件。它还允许用户在远端文件系统上导航式浏览，以及创建新目录，尽管这些功能在“文件传输规范”中并没有明确地要求做到，但这些功能在实现蓝牙文件传输的时候通常都会实现。“文件传输规范”同样允许用户在远端蓝牙设备上创建一个新的空文件，或者将一个已经存在的文件由一个蓝牙系统传送到另一个系统上，删除任意的文件或者目录。同时，“文件传输规范”也实现了通过蓝牙网络实现“远程文件系统管理”（remote filesystem management）的功能，如果再与一个具有导航的用户界面（User Interface，UI）组合使用，那么用户就能够在远程蓝牙系统上（当然也包括在本地蓝牙系统上）识别已存在的文件和目录，快速地浏览和导航了。

可以通过“服务发现协议”中服务枚举的方式，确认在某个远端蓝牙设备上，“对象推送规范”或“文件传输规范”这两个服务是否存在，操作步骤和显示实例如下所示（同样由于篇幅原因，对实例结果进行了删减）。

在这次输出结果中，有三个文件传输服务得到确认。第一个是“文件传输规范”的服务（即实例中的“FTP”），之后是两个“文件推送规范”服务。第一个“文件推送规范”（即实例中的“Phonebook Access PSE”）用于指定电话簿的访问权限，通过“文件推送规范”可以授权或拒绝用户访问目标设备上的电话簿记录。第二个“文件推送规范”服务（即实例中的“OBEX Object Push”）用来授权对远端目标蓝牙设备上文件系统的普通访问权限。

从安全角度来说，“文件推送规范”服务通常会由多个子服务组成，而每一个子服务又都有独立的安全等级。比如，在上面通过“服务发现协议”的服务枚举扫描结果中，这里的“文件推送规范”服务就是由“Phonebook Access PSE”和“OBEX Object Push”两个子服务组成，并且这两个服务具有不同的安全策略。第一个“Phonebook Access PSE”服务用来接收新的电话簿记录，或者允许远端设备下载现在已有记录，所以安全级别较高，而第二个“OBEX Object Push”服务的用途是实现标准的文件系统访问，所以安全级别相对较低。另外，蓝牙设备也会使用“文件推送规范”服务实现名片的传送，并且为了简化信息交换的过程，蓝牙系统会设定这个服务为不需要进行验证的权限。通常情况下，一旦这些协议可以在不需要进行认证的条件下使用的时候，这些存在规范或服务中因访问权限而出现的漏洞被黑客所攻击的重要性和可能性也加强了。

无论是在“文件推送规范”中，还是在“文件传输规范”中，还有另一层安全措施可以用来限制远端设备能够访问的本地文件系统的位置。比如，对于“文件推送规范”，每个服务都在目标文件系统上配置了一个独立的目录，这个目录主要用于存储传入的文件，并在接到文件请求的时候，将这个文件输出。有时，我们会看到一个名为“蓝牙文件目录”（Bluetooth Files Folder），这个目录就是为了和其他文件系统目录区分开来，告诉用户这个目录中的文件都是服务所创建和自用的。对于“文件传输规范”，管理员会指定一份目录列表，列表之中的目录都可以被远程FTP客户端进行访问，但是不在列表中的目录则会拒绝FTP远程客户端的访问。

在过去的几年时间里，大量的漏洞被黑客识别和使用，有很多都是“文件推送规范”和“文件传输规范”这两个服务在实现时，因为权限问题而导致的，这使得黑客从远端设备上访问要攻击的这个设备时，不需要访问权限，因而就可以无限制地访问本地文件系统。这些被黑客发现和执行的漏洞技术，对于理解现代蓝牙技术，实现现代蓝牙服务是很有价值的。

文件传输目录的遍历漏洞

迄今为止，多种蓝牙协议栈都被爆出会遭受“目录递归攻击”（directory recursion attack）。在“目录递归攻击”中，黑客会在目标设备系统的文件名前加上“目录递归字符” [6] （“..\”）。如果目标蓝牙协议栈对传输的文件名中目录部分的权限不进行验证的话，那么通过“目录递归字符”的多重组合，攻击者就可以通过多级组合，在目标文件系统的任意目录中存储文件。举例来说，假设某蓝牙设备的存在目录是“C：\My Documents\Bluetooth Files”，在这个目录下，蓝牙设备可以将所有的文件合法地存储在这个目录，以及这个目录下的子目录中，而一旦攻击者指定要保存的文件名是“..\..\Windows\Startup\Pwned.exe”，那么存在漏洞的蓝牙协议栈就会不经路径审核地将Pwned.exe文件写入到“C：\Windows\Startup”目录下，后者目录很显然不在“C：\My Documents\Bluetooth Files”目录中，因而跳出了受限制的蓝牙文件目录，对于该用户来说，这很显然是非法操作。

“目录递归攻击”曾经出现在Widcomm、Toshiba、Bluesoleil、Affix和多种移动设备的蓝牙接口上。它们之间的漏洞细节都很类似，基本都出现在“文件推送规范”和“文件传输规范”中。

我们可以使用ussp-push工具，使用“目录递归漏洞”攻击“文件推送规范”。第一步，我们需要选择要上传到目标系统上的黑客工具。比如最常用的rootkit后门程序，或其他系统的后门程序，还可以是用来修改系统获取访问权限的shell执行脚本。下一步，我们指定要使用文件的名称，确定它的执行目录，将文件传输到目标系统上，这个文件必须是个可执行文件，并且是原有蓝牙系统中存在的可执行文件，这样做的原因是，上述操作会将我们自己的黑客工具以文件覆盖的方式取代该蓝牙原有的可执行文件，并且为了避免蓝牙系统瘫痪或崩溃，该文件应该是系统启动时，肯定会用到但不是蓝牙系统是最重要，最常用的文件。在下例中，文件名是acrd32up.exe。比较常见的攻击方法是将上述黑客工具上传到C：\Windows\Startup目录下，这样当系统启动时，我们的代码就会得到执行，如下所示：

尽管没有执行成功的回显，ussp-push程序已经成功地把pwned.exe文件传送到了目标系统上，将它写入“C：\windows\startup”目录中，新的文件名是acrd32up.exe（起这样一个中性无害的名字，很显然是伪装文件原来的企图）。需要额外说明的是，“反斜杠”（即字符“\”）在UNIX/Linux操作系统的shell中表示“转义字符”（meta-character），也就是说在一个命令串中遇到“反斜杠”时，并不将其作为一个单独的单符，而要与后面的字符一起当成一个特殊的字符，比如“\n”表示回车，但如果确实要表示“反斜杠”本身时，则要用两个“反斜杠”，也就是说字符串中每一个“\\”表示一个字符“\”，其中前一个“\”是转义字符，后一个是要转义的字符，所以在上面表示路径的地方，我们需要输入每连续的一组“\\”，表示一个“\”，以避免Linux操作系统的shell误将“\”以其后面的字符相结合，产生不是我们想要的结果。

提示

如果你不知道当前目录所在层次，怎么办？其实，任何一个操作系统在目录切换的过程中都有“容错”机制，比如当你已经处于根目录下，再要“退出该目录，返回到上一级目录”的时候，系统仍然还是回到根目录。鉴于此，如果你不知道当前需要从多少层的子目录中退到根目录，可以在上面“目录递归”攻击命令中，任意指定要返回的层数，这并不会产生什么负面结果。也就是说，如果你不知道需要递归的路径的具体层数，可以指定一个大于或等于实际层数的适当数量值，就可以确保在构造文件目录时到达整个文件目录的根目录处。体现在shell的命令中，就是上面命令中“\\windows”之前，加足够多的“..\\”，总能找到根目录。

尽管在“文件推送规范”中，“目录递归”漏洞是一个巨大的威胁，然而在“文件传输规范”中，问题更严重，因为这里的“目录递归”漏洞会暴露目标文件系统的内容。在“文件推送规范”中，“目录递归”漏洞允许攻击者向目标系统的任意目录上传文件。而在“文件传输规范”中，攻击者可以利用这个漏洞列出目标文件系统上的所有目录和文件，上传任意文件并且能够获取任意的文件内容。总之，无论是“文件推送规范”服务，还是“文件传输规范”服务，二者中存在的“目录递归”漏洞最终都会被用来攻击蓝牙设备主机，只是对于攻击者来说，要想获取目标设备上敏感资源，“文件传输规范”中的漏洞更容易利用。

在Linux操作系统上，我们可以使用obexftp工具攻击有漏洞的“文件传输规范”服务，其操作步骤及效果如下所示：

然后使用“-g”参数，我们可以通过指定文件名的方式获取到该文件。

最后，我们还可以使用“-p”参数将我们文件上传到目标设备上，以及通过“-c”参数指定将这个文件复制到的目标目录路径，如下所示：

文件传输规范中目录递归攻击的缓解措施

要想成功地运行文件传输“目录递归”攻击，攻击者首先要知道目标设备的“蓝牙设备地址”，并且，如果目标设备使用认证时，他必须对该蓝牙设备具有对应服务的访问权限。当然，最重要的是，目标设备上还必须存在“目录递归”漏洞。要对抗这种攻击，我们可以采取的最佳措施就是将设备配置在“非可发现的”模式，这可以作为初级防御的措施。如果设备要求所有的输入连接都需要进行认证的话，提醒你的用户拒绝接受不请自来的蓝牙连接，留心之前没有见到过的系统提示信息，这可以作为中级防御的措施。最后，如果可能的话，及时给蓝牙协议栈打上最新的补丁，通过开发商来积极修补漏洞。

[1] ad-hoc的解释详见“1.1.1节”。──译者注

[2] BNEP同时是两个协议的简称，一个是“蓝牙网络交换协议”（Bluetooth Necwork Exchange Protocol），主要集中在本书的9.1.2节的内容中，另一个是本处“蓝牙网络封装规范”（Bluetooth Network Encapsulation Prof ile），遍布全书多处。——译者注

[3] 从信号的角度来说，距离目的网络越近，信号越稳定，越安全，但这里的“安全的距离”很显然指的不是这个意思，反而是指能够进行正常通信的范围内，距离目标网络越远，或越隐蔽，对于黑客来说越安全。——译者注

[4] vCard即“电子名片规范”，主要用于公开的个人数据交换。规范主要定义电子名片的格式。该格式即可以直接用于数据交换的格式，也可以作为电子邮件的附件方式进行数据交换。——译者注

[5] 看到蓝牙“文件传输规范”，很容易想像到互联网上的“文件传输协议”，二者名称近似，功能也近似，并且同样都既是协议名称，也是服务名称。不过“文件传输协议”只进行文件传输；而“文件传输规范”除进行文件传输之外，还具有远程修改等功能。——译者注

[6] 在很多操作系统中，约定“\”表示根目录，“.\”表示当前目录，“..\”表示当前目录的上一级目录，并且“..\”可以组合使用，如“..\..\”表示当前目录的上两级目录。另外，由于网络上分隔目录的符号是“/”，所以有些系统除了支持上面格式名，还兼容地用“/”表示根目录，“./”表示当前目录，“../”表示当前目录的上一级目录。——译者注

10.4　攻击Apple公司iBeacon通信模块

正如你在第8章中所看到的，Apple公司的iBeacon技术使用“低功耗蓝牙”的“通告信道”（advertising channel）向外发送一个独一无二的ID值（identifier），其他设备也正是通过这个ID值唯一识别标识这个无线蓝牙设备。这个ID值就是“通用唯一标识符”（UUID），代表的是一个商业机构或特定公司的编号。iBeacon所发送的“通告信道”信息中，除了上面的“通用唯一标识符”之外，还包括两个额外的值，其中一个叫“主ID”（Major ID），主要用于识别一个个体商店，或者是一个相对较小的地理区域内的一个“iBeacon发送器”（iBeacon transmitter）的集合。另外一个叫“次ID”（Minor ID），主要是用于识别一个独立的“iBeacon发送器”。每一个“iBeacon发送器”均发送自己的“通告”信息到那些同在这个“iBeacon发送器”信号功率范围内的所有监听设备上，发送的频率为每秒多次，并且发送的“通告”中，都以明文的方式包含“通用唯一标识符”、“主ID”、“次ID”这3个值。一个机构或公司建立这样的一个iBeacon设备的目的是要在这个基础上开发一些应用程序。较以前的应用程序，这里的应用很特殊，那就是实现你在室内的定位，其原理是：当进入这个iBeacon的区域内，你的无线蓝牙设备必然会与该区域内的无线蓝牙数据进行通信，这里的通信不一定是数据交换的通信，大多数还是由iBeacon设备发出的“通告”信息，和自己的蓝牙设备对iBeacon设备的回复信息。借助于通信形成的“微微网”，iBeacon设备可以读取你和它之间的“信号强度”（signal strength），通过信号强调就可以估算出一个你的无线蓝牙设备和他之间的距离数据，而借助于这个距离数据，iBeacon设备就可以对你的蓝牙设备进行定位。有了定位，就可以与iBeacon设备达成互动，那就是iBeacon设备可以有针对地向你发送通告信息、“不同地方不同应用”（location-aware）类信息，以及其他“到特定位置才发”（location-specific）的信息。

注意

在这一节中，我们研究一个常见的部署场景，虽然这些场景中的攻击方式也可以适用于Android 4.3及以后版本的设备上，但至少在这里，我们是专为Apple公司的iBeacon技术而设计的。因为iBeacon是Apple公司的注册商标，所以看上去，这似乎只是Apple公司的产品上存在，但在Android设备上，如果这些技术是由Radius网络提供第三方Beacon开发库开发，那么这些技术同样会被支持。有关Radius网络提供第三方Beacon开发库方面的资料，可在http://developer.radiusnetwordks.com/ibeancom/android 网上查找。

10.4.1　iBeacon部署实例

首先我们从一个例子开始，有一个虚构的零售商店，我们称为Bourne。它是一家美国连锁百货店，销售各式各样的货品，从服装到易腐食品。作为一个营销计划的一部分，Bourne为用户开发了一个基于Apple产品的iOS应用，提供主要商店库存的查询服务、当地商店确切位置的方位指向服务和营业时间服务，并在自己的店内提供“不同地方不同应用”服务，比如交互式存储地图指导和电子优惠券打折物品推荐等功能。

为了允许iOS应用程序能够在该连锁商店的内部识别出顾客的位置，Bourne店内已经事先部署了大量的iBeacon传感器，遍布于整个商店各处，并且在特别促销物品的位置，部署了更大密度的传感器区域，所有Bourne店内的传感器都共用同一个“通用唯一标识符”，各蓝牙设备都可以通过这个标识，将iBeacon发射器识别为Bourne的商店设备。其中“通用唯一标识符”本身的查询，可以通过Mac的OS X操作系统中的uuidgen工具来完成，其命令如下：

通过对整个商店内“通用唯一标识符”的使用，Bourne移动应用程序的开发者将程序的逻辑设定为：任何时候，当有一个顾客进入Bourne商店范围之内的时候，由于该商店使用的是“Apple核心定位框架”（Apple Core Location Framework），所以这个顾客的手机就会注册一个iOS应用，通过该应用就会收到一个提醒消息（alert）。这个“Apple核心定位框架”是用Objective-C编程语言开发的，其部分核心代码如下：

在上面这段代码中，Bourne的“通用唯一标识符”被用来分配给一个NSUUID对象，这个对象然后被用于分配了一个属于beacon的区域。下一步，Apple的“定位管理器”（location manager）开始监测带有特定“通用唯一标识符”的iBeacon设备。当一个顾客的iOS设备进入到Bourne的商店，关联到Bourne“通用唯一标识符”的通告就会通过应用程序发出，这个应用程序在此之前通过注册获得了通告的控制权力，发出的通告信息会在进入顾客的移动iOS设备之后，向用户设备上发出一个锁屏式提醒信息（lock-screen alert），伴随着提醒信息的显示，还会有通告类事件的发生，比如会有一个提示音的提醒，或者是一个震动提醒。

每个Bourne商店都通过iBeacon的“主ID”，有一个唯一标识，这个“主ID”是由国家统一规定的。而“次ID”标识则只是在这个商店中的iBeacon发射器的唯一标识，通过“次ID”只能具体到一个店铺边墙、过道或其他特定的区域。对于一个特定iBeacon发射器的“通用唯一标识符”、“主ID”、“次ID”，三个值组合起来，就表示商店里某一个具体的位置，有了这个位置，就可以对症下药地向在这个位置的顾客发送他可能要用的位置通告、优惠券、其他店内营销内容。基于Bourne的动态营销和业务优先级，用户的无线手机终端上还可能会显示出一些各种销售或其他服务的信息，店家通过这些鼓励买家购买其特色商品。

Bourne的移动应用程序之所以可以获取顾客在店内的位置信息，主要是通过基于iOS操作系统中收到的通知获取的。当一个iBeacon发射器发出的“通用唯一标识符”被店内遍布于某位置的无线设备接收到的时候，这个无线设备的移动应用程序会收到一个背景状态的通知，该通知显示那个使用某“通用唯一标识符”的顾客正在距离自己在0.5~30米的位置。按照iOS的iBeacon公约，应用程序并不识别客户移动设备的准确距离，而只是粗略地将距离识别为“很远”（far）、“附近”（near）或“紧贴”（immediate），其判断标准就是距离发射器的大致距离，如图10-4所示。

图10-4　iBeacon通知中的距离分类

先考虑一种情况，Bourne最近已经采购一种新的男装运动外套系列。以前的产品系列在商店卖得很好，但需要清理库存以便让出空间给新的系列。这时如果一个用户的iOS设备运行的移动应用程序检测到自己在Bourne老产品系列的“附近”，那么它可以在设定了该客户的性别以后，查询该客户的偏好、过去的购买记录（该用户是否已经购买过这个系列款式），以及支出分析（是否该用户购买过这个物品，在历史购买记录上是否打折或折扣的级别），动态地生成一个优惠券，或向其iOS设备提供其他通知，优惠券如图10-5所示。随后，移动应用程序可以确定，如果用户决定使用优惠券，那么Bourne决定给这个顾客这件运动夹克较大的折扣价；如果用户不使用优惠券，那么会给这个顾客在下次进入本店消费时，提供一个更优惠的价格。

图10-5　Bourne移动应用程序动态生成的优惠券

iBeacon协议的简单性，使得通过零售商和其他商人很容易就能掌握。而将移动应用技术整合到手机中，可以检测到iBeacon发射器发出的与特定制造商ID相关的信息，从安全的角度来看，通过iBeacon发射器发出的“有限”的数据，对黑客来说，提供不了多少有兴趣的内容，上面“有限”的数据指的是“蓝牙接入地址”、通告地址、“通用唯一标识符”、“主ID”、“次ID”，如图10-6所示。然而，这个iBeacon的用例和操作移动设备应用程序的交互能力，对于黑客来说，是有兴趣的，因为这时可以使用iBeacon的通知功能开发在不同移动应用程序之间变化的移动应用程序。

图10-6　通过数据包嗅探捕获到的iBeacon通告内容

iBeacon的冒充

在写本书这段内容的时候，还没有哪种安全保护机制可以用来保护“低功耗蓝牙”通告消息的保密性和完整性。一个攻击者只要通过他的“低功耗蓝牙”无线接口配以合适的软件就可以冒充iBeacon发射器来操纵其他各蓝牙移动端站上的应用程序。

例如，考虑这样一种情况，通过逆向工程和网络通信数据包的捕获分析，攻击者识别到在Bourne商店的应用中，为到店顾客中逛到店内女性内衣摆放区的顾客提供一种优惠券。一旦有顾客满足这个条件，逛到了内衣区，那么她的行为就激发Bourne的应用程序，这时iBeacon发射器，就会发送“通用唯一标识符”为72C898A3-8F29-493B-8A34-41297FIB17B5，“次ID”为Ox4D49。那么攻击者就可以修改代码为如下代码段：

在这段节选的代码中，Bourne应用程序中注册了“通用唯一标识符”，之后监测iBeacon通告的程序也会使用这个“通用唯一标识符”。当一个iBeacon被邻近的Bourne应用程序识别出来时，Bourne应用程序会检查这个iBeacon设备的“次ID”。由于“主ID”用于表示该商店的标识，在这个店中，任何一个位置触发的事件，都会使用这个相同的“主ID”，所以在本例中，“主ID”并不具有区分的作用。如果这个iBeacon的“次ID”设置为BOURNE_BEACON_MIN_LINGERIE，那么在用户的移动终端上就会显示一个广告信息，该广告的内容是一个由应用程序指定的一张图片。

认识到这一行为，攻击者可以冒充这里的iBeacon发射器，触发应用程序中的这一事件，只要所用的“通用唯一标识符”是这个Bourne商店的，“次ID”是上面这个BOURNE_BEACON_MIN_LINGERIE值即可。

hciconfig工具主要用于禁用“通用查询”（traditional inquiry）和“页面扫描”（page scanning），以及打开“低功耗蓝牙4”的适配器的低功耗通告功能。通过hcitool工具集配置适配器，让适配器使用低功率通告功能，其命令中各个数字的意义如表10-2所示。

表10-2　“低功耗蓝牙”通告数据的字段分解意义

即使不使用Linux操作系统的主机，攻击者可以在iOS操作系统内核上，使用具有低功耗iOS设备能够冒充任意的“通用唯一标识符”，“主ID”和“次ID”，将这三个值组合使用后，就可以冒充免费的xBeacon应用程序。xBeacon应用程序的一个应用实例如图10-7所示。需要说明的是，在图10-7中，xBeacon应用程序的“主ID”和“次ID”显示的是十进制的格式，而不是上面我们常用的十六进制格式。

当攻击者将自己的系统伪装成一个“iBeacon发射器”后，任何在距离上邻近的被攻击系统中，只要已经安装了iBeacon应用程序的，都将收到一个iBeacon的通告信息，这个时候，由于这里的“iBeacon发射器”是冒充的，不再考虑原来“店内的位置”因素，所以无论被攻击者实际的位置在哪，也无论被攻击的移动设备是否在Bourne的商店里，他们都将收到一个iBeacon的通告信息。一个通告的实例发送事件，显示如图10-8所示。

从安全的角度来看，攻击者通过愚弄的手段欺骗一个移动设备，使其相信自己就在一个合法的iBeacon发射器的附近，更确切地说是在某个商店的附近。虽然这肯定属于是一种潜在危险，但确实还算不上是一个重大的威胁，但我们还不能这么简单地看待这一问题。

·一个攻击者通过冒充iBeacon设备触发对被攻击移动设备上的应用程序的行为，的确算不得什么。但是如果在被攻击的移动设备的应用程序上，存在可以识别的漏洞，那么冒充iBeacon设备，发布内衣广告就算不得什么事，相反，这个带有漏洞的应用程序就会完全成为攻击的主角，攻击者后面要攻击的就是这个应用程序上的漏洞了。

·那些部署了iBeacon设备的机构，可能更关注的是发生攻击以后，自己的商店品牌被败坏了，因为这些都是攻击者以自己名义向购物者发送的消费让利信息，而对于店方，他们是无法兑现的。例如，在一个市场营销计划中，店方提供的商品折扣信息是让消耗者在店内消费的，攻击者偏要在飞机上或其他消费者不能使用的场所发了这样的商品打折信息，最终也只能石沉大海。

图10-7　通过xBeacon冒充iBeacon发送器

图10-8　Bourne移动应用程序上的iBeacon冒充实例截图

·在iBeacon冒充攻击方式中，也会有一些变种。比如，Bourne商店的竞争对手也可以注册一个应用程序，然后当安装有Bourne商店中iBeacon应用程序的消费者来到这个竞争对手应用程序的功率覆盖范围内的时候，这个应用程序就会采取一定的行动。下面用例子来说明，同样还以运动外套为例，当Bourne商店的竞争对手检测到Bourne商店的购物者距离这个冒充的iBeacon发射器非常接近的时候，Bourne商店的竞争对手会向Bourne商店的客户提供比Bourne商店更大的折扣比例或价格，但这时所指的商店却不再是Bourne商店，而是Bourne商店的竞争者所在的商店，其目的就是借这样的手段，努力地说服购物者改换门庭，不再去Bourne商店购买这件运动外套，而到Bourne商店的竞争对手所在的商店购买。这就成了另一种意义上的威胁。

iBeacon设备未来的部署也还是会受到侦听攻击的。在这种攻击中，通告信标的数据包中，侦听者所关注的有效载荷的内容包含的不仅仅是“通用唯一标识符”、“主ID”和“次ID”，还会包含其他的一些值。例如，使用Linux操作系统中的hcicool命令，我们可以频繁地检查一个Linux主机的CPU的状态，从中可以看到“低功耗蓝牙”通告数据包中通告数据包的总CPU使用率，该操作很简单，也很直观。另外，Apple公司的iOS设备可以获取到通告数据包的总CPU使用率这个值，但所用的却是另一个方法，如图10-7中可以获得解码后的“主ID”和“次ID”两个十进制值，将这两个值出现的次数，分别作为一个除法公式的左右两边，这时分子是“次ID”为通告数据包出现的总次数，分母为“主ID”为Bourne商店的“主ID”出现的次数，因为Bourne商店内所有的通信数据都使用这一个“主ID”，所以该总数即意味着所有的蓝牙通信数据包。相除以后，必然能生成一个浮点数，而这个商，也是通告数据包占所有数据包的比例，代表着CPU的使用率。

提示

还可以从“低功耗蓝牙”通告数据包中看到改变CPU级别数字的改变，不过，这需要在相同的系统上，通过在一个新的终端窗口中运行“hcidump-X”命令实现的。

另外，在“低功耗蓝牙”信标数据包的有效载荷中，还有一些与制造商有关的数据会被同时传送，这些数据最多可以达到31个字节，具体取决于不同制造商的ID。

在这个例子中，从有线网络接口eth0上发送和接收的字节数，其实表示的是“低功耗蓝牙”信标数据包进行编码和发送的内容。样例中的这个数据包与iBeacon系统中的数据包是不兼容的，因为其中代表“制造商的ID”（详见“表10-2”）中，对于Apple电脑，该值为“004C”，但这里却随便写了一个任意值“4A 57”。但相比于两次单独使用“主ID”字段和“次ID”字段，这个数据包却可以发送更多的数据。

在这些例子中，我们都是用来传送一些基本系统的使用信息，但是我们更希望更多的厂商在自己的产品中利用“低功耗蓝牙”的信标数据包传送一些敏感数据，那才是更合理的做法。在“低功耗蓝牙”中，潜在可以使用的敏感数据用途包括患者医疗遥测信息，如“血压”（blood pressure）、“脉搏血氧饱和度”（pulse oximetry）、“心率”（heart rate）、“血糖水平”（glucose level）等；还可以包括一些环境数据，如“温度”（temperature）、“湿度”（humidity）、“空气颗粒计数”（air particulate count）；一些安全系统，如“振动传感”（vibration sensing）、“自动打开控制门”（door open event）、“玻璃破碎探测器”（glass break detection）、“邻近报警”（proximity alerting）；以及自动化控制系统，如“温度报告”（temperature reporting）、“每千瓦时的成本”（cost per kilowatt hour）、“电能使用监测”（power utilization monitoring）等信息。

在这种情况下，从被动式侦听的角度来看，捕获到传输的明文数据是没有价值的。即使你捕获到了“心脏率报告系统”，但这个病人的“通用唯一标识符”对于攻击者来说，是不知道所代表的意义的，所以不会为侦听者带来很大利益。然而，任何的动作都有两面性，侦听就意味着可以获得一些信息，而借助于获得的这些信息，又意味着我们可以对其进行修改，进而意味着我们可以操纵对方的系统。

使用iBeacon和“低功耗蓝牙”信标数据包的产品在不断地涌入市场，有很多技术成员会议对“低功耗蓝牙”提出了新的要求，那就是电池寿命长、成本低，可以简单地集成到其他的系统中。可是，在黑客眼里，无论怎么变，只要你们仍然一如既往地不注意基本的安全问题，那么将来攻击者还会“我行我素”地攻击这些无线蓝牙目标系统。

10.5　本章小结

在本章中，我们集中地分析了攻击和使用蓝牙的各项技术，这些技术的基础，正是第7章和第8章中通过侦察和扫描获取到的蓝牙网络信息，以及第9章中侦听到的蓝牙数据通信的数据包。

蓝牙“个人身份码”攻击是通过在“配对”过程中，侦听无线蓝牙设备之间的数据通信数据包实现的。一旦侦听到了“配对交换”，攻击者就能够还原出“个人身份码”或者“长期密钥”的值，进而从捕获的蓝牙网络数据包中解密数据。

我们还介绍和验证了多种识别蓝牙设备信息的方法，这些信息包括“蓝牙设备地址”、“服务类型”和“设备类型”，以及“友好名称”。通过修改这些字段，我们能够改变远端蓝牙设备对我们自己蓝牙系统的认知，使其对系统本质产生出我们想要的“误导”效果。在某些时候，这样做是有必要的，比如在iPhone蓝牙浏览器接口的那个示例中，iPhone只接受耳机和音频类设备，于是我们就修改自己的“设备类型”，最终为它所接受，为下一步的攻击清除了障碍。其他情况下，类似的例子也有很多，例如我们就曾经根据识别到的“友好名称”得知对方蓝牙设备的型号和版本，并根据这些信息查询到这个版本的蓝牙设备上有哪些可以为我们所用的漏洞。

我们还介绍了多种攻击蓝牙规范的方法，各种蓝牙设备在按照蓝牙规范实现其蓝牙设备的软硬件协议栈的时候，常常会因为实现方式的误区或滥用，最终导致在某型号蓝牙设备或某个版本蓝牙设备中，存在某种弱点和漏洞。相比于其他针对蓝牙设备的攻击技术，尽管基于蓝牙规范的攻击方式目前仍是攻击者所采用的最广泛的攻击手段，但这些攻击技术通常并不适用于所有的蓝牙设备。

有关“低功耗蓝牙”的介绍，主要集中于一些新兴技术中，比如Apple公司的iBeacon设备就在不断地将“低功耗蓝牙”引入到很多新的市场中，并不断寻找自己更合适的接受方式。尽管iBeacon设备本身的使用并不一定会威胁到蓝牙设备的安全性，但是iBeacon设备上存在的漏洞本身就代表了一种针对最终用户的潜在威胁。这种漏洞对于攻击者来说，是一个在被攻击移动设备上操纵应用程序行为的绝对机会。

对于攻击者来说，蓝牙技术保留了很多不可抗拒的攻击诱惑，使黑客们愿意投入精力不停地开发新的攻击工具，这些攻击工具包括使用超牙进行数据包的嗅探。其实，只要使用蓝牙通信的机构不改进和完善现有的蓝牙技术，那么攻击者就会百尺竿头，更进一步，不断地寻找新的方法，利用其弱点和漏洞攻击这些流行的无线传输机制。

第三部分　入侵其他无线技术

·第11章　软件无线收发设备

·第12章　破解蜂窝网络

·第13章　破解ZigBee网络

·第14章　破解Z-Wave智能家居网络

案例学习：永不言败

“只要有天才带路，任何时候我们都可以随时准备出发。”

Lourdes没顾得上回头瞥看中士一眼，因为她知道，在他们小分队进入前面建筑之前，她必须完成准备工作，除此之外，再无他法。而在她完成任务之前，整个队伍只能等待。对于进入前面这个建筑这件事来说，她并不在对方认识的人员名单之中，因此她以及后面的队伍只能偷偷地进入，现在的问题是队伍中的人只能躲藏在一堆杂物之中，这样会很不利，而且她看到有一组敌方的快速反应特警队的队员藏在一个伪装的货车内，所以目前的状况不仅仅对自己不利，她还意识到，自己接下来要做的事是一个危险的行为。

整个队伍都指望着她的成功，所以她也不能让他们失望。

现在要对付的目标中的敌人，对于前沿的技术可不是个生瓜蛋，眼前是一个大的建筑，建筑的四周是围墙，“运动传感器系统”监视着建筑及四周石头墙紧紧围起的那片空地。“视频监控系统”涵盖所有出入口的大门处，哨兵相互之间使用无线通信设备随时联系。每个门本身就是一个难以克服的障碍，更何况还配备了最先进的短程智能卡认证系统。

幸运的是，Lourdes对于无线网络的入侵技术略知一二。她现在其实也不是空手御敌，至于她现在手里有一个“人机接口设备”门卡克隆工具以及克隆好的卡，这意味着，作为先遣队成员的她，面对前面这个由三角架加固、大锁锁死的钢铁大门，她并没有太在意，因为对于她来说，有卡在手，只需要决定什么时候准备好通过即可。之所以要选择时机，是因为当前她要解决的是面前的“运动传感器系统”、“视频监控系统”和对方的“无线对讲系统”。

首先要解决的是“运动检测系统”。高端ZigBee网络的运动传感器功能丰富，但该传感器仍然是基于IEEE 802.15.4协议。经过几天对该设备固件 [1] 的逆向工程，Lourdes发现这个设备中存在一个有趣的缺陷：当设备内部的数据包计数器增长得太高的时候，设备就会停止数据通信，但其实这个计数器的上限足够大，所以在日常正常使用的过程中，设备的计数器是永远不会达到上限的，但Lourdes知道她可以通过注入的方式将大量伪造的数据包注入到ZigBee网络的数据流中，目的是使数据包计数器最终达到或超过其上限的2³² -1个，让传感器无法发送更多的数据包。这样做可以防止自己的队伍在逃跑的过程中触发到任何一个运动传感器，要知道这些运动传感器一但感觉到有人或物体运动，它们就会打开足以照亮全部院子的探照灯。

攻克“运动检测系统”以后，下面对“视频监控系统”的攻击就相对容易很多了。目标区域内已经部署的是使用Z-Wave无线网络的标准消费类硬件，Lourdes知道这种系统容易受到“重播”式攻击。几天前的一个晚上，Lourdes对镜头相机节点都做了一个一分钟的连续镜头录制。作为一个“行为优先”的通信协议，Z-Wave在设备处于“忙”状态时是不发送监控的视频流的。对于Lourdes来说，可能想办法让设备“忙”起来，以便让视频系统能够“沉默”一会儿，更为可喜的是，一旦这边视频系统停止发送新的视频流，那么终端负责监视的显示器上显示的将是之前所发视频数据流中最后一个视频帧的内容。换句话说，就是只要想办法让视频的摄像头处于“忙”的状态，那么显示器上将会不停地重播之前最后的画面。只要那些坏人面对重复播放的视频内容别看得太仔细，那么这个效果足以掩盖整个队伍通过建筑时的行动。

攻击无线通信系统是一个很大的挑战。这个设备使用专用的射频收发系统，Lourdes不得不想出如何通过“软件无线收发”工具来解调士兵之间通信的数据包。通过一些自定义的代码和选择性干扰工具，她能够让自己的队伍监听对方的通话，并且切断对方一小段时间的音频传话。

卫兵通常会固执地认为在执行任务期间，不会与外界进行通信。切割他们的有线线路很容易，但现在他们使用的都是无线传输，所以Lourdes不得不想出一个拦截手机和4G数据连接的方法。那就是通过修改“移动网络扩展器”，使无线发射的“信号塔”将信号以“广播”的方式，发给其功率覆盖范围内的所有设备，而不是以前的“一对一”发送。然后在防火墙上，做一个简单的iptables规则修改，就可以切断所有与外界的通信，但是看上去却仍然保持着通话连接的状态。

“我已经准备好了，中士。”

“下面听我的命令。”

Lourdes等待着执行攻击的命令，整个队伍已完成了第三轮武器检查，做好了随着攻击的准备。而她，则注定在这场战斗中扮演一个重要的角色，她的参与对于获得对敌胜利的一个必不可少的组成部分。

他们都指望着她，她也不会让他们失望。

“出发！”

[1] 固件（firmware）就是写入EROM（可擦写只读存储器）或EEPROM（电可擦可编程只读存储器）中的程序。——译者注

第11章　软件无线收发设备

你还记得曾经的V.92标准 [1] 拨号调制解调器在拨号时发出的声音吗？那些时而尖叫、时而口哨声和时而嗡嗡叫的声音 [2] ，恰恰表示的是你的数据沿电话线连接到“互联网服务提供端”（Internet Service Provider，ISP）的声音。从理论上讲，你可以通过以“tap”方式 [3] 搭线窃听你的电话线，将完整的通话记录保存到一个wan文件中，然后写一个计算机程序将声波转化成一个pcap文件。

现在，把上面的步骤再往前走一步。如果你将音频插入到一个pcap文件，那么你应该也能够逆转上一过程，将这个文件中的内容发送出去。如果你能将上面的过程实时（in real-time）完成，那么只需一个声卡和一台处理速度足够快的计算机系统，你就可以设计一个语音转发的“中间人”（Man-in-the-Middle，MitM）系统。

但是我们不得不就此停住，为什么呢？因为这种方式下，“来电显示”（Caller ID）功能不可使用V.92标准，但这时调制解调器却仍然在“吱吱”作响！如果我们研究得再深入一点，你会发现Bell 202调制解调器正处于工作状态和使用相同的硬件来笨拙地模仿来电的“嘀嘀声”。在本质上，这是“软件无线收发”（software-defined radio）的基本功能，即使用“无线电波”（radio wave）代替“声波”（sound wave）。通过使用一个特殊的“无线声卡”（radio soundcard），你就可以接收和发送任意信号了。

当程控电话（phone phreaking）和拨号调制解调器的日子走到了尽头，廉价的“软件无线收发”（Software-Defined Radio）出现了，并且一出现就重新定义了无线窃听的前景。通过“软件无线收发”的使用，对于无线，我们不再限制在以前的“黑盒子” [4] （black box）操作模式，相反，这时几乎可以不受任何限制地访问射频频谱、无线模块和协议。以前通过“保密协议”（Non-Disclosure Agreement，NDA）进行屏蔽的内容和只有专业设备才能看到的现象，现在已全部无遮无拦地展示在你面前，任由你操纵。

本章分为五个部分，可以作为一个“软件无线收发”的高速速成课程。第一部分介绍了“软件无线收发”的定义，描述了它们是如何工作的；第二部分讲述了如何选择“软件无线收发”设备；随后的第三部分，我们讨论了“软件无线收发”的“即插即用”（plug-and-play）技巧，以便获得新的用户和运行；对于更多喜欢分析的读者来说，第四部分则主要讨论了一些在无线和信号处理背后的一些理论知识；最后一个部分，我们通过逆向工程来一步步分析一个简单的无线装置。

然而，首先我们需要提醒读者，无线频谱的使用是由不同的政府机构严格监管的，所以你有责任确保在“接收和发送”，以及“接收或发送”无线电信号的时候，遵守了当地的法律。

其次，读者也应该注意到，“软件无线收发”目前仍然处于起步阶段，还谈不上是真正的“即插即用”。即使你按照软件说明书上的指示操作，仍有可能出错。信号处理涉及大量高等数学的概念，并且很多概念之间经常有循环依赖。这一章最适合那些有足够耐心的人！

[1] V.92标准是2001年国际电信联盟ITU发布的一个调制解调器新标准，采用V.92标准的调制解调器不仅上网的连接速度和上传速度大大提高，而且新增了“Modem呼叫保持功能”（Modem-On-Hold），使得拨号用户在上网的过程中，既可以接听第三方的电话呼入，又能够保持和局端接入服务器的连接。——译者注

[2] 有些调制解调器带有语音，所谓的语音，只是将接收到的信号转成一定频率，然后由一个简陋扬声器发出，所以听到的声音只能是这种效果。——译者注

[3] 电话线的两根线，一路输入，一路输出，所以只要再找两根线分别“并联”到两根线上，就可以实现电话的窃听，这种方式就叫“tap”方式的搭线窃听，市场上也有一转多头，称为“tap”头。——译者注

[4] “黑盒”，设计上的术语，指在设计、使用、测试某一个功能块的时候，只需要知道该功能块的输入和输出即可，而不需要知道其内容的原理、结构等细节。与之相反的是“白盒”，指除了知道输入和输出，还要知道内部的各项细节。——译者注

11.1　“软件无线收发”设备的体系结构

在本章的介绍中，我们将“软件无线收发”比作一种处理无线电波的声卡。为了更易于理解，有些概念在使用上，尽量避免过于专业化，与枯燥乏味的准确概念之间留出了一定的距离，只给出了一些形式化的简单定义。下面就是一个简化后，并且以功能块分割后的一个基本“软件无线收发”原理图。大多数“软件无线收发”有三个主要部分：“射频信号放大器”（Radio Frequency Amplifier，简称“RF放大器”），“调谐器”（tuner）和“模数转换器”（Analog-to-Digital Converter，ADC）。

虽然从技术角度上来看，天线并不能算是无线的一部分，因为天线只是“采集”（picking up）无线信号，不过，真要说起天线，还是有很多讲究的。有一些天线的功能可以很好地在多个频率上使用，而另一些天线的功能则只能在一个频率上使用。各向同性天线可以发送和接收（或同时收发）来自任何方向的信号。然而，如果你想进行长距离的沟通，那么一个定向天线（如“八木天线”）将会是一个更好的选择。不幸的是，天线是一个复杂的问题，全面讨论则会超出本章的范围，所以这里也不会详细展开。其实有一个简单的原则，那就是在大多数情况下，“软件无线收发”设备自带的天线应该基本足够你使用了。

“射频放大器”负责将弱信号功率提高。用户指定的增益值是以“分贝”为单位，表示为“dB”，“射频放大器”所控制的是在没有增益的前提下放大的数量，因为你可能接收不到太弱的信号。但太多的增益也会扭曲你的信号，就像你将一个音响的音量开得太大了，一些声音会发生变形一样。还有一些无线是通过增益的多个阶段获得的。除此之外，还包括“自动增益控制”（Automatic Gain Control，AGC），在使用这种设备的时候，它会试图帮你选择最佳的增益值。

接下来的“调谐器”，或者叫“混合器”。就像老式收音机的调谐旋钮一样，“混合器”的作用是选择无线电的频谱部分进行分析。这个过程可以理解为“混合器”将一系列的频率“拉到”到一个较低的频率上。有一些无线处理设备是通过几步完成这一操作的，而处理的信号中包含“中频”（Intermediate Frequency，IF）和“基带”（BaseBand，BB）信号的增益。

最后，无线信号的选择，是通过一个“模数转换器”实现的。“模数转换器”的作用是在进行“采样”（sample）的过程中，将模拟的语音波形转变成数字流。虽然这个话题说起来很复杂，但处理过程却很容易理解，不妨从下面一个例子中进行说明。

你的老师要求你记录你家室外的温度，并且画出一张变化走势图。多数情况下，你会设计一个电子表格，根据温度计的读数，然后记录在电子表格上。这种家庭室外温度的变化浮动范围一般只有5度的增减，然而，所以样品的分辨率，也就是精细程度也是有限的。此外，测量温度的频率也会直接影响你的信号分辨率。如果你只是一个星期记录一次，你画出的图也不会太丰富。如果你一个小时记录一次，那么你的图就能体现一天的温度变化。这就是“模数转换器”在功能上的作用，当然这里测量的是电压，而不是上面的温度。

以图11-1为例，我们在理想状态下，把整个过程中每一个模块的处理过程放到一起，集中展示出来。“射频输入”（RF Input，即图上的第一行）代表许多传输中的无线频率，你可能会注意到一些熟悉的波段，如FM调频广播、Wi-Fi无线网络，还有蓝牙网络。“低噪声放大器”（Low Noise Ampfifier，LNA，即图上第二行），简称“放大器”，作用是在模拟信号的频谱中增加增益，使信号得到加强。“调谐器”（Tuner，即图上的第三行），在这个情况下，中心频率是800MHz，主要作用是将高频的频谱调谐到基带区域，以方便“模数转换器”的采样。通过配置“模数转换器”，使其运行在每秒1000万的采样值，换句话说，达到10个“每秒百万次采样值”（Million Samples Per Second，MSPS），计算机可以处理的频谱范围是795MHz~805MHz，也就是说计算机可以处理的带宽是70MHz。

图11-1　理想状态下的“软件无线收发”SDR处理过程

“模数转换器”并不知道正在采样的是哪一部分频谱，其实在“混合器”阶段之后，我们就不知道正在转换的是什么信号了。如图11-1所示，任何波段的信号均可以混合到“模数转换器”所需要的这10MHz带宽中。最终用户的软件，比如gqrx程序会持续跟踪这一信号的变化，并以图形的方式还原成你原来的频率。在分析过程中，你会经常看到相对于调谐频率的频率变化值。需要注意的是，分析时总的可用带宽和原来采样信号的带宽是相等的，只是频率位于0MHz左右，并且中心频率位于0MHz。

11.2　选择合适的“软件无线收发”设备

现在，你要一些有关“软件无线收发”设备操作的一些基本原则，让我们先看看市场已有的各种“软件无线收发”设备，本节主要讨论选择一款设备的四个主要特性。

采样率（Sample Rate）/带宽（Bandwidth）　采样率就是你能同时看到的最大带宽，通常以“每秒百万次采样值”为单位。看看Wi-Fi无线网络的802.11b/g，或者是“低功耗蓝牙”的信号，你至少需要20MSPS的带宽。不过，相比于这些“带宽大户”，我们更多使用的信号带宽都是2MSPS，具体在本章以后的内容中将不断出现。

动态范围（Dynamic Range）/“模数转换器”分辨率（ADC Resolution）　“模数转换器”的分辨率，类似于现代电视上对比度和“每英寸点数”（Dots-Per-Inch，DPI），是以“位”（bit）为单位。较高的“模数转换器”的分辨率一般是14位或16位，这样既可以在记录中分辨出很大的声音和极其细微的小细声音，并且可以对信号中声音的轻微差别进行区分。对于一些要求比较苛刻的应用，如“低功耗蓝牙”加上“全球定位系统”，8位的分辨率可能是不够的。不过，具体还要看是做什么，对于跟踪飞机、解码传呼消息和更多简单的应用上，8位就足够了！

发送功能（Transmit Capability）　一些“软件无线收发”设备只有接收功能，而没有发送功能。虽然据大部分的调查工作，大家都是把“软件无线收发”设备作为一个接收器使用，但仍有些读者可能不满意，非坚持要求设备具有发送能力！要鉴别设备是只有接收功能，还是兼具收发功能，可以注意一下“软件无线收发”设备的输入/输出配置，即使是具有收发功能，有一些“软件无线收发”设备可以同时发送和接收，一般标注为“全双工”（full duplex），而另一部分则只具有“半双工”（half duplex）的传输能力 [1] 。

调谐器调谐范围（Tuner Range）　调谐器的调谐频率范围决定你能够接收的频率范围。例如，如果你想接收蓝牙通信数据包，你最好确保你挑的这款“软件无线收发”设备包括了2.4GHz的范围！

在软硬件产品市场上，有几款“软件无线收发”设备可以使用，表11-1中列出了其中四个最常见的产品介绍。在后面的介绍中，我们将集中围绕着RTL-SDR和RTL-SDR这两款“软件无线收发”设备中的技术进行分析，而这两款也是目前可用的“软件无线收发”技术中最常用的。

表11-1　“软件无线收发”设备硬件与功能注释

11.2.1　RTL-SDR：入门级的软件无线收发设备

如果我们没有拿出一小篇幅的内容介绍一款针对大众想要的“软件无线收发”设备的话，那就是我们的失职了。RTL版的“软件无线收发”设备 [2] 就是作为一款最廉价的“软件无线收发”设备粉墨登场的，这款设备的作用主要是收看“数据广播电视”（Digital Broadcast Television，DVB-T），收看节目遍及欧洲、亚洲和大洋洲。插到你的笔记本电脑的USB口中，只要你有信号，就可以看电视。

研究人员Eric Fry发现这个设备是通过USB口发送原始无线信号的波形的。更重要的是，该设备可以在50~1750MHz之间任何调谐。于是他随即编写了一个简单的驱动程序，并增加了支持“GNU计划” [3] 中的无线部分。这项开发迅速发展，不久，各地“软件无线收发”设备的无线电爱好者都热追该软件。同时，这款设备的售价也只有20美元，其实物图如图11-2所示。现在，有很多地方可以购买RTL版“软件无线收发”设备，比如http://www.nooelec.com 。

图11-2　RTL版“软件无线收发”设备

不过，虽然20美元听起来对于这样一个基于USB加密狗的RTL版“软件无线收发”SDR设备来说，是相当吸引人的，但也不可否认，这个设备也有一些缺点。比如该设备的晶体振荡器（也可以认为是设备的时钟）很容易发生振荡漂移，从结果上来说，那就是时钟不准，偏差较大，当温度高的时候，这种现象更是明显。比如，你把你的调谐器降到10kHz左右，可当你回来再看的时候，你的无线信道已经漂移出这个范围了。同时，接收到的信号噪声太大，还有系统内部时钟的加工工艺是在28.8MHz的整数倍。

注意，对于RTL版“软件无线收发”设备来说，这是一个理想的无线信息处理设备，并且通过这个设备，可以完成本章中所有的例子。这只不过是一个收看电视的小信号接收器，怎么可能成为一个黑客工具？如果你还在迷茫于这个问题而表示不服气的话，那么可以将注意转向http://www.rtl-sdr.com 网站，在这里，你将看到使用该设备所进行的一些最近的项目列表。

11.2.2　HackRF：多功能的软件无线收发设备

2014年，Mike Ossmann发布了“HackRF一号”（HackRF One），该设备如图11-3所示。这是一个灵活的、基于USB接口的“软件无线收发”设备平台。该设备可以在10MHz和6GHz之间进行调谐。可以实现接收功能和发送功能，但属于“半双工”通信模式。HackRF版的“软件无线收发”设备在“软件无线收发”设备系列中，与提供了相同功能的更昂贵的“软件无线收发”设备平台相比，成本相对较低的。该设备包括一个20MSPS的采样率。

图11-3　“HackRF一号”

HackRF设备可以从多个在线零售商处买到，包括HakShop（http://www.hackshop.com/ ）和NooElec（http://www.nooelec.com ）。HackRF的网站上也包括一些与“软件无线收发”相关的有价值的视频教程，这些内容也都可以通过http://www.greatscottgadgets.com/sdr 网站查到。

对于读者来说，要开始研究“软件无线收发”技术，RTL版“软件无线收发”设备是进行实验和学习的最低成本的平台。在这一章中，我们将集中大量的例子介绍RTL版“软件无线收发”设备平台上的应用，还有少量附加的例子则需要使用HackRF版“软件无线收发”设备，这主要是针对那些在功能上想使用超过RTL版“软件无线收发”设备的附加功能的那一部分用户。

提示

另一个基于“软件无线收发”技术的开发平台就是Airspy版的“软件无线收发”SDR平台。在作者写这一章内容的时候，Airspy版的“软件无线收发”平台还不能使用，不过相信很快就能使用了。Airspy版的“软件无线收发”平台的设计目标就是为了满足“软件无线收发”爱好者人群中，希望功能比RTL版的“软件无线收发”平台多一点，价格又比HackRF版的“软件无线收发”平台少一点的那些人的要求。要访问Airspy版的“软件无线收发”平台的网站，请访问http://www.airspy.com 以获得更多更详细的信息。

[1] 这种描述，容易给对通信不太熟的读者产生误会，从通信的收发功能上，一般分为“全双工”（可以同时进行收发，如手机）、“半双工”（可收可发，但不能同时进行，如对讲机）、“单工”（Simplex，或只收，如收音机；或只发，如电台电视台发射机），所以，上面其实应该还包括一种“单工接收”。——译者注

[2] 这里的RTL是Realtek的缩写，因为该设备使用了基于Realtek公司的RTL2832U芯片作为其设备主芯片，所以因此命名。考虑到后面还有别的型号“软件无线收发”设备未使用芯片命名，为了格式上的统一，所以本处将其称为“RTL版的‘软件无线收发’设备”，而不是“‘基于RTL芯片的软件无线收发’设备”（其实这一名称更合适）。——译者注

[3] GNU计划，又称革奴计划，是由Richard Stallman在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。所有GNU软件都有一份在禁止其他人添加任何限制的情况下授权所有权利给任何人的协议条款，GNU通用公共许可证（GNU General Public License，GPL），即“反版权”（或称Copyleft）概念。另外，GNU的全称更有趣，它是“GNU's Not UNIX”的缩写。——译者注

11.3　开始使用软件无线收发设备

接下来，我们将分别在Windows和Linux操作系统上，看看要成功运行“软件无线收发”设备，一些作为先决条件的软件工具是怎么工作的。

11.3.1　在Windows操作系统上的下载与安装SDR#程序

在Windows操作系统中，首先介绍的能与RTL版和其他版的“软件无线收发”平台进行交互操作的流行工具是“软件无线收发#版”（SDR#），发音同于“SDRSharp” [1] ，是由Youssef Touil编写的。SDR#提供了一个直观的界面，可以用来浏览无线频谱，界面有“瀑布式”（waterfall）视图和“实时信号”视图两种。

SDR#的网址是http://www.sdrsharp.com ，这里可以下载最新版本的安装文件，是zip格式的压缩包，文件名叫作sdrsharp-install.zip。下载该文件后，解压缩，随便就可以运行解压后的install.bat批处理安装文件了。这个脚本将会从不同的网站自动下载几个库文件和可执行文件。这样做的目的是，该文件会下载可以整合多种“软件无线收发”设备的硬件，使其提供对SDR#软件的支持。

在Windows“资源管理器”中，导航到上面安装程序所创建的sdrsharp目录中，以管理员的身份启动zadiag.exe文件。该程序会让用户配置系统驱动程序，以便支持RTL版“软件无线收发”设备的使用。对用户来说，要完成这一操作，需要先单击“选项（Options）|列出所有的设备（List All Devices）”菜单，然后在界面下拉列表菜单中，选择“散装，接口（Interface 0）”（Bulk-In，Interface（Interface 0））的下拉列表项。这时的界面如图11-4所示。单击“安装驱动程序”（Install Driver）按钮，程序就会开始安装要与RTL版“软件无线收发”设备进行交换所需要的驱动程序。

图11-4　配置系统驱动程序

提示

“SDR#软件支持通过插件方式增强工具的功能。一组由软件开发者提供的插件列表，发表在http://www.sdrsharpplugins.com 网站上，可供用户查阅使用。其实“频率管理器+扫描器”（Frequency Manager+Scanner）插件是由Jeff Knapp开发的，在保存有价值频率时所用的功能时必须用到这个插件，所以建议想要使用这一功能的读者，先下载并安装这个插件。

11.3.2　在Linux操作系统上的下载与安装gqrx程序

就像“软件无线收发#版”软件这样的Windows应用程序，在启动SDR设备的时候，都可以分别设置时间。然而，多数使用SDR设备进行信号分析和解码的工具，都假设你现在使用的操作系统是Linux操作系统。所以虽然后面的例子中，大多数的攻击目标是Linux操作系统的，但如果有可能的话，作为控制SDR设备的软件，我们会尽量介绍一些Windows操作系统上的工具使用的例子。

不幸的是，安装“GNU计划”中无线部分（GNU Radio）和其相关的库文件的文字描述，还有一连串的依赖程序和库文件，程序所使用的插件，插件所使用插件，其要安装的项目很多，且安装过程繁琐。这迫使许多人必须在两项操作中进行二选一的操作，或者是手工一件一件地编译一切他们感兴趣的程序、库文件和插件，或者在运行一些别人编译好的那些有可能落后的发布版本。不过，不要害怕，至少有一个只使用了短短的几条命令的，简单的配置方案是可供使用的。

首先，从http://www.ubuntu.com 网站上下载和安装最新的64位Ubuntu操作系统的ISO映象文件。后面该映象文件可以作为一个Ubuntu的虚拟机使用，但这样做后，系统整体的性能会下降，另外，USB接口对高吞吐量适配器的支持开始变得挑剔，由于SDR设备也是基于USB接口的，所以这也会影响对SDR设备的支持。因此，不建议以虚拟机的方式使用Ubuntu操作系统。

有了Ubuntu操作系统，下一步就是在Ubuntu系统中添加一个第三方程序包文件，这个程序包文件由Alexandru Csete提供技术支持。这个人同时也是gqrx程序的作者，而这个gqrx程序（我们随后将使用到）是一个基于UNIX的多种操作系统下的SDR设备工具。程序的界面将在下一节中出现。这个程序包所在的站点经常会更新这一程序包，有的时候频率甚至比官方的Ubuntu程序包还频繁。这个程序包可以让你轻松地在Linux操作系统上，安装和配置RTL版SDR平台和HackRF版SDR平台。

其次，就是更新软件包列表，安装以下软件包到安装了SDR平台的目录中。

现在，你终于有了一个稳定的，相对最新版本的，也几乎就是最新版的，可以用于“软件无线收发”分析的全部东西了。这对Linux系统来说，是一种罕见的壮举！

提示

你也可以试着去找一个“GNU计划”中无线部分的LiveDVD程序，进行一个快速的，无初试经验的程序包安装生成体验，以便熟悉这种通过短短的几条命令的简单配置方案。LiveDVD程序的下载地址是http://gnuradio.org/redmine/projects/gnuradio/wiki/GNURadioLiveDVD 。

安装了核心的，与SDR相关的软件之后，我们首先要做的事情就是确认RTL版的SDR设备能正常运行。这一步很容易，只要运行rtl_test命令就可以轻松验证：

注意

上面代码中，最后一句的内容是：如果在这儿之后，没有看到更多的输出内容，那就说明你的RTL版的SDR设备安装正确。

提示

在11.2.1节的最后提到，RTL版的SDR设备的“主业”是收看多国多地的电视信号，所以有一些版本的Ubuntu操作系统会天真地以为你真的想用RTL版的SDR设备来看电视。因而Ubuntu也会“自作多情”地自动加载该设备的驱动程序，这种“画蛇添足”的行为最终会导致驱动程序访问上冲突。如果你遇到了此类问题，简单的处理办法是通过“rmmod dvb_lisb_rt128xxu命令简单地卸载由Ubuntu操作系统安装的驱动程序。

测试程序rtl_test是一个不会停止工作的程序，该程序在运行后会一直处于测试状态，所以一旦你认为你已完成了测试工作，按Ctrl+c组合键中止当前的测试工作。在RTL版的SDR设备上，一次只能同时使用一个应用，另外，我们也要记得，在RTL版的SDR设备上有一个轻微的小毛病（slightly buggy），即当你关机的时候，偶尔会看到一个“数据段操作失败”的错误，即segfault错误。另外，如果你的设备停止响应，重插一个USB软件狗再试一次，一般问题就可以解决。如果重插设备后问题仍然存在，那就要考虑重新启动你的SDR系统。

注意

网站

如果你只能够以root用户的身份运行rtl_test程序，那么你需要安装一个Linux操作系统中的“设备管理器”，名叫udev，这其实是一个以“rules”为扩展名的配置文件，从该扩展名上可以看出，该配置文件中保存的应该是一些“规则”。对于RTL版的SDR设备，其“规则配置文件”名叫rtl-sdr.rules，读者可以从本书的配套网站上下载，网址是http://www.hackingexposedwireless.com/files/11/rtl-sdr.rules 。下载后的文件直接复制到“/etc/udev/rules.d/”目录中，然后再运行“udevadm control--reload-rules”命令加载该规则。

如果你足够幸运地拥有一款HackRF版的SDR设备，那么该设备也有一个简单的工具，你可以如法炮制地使用这一工具验证该设备与计算机之间的通信。这个与HackRF版的SDR设备进行通信的工具，名叫hackrf_info。

一旦验证试验是成功的，那么你就可以在“命令提示符”中运行gqrx工具了。这个命令的运行权限并不局限于root用户，非root用户也可以使用。与Windows操作系统上使用SDR设备的SDR#程序相比，gqrx程序不仅提供了所在SDR#程序的功能，而且还支持其他有用的功能，具体将在本章的后面内容中进行探讨。

注意

如果你在使用Linux操作系统上的“音频”方面有什么问题，那就趁着现在先搞清楚了。不然，在下一节中，我们将直接使用你的“耳朵” [2] 去寻找你所在区域内的信号。

11.3.3　使用SDR#和gqrx程序扫描无线频谱

接下来，我们研究如果通过Windows操作系统下的SDR#程序和Linux操作系统下的gqrx程序，对各种无线信号进行分析。

通过RTL版的“软件无线收发”设备，我们要做的第一件事就是监听当地的“调频广播电台”（FM radio station）。这是一个开始的好地方，因为几乎每个人都生活在一些调频广播电台的信号覆盖范围之内，它们都位于全国一致的频率 [3] 。

SDR#程序和gqrx程序的界面一致，主界面都是由四个主要的“用户界面”元素（User Interface element）组成。其中“音量控制/调谐器”（volume control/tuner）突出位于顶部，我们不妨称之为“1区”。而这些功能都如预期所料，是一个收听调频广播的最基本功能。在左边的一列，是无线配置区，不妨称为“2区”。在这里，主要是由你告诉程序要接收什么类型的信号。现在，输入一个当地的调频广播站调频号码，设置无线“宽带调频”（Wide FM，WFM）。在图11-5中，我们收听的广播是WBRU95.5的调频广播，当地的一个另类摇滚电台，设置完上面的操作以后，按“播放”按钮或“电源”按钮，就可以开始收听了。

图11-5　SDR#程序界面截图

“快速傅里叶变换”（Fast Fourier Transform，FFT）区显示的是你的RTL版的SDR设备不停地采集到的“振幅”（amplitude）和“频率”的显示值。不妨称该区为“3区”，其中的竖线（即“3区”正中的黑线），表示的是当前调谐到哪个电台的频率。下面是瀑布显示区，不妨称为“4区”。在这里，显示的是接收信号的历史过程，以时间为单位。当试图找到一个无线电信号时，“3区”和“4区”的数据都被证明是有用的。

虽然我们还没有讨论“频率”和所用的单位“Hz”（中文名也写作“赫兹”），然而，在前面的内容中已多次遇到过这些术语。现在，我们需要知道的是：对于一个信道的“频率”，是电台在使用之前分配到然后由电台告诉我们的。“Hz”，全称是Herz，只是“频率”的单位，一个调频广播电台会占据的一小段频率。以上面的WBRU 95.5为例，虽然95.5MHz是WBRU广播所指定的中心频率，但在实际的传输中，这个频率实际占用的宽度大约100KHz，换句话就是0.1MHz，在以95.5MHz为中心，向两边方向上偏移。这也是为什么电台的调频频率从来都不用偶数结尾的原因 [4] 。

另一个要注意的事项，就是多个调频电台都在不停地对外广播。而SDR#程序和gqrx程序一次只能解调一个电台的广播。通俗地讲，就是一个这样的设备，一次只能收听一路广播信号。但这并不是程序和SDR设备的限制，这只是因为这个程序并不起让你同时收听多个流。其实只要程序稍做修改，你就可以产生额外的线程，来同时收听多个，甚至是所有的电台！

当然，费这么大的劲，如果只是听听收音机信号，那就不值了，因为直接买个收音机，就可以以更容易的方法听调频广播电台了。然而，我们特意使用的是SDR设备，这是因为相比于收音机，你可以读取到其他无线电系统不容易找到的频率，比如“广播式自动相关监视”（Automatic Dependent Surveillance-Broadcast，ADS-B）中的无线信号。

通过dump1090工具解码“广播式自动相关监视”系统

首先我们使用专用的应用程序与RTL版的“软件无线收发”（SDR）设备进行通信，这个专用程序就是dump1090。这个程序是由Salvatore Sanfilippo编写的，作者其实在黑客界还有一个更响亮的名字，叫做antirez。从dump1090这个名字来看，1090应该是得名于频率值，因为飞机通常都使用1090MHz的频率发送自己的位置和航班号，与地面空管基站进行通信，而这个程序又与“广播式自动相关监视” [5] 息息相关。你必须手工下载和编译dump1090手，不过这个很简单，操作步骤如下所示：

命令中的“--interactive”标志会让dump1090程序输出一个标准格式化的ASCII表，“-net”参数会让程序关联到8080端口，而该端口是“Google地图”（Google map）软件所用的端口。

提示

一些航班不发送“纬度”（latitude）和“经度”（longitude）信息。所以有时即使你看到有某个航班的消息弹出，但却看不到该航班相关的坐标或航班号。

上面输出的这张表格中，有很多信息是相当令人印象深刻的，这些内容真的是从稀薄的空气中主动以“拉”（pull）的方式读取出来的吗？但是“一张图片胜过一千句话”。打开http://127.0.0.1：8080 ，随后你确实看到了飞机实时的跟踪信息，如图11-6所示。

图11-6　飞机实时的跟踪信息

dump1090工具的工作就是解调飞机以1090MHz频率上发出的“广播式自动相关监视”信号。这些信息会被该飞机信号发射功率覆盖范围内的其他飞机以及地面站所使用。数据没有加密，所以很容易在数英里以内接收到，甚至在室内，只要是带有天线，无论是RTL版的SDR设备，还是HackRF版的SDR设备都可以收到！

接下来，让我们特别关注一下SDR设备的另一个功能，那就是捕获业余无线电爱好者的短信信号。

通过gqrx程序解码“自动分组报告系统”协议

“自动分组报告系统”（Automatic Packet Reporting System，APRS）协议大致相当于业余无线电爱好者之间的“手机短信服务”（Short Message Service，SMS）协议，是1993年在“业余无线电频段”（Ham radio band）发送短的基于文本消息（short text-based message）而设计的一个无线协议。通过该协议所发的数据包可以在“中继器”（repeater）补发以后，最终连接到互联网，甚至连接到到国际空间站上！

不幸的是，大多数“自动分组报告系统”的通信数据包的内容都很无聊。那些业余无线电爱好者们，虽然主观上他们一般都很友好，并且没有任何恶意，但却喜欢使用“自动分组报告系统”做一些意义不大的任务。比如通过“自动分组报告系统”不停地向外发送汽车所在的位置，以便让每个人都知道他们的座驾在哪里。通常，他们所有被跟踪的对象本来应该是不停移动的才有意义，但在很多情况下被跟踪的对象都是固定的，并且有的时候一停就是几个小时。还有一些人，喜欢做一些更实际，也更刺激的事，就是使用“自动分组报告系统”来跟踪高空的气象气球。每天早晨，这帮人就开始像赛车一样，在一辆装满电子仪器的车里狂追气球的行踪，一直到他们的气球飞得临近外层空间无法追踪为止。当地的“无线电俱乐部”（radio club）可能更愿意带你去参加他们的下一次探险，并且偶尔会提醒你，他们的车现在还停在停车场外面，以此来炫耀他们的“自动分组报告系统”正在工作中，并且车上装满了各种电子仪器。

在美国北部，你可以在144.39MHz的频率上看到有“自动分组报告系统”数据包的发送。幸运的是，gqrx工具有一个内置的AFSK1200解调器模块，这意味着你可以简单地调谐到144.39MHz，然后选择“窄带FM”（Narrow FM，NFM）模式，再单击软件“工具（Tools）|AFSK1200解码器（AFSK1200 Decoder）”菜单项。那么随后，当设备接收到“自动分组报告系统”信息的时候，这些信息就将被解码出来，并显示在屏幕上，如图11-7所示的是在“北纬39.2148，西经76.4991”（即图上“3921.48N/07649.91W”）位置处捕获到的“自动分组报告系统”数据包。

图11-7　被捕获到的“自动分组报告系统”数据包

提示

记住：RTL版的SDR设备可能会有频率的漂移，所以在使用“瀑布”视图查看附近无线电爱好者所发送的数据的时候，数据会略有偏差！

有时你可能会发现，在你的程序的“自动分组报告系统”解码器窗口中，一直是空空如也。如果你想接收到这些“空野来信”，你就需要从下面几处建议中排查没有收到的原因。

·拨弄一下增益，调调看其他值的情况下是不是能收到什么数据。当有“自动分组报告系统”信息出现时，SDR设备会有很明显的“嗞…嘀…噢…喀”（Squee-awwwwwk）的声音出现。调一会儿增益，正常情况下，你总是能听到一个的。

·换另一副更好的天线，或者是将天线的头朝向山外没遮挡的方位。

还是没有收到吗？查看http://aprs.fi 网站，看看你所在的区域内是否有无线站点。

一旦你开始收到一些“自动分组报告系统”的消息，你就可能想进一步解码这些信息，最好是能将显示的消息中包含有GPS坐标的信息，都以加亮的方式显示。这样的工具也有不少，比如Dire Wolf软件，它的网址是https://home.comcast.net/~wb2osz/site ，另外还有Xastir软件，它的网址是http://xastir.org/index.php/Main_page ，都可以从接收到“自动分组报告系统”数据包中，提取地理位置信息，并且可以将这些信息按这些地址绘制在地图上，甚至如果你有正确的硬件和无线电许可证，对方会要求你回传一个回执信息。

虽然通过gqrx工具，可以将“自动分组报告系统”消息直接接收和解码，但是作为“自动分组报告系统”协议本身，对于业余无线电爱好者来说，还是有一些限制的。而另一个相似的，具有与“自动分组报告系统”差不多的功能，但却被更广泛地使用的协议叫作“传呼网络”（pager network），对于公众来说，更加普及，而且值得高兴的是，我们的SDR设备也仍然可以访问这种协议。

对传呼信号进行破解

我们最后要解码的数字信号，就是“POCSAG传呼”（POCSAG pager）通信数据包，其全称是“基于‘邮局代码标准化顾问组’的传呼业务”（Post Office Code Standardization Advisory Group pager）。寻呼机仍被广泛地运用在医疗和工业领域中 [6] ，所以对于黑客来说，这仍然是一个很好的机会，通过传呼，你可以从而在家里，就能听到一些外边人相互发送的传呼内容。只要你能捕获到这些数据包，传呼的信号很容易识别和解码。由于传呼的使用频率范围在不同的地理位置有显著的差异，所以你不得不需要到处寻找传呼可能使用的信号。可以搜索的频率有如下几种：

·.152~163MHz，这段频率被称为“甚高频”（Very High Frequency，VHF）

·.454~465MHz，这段频率被称为“特高频”（Ultra High Frequency，UHF）

·.929~931MHz，这段频率被称为“特高频”（Ultra High Frequency，UHF）

幸运的是，“邮局代码标准化顾问组”协议有一个非常独特的波形和声音效果。当你听到“哔…嘟，哔…嘟”（Bee-doooh）的声音的时候，就说明你现在有“窄带FM”（NFM）音频解调信号。将信号通过“快速傅里叶变换”（FFT），信号就会变成“蝙蝠耳朵”的形状，在信号的两端有两个明显的峰值，通过gqrx程序，其显示效果如图11-8所示。

在gqrx工具中，内置了一个“自动分组报告系统”解调器，但在作者所用的“软件无线收发”设备中，并没有配置对“邮局代码标准化顾问组”码的解调支持。不过，这个问题也不大，我们可以将这些音频通过UDP协议传送到另外具备对该协议进行解调和转换的软件工具上。整个操作的过程的概述如图11-9所示。

图11-8　“邮局代码标准化顾问组”协议信号显示效果图

图11-9　操作流程图

一旦我们发现了有通过“邮局代码标准化顾问组”协议传输的信道频率，我们需要将这个信道上捕获的音频数据流，通过UDP协议转发出去。要完成这个操作，我们在gqrx软件的“音频”（Audio）选项卡（在前面gqrx程序主界面的右下角），然后单击“音频设置”（Audio Settings）按钮（就是那个“扳手和螺丝刀”图标的按钮），然后选择一个端口，默认的端口值为7355。然后我们单击界面上“两台电脑”的图标开始在本地以“广播”（broadcasting）的方式发送音频流。你可以通过Netcat程序（其命令是“nc”命令）进行测试，使用时，将该命令连接到上面指定的端口即可工作，其操作实例如下所示：

因为上面gqrx程序和multimon-ng程序分别由不同的作者编写的，我们必须改变程序音的采样率，以便两个程序可以统一参数。尽管gqrx程序输出音频频率是48个“每秒千次采样值”（KSPS），而multimon-ng程序希望运行在22050“每秒采样值”（SPS）。命令行工具sox可以完成这种转变。不过，在使用这个程序之前，必须首先安装了sox数据包：

sox安装好以后，我们就可以通过该工具将gqrx的输出转换成通过UDP发送的数据包，其命令格式如下所示。

这个命令的前一半是告诉sox程序以“原始（raw）的16位有符号整数”值 [7] 的形式从“标准输入设备”（stdin） [8] ，以48000Hz的采样率进行采样。这里的“原始”采样，指的是所采用的音频值没有头部数据，直接全部都是音频采样值，就像我们在wav文件或mp3文件中 [9] 保存的那样。命令的后半部分是告诉sox程序以“16位有符号整数”值的形式从“标准输出设备”（stdout），以22050Hz的采样率进行输出，同样，发送的时候，采用原始没有头部数据的格式。最后，我们在multimon-ng程序中，接收由sox程序输出的数据，作为自己重新采样的数据。

multimon-ng是一个命令行实用程序，是由Elias nal编写，该程序可以解调许多不同的数字信号。要使用这一工具，我们需要下载和编译该程序的源代码，然后安装编译后的二进制可执行文件。其步骤如下所示：

multimon-ng程序的执行实际上是相当简单的。我们只是告诉该程序希望使用原始格式进行采集（即“-t raw”参数），并且是从“标准输入设备”作为输入源（这是通过单独一个减号“-”作为参数），而且在命令中，给出了一组尝试潜在的调制参数列表。在这组列表中，程序会依次尝试这些组参数，遇到成功即停止随后的尝试，或全部都不成功则退出。“邮局代码标准化顾问组”支持三种信息格式的解码，对于每种格式，multimon-ng程序都有相应的解码模式：

如果我们把所有上述命令集中到一行中操作的话，就会生成一个超长的命令行。这时，这个命令行的格式将如下所示。

注：在10.3.3节中提到，shell命令中的“\”表示的是转义符，而该符号后面紧跟回车的话，表示的是当前这一段和下一段的内容是连接在一起的，不仅这个“\”转义符不属于shell命令的一部分，随后的“回车”也不是命令格式的一部分。你可以将“\<回车>”理解为只是显示格式上的优化，在命令执行的时候，该符号都将被去掉。——译者注

一旦mulLimon-ng程序正常运行，它就会打开一个简单的示波器（oscilloscope）界面显示从输入接口中采集到的数据。下面显示了一个有效的输入信号所展示的示波器界面效果，该图上起伏的波形，正是通过gqrx程序选定的频率后，捕获到的音频频率的一个实例效果。

运气好的话，在你程序的界面上将会开始出现滚动的页面。一个传呼数据捕获的实例，内容如下所示，考虑到隐私问题，内容中，部分与技术无关的敏感信息和累赘的冗余信息都经过了编辑，比如，有些都以“XXXXXX”显示，有些以“…”省略掉。

如果你做到了这一步，那么就祝贺你了！没有这些专业的硬件，你能将模拟的无线电波想尽办法转换到ASCII数据的格式，也都是徒劳的。这不是故意要嘲笑大家，看看上面流程中所要求的所有步骤，我想你会支持我的说法的！

在本章的开始，我们就陷入，然后跳过了一些关键的概念。通过这些术语讨论SDR设备上的技术问题是件很“酷”（cool）的事情。深入了解这些概念对于更好的掌握SDR设备能做什么，不能做什么，做某事可能会出现什么问题等方面，都是一个关键的因素。

[1] 软硬件的版本号通常没有硬性规定，所以导致其形式多样，但就某一个具体软硬件版本来说，一般都是有规律的。例如有些系列，某一版本的加强版就是在当前版本后面加一个“+”号，而再加强的版本，就是后面跟上“++”，但没有人画蛇添足地使用“+++”作为后续累赘的版本号，于是有人想出把两个加号交叉重叠使用，于是“#”符号就出现了。并且有些系统跳过了“+”和“++”，直接将“#”作为其加强版的版本号，本处大概也是这个意思。这个符号的英文发音等同于英文单词sharp的发音，中文俗称“井号”。——译者注

[2] 这里的“音频”和“耳朵”都各有两层含义。其一，SDR设备的本来作用是接收无线广播信号，所以这里的“音频”指的是调频广播信号，而“耳朵”就是我们听音乐的耳朵；其二，实际上，我们使用SDR设备来接收无线信号，所以这里的“音频”泛指各种无线信号，而“耳朵”当然指的就是SDR设备本身。——译者注

[3] 这个说法只能说是美国的特点，由于调频的覆盖范围很有限，一般都是几十公里的范围，所以中国基本上是以城市为单位，而不是以省为单位，更不会全国统一，每个城市都有自己独立的调频系统。即使两个城市使用了同一个频率，其内容也是完全不一样的。——译者注

[4] 严格地讲，所有的调频FM频率都是偶数。只是如果以0.1MHz（即“十万赫兹”）为单位的时候，才具有“不是偶数”的特点，但这也只是美国调频FM的特点（每个信道占用200KHz的带宽，所以只要有一个是奇数，则所有都是奇数）。中国的调频不存在这样的特点，比如上海的“海上戏剧频道”的调频是92.4MHz。——译者注

[5] ADS-B主要应用场景是航空器之间，或与地面之间进行数据传输的协议。所传的数据包括空域交通、天气、地形等飞行信息，让机组人员清晰地了解周边的交通情况，提高情景意识，并可用于航空公司的运行监控和管理，为安全、高效的飞行提供保障。——译者注

[6] 上面说的是在美国的现象。在中国，传呼仅仅在上世纪的最后十年和本世纪的最初十年盛行过20年，随后就因手机的普及而迅速消失。——译者注

[7] 这时的“16位有符号整数”是声音的分辨率，16位共可表示216种声音量化的值。——译者注

[8] 在音频采集领域，“标准输入设备”指的是声卡的标准输入接口。至于这个接口上插的是什么则要看用户自己的需要，家庭台式计算机一般插的是视频聊天时使用的话筒，有些还可以插入一些电子音乐设备（如带midi功能的电子琴）。后面的“标准输出设备”，同理指的是声卡的标准输出接口，通俗地讲，就是我们平时插耳机或音箱的那个接口。——译者注

[9] 无论是wav文件，还是mp3文件，本身都是有文件头的。但这里指的不是文件本身的头部，而是指这两种文件的音频内容中，每组音频的头部。——译者注

11.4　数字信号处理的速成课程

到现在为止，你应该对gqrx程序中遇到的“快速傅里叶变换”（FFT）和瀑布的特点开始适应了吧。在“频域”（frequency domain）的范围内分析数据的传输，对用户来说，通常会有一个相当直观的形式化印象，这无论对于信号定位、识别、两信号间比较都是一样。然而，这也只是图表中所表达的内容中的一半内容，另一半对信号的分析，则是通过“时域”（time domain）实现的。在这一节中，我们来讨论一下数字无线通信的内部工作机制。

11.4.1　最基础的通信

想象一下，在我们十岁的时候，我们需要通过我们的“树上堡垒”（tree fort）之间传送秘密的信息，两个“树上堡垒”之间有一定的距离（如图11-10所示）。所以我就抓住我妈妈的花园浇花软管，在软管的一头套上一个气球，然后你就你那边的“树上堡垒”中对着软管吹气，你所吹的气通过软管到达我这边，就把气球吹大了。

图11-10　通过“树上堡垒”通信

通过软管吹气球，我可以向你发送一个消息；如果在预定吹的时候，我没有吹，那么一个瘪的气球也同样表示我向你发送了一个消息，只是这两个消息表示的意思不一样。比如不吹气球表示“送我条金枪鱼；我的老虎饿了”；那么，吹气球则可以表示为相反的意思。当然，既然这么做可以发送多于一个消息了，所以我们很快就发明了二进制，并且通过上面的方式，约定了每五秒我们之间至少会做一个“吹”与“不吹”的动作，这里的“吹”与“不吹”的动作其实就是二进制传输中“位”（bit）的概念。

很显然，这个方法很快就遇到了一些问题。我们都有了难以说出的节奏感（sense of rhythm），因为有时我需要超过五秒或者更长的时间才能发送一个“位”。这会对接收方带来困扰，对方是发了连接的两个“0”？还是只有一个“0”？或者，在无意识中，你接收的时间起始点，正好是发送方发送过程中的某个点。这都会导致“发送方的发送没有出错，接收方的接收也没有出错，但接收方接收的信息不是发送方发送的信息”的现象。为了解决这个问题，我们发明了一种数据包结构，即在数据中增加一个“校验和”（checksum）。这样，发送方在发送前，先对要发送的数据通过一定的算法算出一个“校验和”，然后在发送的时候，除了发送数据之外，额外加上这个“校验和”。接收方将数据与“校验和”一起接收后，通过同样的方法对数据进行计算，然后将自己算出的“校验和”和接收到的“校验和”进行比较，如果二者一样，则表示数据是对的，不一样则表示或者接收到的“数据”是错的，或者接收到的“校验和”是错的，总之，接收到的数据是错的。这样，我们至少可以确保得到消息的正确性（包括正确和错误两种可能）。挺复杂的，不是吗？

如果你用过像Arduinog一样的微控制器，你会知道这是怎样的数字通信工程。上面例子中的软管代表的是信号传输线（或电路板上的走线），吹到气球中的压力代表电压。显然，上面吹气球的这个“系统”具有一定的物理局限性，因为我们只能在一个方向上进行通信（就是吹气），除非我们再拉第二条等长的软管，在另一端套上气球由这边来吹，或者事先约定好，在软管的两端都可以套上气球，并定时切换由谁来吹。同时，如果软管的长度太长，那么要吹大一个气球，将耗费的能量太多了。

11.4.2　最基础的无线通信

同样在上面的例子中，我们在发送1和0的过程中，随时有可能会有数据丢失现象。显然，我不能在发送0的时候，把周围所有的大气都吸净，而生成一个真空的环境。同样，我们可以像动画片“Cap’n Crunch”一样，只要吹响哨子（whistle），就可以搅动周围的空气压力以便让你的耳朵可以听到，这样做的好处是双向通信也容易了，但是代价就是附近的所有人都可以接收到我们之间通信的信息。

当然，就像我们必须与我们的父母和邻居共享相同的空间一样，在爸爸正在修剪草坪的时候跟他沟通是相当困难的。街道对面的那个恼人的孩子在偷走了我们“Cap’n Crunch”哨子，然后再与我们进行沟通的念头，不用说也是行不通的。要想让我们所做的事变得更容易，我们只有把我们的哨子换成长笛，因为长笛有许多个音洞，多种发音的音调，这样，当我们遇到一种干扰源的时候，我们可以“移动”到另一个远离干扰源的通信方式上。

这种原始的例子正在一点一点地接近无线通信工程。大致的意思就是：我一次发送一个“广场”的1，虽然简单，但是也难免出错；但是如果能在传输的过程中，发送一个需要改变的“通知”，然后临时地改变频谱却是件很容易的事。通过下面的一个例子，我们看看能不能理解“邮局代码标准化顾问组”协议的工作原理。

11.4.3　在“时域”和“频域”上的POCSAG信号

“邮局代码标准化顾问组”（POCSAG）协议是一个无线通信协议。这个协议的数据传送机制是，从开始时首先拿到一段文本信息，然后将这段文本信息保存在一个有几千字节容量的内存芯片中，再根据数据包的结构将数据打包，最后，将这段打好包后的信息以“位流”（stream of bit）的方式发送到空中，而无线调制模块在调制这些信息，然后将它们依次发送到空中的时候，是以一个电磁波的形式发送的（见图11-11）。

图11-11　以电磁波的形式发送信息

在这里，你可以看到一个模拟的“邮局代码标准化顾问组”协议编码在“时域”上的传输过程。上面的虚线是帮助你看清楚原始的二进制信息。在这种情况下，“邮局代码标准化顾问组”协议使用两个频率值代表数据，其中较低的频率表示0，较高的频率表示1。这种调制称为“二进制频移键控” （Binary Frequency Shift-Keying，BFSK），也可简称为FSK。利用“树上堡垒”的例子，“二进制频移键控”就像用长笛发出两种不同的音符来表示发送的信息。

回到我们的例子上，在信息结束之前，有人用一个强大的发射器开始与我们进行对话，这就形成了对我们的“干扰”。虚线表示我们的数据仍然是存在的，但由于新的信号叠加进来以后，导致我们很难看出原来的数据信号，如图11-12所示。不过，在我们放弃这些后来干扰时的数据包时，让我们来检查一直被干扰期间的“频域” 信号。

图11-12　“干扰”信号加入后的波形图

两条竖直的“铁轨”瀑布代表的是信道上的每个用户正在发送信号。两个“铁轨”的每一个轨道上，都有两个频率值，而使用这两个频率信号就可以构成上面所说的“二进制频移键控”。如果你看到这个信号的“快速傅里叶变换”图的话，那么这里的两个“铁轨”看起来，会像一对“兔子耳朵”。

比原来信号中的“1”和“0”本身大得多的是“干扰信号”（interfering signal）；就是图11-12中，右边的竖亮条。如果我们让这个信号通过一个“滤波器”（filter），就可以可以把干扰过滤掉，然后留下我们想要的信号，消除不必要的“噪声” [1] （noise）。在“时域”上，这样做就可以消除“干扰信号”，最终让我们看到我们的信号。当然，无论我们怎么做，总是还会有一些“干扰信号”通过滤波器，最后仍然保存在正常信号中；只是我们希望能尽可能多地过滤掉这些“噪声”，防止读取“位”发生差错的现象发生！

11.4.4　声音中的信息

到目前为止，我们已经可以方便地将无线通信信号想象成我们经常听到的声音了。但是毕竟二者还不能完全等价，简单地说，二者唯一的区别在于声波和通信用的无线电波之间的传播介质和使用的频率是不一样的。这是一种说法，其实还有的区别就是，不是所有的无线信号都有声音。著名的“木星之声”（Sounds of Jupiter），是由“旅行者一号”（Voyager I）航天器所录，其实名为“之声”，实际上所录的只是在经过这个星球的时候，这个星球表面的太阳风（solar wind）所引发的电磁波的信号值。然后有人将这些信号加速，并且将其转换到人类听觉频率的范围，然后再把转换后的信号通过扬声器播放出来，享受这种“天籁之音”的效果。而实际上，在太空中，是没有我们人类可以听得到的声音的，只有那些听不到的无线电磁波。

可是，换一种角度，我们也可以发现，有好多种无线通信方式喜欢用声音进行交流，比如“自动分组报告系统”（APRS）解调器，以及V.92协议调制解调器。这取决于你如何看待它。这些调制解调器的原始设计者意识到电话线有3~4KHz带宽，所以在设计自己的协议产生的电信号时，如果能“看”到这些信号，那会显得很直观，于是他们就把这个带宽的数据当成是声音的带宽，然后将其当作声音。在某些情况下，比如对方传的原始信号恰在声音的范围内，那么这个信号通过“声音耦合器” （acoustic coupler）后，在调制解调器上还是可以听到声音，这时，就相当于有两个持有手机在通话一样。

抛开上述个别比较钻牛角尖的事例之外，整体上，你应该对原始的无线通信理论有较好的理解。下面就将结合这一新的认识去攻击脆弱的无线设备。

攻击车库入口的电子钥匙

如果你做到了现在这一步，你可能已经发现，SDR设备的功能远远超过我们已经向你展示的上述，在生态系统领域内有限的应用。当然，“好马还要配上好鞍”，除了SDR设备本身，还要有dump1090程序和multimon-ng程序的鼎立支持。其实，“好马好鞍之外，还要有好的骑师”，那就是对于SDR设备，有什么样的工具能从“无线轮胎压力监测系统”（Wireless Tire Pressure Monitoring System，TPMS）以“拉”的方式拿到数据呢？在一次模糊测试中，又有什么应用程序允许你发送任意格式的“全球移动通信系统”（GSM）协议的数据包呢？这下麻烦了，我们大概要东拼西凑地去各处找针对具体应用的这些程序。其实则不然，想想这个设备名字中，本应属于“硬件”来做的“无线收发”，现在却改成了“软件”来负责，这其实就足以说明，即使是针对上述不同的应用，通过软件的定义，我们仍然可以通过SDR设备进行控制。

虽然我们不能在仅仅一章的内容里就教会你如何建立一个属于你自己的“全球移动通信系统”协议栈，但是，我们可以教你一些基本的构建块，就像搭积木一样，有了这些基本块，剩下的就是怎么搭了。比如，许多现代电子设备使用的“开关键控”（On-Off Keying，OOK），这显然是一个简单的，容易理解的调制方案。在这一部分中，我们将分析“无线电子钥匙”（wireless key fob）系统，并试图确定该设备是否存在容易遭受攻击的漏洞。

像所有真正的入侵一样，黑客需要一些努力、技巧、耐心和运气。这种类型的分析一直是充满着挑战性，心脏脆弱的请绕道离开！

11.4.5　挑选攻击目标

找到一个“开关键控”的发射器应该不会太难。在你的房子周围，可能就有多个这样的设备是采用“开关键控”技术的，比如车库门遥控器、汽车的电子钥匙、气象站、门铃、智能喷水枪。我们建议先从一个廉价的无线门铃，或者简单的车库门开启装置开始，因为越便宜的无线设备，越有可能采用“开关键控”技术。

在这次攻击中，我们的目标是“精灵公司”（Genie Company）的车库门开启装置，这是作者本人所使用的。你不需要为了检验本节的内容而专门再买一个这样特定的产品，因为这里介绍的是通用的步骤，这些对付这类电子产品的技术可以直接应用于你所选的其他电子产品上，一般情况下，同样可以作为你自己攻击实验中的目标。

设备的侦听

虽然，进行“黑盒测试”（black-box testing）是完全有可能的，但那样只是对于一个初学者才采用的方式。为了减少这里攻击情节描述的复杂性，现在，我们假设你已经能对要攻击的电子设备进行物理层面上的访问，换句话说，就是你可以走的离车库电子门足够得近。那么第一个问题就是“什么是FCCID？”，“美国联邦通讯委员会”（Federal Communications Commission，FCC）是一个组织的名称，大多数的无线设备，若要在美国销售就必须符合该组织的“FCC Part 15” [2] 条例。“美国联邦通讯委员会”维护着一个兼容设备的在线数据库，提供对各种电子产品的测试“记录”（test record）、“所分配频率”（frequency allocation），“产品用户手册”（manual），甚至产品内部的照片！“美国联邦通讯委员会”会为每个设备编一个唯一的识别码，有了这个概念，那么FCCID就是“美国联邦通讯委员会设备编码”。

通常情况下，“美国联邦通讯委员会设备编码”（FCCID）会印在装置的背面，有时候该码也会直接在设备模具的外壳塑料上塑模成型，也有时候只是简单地在外壳上印上一个标签，在标签上打印或手写上这样的编码。如果你在设备上找不到编码，那就检查包装盒或说明书。找到这个“美国联邦通讯委员会设备编码”之后，你就可以通过“美国联邦通讯委员会”的网站进行查询，网址是http://transition.fcc.gov/oet/ea/fccid 。

图11-13　车库门遥控器上的FCCID

如图11-13所示，这个车库门遥控器上的“美国联邦通讯委员会设备编码”是“B8QACSCT”，乍一看，我们也看不出什么意义。要想知道每一位的明确含义，我们需要知道该编码的组成结构，这个ID值可分为两个部分，分别是“受让人代码”（grantee code）和“产品代码”（product code），其中，“受让人代码”由三或五个字符组成，剩下的那当然就是“产品代码”了。对于这个实例，“B8Q”就是“受让人代码”，而“ACSCT”就是“产品代码”。把这两个值输入到“美国联邦通讯委员会”FCC的网站后，可以查询到一组产品文档的列表，本实例中，查到了两个结果，如图11-14所示。对这些文档的内容稍稍进行一点点的信息挖掘，我们就会发现这款车库门遥控器的无线频率被分配到390MHz上，如图11-14产品列表中，最右边一列字段所示。

图11-14　实例查询结果

没有上述这些信息，我们就只能通过gqrx工具在空气中，通过暴力破解（brute-force）的方式，搜遍所有频率来找这个无线车库门遥控器的频率。这种情况也不是不可能的，每次当我们按下“搜索”按钮的时候，当然心里希望能有所斩获，只是有些时候，用些巧劲儿又是完全必要的，比如如果某次攻击中，你必须得靠暴力方式找到对方所用的频率，若你要搜索的产品属于工业（Industrial）、科学（Scientific）和医疗（Medical），三者常被合称为“ISM”，那么它们三个行业产品的无线频率，一般分别开始于315MHz、433MHz和915MHz。记住，如果采用更高的采样率，那么你将会不断地看到更多射频频率的频谱。

11.4.6　查找和捕获射频发送信号

在本节中，我们将使用一个新的工具，名叫osmocom_fft。该程序的用户界面是一个精简版gqrx程序和SDR#程序，不过该功能注重的是实用而不是功能繁杂。我们的目标是找到要捕获无线设备的信号，所以该软件主界面图的正中间，就是频段的中心，在图中设定好中心频率以后，再选择一个合适的增益，并将这些参数保存到一个文件。

下面就可以运行RTL版的SDR设备，中心频率设定为390MHz，采样率设定为2.5“每秒百万次采样值”（MSPS）。这给了我们一个“大水桶”（wide bucket）来装所捕获到的信号，这是为了防止某些无线电子设备万一不按“美国联邦通讯委员会”规定的频率值发送数据的时候，我们也能捕获到。另外，我们也把射频增益调在某个地方的中部，对于增益这种耗大、影响极大的参数来说，仅凭预感，我们就知道电池可能很快就能耗掉一半。最后，我们知道这些无线设备信号传输持续时间将是很短的，想想按一个汽车的无线钥匙还能用多长时间呀，多数情况下比眨眼还快。为了让我们不错过对方的每一次按键，我们不妨启用“峰值保持”（Peak Hold）功能。

一旦我们按下了车库门遥控器的按钮，在软件osmocom_fft的主界面上，我们就会看到一个突发的活动，在390MHz的左边一点，如图11-15所示。太棒了！这是我们第一次尝试就抓到的第一个信号。不用说，在实战中，我们并不总是这么幸运。

图11-15　在软件osmocom_fft上看到的突发活动

虽然我们找到了要找的信号，我们还没有准备好去捕获到它。在这个例子中，我们所设的增益值太高了。所以在该频率的左边和右边，分别都出现了一些干扰导致的扭曲，解决这个问题，我们可以降低增益，直至这些扭曲消失在噪声层（noise floor）中，如果你看到“载波振荡”（carrier wandering），那就每次给予100KHz的微调，因为这种偏移不是你的接收机造成的，而是对方廉价的无线车库门遥控器造成的，可以说这也是廉价的“开关键控”类发射器的共同特点。你可能也注意到图的中心一个直流的“穗”状毛刺，这是射频测量系统中的一种常见伪影现象（artifact）。调整你的信号“偏移量”（offset），一直到直流的“穗”状毛刺不再干扰你的正常数据！

剩下要做的就是将捕获到的数据保存到一个文件中。按下右下角的“录制”（record）按钮后，应用程序就开始将射频采样的数据保存到硬盘中了。连续捕获两个或三个好的发射数据以后，就可以再次单击“录制”按钮停止当前录音。

11.4.7　通过盲测发起“重播”攻击

示例中的这个车库遥控钥匙是很老的型号，所以只要简单地将上面捕获到的数据包简单地“重播”（replay）一下，就可以打开车库的大门。打开HackRF版的SDR设备，后面的处理过程非常简单，注意你在osmocom_fft软件上的设置，主要是“频率”、“增益”和“采样率”三个参数。接下来，就可以开始捕获的过程了，这里用的是HackRF版的SDR设备上自带的hackrf_transfer程序。其命令格式和运行效果如下所示：

采样的数据都被保存到一个文件中。命令中的“-a”参数、“-l”（小写L）参数和“-g”参数主要分别用于调整“幅度”，“低噪音”（low noise），和“中频增益控制”（intermediate frequency gain control）。另外，“-f”参数是以Hz为单位的采样率。如果你想知道该命令中更多有关参数的信息，可以运行“hackrf_transfer--help”。在完成采集数据的记录以后，按Ctrl+C停止捕获过程。

要重传这些信号，以发运“重播”攻击，可以运行以下命令：

在这个例子中，“-x”参数的作用是设置发射增益。这个参数具体选什么值，当然就是“仁者见仁，智者见智”的事情了，一般都是“看不同人的口味下调料”。除非你碰巧有一个频谱分析仪，可以帮你确定需要设置多少发送信号的输出功率。你可能会认为存在一个0分贝（dB）的增益值来发送原始信号，但实际中这种情况是不可能存在的，因为发送0分贝的增益就意味着你的发射器必须位于一个“极度安静”（quietest signal）的场所中。

注意

假设你站在你的车库门附近，我们发现10~20分贝的增益就可以很好地捕获信号。但如果没有发射天线连接到你的无线收发设备中，一个噪音的干扰就有可能破坏，甚至摧毁设备中的模拟电路，所以一定要确保你的天线是与你的SDR设备是硬件兼容的！这里所说的“兼容”不是尺寸上正好可以安装，而是指二者要匹配正确阻抗（impedance），阻抗组一般在50欧姆（ohms）左右，并且在操作前就将频率设好，直接设为目标的工作频率。

如果设备不工作怎么办？

设备的正常工作，通常是所有环节设置都对的结果，但导致设备不能正常工作的原因太多了，所以面对“如果设备不工作，该怎么办”这样的问题，答案就是“没有直接的答案”。这种练习就像是“撬锁”（lock-picking），谁也不能说哪种方法就是好的，哪种方法就是对的。“自己动手，丰衣足食”，通过你对SDR设备工作原理的理解，你需要自己开发出一套直观的操作流程，然后借助于你自己的流程，操控SDR设备，完成攻击，并且在某些情况下，你需要的纯粹是运气。对于创建符合你自己习惯的套路，我们可以给你一些想法，但是没有承诺。

如果你攻击一个廉价的无线门铃，或是一个旧车库的电子门，这一招应该很灵。攻击上述设备失败的主要原因，最大的可能是你的SDR设备的发射信号太弱导致的。解决方法也很简单，逐步认真地加强发射增益，并尝试重新接近这些无线设备的接收机。如果还失败，那就是你的信号仍然还是太弱，继续尝试加大到更大的接收增益，直到显示出接收的波形。

现代车库的电子门和汽车，都在安全系统上有了较大的改进，很多产品都通过“滚动码”实现。这样做的好处是，即使你偷偷录制了某个电子门或汽车的上一次通信数据包，但由于电子门或汽车在使用一段时间以后，就自动滚动到下一组值上了，所以即使你通过“重播”攻击，也许只能有效地使用一次，也许根本连一次也用不了。在录制远端通信的过程中，如果想“重播”看看效果，也要确保你的距离足够远，以便对方的电子门和汽车接收器无法“听到”你发的“重播”信号。对于现代的电子门和汽车系统，这些录制的数据通信包应该尽可能早地使用，因为先进的系统可以在某个编码使用一段时间以后，自动终止该码的使用，而更换成新的编码，这个时候，再用原来保存的旧码通过“重播”攻击方式进行攻击就没有效果了。

现在我们已经检验了捕获和“重播”功能，所使用的实例就是开启一个简单的车库电子门。下一步，让我们进入到一个更高级的攻击方式，即攻击一个“免钥匙开门”的汽车系统。

攻击“免钥匙开门”的汽车系统

在写作这一章的过程中，Johnny Cache跑过来，想看看我们能否破解他“Mini Cooper”小轿车的“免钥匙开门”的汽车系统（keyless entry system）。根据前面我们破解车库大门电子锁的那套设备和操作流程，我们使用了相同的认证手段、相同的捕获数据包方式、相同的“重播”技术，的确打开了一次它的车门。不过，当我们想第二次打开的时候，我们发现之前捕获的数据包已不再有效。难道“Mini Cooper”使用的是“滚动码”机制？或者车锁系统采用的是“质疑响应”（Challenge response）机制？我们不得不回过头来，从自身的操作流程和分析思路上找问题的原因和解决办法。既然前面我们已经将捕获到的开门无线信号的波形记录到磁盘上了，那么我们就不需要再从捕获无线信号这一步开始了。

在本节中，我们使用“‘GNU计划’中无线部分同伴”（GNU Radio Companion）设计一个信号处理算法，来还原从无线车钥匙上捕获到的数据包。我们的算法将非常接近于那个我们正在分析的无线电子车钥匙的型号，所以你需要在这些设备上改变这些步骤的时候，只需要进行微调即可，当然也不排除有大幅调整的可能。而且，这种设计方法是非线性的（nonlinear）和实验化的（experimental），所以要想在最大程度上获得成功，我们需要关注的是概念的内涵（implicit concept），理解它想表达的深层含义；而不是“邯郸学步”，只是简单地模仿前面各个明确的操作步骤（explicit step）。

“GNU计划”中无线部分的“Hello World” [3] 　当我们要创建一个应用程序的时候，通常会先构建一个框架，然后借助于这个框架来验证当前的工作是不是有益的。对于现在要进行“Mini Cooper”车门只能接受一次“重播”攻击的事实，我们要建立的框架就是将一些信号加入到一个“快速傅里叶变换”数据块（FFT block）中，并且确认一下，我们确实看到了相同的发送数据包，而这个发送的数据包正是我们之前记录的。记录的步骤如下。

1）打开gnuradio-companion程序，这个程序可以让我们通过对所用数据包的选用数据块（using block）的拖放处理（drag-and-drop process）设计出我们自己的信息处理算法。

2）按下Ctrl+F组合键，查询“文件源”（File Source）数据块，然后将选中的块拖到“工作区”（workspace）上。

3）双击“文件源”（File Source）数据块，就可以打开该数据块的“属性”（properties）窗口，单击窗口中的标题为省略号“...”的按钮，就可以打开文件浏览器，并选中你所捕获的文件。

4）查询“减速”（Throttle）数据块，将该数据块放在你的“文件源”数据块的后面。单击“输入”（In）和“输出”（Out）选项卡就可以将这些信息插入到“减速”（Throttle）数据块中。这个数据块的作用是负责限制采样样品从磁盘文件中的读取速度。除非你使用的是一块硬件（例如声卡或SDR设备），否则你应该在流程图（flowgraph）中的某个地方包含这个数据块。

5）在“减速”数据块的后面放置一个基于QT的图形化频率接收器，然后连接上去。当你运行这个程序的时候，程序将会在输出显示中增加一个“快速傅里叶变换”视图。

6）确保“选项”数据块（Options block，通常在界面的左上角）是用于生成一个QT图形化界面的设置，而不是使用WX工具包（QT最终会成为gnuradio-companion程序的图形化界面）。

7）打开名为samp_rate的“变量”数据块（Variable block），将该项设置成与你文件的采样率相同的值。我们在osmocom_fft程序中使用的是1个“每秒百万次采样值”（MSPS），所以我们进入1e6（或1000000）。这个变量是全局和传播在工作区中的所有数据块。

注：以C语言为主的编程中，数字的科学计数法表示形式。1e6等价于1×10⁶ ，即100万。——译者注

8）将上面流程保存到磁盘文件中，然后单击绿色箭头来开始执行程序。

注意

在设置的时候，要确保你的samp_rate值设置的是正确的。许多“数据块”操作都需要知道两次采样之间的这个时间段长度，比如说“滤波器”就与采样率关系很大。另外，虽然同为“数据块”的名称，但不要在上面的概念中混淆了“减速”数据块的作用，“减速”数据块只影响文件处理的速度，而不会影响到收发速度怎么处理。

注意，在图11-16只有一个峰值了，一峰值就意味着只有一个“开关键控”发射器。如果你看到两个峰值，那您的设备可能是一个“二进制频移键控”发射器。保持这种状态继续监听着！你还应该能够得到一些数据；只是我们得多做一些工作才能够关联并得到这一些值！

图11-16　我们的第一个“GNU计划”中的无线程序，包含了程序的输出

信号波形加工　在我们的例子中有一个非常干净的信号，中心频率接近于0Hz。大约40dB的信噪比（Signal-to-Noise Ratio，SNR）是一种优良的低数据率数据，很像前面提到的“开关键控”发射器。如果设备所接收到的信号中有干扰信号，或很弱的信噪比，那么你可能需要对你的信号波形进行加工。虽然你不能改变你的信号所对应“底噪”（noise floor）的振幅，但是可以去除噪声，有效地提高信噪比，这个过程可以通过以下步骤实现：

1）从前面的步骤中，使用“快速傅里叶变换”公式，写下你的信号占用频率的范围。在我们的例子中，信号之间运行在-100kHz和+100kHz之间。

2）如果你的信号是接近您的图形的中心，那么使用一个“低通滤波器”（Low Pass Filter）。并且放在“减速”数据块和“快速傅里叶变换”之间。

3）如果你的信号向一侧发生偏移，你可以使用“复用”数据块（Multiply block），配以余弦函数（cosine）调用，将其调谐到中心点上。然而，这样你可能会发现使用的“带通滤波器”（Band Pass Filter）会更容易。

4）设置你的滤波器的“截止频率”（Cutoff Frequencies）和“传输带宽”（Transition Width），并重新运行程序。在这个例子中，我们配置了“频率接收器”（frequency sink）同时接收两个流，所以我们可以比较它们的之前数据和之后数据的差异，如图11-17所示。

图11-17　配置频率接收器后接收的两个数据流

学生常常问我“什么是一个合适的滤波器”？如果我们从开始到结束，设计的是一个高性能的无线滤波器，我们可能需要使用“匹配的滤波器” （matched filter），这样可以利用一个已知的信号更可靠地检测到一个未知的信号。然而，这更多的是一种“餐巾纸的背面” [4] （back of the napkin）式的逆向工程项目，同样，现在仅仅是设计一个滤波器，通过该滤波器让你的信号在通过的时候去除掉你不要的那部分频谱。

也就是说，数字滤波器不是让信号更自由地想到哪个频段就到哪个频段，而是在传输的时候，限制在更窄的带宽范围之内。带宽越窄，你的滤波器就与CPU关系越大。选择一个比你的采样频率略少百分之十，可能会使你的模拟显得更缓慢。在这个例子中，我们将“低通滤波器”设置在任一方向上允许+/-100kHz的变化范围，这样可以将下一个100kHz内的噪声逐渐减弱。你可以在前面的图像中看到，在滤波器滤通区域之外的“底噪声”显著地下降了。

解调“开关键控”发射器　该过程的下一步，是瞥一眼正在发射的实际的数据“位”。这里，我们需要引入两个新的数据块。“复数型Mag”数据块（Complex to Mag block）负责解调“开关键控”发射器，和“QT图形界面时间接收器”数据块的作用是及时将解调后的声波输出出来。如果你碰巧有一个“二进制频移键控”信号，那就用“正交解调器”（Quadrature Demodulator）取代“复杂型Mag”数据块。

在放置数据块的时候，需要注意“复数型Mag”数据块的选项卡的颜色将会由蓝色变成桔黄色，变化的原因是因为数据类型已从“复数”变为“浮点数”。令人遗憾的是，我们没有足够的空间来讨论复数型信号。如果你对本问题比较好奇，属于数学极客 [5] （geek）或一个数学公式受虐狂，我们高调推荐你看《复数信号处理：复数型，而不是复杂的》（Quadrature Signals：Complex，But Not Complicated）这篇文章，该文章由Rick Lyons所写，其网址是http://www.dspguru.com/dsp/tutorials/quadrature-signals 。在任何情况下，都要确保你配置“QT图形界面时间接收器”（QT GUI Time Sink）的数据类型是“从复数型到浮点型”（Complex to Float）这个选项。

“QT图形界面时间接收器”是一个复杂的数据块，有许多配置选项。图上所选择的参数值，也正好是将根据上面例子中所用的参数值。这些选项可以在运行时通过双击图上区域进行查看。

第一次时，我们按这个流程图的顺序运行程序，迎接我们的是部分数据“位”因为数值不停地变化，而从整体看上去在不停地闪来闪去。回想起来，这是有道理的，因为我们已经将“QT图形界面时间接收器”的值配置为一次显示1024个采样值。对于一个有1个“每秒百万次采样值”（MSPS）变化率的采样值，每个值只能在窗口中显示短暂的1毫秒，那数据位不闪反而不正常了。找到问题所在，解决方法也很简单，在图像中间单击菜单，我们配置数据块显示的点数为“100倍速”显示（即“100 x”）。这样，一旦有一次数据发送出现，我们就可以停止当前的显示，操作方法仍然是在图像中间单击一下菜单。然后按下鼠标左键，拖动出一个“缩放框”（zoom box），以便让系统知道我们想看的区域，然后系统就只显示这个区域内的图像内容。如果想调整图像内容的大小，可以通过右键鼠标缩小（zooms out）图像，左键鼠标放大（zooms in）图像，或者你可以使用鼠标滚动轮进行调节，其方式和其他程序通过滚动轮调整大小的方式一样，故不再赘述。

在图11-18中，你可以看到，数据流的部分是由1和0组成。每一个“位”看起来和旁边相同的值的“位”看上去都有些不同，这是系统中的噪声造成的。如果信号传输的距离远一些，那么“位”的振幅会减小。如果噪音太大，或信号的幅度太低，那么你可能会在记录某一位的时候意外地出错。

图11-18　调整后的数据流

对信息进行解码的方法之一，是把一个屏幕的窗口进行截屏，然后手工地录制每一个比特位。这也是一种“把自己搞得头晕脑涨，失去你仅有的那么一点理智”的伟大方式，这样做很容易让电脑明白和理解我们。除此之外，“时钟恢复” （clock recovery）也是一个最复杂的、令人沮丧和棘手的一件事。另外，因为我们对“逆向工程”（reverse engineering）就是一个睁眼瞎，所以想知道我们正在做的这一部分是否正确，也是件很困难的事。最重要的事情是我们可以帮助你设计自己的系统，那就是放置一个“时间接收器”（Time Sink）到流程图的每一步，这样只要你在每一步中检查时间接收器的结果，就可以确定所输出的结果是不是你所期望的值了。

首先，我们必须确定一下，数据“位”发送的速度有多快，换句话说就是“波特率” （baud rate）的值有多大。在传输开始时，首先传的是“前导码” （preamble），这样对于同步定位是有帮助的。“前导码”通常是一个值为“10101010……”的字符串，并且在通信的时候，“前导码”会重复地发送足够多次，以便帮助作为接收方的计算机“锁定”时钟。通过使用“时间接收器”，我们算出它花了大约2.1毫秒发送10个数据“位”，做一个小小的除法运算，也就是4761比特/秒，因此我们使用最接近的波特率值为4800波特 [6] ，因为对于串行端口来说，这是一个有效的波特率，在这个波特率中，我们有足够的信心可以保证数据传输的正确性 [7] 。

注：很简单，就是10/2.1×10³ =4761.90。——译者注

在速率为1个“每秒百万次采样值”（MSPS）时，每个“位”将有208.3个采样 [8] 。这是一个很大数据量的样本！我们配置的“低通滤波器”将其除以20，也就是说每20个采样，只取其中1个。那么这样，每一个符号“位”就给我们留下了约10.4个样本。通过使用“Marker” [9] 标注“时间接收器”，我们可以看到实际的采样值，如图11-19所示。

图11-19　通过Marker标注“时间接收器”，看到实际的采样值

在图11-19中，你可以看到的数据代表的是“1011”（至少我们非常肯定，我们没有看到有一位少于10个采样）。每一个“位”刚刚超过10个“采样/符号”。我们的目标是将这个值再下降到每个“位”一个采样，并将其写入一个文件。我们通过设置“决策阈值”（Decision Threshold）约为0.5。这样采样在大于这个值后，就会知道哪个位代表数字1，剩下的位当然就代表数字0。

你可能会天真地认为，配置一个“低通滤波器”，然后再除了208就“足够好”了，（1个“每秒百万次采样值”除以208约为4800Hz）。但很快你会发现，不幸的是，“时钟抖动”（clock jitter）会引起数据“位”的错误。一个更好的方式来做这件事是使用“时钟恢复”数据块。你可以告诉这段代码你对每个符号会产生多少采样，这样一来，整个系统就会表现得很好，并且尽最大的努力智能地挑选每一个数据“位”。

“时钟恢复”数据块是很微妙的，它的工作就是提供一个每个符号采样四次的滤波信号。只要你试着将“时钟恢复”数据块的输出与你的“输入信号”（Input Signal）做一个对比，你就会发现有趣的现象，那就是因为采样率发生了改变，所以最后导致你需要两个独立的“时间接收器”。试着建立起这样的触发机制有助于后面数据的捕获。

因为这里的“时钟恢复”数据块输出了一个“估计位”（estimated bit），所以我们需要做出一个决定。“二进制识别器” （binary slicer）将会把正的采样值（positive sample），也就是大于0.0的采样值识别成“逻辑1”（logical 1），而把负的采样值（negative sample），识别成“逻辑0”（logical 0）。你可以指定“减速”值，以便使用“减速”数据块帮助滤波器输出这些数据“位”。

在这个系统中的一个有趣的数据块，就是“根升余弦滤波器” （Root Raised Cosine Filter）。这种特殊的滤波器只用于数字数据。配置输入采样率和预期的波特率，它就会通过删除不必要的频率，平滑地输出比特位。正确使用“根升余弦滤波器”，可以帮助我们得到一个较低的“误码率”（Bit Error Rate，BER）。

图11-20说明了一个可以可靠地工作的解决方案。应该指出的是，这种设计只适用于在“实验室环境”中可以良好地工作，因为“实验室环境”中，一切传输条件都是理想化的。而对于一个在野外的环境中进行工作的系统，设计更为复杂，并且涉及大量的参数微调，如果你把这个系统安装在你的车中，你会发现你只能对在你10英尺 [10] 范围内的汽车车门进行开锁的破解工作。

图11-20　终极“开关键控”发射器解调方案

经验丰富的信号处理专家可以在上面方案中指出一些糟糕的设计选项。比如，在流程的正中间，我们决定需要有“减速”选项的地方都放置了“减速”数据块。另外，我们任意地选择了0.5作为一个“减速”值的参数。然而对于这个“减速”值需要设置多低，我们仍然还能接收到信息？也许，额外的分析和滤波器的结构，可更好地提高对传输数据捕获的可靠性。

一旦我们有数据“位”输出，我们就需要从中找到我们所需要的信息，并且显示出来。这时，你应该多注意那些在每个传输开始的“前导码”，因为这之后的，才是发送的内容部分，为此，我们专门写了一块叫“模式输出” （Pattern Dump）的数据块，可以从网站http://github.com/tkuester/gr-reveng 中查看。你可以配置一定的模式，然后进行搜索。当这个数据块的运行中发现有合适的模式，就会打印随后的N个字节到屏幕上。或者，你也可以按位次把这些数据“位”拼凑成一个一个的字节，然后依次将它写到一个文件中，用于以后分析。

注意

网站

你可以下载上面实例中的这个输出文件，以及其他相关的“GNU计划”中的无线图形进行分析和理解。下载的网址同样是本书的配套网站，网址是http://www.hackingexposedwireless.com/files/11/8-clock_recovery-ANSWER.grc 。

11.4.8　那么，还有什么遗漏吗

下面的内容，就是通过上面的信号处理流程输出的结果中的一小段。

从整个文件的内容来看，很明显，有人使用电子钥匙首先发送了一个长的“前导码”。跟着连续发送了4次相同的信息，看上去这把电子钥匙是拿错了。如果我们的车没有接收到第一次所发的消息，那么电子钥匙还有三次开锁的机会。在文件中深度查找，我们可以找到五次相似的块信息。

我们注意到一件奇怪的事情，没有消息顺序地依次超过两个1秒的时间。有一些无线电使用“曼彻斯特编码” [11] （Manchester encoding）避免“1秒”的长串是“背靠背”（back to back）的形式。也就是说当出现一长串1或一长串0的时候，“曼彻斯特编码”可以有效地避免接收方无法通过“时间恢复”数据块进行同步的问题，这是因为“曼彻斯特编码”将要传送的数字“1”转换成了二进制的“10”，而将数字“0”转换成了二进制的“01”，所以无论传输什么样的值，中间总有一个“跳变”的过程，因而十分利于“时间恢复”的操作。

在配置“模式输出”数据块以后，就可以完成“曼彻斯特码”的解码工作，如上所述，我们可以从中恢复出可靠的比特流数据，如下所示。不过，有些与被攻击汽车门锁上，带有隐私性质的数据都已去掉。

尽管我们还没有完全做到通过逆向工程破解这把电子钥匙，但是看上去，上面的数据中，好像有两个字段正在发生变化：一个16位的字段和一个32位的字段。如果我们重复使用第一次的消息会发生什么呢？是这次能够把车门打开，还是显示代码已过期？16位字段的第二字节为什么一直以3为步长进行增量累加？为什么锁车按钮所发送的数据，每次会有如此惊奇的不同？这辆汽车能够反过来跟电子钥匙进行数据传输吗？

要回答这些问题，唯一的办法就是收集更多的数据。在你理解了车锁和电子钥匙之间通信协议的详细格式以后，你就可以进展到实时修改程序的工作了，然后就可以将这一方法扩展到其他车型的车锁和电子钥匙上。在某些时候，你甚至可能会尝试构建一个发射器，然后通过暴力的方式破解这些汽车的车锁安全系统。

[1] 在通信中，凡是不是我们原有信号产生的，都可以视为“噪声”。——译者注

[2] “FCC Part 15条例”指的是无线电频率装置或产品发出的无线电频率RF能量（9KHz至3000GHz）条例及应用原则。该条例本身又可以细分为多版，比如A版（通用细则）、B版（无意辐射电子产品或装置）、C版（适用于有意辐射电子产品或装置）。——译者注

[3] 1974年，由Brian Kernighan和Dennis M. Ritchie合著的《The C Programme Language》一书中，将第一个程序设定为打印“Hello World”这个字符串，在此之后的计算机书中，都争相效仿，将打印这个字符串的程序作为全书的第一个程序。所以计算机界，一般习惯上将“Hello World”理解为你使用某个新工具所做的第一件简单且正式的事。——译者注

[4] 源于Roam Dan在其《The Back of The Napkin: Solving Problems And Selling Ideas with Pictures》书中提出的一种解决问题的新观念，其主旨是通过笔、餐巾纸、白板等低科技含量的设备，为高科技行业、政府机构、金融行业等行业提供视觉化思考培训，解决各种商务问题。——译者注

[5] 极客，主要指对科学（本处当然是指对数学）抱有狂热爱好的某一类人，原理事事必问来源究竟，公式处处都要推证到底。——译者注

[6] 串口的波特率是可设的，但并不是说可以随意设置，而是从总共20多个固定值中进行选择。通常的选择原则是“大于你的波特率中，最小的那个”。比如本处4761，选择了4800的波特率。——译者注

[7] 这个结论十分勉强。串口通信有几个重要的参数，除了波特率之外，还有停止位、校验位和流量控制。如果该SDR设备将自己要发送的数据传送给一个串口模块，那么SDR设备发的数据是“裸数据”，停止位、校验位和流量控制则由串口模块完成，这个结论是对的；如果是SDR设备直接以串口方式向外通信，那么停止位、校验位和流量控制将占用带宽，这时4800的波特率，肯定是不够用的。——译者注

[8] 即1000000/4800=208.33。——译者注

[9] Marker值，是频谱仪中的专用术语。你可以简单地理解为一个Marker就是频谱仪屏幕上的一个点。只是该点中，x坐标是由用户指定的，而y坐标是频谱仪告诉用户的。——译者注

[10] 10英尺约合3.05米。——译者注

[11] 曼彻斯特编码，一种用于物理层的数据通信编码，每一位都会做出跳变，从低到高跳变表示“1”，从高到低跳变表示“0”。这样做的最大好处是，当连续出现0，或连续出现1的时候，接收方仍然能很好地同步。因而这种方式广泛地应用于局域网中的数据通信中。——译者注

11.5　本章小结

这些SDR设备对以前的无线攻击进行了重新定义，因而黑客的兴趣都转向了如何做好一个个人预算，以便购买更好的一款SDR设备。本章首先介绍了每一款SDR设备的重要特征，这对于黑客选择SDR设备都是非常重要的建议。然后介绍了许多可以用于数字信号解码的第三方的应用程序，有一点好运气、耐心，加上一个具有发射功能的SDR设备，读者就应该能够进行一些基本的“重播”攻击，这样至少可以破解大量常见的电子设备。对于高级的读者来说，他们应该有更坚实的基础，可以运行与本章实例相似的攻击方案，并将无线信息解调，使之恢复到它们原来作为二进制有效载荷时的状态，因为这是下一步进行分析、修改、重新攻击的基础。

你现在在对无线安全方面进行研究的时候，都需要将SDR设备工具作为你的攻击装备随时携带，这个工具毫无疑问都是必不可少的。在接下来的内容中，我们仍将使用这些工具，以前所未有的访问方式来攻击和破解蜂窝网络中的信息。

第12章　破解蜂窝网络

本章包括的内容是无线蜂窝通信技术，以及在该技术下对通信的保密性（confidentiality）、完整性（integrity）和可用性（availability）的威胁。为了让读者熟悉蜂窝通信，我们首先介绍无线蜂窝通信技术的基本概念，以及围绕这些概述范围内的蜂窝通信的协议和标准，以便让你对现代蜂窝通信网络基础设施的体系结构建立起一个宏观的全面了解。最后，我们讨论对于这种体系结构的各个组成部分，我们应该如何进行攻击。

警告

本章不像本书中的其他章节，其他的章节中，每次学习到一种攻击技术，只要不违反法律，你都可以随便找一个网络进行测试，而在本章中，在学习完这些攻击技术以后，我们希望你只在自己搭建的网络或自己的设备上进行“渗透测试”（penetration test），而不应该将这些攻击技术应用于真实的蜂窝网络中，这包括当前市面上在用的“二代”（2-Generation，2G）、“三代”（3-Generation，3G）、“四代”（4-Generation，4G）无线通信网络的基础设施。“美国联邦通讯委员会”（FCC）曾授权过一些专用于“渗透测试”的无线蜂窝网络的频率，只有使用这些频率的无线移动设备的“无线网络服务提供商”（carrier）才能针对上述无线蜂窝网络通过“渗透测试”进行“认证攻击”（authorize attack）。所以本章的内容更像是一种信息的参考，在没有认证实体的书面授权的情况下，不允许使用这些攻击技术对该网络进行攻击。

12.1　蜂窝网络通信的基础知识

首先，让我们看看一些蜂窝网络的基本构建分块，并从频率的分配开始了解。

12.1.1　蜂窝网络的射频频率

现代手机使用一系列不同的频率进行数据的传输，对于每一个具体的手机，所用的频率取决于该手机所处的国家，以及当地“移动运营商”（mobile operator）所用的网络。各个移动运营商的称呼五花八门，比如有“手机提供商”（cell-phone provider）、“移动运营商”（mobile operator）、“电信”（telecom）、另一种称呼的“电信”（telco）、“移动载体”（carrier）等。这些移动运营商的网络，租用或自己拥有一定频段的无线频率，那么他的客户当然也就使用这一段频率进行通信。通常情况下，一个国家都是由一个政府监管机构负责着该国该地无线频谱的租赁业务，它负责将特定频段的频谱分配给所管理的某一个公司或某几个公司。有一些国家只允许国有企业经营蜂窝网络的无线通信服务功能。而另一些国家，比如美国，政府将频谱租赁给各移动运营商，这样各移动运营商的客户就通过该频率进行手机通话、“手机短信服务”（Short Message Service，SMS）和基于IP的数据服务。

表12-1中列出了一些通用的，使用全球范围通信的蜂窝无线通信频率。

表12-1　通用的全球范围通信的蜂窝无线通信频率

12.1.2　无线蜂窝网络通信标准

有很多协议用于无线蜂窝网络的通信。要从技术层面理解这些协议名称的词汇需要花费大量的时间和精力，甚至无线蜂窝网络的一些非常通用的术语都会让我们晕头转向，产生混淆。比如在2G、3G和4G的网络中，就大量使用了无线蜂窝通信协议的不同修订版本，有些增量修改的版本，甚至不得不导致整个大的通信“代”（G）的编号发生变化，为了避免冲突，它们只能在两个大“代”之间，采用一个浮点数来表示“代”编号，比如2.5G和2.75G无线蜂窝网络。这些术语通常用作大的“协议容器体”（container），在里边包含了一套技术集和官方发布正式协议集。

负责制定全球蜂窝标准的一个标准化机构，叫作“第三代移动通信合作伙伴计划”（3rd Generation Partnership Project，3GPP），它是由六个组织以合作伙伴的方式组成的运行实体，即日本的“无线工业和商业协会”（Association of Radio Industries and Businesses，ARIB）、美国的“电信行业解决方案联盟”（Alliance for Telecommunications Industry Solutions，ATIS）、中国的“中国通信标准化协会”（China Communications Standards Association，CCSA）、欧洲的“欧洲电信标准协会”（European Telecommunications Standards Institute，ETSI）、韩国的“电信技术协会”（Telecommunications Technology Association，TTA）、日本的“电信技术委员会”（Telecommunication Technology Committee，TTC）。另外，在“第三代移动通信合作伙伴计划”组织中，还有一些额外的观察员组织（observer organization），它们的任务就是跟踪组织合作伙伴所参与的活动。

这个国际利益财团所做的工作就是开发用于无线蜂窝通信技术的国际标准。这个机构机体的特色就是强调一致性协议的重要性和对全球数据影响方面的保护。

“第三代移动通信合作伙伴计划”机构定义了多种技术：

·“长期演进技术”（Long Term Evolution，LTE）

·“高级长期演进技术”（Long Term Evolution Advanced，LTE-Advanced）

·“非访问层”（Non-Access Stratum，NAS）

·“演进的数据包核心”（Evolved Packet Core，EPC）

·“高带数据包访问”（High Speed Packet Data Access，HSPA）

·“通用移动电信系统”（Universal Mobile Telecommunications System，UMTS）

·“宽带码分多址”（Wideband Code Division Multiple Access，W-CDMA）

·“全球移动通信”（Global System for Mobile Communications，GSM），包括“通用分组无线服务”（General Packet Radio Service，GPRS）和“全球演进的增强数据率”（Enhanced Data Rates for Global Evolution，EDGE）。

“第三代移动通信合作伙伴计划”官方正式发布的规范命名，是通过在无线蜂窝网络规范的后面跟上一个数字来表示的，这个数字可以理解为所发布规范的版本号。比如“Release 98”版是1999发布的，包括大多数的3G技术，“Release 8”版则是2008年发布的，包括第一4G的“长期演进技术”技术，“Release 10”是2011年发布的，包括目前“高级长期演进技术”网络技术。

“第三代移动通信合作伙伴计划”规范不仅定义了许多可以与无线蜂窝网络技术相关联的无线接口，而且还定义“后端网络基础设施组件”（backend network infrastructure component），以及所使用的协议。其结果就是一堆极其复杂的协议、标准和首字母缩写的术语单词。为了使本章内容更容易消化吸收，我们偏离了本书标准的章节编写模式，而改用新的方式进行介绍。如前所述，在以前的各章中，我们都是先从整体上了解所有协议的功能，然后才会看到针对这一协议的攻击方式。而在本章，取而代之的是，直接将本章随后的三节内容中，针对于现在无线蜂窝网络的三个传统的技术分类，即2G、3G、4G这三个分类，采用一节一个内容，共三节内容进行介绍，并依次在每一节中介绍一个高级的无线蜂窝网络技术。只是在每一节内容的介绍中，我们还是采用传统的编写思路，即在介绍针对某一协议的攻击技术之前，先介绍这个网络架构功能和存在的安全隐患，然后再实施攻击。

蜂窝网络安全分析的法律问题

从根本上讲，无线安全分析就是一个捕获和分析无线活动，识别存在和潜在威胁的过程。不幸的是，在美国，针对蜂窝网络的这种分析活动是非法的。

《美国法典》第47标题第302A款（US Code Title 47§302a）描述了“评估研究蜂窝基础设施将面临法律的挑战”。该项标题是“电讯、电话，以及无线电报”（Telegraphs，Telephones，and Radiotelegraphs）：

1）1992年10月28日之后的180天内，委员会应制定有效的法规，规定和否定设备授权（在《美国法典》标题47下的第15部分，或本标题下的任意其他部分范围内），使用任何扫描接收器进行如下活动：

a）在频率分配给国内的蜂窝无线通信服务中，进行数据的接收和传输业务；

b）很容易被用户篡改的内容，在这些频率范围内，进行接收和传输；

c）配备解码器，将数字蜂窝传输转换成模拟话音传输。

这项立法在克林顿（Clinton）执政时期通过，主要是针对早期的，通过使用商品业余无线侦听设备，窃听模拟手机信号的行为。虽然现在模拟手机及模拟信号早已不存在了，但是这些法律今天仍然适用，这条法律可以有效地防止无线侦听分析人员，在美国蜂窝无线网络中从事安全性评测的活动。

尽管有这样一条法律的存在和限制，但是攻击者仍然还是设计了多种技术窃听和利用蜂窝网络。所以，从安全的角度来看，虽然我们有义务不在蜂窝网络上进行各种攻击测试和应用，但我们还是应该了解攻击者的所使用的黑客技术，以及蜂窝网络协议上固有的缺陷，寻求弥补方法，进而保护我们的网络有效性。

12.2　2G无线蜂窝网络的安全

2G网络，包括2.5G的“全球移动通信”（GSM）网络、2.75G的“通用分组无线服务”（General Packet Radio Service，GPRS）网络和“全球演进的增强数据率”（Enhanced Data Rates for Global Evolution，EDGE），具有十分广泛的研究基础，在使用中，协议存在的许多安全隐患都被发现。虽然到目前为止，2G网络仍然上的通信协议仍然是使用最广泛的全球蜂窝协议，但随着3G网络的引入，2G网络技术开始并不断地受到抨击。然而，在人口最稠密的地区，人们想着是不是要回到2G网络的性能水平，并且让许多设备保持“向后兼容”（backward-compatible），以便让早期的2G技术仍然可以使用，即使是重新面对黑客的攻击也在所不惜。这样做的目的很简单，就是让传统的基础设施系统，如配电和发电站，能继续频繁使用2G网络，也可以作为其他网络接入机会下后备的连接机制。

注意

在这一节中，我们把主要精力集中在有关“全球移动通信”网络上与安全有关的主要内容上。另外，还有一些利用基于“码分多址复用”（CDMA）网络上附加的安全信息，这部分内容放在了本章的后面。

12.2.1　全球移动通信网络的模式

“全球移动通信”网络的基本网络模型如图12-1所示。虽然在“全球移动通信”GSM网络中，还有部署了许多额外的组件，但这些组件都是获得了GSM系统安全上，至关重要的子系统：

图12-1　基本“全球移动通信”GSM网络体系模型

·“移动基站” （Mobile Station，MS）　移动基站是连接到“全球移动通信”GSM语音、数据、设备。除此之外，还可能包括对“手机短信服务”（Short Message Service，SMS）或“手机彩信服务”（Multimedia Messaging Service，MMS）的连接。在一些规格中，“移动基站”被称为“用户设备”（User Equipment，UE）。

·“SIM卡” 　在网络上的每一个“移动基站”必须有一个“SIM卡”。“SIM卡”的全称是“用户识别模块”（Subscriber Identity Module，SIM），只是大家更愿意使用“SIM卡”这个名称。“SIM卡”属于可移除的（removable），其作用是为“移动基站”提供识别“国际移动用户标识符”（International Mobile Subscriber Identifier，IMSI）的能力，同时该卡中保存了一个用于在网络上认证“移动基站”的唯一密钥。

·“移动用户临时识别码” （Temporary Mobile Subscriber Identifier，TMSI）　“移动用户临时识别码”的产生和分配是随着“移动基站”认证过程中进行的。“移动用户临时识别码”可以代替“国际移动用户标识符”完成在可能的情况下保护用户的身份信息的作用。

·“基站收发信台” （Base Transceiver Station，BTS）　“基站收发信台”无线蜂窝网络的无线设备，一般位于某个建筑上，比如手机信号发射塔上，提供到“移动基站”的无线连接，“基站收发信台”设备在“全球移动通信”网络中，几乎没有什么智能可言。

·“基站控制器” （Base Station Controller，BSC）　“基站控制器”的作用是负责管理许多“基站收发信台”设备，为“移动基站”设备的维护和管理提供智能连接。

·“基站子系统” （Base Station Subsystem，BSS）　由“基站收发信台”和“基站控制器”一起，就构成了“基站子系统”。

·“移动交换中心” （Mobile Switching Center，MSC）　“移动交换中心”提供了下游（downstream）“移动基站”设备的路由服务，包括“语音通话”、“手机短信服务”，“传真”，和“数据服务”。

·“归属位置寄存器” （The Home Location Register，HLR）　“归属位置寄存器”是一个数据库资源，记录着该网络上用户的信息，这些信息包括了每个“移动基站”的“国际移动用户标识符”。

·“访客位置寄存器” （Visitor Location Register，VLR）　“归属位置寄存器”记录下网络用户的信息时，“访客位置寄存器”就会接纳“非网络用户设备”（non-network device），以便于实现用户的手机漫游业务。

·“认证中心” （Authentication Center，AuC）　“认证中心”负责“全球移动通信”网络中，用户身份的认证。

·“公共交换电话网” （Public Switched Telephony network，PSTN）　“公共交换电话网”是“全球移动通信”网络提供商和其他网络服务之间的公共网络接口。

·“网络交换系统” （Network Switching System，NSS）　“网络交换系统”是对“全球移动通信”网络后端的组件，包括“移动交换中心”，“归属位置寄存器”，“访客位置寄存器”，“认证中心”，共同在“全球移动通信”网络中搭建起“网络交换系统”。

随着我们对“全球移动通信”网络模型有了一个基本的了解，下面我们就可以开始评估用于保护“全球移动通信”网络供应商的认证和加密服务。

12.2.2　全球移动通信的认证

“全球移动通信”的认证交换在对用户身份进行验证的时候，是通过“国际移动用户标识符”的使用，以及关联的“用户密钥”（subscriber key）Ki ，该“用户密钥”Ki 存储在SIM卡。这个过程如图12-2所示。

图12-2　“全球移动通信”网络认证的交换过程

在“全球移动通信”的认证交换过程中，涉及“SIM卡”、“移动设备”（Mobile Equipment，ME）、“移动交换中心”和“认证中心”。“认证中心”和“SIM卡”都有用户的“国际移动用户标识符”知识，以及关联Ki 值作为设备注册过程的一部分。当“移动设备”连接到网络的时候，“SIM卡”会共享“国际移动用户标识符”信息，并将“国际移动用户标识符”转发到“认证中心”。“认证中心”会检索Ki 的值，并将与Ki 的值连接到“国际移动用户标识符”上，然后选择一个随机数作为“随机数”（RAND）的值，这个“随机数”将用于两个算法中，这两个算法分别是A3算法和A8算法，这两个算法分别与“用户密钥”Ki 生成“临时密钥”Kc 和“预期的响应”（Expected Response，XRES）值。“认证中心”共享“临时密钥”Kc 、“随机数”、“移动交换中心”和“预期的响应”值，最后，结束在认证过程中的“认证中心”的角色作用。

接下来，“移动交换中心”共享“移动设备”的“随机数”，然后将其发送给“SIM卡”。就像之前的“认证中心”AuC一样，“SIM卡”使用“随机数”用于“临时密钥”Kc 的值和“签名的响应”（Signed Response，SRES）的生成。“签名的响应”值随后会交付给“移动设备”，“移动设备”会通过无线接口传送到“移动交换中心”进行验证。

“移动交换中心”会对“签名的响应”和“预期的响应”进行比较，如果这两个值是匹配的，那么“移动交换中心”就知道这个“SIM卡”的“用户密钥”Ki是正确的，就会让“移动设备”ME通过身份验证，否则就不予以通过。“移动交换中心”会为“移动设备”生成和加密一个“移动用户临时识别码”，然后通过无线接口将其传送出去。

在这个认证交换过程中，注意“SIM卡”与“移动设备”是关联了的，会对“认证中心”进行认证。该认证符合网络提供商的要求，可以防止未经授权的设备访问网络的服务。认证交换并不会将提供者的身份证提交到“移动设备”上，然而，在这里，有一个弱点可以被攻击者成功地利用。

12.2.3　全球移动通信中的加密

“全球移动通信”网络使用“A5/1”密码算法为用户提供了保密性控制，那就是在“移动设备”和“基站控制器”之间，通过“全球移动通信”的无线接口所进行的数据包传输。“A5/1”密码算法是一种基于流的加密算法，使用的是一种称为“线性反馈移位寄存器”（Linear Feedback Shift Register，LFSR）机制的加密算法。“线性反馈移位寄存器”的加密功能是用常见的硬件实现的，这样做可以降低实现的成本，保证设计优先。

“临时密钥”Kc 作为“A5/1”密码算法的输入，用来生成“密钥流”（keystream）数据。这样，明文数据会与“密钥流”数据进行“异或”（XOR）操作，以便生成密文数据。在解密和的时候，只要将密文数据再次与匹配的“密钥流”进行“异或”操作，就可以解密还原成原来的明文数据。

注意

“A5/1”密码算法是在“A5标准”（A5 standard）中几个密码中的一个，其中既包括“A5/2”密码算法，也包括“A5/0”密码算法。“A5/2”密码算法以前主要应用于美国北部，但是，目前已经取消支持对“A5/1”密码算法的支持。而“A5/0”密码算法是一个“空”的加密模式，换句话说，就是这个“A5/0”密码算法。这个密码“加密”算法并不对数据进行加密，只是为了将“不加密”也纳入到这样一个体系来，而对“不加密”所起的一个别名。需要说明的是，目前“A5/0”密码算法仍然被广泛地使用着。

现在，我们已经检查了一些支持“全球移动通信”网络的基本的安全机制，下面，让我们看看如何针对其漏洞进行攻击，以及针对“全球移动通信”用户暴露的攻击技术。

12.2.4　针对全球移动通信的攻击

针对“全球移动通信”的攻击可以分为三类：

·隐私的攻击，特别是可以导致“国际移动用户标识符”（IMSI）信息暴露的攻击。

·机密性攻击，包括将通过“全球移动通信”网络无线接口通信的语音和数据暴露的攻击

·完整性攻击，攻击者直接操纵，或者是冒充“全球移动通信”网络的“后台服务”，修改通过“全球移动通信”无线接口与“全球移动通信”无线网络之间交互时传送的内容，其攻击对象是对其脆弱点实施多重攻击，而导致交互时传送的内容不能使用，最终导致隐私暴露，保密性被破坏，完整性要求也无从谈起。这一种攻击的危害自然不言而喻，“全球移动通信”是意义最为深远（far-reachin）的无线协议，在全球范围内都在使用，特别是在农村地区。数十亿的用户，在协议中存在重大缺陷时，一旦遭受到攻击和破坏，那么要想恢复元气，将是一个缓慢的过程。

12.2.5　全球移动通信中的侦听

虽然商业“全球移动通信”数据包捕获工具对于大多数用户来说，成本是过于高昂的，但是通过变通，你可以使用廉价的硬件来构建自己的“全球移动通信”嗅探工具包。“全球移动通信”数据包一旦被捕获，将会披露关于网络的一些基本信息，但是不会暴露通信数据的内容。这些内容包括通话的音频数据流内容，“手机短信服务”和“手机彩信服务”的内容，以及通信活动中直接传输的数据部分。究其原因，就是因为在“全球移动通信”通信中，虽然结构不是加密的，但所传输的数据都是加密的。在本章的后面，我们看到一些攻击技术，是攻击者将利用某一个“A5/1”密码算法的漏洞，对所传输的内容进行解密的攻击。

在攻击工具的硬件方面，我们仍然使用在上一章中，就表现出多才多艺的RTL版的“软件无线收发”设备，作为这里的“全球移动通信”网络嗅探工具。正如你在第11章中所看到的一样，原本这款廉价的RTL版的SDR设备，它的设计目的是为了接收数字高清电视的，然而，也只是简单地化蛹成蝶，在几乎没有多大改进的基础上，就摇身一变，变成了一个功能超强的黑客专业入侵工具。RTL版的SDR设备具有一个特殊的调试模式（debug mode），在这一模式下，该设备可以作为一个通用的SDR设备。如果我们想将其应用于对“全球移动通信”数据信息的接收工作，那么我们只要将其捕获的频率段调整到850MHz或1900MHz这两频率上的一个即可。当然，如12.1.1节中所说，这两个频率只是北美洲“全球移动通信”网络所使用的频率段，如果你身处欧洲或世界的其他地方，那么这两个频率段调整到900MHz或1800MHz上的这两个频率中的一个。目前，这款廉价的RTL版的“软件无线收发”设备可以捕获850 MHz和900MHz的频率段上“全球移动通信”网络中的活动，但不能访问更低或更高的频段上“全球移动通信”网络的活动。这个时候就需要使用E4000型号的RTL版的SDR设备才行。

使用AirProbe工具对全球移动通信网络进行嗅探

AirProbe是一个运行Linux操作系统上的“全球移动通信”无线网线接口，主要由三个主要部分组成，分别是“GSM信号采集”（GSM signal acquisition）模块，“解调”（demodulation）模块和“数据包分析”（packet analysis）模块组成。要将其作为一个SDR接口使用，该程序还需要几个主要的软硬件支持。硬件毫无疑问就是一台RTL版的SDR设备，软件的支持库有“GNU计划”中的无线；一个名叫“开源移动通信”（Open Source Mobile Communication）的程序，其文件名是Osmocom；还有就是Wireshark软件。AirProbe程序的功能主要是捕获“全球移动通信”网络上的活动，然后对数据包中的信息进行解码，以便在随后其他更专业的软件中进行分析。前面已经提到，在“全球移动通信”网络通信中，通信数据包结构和其中的通信数据是不加密的，而其通信数据包的内容则是加密的。因而在遍及世界的大多数地点，语音、数据、“手机短信服务”SMS和“手机彩信服务”MMS等有效载荷，由于其内容是加密的，所以可以拿到，但却看不了内容；而另一些我们可能感兴趣的数据结构内容却因为数据未加密而变得可以看到。

安装AirProbe软件的步骤很简单；然而，相比之下，其依赖库“‘GNU计划’中的无线”的安装却十分复杂。为了简化对“‘GNU计划’中的无线”的安装，该软件的开发人员Marcus Leech已经组建了一个shell脚本，该脚本可以在Ubuntu操作系统，以及其他基于Debian的系统上，自动地下载和编译所需要的程序，并实施安装。首先，我们通过apt-get工具，安装作为先决条件的必要软件包，其命令格式如下所示：

接下来，我们下载本程序的开发人员Marcus Leech对“‘GNU计划’中的无线”所构建的脚本程序，该脚本的下载地址为http://www.sbrac.org/files/build-gnuradio 。下载结束后，将其标记为可执行文件，并运行该文件。脚本应该运行在“非root”（non-root）的用户下，这就要求我们的系统需要通过sudo工具获得root用户的访问权限，然后安装安装工具包，以及其他所需要的软件，整个安装过程大约一小时。从脚本的输出内容很长，为了本书格式上的简洁，在下面我们特对输出内容中，不是很关键的内容进行了裁剪。

注意

对“‘GNU计划’中的无线”组件的代码编译过程，属于典型的“资源密集型”（resource intensive）的程序，对内存的消费极大，所以无论是你的还是别人的主机，要安装本程序的Linux操作系统至少需要2GB的内存才能继续。

一旦“‘GNU计划’中的无线”安装脚本运行成功后，就可以下载并安装“开源移动通信”（即osmocom程序）了，通过git下载该程序的源代码，命令格式和执行效果如下所示：

下载好该程序的源代码以后，我们需要将下载目录修改为libosmocore目录。然后我们创建 [1] （build）和安装软件，其操作步骤如下所示：

接下来，我们下载AirProbe软件，其操作步骤如下所示。

AirProbe软件并没有针对“‘GNU计划’中的无线”的结构进行过维护与修改更新。所以建议大家不要随便对该程序进行在线升级，因为在线升级到“‘GNU计划’中的无线”中的最新版，就会导致最新版本的兼容问题。不过，你可以申请一个名叫“neeo”的补丁，这个补丁是可用的，其下载地址是https://raw.githubusercontent.com/scateu/airprobe-3.7-hackrf-patch/master/zmiana.patch 。在作者本人的网站上，对该补丁程序进行了“镜像”（mirrored），所以读者也可以从作者本人的网站上进行下载，同时，除了程序下载之外，也可以看到有该补丁程序的源代码。我们改变为airprobe目录，然后下载并应用这个更新AirProbe软件的补丁，其步骤如下。

接下来，我们将当前目录切换到AirProbe程序的gsm-receiver目录中，然后编译和安装其中的软件，如下所示：

最后，我们修改PYTHONPATH变量来搜索本地安装的软件包，其步骤如下所示。我们将使用命令编译最初源代码，来使这种变化得到应用；这一步会在下一次我们登录Linux主机的时候自动发生。

安装了AirProbe软件以后，我们可以测试“全球移动通信”网络的解码功能。测试的方法是，使用一个“‘全球移动通信’信号文件”在AirProbe程序上进行测试，这个“全球移动通信”信号文件的程序名称叫作cfile，是由一个名为“浑沌计算机俱乐部” [2] （Chaos Computer Club，CCC）的黑客组织开发的。我们转到“AirProbe Python”的源文件目录中，然后就可以下载“全球移动通信”捕获文件了。这种格式的文件可以从“浑沌计算机俱乐部”网站的wiki目录中下载。

接下来，我们通过sudo命令获得root权限以后，就可以开始使用Wireshark软件进行协议分析了：

AirProbe软件将解码后的“全球移动通信”数据包作为UDP数据包的有效载荷，填充到UDP数据包中，并发送到“本地环回” [3] （local loopback）接口。我们在选择了标注为“lo”的网络适配器以后，就可以开始捕获数据包了，这时的界面截图如图12-3所示。

图12-3　捕获数据包的界面

然后，我们就可以使用AirProbe软件中的go.sh脚本对“浑沌计算机俱乐部”组织的“全球移动通信”信号文件进行解码工作，其步骤和显示效果如下所示。

解码后的“全球移动通信”信号数据包以十六进制的格式显示在终端上，这些内容是通过UDP协议发送的。而一旦进入到TCP/IP的网络中，那就很容易被Wireshark程序所捕获和解码了。在Wireshark工具中，我们很容易看到解码后的信息，识别“无线网络服务提供商”运营网络的属性，包括“移动国家代码”（Mobile Country Code，MCC）和“移动网络代码”（Mobile Network Code，MNC）跨国信息，如图12-4所示。

注意

Wireshark软件的运行必须早于上面go.sh脚本的运行，这样Wireshark软件才能捕获到上面所提到的“全球移动通信”信号通信数据包。

图12-4　解码后的信息界面截图

在将所捕获到的信号文件，又通过网络捕获进行处理的时候，我们可以继续随后的“全球移动通信”信号通信数据包的捕获。我们知道，“全球移动通信”使用什么样的频率取决于移动设备载体对频率的选择，所以要扫描本地“全球移动通信”活动。我们可以手动使用Windows操作系统中SDR#程序，寻找信号模式类似于图12-5所示的“全球移动通信”的例子，并且，我们也可以使用Kalibrate工具自动完成寻找工作。

图12-5　SDR#程序扫描到“全球移动通信”中的活动

Kalibrate软件是由Joshua Lackey所写，其目的是为了校准RTL版的SDR设备射频接收的频率。一些RTL版的SDR设备容易受到不准确的频率波动。例如，我们将无线频率调谐到850 MHz，但实际上只调谐到了849.5 MHz。因为这是实现信号分析的可靠的问题，所以Kalibrate工具可以通过扫描“全球移动通信”网络来识别出频率的漂移问题。其原理就是，当捕获到大量数据包时，可以根据这些频率与所设定的频率进行比较，通过比较不仅可以知道是否存在“漂移”（drift），还知道“偏移量”（offset）。我们可以使用这个工具，用于类似的目的，但也进行“全球移动通信”网络扫描和频率的报告。

首先，我们使用git工具下载Kalibrate的源程序，其操作步骤和结果如下所示：

然后，我们可以改变目录到Kalibrate软件的目录，通过“创建”的方式编译连接和生成这个软件的可执行文件。

要在Linux操作系统上使用RTL版的SDR设备之前，我们不得不卸载掉一个兼容但是有冲突的驱动模块，那就是dvb_usb_rtl28xxu驱动程序，其命令格式显示如下。我们还需要在“Linux的黑名单”（Linux blacklist）中增加这个驱动程序的项，以避免在操作系统重启以后，该驱动程序又死灰复燃，被系统加载。

接下来，我们运行Kalibrate程序，然后扫描可用的“全球移动通信”网络。我们先设置一个“初始射频增益”（initial RF gain），值为42 dB，和一个22 ppm的“初始频率误差”（initial frequency error），然后扫描北美洲的850 MHz频率的“全球移动通信”无线信号网络。如果是在欧洲和世界其他地区，那么这个扫描的频率值则指定为900 MHz频率的“全球移动通信”无线信号网络。

在这个输出的结果中，Kalibrate软件从RTL版的SDR设备所扫描的结果中识别出三个“全球移动通信”无线通信网络，功率电平最大的是在234通道中的890.4 MHz。要在这个频率上捕获到实时的通信数据包，我们需要在本地回环lo接口上打开Wireshark软件，让该软件捕获被“回环”出来的这些实时数据包，然后再借助gsm_receive_rtl.py脚本对实时的“全球移动通信”无线通信网络数据进行捕获，并将捕获到的数据包投向本地回环lo接口。运行命令的格式如下所示：

在这个例子中，我们将采样率降低到1个“每秒百万次采样值”（MSPS），这样做的原因是可以减少对主机系统的开销，命令中，“-s le5”的作用是让RTL版的SDR设备所用的带宽与“全球移动通信”无线通信网络所用的带宽相匹配，并且都使用890.4 MHz这个中心频率。增益值可以先设为24 dB，这个值可以根据后面低功率水平信道的需要而做出调整。

gsm_receive_rtl.py脚本将调用一个“图形化用户接口”的窗口，用来显示接收到的实时信息的强度信息，如图12-6a所示，与此同时，在终端窗口中，也同时显示数据包内容和接收时产生的错误信息，如图12-6b所示。所以成功接收到的数据包马上通过UDP协议将“全球移动通信”无线通信数据包的整包作为UDP数据包中的有效载荷，通过环回接口发送出去。如前所述，所谓环回地址，主要用于TCP/IP协议的内部协议测试，发向该地址的数据，马上就得到协议的回复后，又被转发出来，而在转发出的内容，正好可以被我们预设的Wireshark软件所接收和解码。

图　12-6

在北美洲和欧洲以外的一些网络，仍然有使用“A5/0”密码算法进行“加密” [4] ，传输一些未加密的语音、数据、“手机短信服务”或“手机彩信服务”等活动信息，虽然这种现象是可能的，但是大部分的情况是上述活动信息都是通过另外的密码算法进行加密的，所以通过Wireshark软件是无法访问的，或者说是通过Wireshark软件访问到的都是加密后的数据。然而，通过“A5/1”密码算法的漏洞，同样很容易受到“密钥还原”攻击（key recovery attack），让对手利用这一漏洞，克服这一安全障碍。

12.2.6　全球移动通信中A5/1密码算法的密钥还原

虽然“A5/1”密码算法的实现细节一开始就是作为秘密进行保密的，但是还是有据可查的，我们可以参考1999年由Marc Briceno根据他对其手机所做的逆向工程分析，并在随后公开发现的该密码算法参考文档，这样，就有一种可能，那就是密码学家对协议的安全质量进行评估，而不需要受到其不允许将分析和分析结果进行公开的限制。

该参考文档的结论并不是很好。“A5/1”密码算法存在重大漏洞，并且已经存在了很长的一段时间了。其中最严重的，出现在2008年，由David Hulton和“黑客的选择”（Hacker's Choice，THC）黑客组织中一自称为“Steve”的人很礼貌地指出，这个漏洞使用“预计算参考”攻击（precomputed reference attack）的形式，可以将整个密钥全部还原。在这种攻击中，攻击者通过几个已知明文数据包计算密钥流（keystream），然后通过密钥流数据（keystream data）和已知的密钥流状态（keystream state）信息进行一一对应（mapping），然后就可以通过观察明文的方式，识别出加密密钥（encryption key），而一一对应关系，只需要通过预计算的方式，将预计算的结果保存在一张表中，在密码破解的过程中，不停地查找这个表就可以了。通过这种攻击，攻击者还原一个Ki大约需要30分钟，其中那一套预先计算的查找表共有约288万亿种可能的条目，保存的数据文件约占2TB的存储空间。

这种攻击方式通过程序实现，并且公之于众，供大家使用的是gsm-tvoid工具，不过，就在David Hulton和THC黑客组织发布gsm-tvoid工具不久，这个工具所必须的那个查询表就从网站不作任何解释地下线了。公众猜测，最大的可能是美国政府介入调查，最终干预和限制这个利用“全球移动通信”缺陷进行攻击的黑客工具，导致Kraken项目的开发受到限制。

2009年，密码学家Karsten Nohl和Sascha Kriler共同推出的针对“A5/1加密算法的破解”项目（A5/1 Cracking Project），该项目的网页地址是https://opensource.srlabs.de/projects/a51-decrypt 。Karsten Nohl和Sascha Kriler复制和优化工作以前由David Hulton和THC黑客组织所做的工作，他们一起发现了新的“密钥还原查找表”（key-recovery lookup table），并且将其发布到“点到点对等网络”（Peer-to-Peer，P2P）网络上。这样做的好处是，由于“点到点对等网络”网络是一个分布式网络，没有固定的主机结构，各个站点为服务器或客观点，因而无法将数据的源头服务端全部定位，所以可以防止文件过早地被人为脱机下线。2011年，“A5/1加密算法的破解”项目团队成员Frank Stevenson发布了Kraken程序，这是一个整合了AirProbe程序，并且可以有效捕获和解密“全球移动通信”无线网络通信数据包的实用工具，该程序同样需要使用“A5/1加密算法”的查找表。此后不久，软件开发人员Daniel Meade发布了一个叫作Pytacle的程序，这个工具可以通过AirProbe程序自动捕获“全球移动通信”无线网络上的活动。然后通过Kraken程序解密“全球移动通信”无线网络通信数据包，并且可以将解密的语音通话内容转换成文件，更值得称赞的是，这个工具可以很容易播放一个完整的，或是一个简单的，针对“全球移动通信”网络语音通话的被动攻击。

通过Pytacle工具还原A5/1加密算法的密钥

尽管Pytacle工具对于实现“A5/1密钥还原”攻击（A5/1 key recovery attack）提供了一个简单的接口，但是针对一次完整的“全球移动通信”网络语音通话内容的攻击，还真没那么简单，至少需要以下资源：

·至少有一台RTL版的SDR设备，并配合AirProbe软件一起使用，在“全球移动通信”网络上进行数据包的捕获和数据源的修改。这部分内容详见本章12.2.5节的内容。

·Kraken软件需要专门针对现代“‘GNU计划’C语言编译器”（GNU C Compiler，GCC）开发，而进行源码级的修改。

·必须有Pytacle软件和一些额外的依赖关系程序。

·针对“A5/1”的加密操作，最好是有一个ATI公司的视频加速显卡，以便对运行时攻击计算机进行优化（该项是可选项）。

·“A5/1加密算法破解的查询表”，如果放在一个临时的存储驱动器里，一个“A5/1加密算法破解的查询表”大约占1.6TB的容量。

·如果将一个完整的“A5/1加密算法破解的查询表”拆分后，写入到一个或多个“A5/1”加密算法破解的查询子表中，那么这些子表总共大约需要占3TB的硬盘容量。

“磨刀不误砍柴功”，为了发动加载并发动一次攻击来还原“A5/1”加密算法的密钥值，首先我们必须装备好我们的系统。

1.发起“A5/1”密钥还原的攻击

我们需要完成以下几个步骤来准备我们的攻击系统。其中有几个步骤是漫长的，所以需要有足够的耐心，整个过程可能需要数天到数周的时间才能完成。

下载和编译连接Kraken程序　Kraken软件由好几个组件组成，这些组件用于生成A5/1的查询表，由于运算量极大，所以需要使用显卡上的“视频加速器”（video accelerator），这些工具会使用本地CPU或ATI显卡上的视频加速器执行密钥还原攻击，并且这些工具还需要准备一个原始的磁盘用于密钥流的查找攻击。可以在Kraken的官方库https://opensource.srlabs.de/projects/a51-decrypt 下载到。然而，在过去的几年中，Kraken软件的开发已经停滞不前了，该程序也将不能在现代Linux操作系统上使用最新版本的“‘GNU计划’C语言编译器”（GNU C Compiler，GCC）进行编译了。作为一种替代方案，我们可以手工从官方库下载补丁代码，你可以从GitHub中下载Kraken作者本人亲自修改的一个分支版本（fork），其命令格式及效果如下所示：

源代码下载之后，我们就可以切换到Kraken的目录中，通过编译连接后创建这个软件。该软件通常更希望在本地的硬件系统中，有一个带有“图形处理单元”（GPU）处理功能的ATI显卡，可以在离线的状态下进行工作的能力。因为这不是一个“全球移动通信”网络数据包破解的必要要求，我们也可以换成不用“图形处理单元”处理功能的noati软件来创建该软件，如下所示：

下载“A5/1加密算法破解的查询表” 　“A5/1加密算法破解的查询表”在网上发布的可用版本是基于“点到点对等网络”（P2P）网络的，所以可以用BitTorrent软件下载。即使你有一个快速的互联网连接，下载一个完整的“A5/1加密算法破解的查询表”可能也需要几个星期才能完成，甚至可能需要几个月的时间也不是不可能的，因为“点到点对等网络”网络中的数据传输，取决于拥有并发布“A5/1加密算法破解的查询表”的“点到点对等网络”网络其他对等点的网速。BitTorrent软件的下载，需要有“种子”（seed）的支持，在网站https://opensource.srlabs.de/projects/a51-decrypt/files 上，提供了40个可用的“A5/1加密算法破解的查询表”BitTorrent下载种子。由于一个完整的“A5/1加密算法破解的查询表”文件大约占1.6TB的容量，所以被等量拆分后，每一个文件大约是42GB的大小。通过一个类似命令行为ctorrent的BitTorrent工具就可以下载“A5/1加密算法破解的查询表”了，该程序可以从网站http://www.rahul.net/dholmes/ctorrent 上下载得到。另外，如果你在不久的将来参加一个黑客大会，你可以考虑使用邮件列表来寻找另外的与会者，然后大家可以在大会期间，通过相互之间的拷贝，最终使每个人都有一个本地的拷贝。

注意

对于一个1.6TB的文件，即使是本地的对拷，也要花很长的时间才能完成。假设对一个标准的硬盘的随机访问来说，一般的本地文件对拷速度是40M每秒，那么即使以这样的速度由本地硬盘的一个地方拷贝到本地硬盘的另一个地方，也需要12个小时才能完成。

下面，为了说明方便，我们假设上面下载的“A5/1加密算法破解的查询表”文件，保存在硬盘的“/media/a51”目录中。

准备A5/1查询的驱动程序　“A5/1加密算法破解的查询表”并不能直接用于破解的工作。相反，文件被写入到“原始”（raw）的磁盘设备中，也就是说例如，文件被入写到一个没有文件系统的磁盘设备中。之所以要这样做，是为了加快查找操作和索引搜索的速度 [5] 。要将“A5/1加密算法破解的查询表”内容直接写入到查询磁盘中，我们需要使用Behemoth脚本来完成。

Behemoth脚本本身就是Kraken软件的一部分，所以该脚本就位于Kraken软件安装目录中的索引目录中。Behemoth脚本在运行的时候，会先读取一个当前目录下的配置文件，其文件名叫作tables.conf，该配置文件中有磁盘的配置情况，以及哪一个文件保存在哪一个序号的磁盘上，有一个可以作为样例的配置文件，文件名叫作tables.conf.sample，这个文件可以复制成所需要的配置文件tables.conf，然后在必要的时候再编辑修改这个文件，完成配置。

首先，我们要确定磁盘设备的名称，这里的磁盘设备的名称就是连接到这台主机上可以进行加载和卸载的设备名称。Kraken程序中的fdisk工具可以查找有哪些磁盘设备是可以使用的。

在这个输出中，有三个磁盘与本系统有关。上面第一个磁盘“/dev/sda”是用于Linux操作系统使用的，所以不能用于Kraken程序。第二个磁盘“/dev/sdb”包含了Kraken程序所用的原始表，该表中通过BitTorrent程序下载的。第三个磁盘“/dev/sdc”将用于查找磁盘，用于将来Kraken程序保存还原密钥的搜索工作。

提示

固态硬盘驱动器（solid-state drive）是相对于传统的随机访问硬盘驱动器而言的，这将大大加快Kraken密钥查找攻击的速度。

因为只能有一个磁盘用于查找搜索，所以我们指定“/dev/sdc”作为查找磁盘目标。你应该考虑一下如何确保磁盘的配置最适合你的需求，是否有可能使用多个磁盘。一个完整的配置文件tables.conf的配置样例如下所示：

注意

我们必须要非常小心的是tables.conf文件中指定的“设备路径”。因为在操作系统重新启动、USB设备拨了重插时，该磁盘所对应的设备名称有可能改变，所以务必要确保上述三个磁盘设备在tables.conf文件中配置的正确性。要知道哪个磁盘用于保存数据，哪个磁盘用于保存结果。

接下来，我们运行Behemoth.py脚本，并在脚本的命令行中指定“A5/1加密算法破解的查询表”所保存的“原始”磁盘位置，在这里，假设这个磁盘位置是在“/media/a51”目录中。Behemoth脚本会在当前目录下，为每一个“A5/1加密算法破解的查询表”的分表创建一个索引，然后将每一个“A5/1加密算法破解的查询表”的分表的内容，以原始的格式，按tables.conf表中的要求直接写入到磁盘的指定扇区中。在进行这个操作的时候，请务必小心，因为如果tables.conf文件中目标磁盘配置的不正确，那么，Behemoth脚本在运行时会直接覆盖文件中所指定的那个磁盘驱动器上的所有数据，并且这种覆盖，是无法还原的。

Behemoth.py脚本将花上好几个小时，完成这个大工作量的操作，具体所耗费的时间取决于磁盘的读写速度。程序运行结束后，我们就有一个包含大量索引文件的目录结构。该结构相似的例子，如下所示。

安装gsmframecoder程序　gsmframecoder工具是由Johann Betz编写的，主要由Pytacle程序所用，对“全球移动通信”网络数据包中的内容进行破解的。这些数据包在传输过程中都是加密的，但明文的内容很容易知道，这就让我们可以从“A5/1”加密算法中还原密钥流的数据。我们下载源程序，解压缩数据包，编译连接和创建，最终生成可执行文件，然后就可以安装gsmframecoder工具了，上述几个步骤的操作如下所示：

安装“全球移动通信”编码器　在“全球移动通信”协议中，使用了“全球移动通信”GSM 06.10版本的“长时预测规则码激励”（Regular-Pulse Excitation Long-Term Predictor，RPE-LTP）算法，该算法用于语音传送的编码算法。一个开源代码的编程软件，可以实现将“全球移动通信”GSM 06.10版本的“长时预测规则码激励”算法编码的语音转换成wav格式。该程序由Jutta Degener和Carsten Bormann共同编写而成，源程序可以通过http://www.quut.com/gsm 网站进行下载，程序的名字叫作toast。该工具包括在“全球移动通信编码”项目中，同时，该程序也需要由Pytacle程序先完成对数据包中语音内容的解压和解密工作。此外，由于网站上提供的是源程序，所以我们需要下载源程序、解压缩程序包，编译连接和创建，最后安装这个新重要的编码器，其步骤实例如下所示：

安装RTL版的“软件无线收发”设备文件格式转换器　AirProbe软件并没有人积极地进行维护，并且软件本身存在一些bug，这两个弱点，使得Pytacle软件的使用变得很不方便，特别是当“GNU计划”中的无线架构发生了改变以后，这一现象更加突出。有一个重要的需要说明的问题是，gsm_receive_rtl.py脚本所保存的信号捕获文件，在格式上无法向Pytacle程序提供必要的几项内容，而这几项内容恰恰Pytacle程序用于密钥还原和数据解压所用。比如，gsm_receive_rtl.py程序的“-o”参数，会触发一个bug，最终导致程序只写入零字节的文件。

然而，如果使用rtl_sdr工具所捕获的数据包，并生成信号捕获文件，然后再通过一个rtlsdr-to-gqrx工具的转换，最后生成文件的格式就可以由Pytacle软件所使用。这个转换作为工具的rtlsdr-to-gqrx程序，是由Paul Brewer编写，下载网址是https://gist.github.com/DrPaulBrewer 。我们可以下载这个简单的工具，同样，由于是开源的程序，所以也还是上面的编译、安装这套流程，其步骤显示如下。

安装Pytacle工具　下一步，我们下载和解压缩Pytacle工具程序包：

Pytacle程序需要配置好几个该程序所要使用的工具的路径。这是该软件实施攻击的一个重要部分。单击程序的“属性”按钮，然后对于图12-7中显示的每一个工具都需要配置一个完整的路径信息，其格式类似于下面的例子。

一旦Pytacle程序配置好了以后，保存这些文件名的路径偏好，这样就不用在以后每次使用的时候都重新录入这些信息。随后，我们退出Pytacle程序。至此，我们基本上已在我们的系统上，完成了基于“A5/1”加密算法的“‘全球移动通信’密钥还原攻击”的准备工作。

2.执行基于“A5/1”加密算法的密钥还原攻击

在准备好上述所有的工具之后，我们现在可以发起一次针对基于“A5/1”加密算法的密钥还原的攻击。首先，我们打开RTL版的SDR设备，找到“全球移动通信”无线网络的频率，然后开始捕获无线信号信息，如图12-8所示。请注意，rtl_sdr工具并不显示任何解码的输出，所以最好是在开始时先使用gsm_receive_rtl.py脚本进行捕获数据包的工作，以确保你在切换到rtl_sdr工具之前能捕获到“全球移动通信”无线网络的数据包，并生成捕获文件。

图12-7　配置所使用工具的路径

图12-8　开始捕获无线信号信息

注意

记住，在美国和其他许多国家，拦截蜂窝网络的活动是非法的。这里提供的信息仅供参考，所以你只要认识到可以发动什么样的攻击应该就足够了；你不应该是在实践中的应用这些技术。

提示

通过“Kalibrate kal”工具识别目标“全球移动通信”无线网络的频率，有关这部分内容，在12.2.5节中已介绍过了。

在捕获一段时间以后，我们就通过按Ctrl+C组合键停止rtl_sdr程序的运行。下一步，我们使用rtlsdr-to-gqrx工具，将gsm.bin文件转换成Pytacle所支持的格式，其命令格式如下所示：

注意

运行成功以后rtlsdr-to-gqrx工具并没有产生任何信息，只是简单地返回到命令提示符下。通常情况下，输出文件的大小一般正常是输入文件大小的四倍。

下一步，我们运行Kraken服务器开始处理由Pytacle文件在9666端口上通过TCP协议传送的索引文件。这一处理过程将使用我们的操作系统的大约1.6GB内存空间：

提示

对于“全球移动通信”的捕获和Pytacle攻击系统这两个进程来说，Kraken服务器进程可以运行在与二者不同的主机上。这时，你只需要在Pytacle属性中将“Kraken服务器的IP地址”由回环地址“127.0.0.1”改到Kraken服务器所在主机的IP地址即可。

下一步，我们开始运行Pytacle程序，命令格式如下。

不要使用Pytacle程序内置的数据包捕获功能，如前所述，通过这个功能生成的捕获数据文件在经过AirProbe的gsm_receive_rtl.py脚本转换时，由于Pytacle文件的一个bug，最终会导致转换后的文件无法用于随后的攻击之中。取而代之的方法，就是我们可以手动在“破解”对话框（Crack）中，将rtlsdr-to-gqrx工具作为一个输入文件（infile）输出给一个指定的cfile文件，我们单击“破解”按钮，就可以开始这个破解过程了。

如果你的“全球移动通信”捕获文件中，没有包含加密的“全球移动通信”的活动，那么Pytacle工具将会迅速报告“没有立即分配，对不起！”（No Immediate Assignment found，sorry！），否则，Pytacle程序将会解码和解析“全球移动通信”分组数据，尝试使用gsmframecoder工具还原密钥流数据，然后发送密钥流的内容到Kraken服务器进行分析。

当Kraken服务器接收到密钥流数据，Kraken服务器将用原始的“A5/1加密算法破解的查询表”信息，在磁盘资源中搜索相关的密钥信息。如果发现Kraken服务器将会向Pytacle程序返回密钥信息，这就给了我们解密和解压数据包中包含的语音信息，或者是“手机短信服务”信息、“手机彩信服务”信息，如图12-9所示。

图12-9　返回密钥信息得到的信息

对“A5/1”密钥还原的攻击的防御技术

通过Kraken程序和Pytacle程序对“A5/1”加密算法的密钥进行还原，这是一个复杂的过程。从攻击者的角度来看，这个密钥还原过程是有利的，因为该过程允许捕获“全球移动通信”的活动，还原Kc密钥，被动地解密该活动，排除通过异常分析工具进行侦测的任何机会。

从防守的角度看，要避免使用“全球移动通信”网络。现代的3G和4G“长期演进技术”网络中，没有“A5/1密钥还原攻击”所需要的漏洞可供使用，所以选择它们对于用户来说，是一个更安全的选项。然而，“全球移动通信”网络仍然是最广泛的移动通信世界的形式，在未来很可能会继续使用多年。

对于攻击“全球移动通信”网络，除了“A5/1密钥还原攻击”方式之外，还有一种替代的攻击方式，那就是攻击者可以利用“全球移动通信”网络的第二个重要缺陷，进而攻击通话的语音，以及“手机短信服务”信息和“手机彩信服务”的内容，这种缺陷就是通信双方缺乏相互认证。

12.2.7　全球移动通信中的国际移动用户标识符的捕获器

“全球移动通信”网络在认证的过程中识别无线移动设备，是通过验证该设备的“国际移动用户标识符”（IMSI）、所对应的Ki ，以及计算出的“签名的响应”（SRES）是否正确来实现的。尽管这样一种算法提供了一种机制，这种机制可以让“全球移动通信”网络“无线网络服务提供商”保护自己免受未经授权使用上的攻击。但是这种机制对于客户端设备来说，并不对一个网络进行身份的验证。

这个漏洞对于攻击者来说，代表着一种机会，那就是一个攻击者可以冒充合法的“全球移动通信”网络，然后通过使用一个叫作“国际移动用户标识符捕获器”的设备对用户的“国际移动用户标识符”进行收集。此外，仿照合法的提供商在“全球移动通信”网络上所提供的服务，攻击者也可以在这个假的“全球移动通信网络”上提供一些类似的网络服务，使得用户很难意识到他们现在正在连接到一个骗子网络上。如果被骗连接的无线移动设备主机使用这个冒名顶替的网络发送和接收“手机短信服务”信息或“手机彩信服务”、拨打电话，以及发送或接收数据信息的时候，那么这些动作所产生的数据包，连同“国际移动用户标识符”信息将一同发送给攻击者的所设计的陷阱网络中，这相当于给了攻击者一个窃听攻击的机会。

虽然2.5G的“全球移动通信”网络可以提供相互的认证，但这个功能并没有被广泛采用，直到3G“全球移动通信”网络，这种情况才得到改观。其中，对传统的“全球移动通信”网络设备升级的成本，是这些网络不愿意升级到2.5G“全球移动通信”网络的一个最常被提到的可能因素。

在美国，有几个可用的设备可以在公开场合下使用。这些设备具有像合法的“全球移动通信”网络接入设备一样，接收和发送2G“全球移动通信”网络上的通信能力。正如前面提到的，在一个认证的频率上发送无线信号，在美国是非法的。所以对于这里介绍的步骤，读者应该谨慎使用，特别是要避免干扰已认证的“全球移动通信”网络和用户的正常活动。

通过YateBTS实现国际移动用户标识符捕获器

要创建一个可以在2G“全球移动通信”网络上使用的“国际移动用户标识符”捕获器，我们需要通过软件和硬件组合起来，使其能够完成一个“基站子系统”（Base Station Subsystem，BSS）和“网络交换系统”（Network Switching System，NSS）组件所要完成的任务。

有多个设备需要组合安装，才能使其可以正常地运行在2G“全球移动通信”网络上，Range（中文名“兰奇”）网络公司，作为一个OpenBTS项目的开发者，销售这样的硬件套件，这些硬件套件可以作为一个2G“全球移动通信”网络运行，进而实现一个“国际移动用户标识符”信息的捕获器的作用。该设备在网络地址是http://www.rangenetworks.com/products/professional-development-kit ，这个专业的开发套件售价为2300美元，所提供硬件设备型号有GSM850、GSM900、DCS1800和PCS1900几款 [6] 。OpenBTS软件开发包最初是由Harvind Samra、David A Burgess和Glenn Edens共同开发的。该软件开发包兼容了很多“全球移动通信”网络常用的服务的工具集，比如语音通话、“手机短信服务”收发，以及“通用分组无线服务”（General Packet Radio Service，GPRS），基本上可以完成“全球移动通信”网络上的各种数据通信功能。

在其网站http://www.openbts.org 上，OpenBTS项目明确的对象，是创建一个“使用‘软件无线收发’设备向用户的设备提供一个标准的‘第三代移动通信合作伙伴计划’（3GPP）规范无线接口的Linux应用程序。”，也就是说，OpenBTS项目的目的，并不要创造一个“国际移动用户标识符”的捕获器设备；相反，OpenBTS项目的目的是“扩大覆盖面，向没有‘全球移动通信’网络服务的用户提供服务；为‘全球移动通信’网络服务表示出‘缺医少药’的市场区域，推出一个创新平台；面对新兴网络技术，提供全面的技术支持。”这部分内容可以参阅网址http://openbts.org/about 上的介绍。

“全球移动通信”网络服务中的“基站子系统”和“网络交换系统”在OpenBTS项目中，除了使用‘软件无线收发’设备之外，还可以使用其他硬件作为候选。包括Fairwaves UmTRX设备；Ettus研究设备，该设备的各系列中，有B100、B200、B210、E100、E110（提供了有限的支持）、N200、N210、USRP2等设备；Nuand bladeRF设备。其中Nuand bladeRF设备的x115型号，零售价为650美元，x40型号，零售价为420美元，二者都可以在http://nuand.org 网站上查到详细的资料说明。其中的Ettus研究设备中，B200型号的售价是675美元，这很显然是各个低成本设备中另一个不错的选择，该设备的详细资料可见http://www.ettus.com 。

2014年1月，OpenBTS项目中的两个早期开发人员发布了OpenBTS项目中一个名叫YateBTS [7] 软件的分支版本（forked version）。有关YateBTS软件的详细介绍，可以参见网址http://www.yatebts.com 。YateBTS软件包含了OpenBTS中大量的源代码，但该程序裁剪掉许多通信组件，而这些通信组件很显然提供的是一些模块化的通信能力，所以从该软件整体上来看，软件在通信方面的灵活性有所削弱。

在下面的攻击中，我们试着探索一个可行的步骤，那就是通过YateBTS软件创建一个Nuand bladeRF x115型号的“国际移动用户标识符”捕获器（IMSI catcher）设备，该设备的实物图如图12-10所示。对于下面的步骤，其实选择其他硬件设备也可以，但是有可能会有稍微不同的配置步骤。另外，我们还需要经常参考YateBTS和Nuand网站上最新的资源作为配置说明。

图12-10　x115型号国际移动用户标识符捕获器的实物图

目标系统是运行在Ubuntu操作系统的14.04版本上的，这个现代系统使用了USB 3.0的接口，这是bladeRF软件运行功能时所需要的配置。首先，我们把Ubuntu版的“个人软件包”（Personal Package Archive，PPA）增加到“稍有自由”（universe）和“非自由”（universe）版 [8] 档案中。在这个例子中，我们在Ubuntu操作系统14.04版本（该版又名“可靠”trusty）上添加库文件用于发布版中。你应该针对你的使用平台，指定Ubuntu操作系统的适当版本：

接下来，我们将“个人软件包”添加到“个人软件包”的bladeRF项目中，然后更新其软件包的列表：

然后，我们需要安装bladeRF软件所需要的数据包的依赖库。

随着bladeRF数据包的安装完毕，我们就可以将bladeRF设备连接到USB 3.0的接口上，然后通过bladeRF-cli命令行工具，通过与设备之间的交换操作，配置确认了系统的功能。下面的例子允许我们通过查询bladeRF设备验证各个操作功能，以及收集有关硬件的基本信息：

下一步，我们将安装“还是一个电话引擎”（Yet Another Telephony Engine，YATE）软件。因为“还是一个电话引擎”近期正在积极发展，有时系统无法提供完整的发布版，所以我们不得不手动下载源文件，然后编译连接后创建该程序。我们使用这些“传统套路”步骤下载“还是一个电话引擎”程序的源程序，然后配置、创建，在生成可执行文件以后，就可以安装在我们的系统上：

接下来，我们仍然采用上面的“传统套路”，重复这些步骤将YateBTS软件也安装到我们的系统上。在配置脚本的输出中，要确保你所看到的输出文件，在bladeRF程序中，可以在系统中找到并明确表示，该程序是运行这一输出格式的。这句话类似于“检查一下，要确保bladeRF程序是支持‘pkg-config...0.16.2-2014.09-rc2-1-ppatrusty’这个文件的”：

“还是一个电话引擎”的正常使用，需要依靠一些提供了系统功能的“非自由”（universe）版的配置文件的支持。这些“非自由”版的软件都保存在/usr/local/etc/yate目录中，主要有subscribers.conf、ybts.conf和javascript.conf。首先，我们打开subscribers.conf文件，然后找到“；regexp=” [9] 这一行，将其修改为用于读取功能的“regexp=.*”。这种变化，可以让任何移动设备连接到网络。我们保存并关闭这个配置文件。

接下来，我们打开ybts.conf文件，找到“Radio.Band=”这一行，将其修改为“Radio.Band=900”，这样做的目的就是配置新的无线频率，将其修改为欧洲的“全球移动通信”网络波段。在北美洲，这就允许我们使用美国北部的工业（Industrial）、科学（Scientific）或医疗（Medical），或三者一起（合称ISM）的公共波段来操作一个“全球移动通信”基站。我们改变“Radio.C0=”这一行的内容，将其修改为“Radio.C0=50”，这样就可以接收到“绝对无线频率信道号”（Absolute Radio Frequency Channel Number，ARFCN）。在无线收发这个部分，我们修改“；Path=./transceiver”这一行为“Path=./transceiver-bladerf”。这一变化是运用正确的可执行文件，使其在mbts的进程中为YateBTS提供支持。最后，保存并关闭这个配置文件。

然后，我们打开javascript.conf文件，并在一个文件中增加一个路由（routing）项和“一个盒子中的网络” [10] （Network in a Box，NIB）项这两行，增加的位置及效果如下所示。

添加和修改这些行的内容以后，我们保存并关闭该配置文件。

接下来，我们为“还是一个电话引擎”程序创建一个日志目录：

最后，我们添加/usr/local/lib目录到systemwide库的“搜索路径”（search path）中，其命令的格式如下所示：

我们开始“还是一个电话引擎”程序的执行，当程序成功运行以后，就可以创建一个“全球移动通信”通信基站。

然后，我们检查日志文件的内容，识别和纠正一下系统上的任何配置错误。如果“还是一个电话引擎”程序开始运行的时候没有错误，那么该程序就会调用第二个进程，该进程名叫“mbts”进程，我们要确保这两个进行都在顺利运行着。该步骤如下所示：

一旦有了“还是一个电话引擎”程序的运行实例，我们就俨然成为一台“全球移动通信”通信基站（当然，这是我们冒充的），随后，只要有某个无线移动设备连接到这个冒充的网络上，我们就可以查询这台被攻击设备的“国际移动用户标识符”信息的值了。其步骤和实例效果如下所示：

如果“手机短信服务”的发送是通过一个设备连接到我们的“还是一个电话引擎”程序运行实例上的话，那么“还是一个电话引擎”程序就会捕获和存储这些数据包到文件中，以备后面的检验。要从“还是一个电话引擎”程序中获得“手机短信服务”的信息，我们需要通过nc程序连接到设备的管理端口上，然后发出一个“手机短信服务”列表的查询功能。

短信文本内容本身是否可以使用，可以通过JavaScript程序进行验证，在nib.js文件中有一个实例。在这段JavaScript脚本中，msg.execute这个脚本的参数中包含的文本内容，正是我发送的文本内容。要完成侦听的访问，就需要处理“手机短信服务”消息的内容，使之可以为“还是一个电话引擎”程序的实例所用。

到目前为止，我们所看到的技术，仍然聚焦于“全球移动通信”无线通信网络。在美国，由于法律规定，禁止针对蜂窝网络进行监控，所以针对“码分多址访问”侦听方面的攻击技术少之又少。然而，少并不代表没有，我们还是完全有可能利用“全球移动通信”和“码分多址访问”网络，利用无论是2G无线网络和3G无线网络的架构，借助于再利用的认证设备，找到一个遍及大量家庭和商业企业的新式网络，那就是：“家庭基站”。

[1] 这里的“创建”特指的是通过一些编程语言的编辑、编译、连接等程序一次性完成某个源代码到可执行文件的转换过程。上面的这一系列动作的一次性操作，就是“创建”（build）或者“重新创建”（rebuild）。——译者注

[2] “浑沌计算机俱乐部”，又称“欧洲黑客联盟”，是一家德国的黑客组织。是1984年，由当时32岁的程序员Wau Holland在Hamburg（汉堡市）成立。——译者注

[3] 在TCP/IP协议中规定，IP地址为127开始的IP地址都是环回地址，其目的主要用于协议测试。凡是发往这个地址的数据，都会按协议规定进行返回（注意不是原样返回）。比如，即使你在不连网的前提下，ping 127.x.y.x的IP，协议在处理以后都会返回相对应的网络操作成功的消息。不过，更为大家所知的环回IP地址是127.0.0.1，但实际上127.x.y.z的地址全部都是。本处采用这个地址一个程序发，一个程序收的原因是这样速度快，节省资源，尤其是数据量很大的时候。如果要采用正常的socket一个发一个收，则会因为数据要经过TCP/IP的各层解析才能转发回来，效率低，并且有丢包、拥堵等出错可能。——译者注

[4] “A5/0”是将“不加密”的版本作为它加密算法系列中的一个版本。——译者注

[5] 磁盘都是由扇区（sector）组成的，为了便于查找，所以一套文件系统需要有文件索引扇区和数据扇区，查找一个文件的时候，通常是先到索引扇区中找到索引，然后才能到数据扇区中查找数据，对于一个频繁使用的系统来说，系统在存文件的时候，会优先使用未用过的扇区，这样对于一个超大的文件来说，会分散保存在很多不连续的扇区中，这样在读取的时候，硬盘磁盘需要不停地寻道，因而效率很低。如果明知某一个超大文件将几乎占满一个硬盘，那么避开文件系统，直接对扇区进行读写，有三大好处：一是不要索引，从而省略了索引检索的时间；二是索引区也可以用来保存文件，增大存储容量；三是在保存的时候，直接将数据保存在连续的扇区中，从而大大加快读取速度。唯一的缺点就是这需要有高超的底层程序编写能力。——译者注

[6] 每个型号名中的数字，可能是所能侦测的频率。──译者注

[7] 在本处的名称中，后缀BTS，指的就是前面提到的“基站收发信台”，所以OpenBTS很显然是与“基站收发信台”相关的一个项目，而YateBTS又是与“还是一个电话引擎”和“基站收发信台”同时相关的软件产品。——译者注

[8] 这是按软件的自由度来划分的，一个软件可以分为“完全自由”（自由）、“稍限自由”（restricted）、“稍有自由”（universe）和“非自由”（universe）四个等级。“稍有自由”版是官方不提供支持与补丁，全靠社区支持；“非自由”版是官方完全不提供支持和补丁。——译者注

[9] 注意行首有半角分号（“;”）和无半角分号的区别，一般来说，有半角分号表示这一行是注释，是没有作用的。无半角分号则表示这是一个有效的配置项的行。——译者注

[10] “一个盒子中的网络”指的是一个网络上的所有设备，连同网络交换设备，一起都制作在一个设备外壳中。这里既指网络成员小而少，也指这种网络形式很紧凑。——译者注

12.3　攻击3G“家庭基站”网络

“家庭基站”（femtocell）设备延伸了“‘无线网络服务提供商’的运营网络”（carrier network）的范围，使用消费者上行链路的连接作为其宽带连接。“家庭基站”被称为“家庭NodeB节点” [1] （Home NodeB），简称为HNB，属于“第三代移动通信合作伙伴计划”（3GPP）规范。“家庭基站”设备作为一个新的无线接口，允许消费者建立一个属于自己的基站。该基站是对传统“无线网络服务提供商”的运营网络基站的一个相对短距离的扩展，在这个属于自己的小基站上，提供了与传统无线移动服务提供商“载波网络”基站类似的连接服务，也就是说，这个小基站上也同样可以提供语音通话、数据传输、“手机短信服务”信息和“手机彩信服务”各项常规业务。当然这些家用级别的设施在功能上与传统无线移动服务提供商的运营网络基站相比，几乎是天壤之别。这些家用设施只提供很有限的、仅限于上述功能的、几乎不会覆盖其他功能的通信需求。换句话说，对于消费者来说，以前在家庭这个级别上无法提供基站级的访问，而现在“家庭基站”设备提供了这种访问基站服务的能力 [2] 。同样，对于黑客来说，“家庭基站”设备还为攻击者提供了新的机会，借此，攻击者或以攻击其家庭级的无线网络服务的基础设施，以及该“家庭基站”下游的各个“用户设备”（User Equipment，UE）设备，比如手机。

“家庭基站”设备使用IPSec协议连接到无线移动服务提供商的运营网络上，并且提供强大的保密性和完整性，支持在不信任的宽带网络上建立连接。“家庭基站”还有加密和解密的功能，可以对3G网络上的语音通话、数据传输，以及短信服务于本地在转发到“用户设备”或转发到无线移动服务提供商的运营网络的网络之前，实现加密和解密的功能，进而满足以加密数据进行传输的IPSec协议的要求。“用户设备”数据的这种分布式加密/解密机制，正好为攻击者提供了机会，使黑客可以对毫不知情的“用户设备”发动一次攻击。

我们要记住，“家庭基站”属于无线网络服务提供商运营网络的一个负责认证的终端级的设备，所以该设备具有访问动态密钥信息，然后加密或解密3G连接的能力。所以介于传统无线网络服务提供商原有的运营网络和“用户设备”之间的天然位置，使得“家庭基站”具有天然的“中间人”的良好位置优势，非常容易发起“中间人”（man-in-the-middle）式的攻击，并且在一次通信中，有好几次这样的机会，通过这种“中间人”式的攻击，可以包括操纵和拦截的电话的各种操作。

使用Vodafone公司的Sure Signal工具进行入侵

“黑客的选择”黑客组织近年来取得了骄人战绩，曾花费近两年的时间，秘密地入侵并修改了一款家庭基站设备，将这个无辜的设备改造成了一个黑客武器，该设备名叫“Sure Signal”，设备的实物图如图12-11所示。这款设备是英国的Vodafone公司 [3] 完成并发布的。“Sure Signal”是一个“全球移动通信”无线通信设备，支持语音通话、数据传输、“手机短信服务”信息和“手机彩信服务”各项常规业务，并且既支持2G协议，也支持3G协议，售价是100英镑，约合160美元。

图12-11　Sure Signal实物图

通过使用该设备的部分开源组件，加上对不开源代码的逆向工程技术，“黑客的选择”黑客组织通过技术侦别，在该设备的一个板上串行控制台接口（on-board serial console）处，通过焊接，将一个“采用TTL电平识别的RS232”的串口适配器（RS232-to-TTL serial adapter）固化到“Sure Signal”设备的主板上。然后通过这个控制台接口，“黑客的选择”黑客组织透露，改装后的“Sure Signal”设备有可能获得对MontaVista版Linux操作系统的shell外壳访问，并且在“Sure Signal”设备的帮助下，获得了root用户的密码是“newsys”。

在root用户权限下访问该操作系统的文件系统，“黑客的选择”黑客组织也演示了通过“Sure Signal”设备，完全有可能针对本地系统发动几种有效的攻击。总结一下，主要有以下几条。

·通过“安全的Shell连接”（Secure Shell，SSH），可以禁止“Sure Signal”设备的本地防火墙提供网络远程访问。

·通过内置的fpgaP0工具，可以增加“Sure Signal”设备的发射功率（transmit power），提高“家庭基站”信号的有效覆盖范围。

·“Sure Signal”设备的配置是通过一组XML文件完成的，这些XML文件都保存在“/mnt/mainfs/oam_data/dynamic/backup/”目录中，每一个XML文件中的“dps.param”参数，表示的是与更新相关的操作项，所以，如果我们将XML文件中的“dps.param”参数从文件中删除掉，那么这个XML文件就无法指使“Sure Signal”设备从无线网络服务提供商提供的运营网络上下载和更新任何应用了。这种攻击看似没什么，但当设备上存在着可能被攻击的漏洞时，升级可以弥补这一漏洞，而不升级则危险始终存在。

·如果从上述同样的XML文件中，删除BVG这一节的内容，那么“Sure Signal”设备就会停止向无线网络服务提供商提供的运营网络报警了。这样做会停止该设备向无线网络服务提供商提供的运营网络提供出错或被攻击的证据。

一旦到“Sure Signal”设备的远程访问建立成功，通过设备的灵活配置，这时“黑客的选择”黑客组织就可以利用平台完成几个额外的攻击，其描述如下。

1.3G网络中的国际移动用户标识符捕获器

Vodafone公司的“Sure Signal”设备是专为“有限使用”（limited-use）的场景情况下设计的。这里的“有限使用”指的是允许同时连接到该设备上的设备数量。对于一个“用户设备”，要连接到“Sure Signal”设备上，一个先决条件就是“Sure Signal”设备上的管理员必须将这个“用户设备”的“通用用户识别模块”（Universal Subscriber Identity Module，USIM）上的“国际移动用户标识符”，先期增加到自己的“允许访问设备列表”（list of permitted device）中。

“黑客的选择”黑客组织成员发现这个功能在“Sure Signal”设备上，并不是强制执行的，这就意味着“Sure Signal”设备可以被配置为一个“国际移动用户标识符”捕获器（IMSI catcher），只要我们编辑“/opt/alu/fbsr/oam_data/dynamic/restore/Bulkcm.xml”文件，然后找到并修改其中的“femtoACLenable”参数，将其值由true变成false即可。修改后的“Sure Signal”设备不再根据“允许访问设备列表”中的“国际移动用户标识符”作为依据判断某个用户是否允许连接到设备上，而是最终允许任何用户连接到该“用户设备”上。

当不知情的“用户设备”连接到“Sure Signal”设备以后，“国际移动用户标识符”信息就会以XML文件的格式保存在/mnt/mainfs/oam_data/dynamic/backup目录中。更重要的是，“用户设备”将会通过“Sure Signal”设备的宽带接口连接到Vodafone的无线网络服务提供商提供的运营网络上，这无疑给攻击者一个机会，可以捕获和提取3G无线通信网络上的语音通话和数据通信信息。

2.3G网络中语音通话记录的侦听

由于“Sure Signal”设备在3G无线通信网络中会在发送语音之前加密语音通信数据包，然后通过IPsec协议连接到无线网络服务提供商提供的运营网络上，对于攻击者来说，就可以使用“国际移动用户标识符”IMSI捕获器功能来引诱要攻击的设备远程连接到无线网络服务提供商提供的运营网络上，借此机会侦听音频对话。然而，要想提取并解密音频内容，一个必要的机制就是，必须在建立IPSec连接之前，先侦听到整个通话最初的“语音呼叫”（voice call）。

“黑客的选择”黑客组织成员使用Linux操作系统中的netfilter功能，该功能可以允许一个用户空间（user-space）的程序，可以以“tap”的搭线窃听的方式侦听Linux操作系统的核心数据并且在该用户空间中处理这些数据，然后再将这些数据回传给Linnx操作系统的核心中，用于随后对外发送时使用。该组织成员所用的工具，名叫umts_sniffer，注册了一个netfilter的socket通信接口，以便捕获和保存解密的音频文件到本地的文件系统中，该程序的示意图如图12-12所示。要下载这样的嗅探器，可以到网站https://wiki.thc.org/vodafone?action=AttachFile&do=get&target=umts_sniffer-0.1.tar.gz 下载umts_sniffer-0.1.tar.gz文件，然后就可以为“Sure Signal”设备编译二进制可执行文件。有关umts_sniffer文件的介绍，请参阅该程序的网站介绍，网址是https://wiki.thc.org/vodafone?action=AttachFile&do=get&target=umts_sniffer 。

图12-12　程序示意图

首先，我们从IP数据包队列处理中下载netfilter软件的核心模块，有关IP数据包队列方面的介绍以及核心模块的下载地址，可以参阅维基百科所提供的网页，网页地址是https://wiki.thc.org/vodafone?action=AttachFile&do=get&target=ip_queue.ko 中的介绍。下载后将文件传送到“Sure Signal”设备上。下一步，我们加载该模块，其命令格式显示如下。

然后，我们将编译好的umts_sniffer二进制文件传送到“Sure Signal”设备上，并且不需要参数，直接运行。

最后，我们在Linux操作系统的iptables表中增加一个规则，那就是将所有“进接口”（inbound）和“出接口”（outbound）的数据包都以“实时传送协议”（Real-time Transport Protocol，RTP）的方式，重定向到一个音频数据流中。该音频数据流最终会到达umts_sniffer工具的接收队列（queue）中，并进行保存，这一步骤如下所示。

当“语音呼叫”通过“Sure Signal”设备生成的时候，音频数据会被提取，然后写入到指定的目录中。该目录的文件是umts_sniffer工具在程序启动的时候，使用当时的“日期时间戳”（date-stamp）作为文件名的，文件的内容是以“自适应的多码率”（Adaptive Multi-Rate，AmR）格式存储。“自适应的多码率文件”（AMR file）可以通过Windows版的“自适应的多码率播放器”（AMR Player）或QuickTime播放器进行播放。其中“自适应的多码率播放器”软件的下载网址是http://www.amrplayer.com/ 。

除了在3G网络上进行电话呼叫的音频侦听之外，“Sure Signal”设备也可以用来作为3G无线通信网络上数据包拦截的工具。

3.3G网络中数据包的嗅探

“用户设备”连接到“Sure Signal”设备上，通过3G网络的数据服务传输数据也存在数据容易遭到嗅探攻击的漏洞，即使是使用了IPsec协议，并在连接的时候对传送到无线网络服务提供商提供的运营网络的数据在发送前就进行了加密，但这种方式同样无法避免。不过，虽然通过类似于umts_sniffer这样的工具，能够在数据包到达后，并被设备合法地解密后，通过netfilter进程从用户空间中拿到解密的数据包也是可行的，不过这会限制“Sure Signal”设备对数据包的处理和保存能力。因而这种方法并不是一个理想的选择。

“黑客的选择”黑客组织成员采用了一个不同的方式对3G无线通信网络的数据通信活动进行捕获。他们没有使用“Sure Signal”设备本身的捕获功能，而是简单地捕获IPsec加密以后的数据包，并且捕获的工具更有趣，他们根本就没有使用“Sure Signal”设备，而只是根据使用环境不同，采用了网络“tap”式搭线窃听（network tap）、跨端口中转 [4] （span port），甚至直接使用一个“集线器”（hub） [5] 。“黑客的选择”黑客组织的攻击对象并不是在3G无线网络中所使用的“SNOW数据流式加密”（SNOW stream cipher）算法，或者是“KASUMI数据块加密”算法，而是将目标定位在“Sure Signal”设备和无线网络服务提供商提供的运营网络之间由IPsec协议加密（IPsec-encrypted）的数据包上，虽然在这个位置，既要使用解密工具，也要使用密钥材料，该侦听位置示意图如图12-13所示。

图12-13　侦听位置示意图

对于攻击者来说，直接访问IPSec的“封装安全有效载荷”（Encapsulating Security Payload，ESP）协议的通信数据包，并没有多大可以使用的优势，然而，通过使用“Sure Signal”设备，攻击者可以得到IPSec协议中的“安全关联”（Security Association，SA）信息，而“安全关联”信息可以揭示使用Linux操作系统上各IP工具的加密密钥信息。有了这些信息，攻击者可以通过以下步骤，捕获和解密3G无线通信网络中的通信数据包了：

1）在嗅探的连接上，通过网络“tap”搭线窃听、跨端口中转，或者“集线器”开始数据包的捕获操作，由于三者都是基于IP数据包结构的，所以可以使用tcpdump工具进行嗅探操作。如果我们将要捕获的数据包类型限制为“封装安全有效载荷”协议，那么捕获到的数据包将只有3G网络活动，这种设置操作是通过在tcpdump工具中应用一个“封装安全有效载荷”协议数据包过滤器（filter）实现的。设置好，并开始运行以后，就可以将数据包捕获程序暂放一边，让它运行一段时间，然后再看该程序对要攻击的3G网络连接的捕获情况了。

2）从你的shell外壳程序访问“Sure Signal”设备，周期性地运行“ip xfrm state”命令，其目的是显示被诱骗的“用户设备”在连接到无线网络服务提供商提供的运营网络时产生的IPsec协议的“安全关联”信息：

3）当你准备检查3G无线通信网络的通信数据包捕获情况的时候，可以停止tcpdump进程，然后在Wireshark程序中打开所捕获的数据包。然后配置Wireshark软件解密“封装安全有效载荷”通信数据包，其操作方式是单击“编辑（Edit）|偏好（Preferences）|协议（Protocols）|ESP协议（ESP）|编辑（Edit）”菜单，然后填充交换双方的IPSec协议的“安全关联”信息，该界面类似于图12-14所示的实例。输入“封装安全有效载荷”交换双方的上述信息以后，单击“确定”（OK）按钮保存生效。Wireshark工具将应用新的设置，对“封装安全有效载荷”的交换数据进行解密，解密成功以后，就可以查看解密后数据包的内容，如图12-15所示。

4.Vodafone公司针对“Sure Signal”设备发布的补丁

就在“黑客的选择”黑客组织公布了对Vodafone公司产品的新发现之后，Vodafone公司迅速做出反应，发布了一对补丁，这两个补丁可以自动分发和应用到“Sure Signal”设备上。Vodafone公司表示补丁解决了由“黑客的选择”黑客组织所指出的访问漏洞，可以防止“Sure Signal”设备运行老的固件，以至于无法连接到Vodafone无线网络服务提供商提供的运营网络上下载到最新版本的补丁。而且当一个不知情的用户通过合法的方式连接到Vodafoner的网络时，该补丁也可以防止一个恶意攻击者配置他的“Sure Signal”设备去捕获该用户的连接，以及防止设备与该用户进行连接。

图12-14　Wireshark针对IPsec解码数据时的“偏好”设置界面

图12-15　Wireshark软件对IPsec协议网络活动的解密实例

通过“黑客的选择”黑客组织的鉴定，Vodafone的补丁确实解决了一些问题，但这些补丁并不能解决与“家庭基站”设备安全息息相关的根本问题。一个经验丰富的黑客仍然可以在“Sure Signal”设备上访问到其操作系统的shell外壳环境。当然，这需要通过一些新的外壳访问技术，比如利用系统启动的时候，作为一个系统“引导加载器”（system bootloader），再比如使用最新版的“bash外壳休克”（bash Shell Shock）漏洞，再比如系统中的另外一个漏洞。总之，一旦获得了shell外壳环境，就可以“伪造”一个假的，较低的固件版本号向Vodafone的官方网站进行上报，然后让Vodafone的官方网站主动连接不知情的被攻击者，“劝说”该“用户设备”去主动连接无线网络服务提供商提供的运营网络。最终，这样的配置还是会产生未经授权的用户访问3G无线网络，而黑客则通过强大的嗅探工具，侦听其连接过程中的语音通信和数据通信数据包，进而如法炮制地破解其中的通信内容。

这个“黑客的选择”黑客组织入侵Vodafone公司的“Sure Signal”设备的实例，是对“家庭基站”设备的恶意潜在威胁。这种威胁尽管对于“全球移动通信”无线通信网络存在限制，但从其破坏力上来说，这是一个非常有用的威胁实例。“Sure Signal”设备的入侵方式被公开不久，另一个项目展示了“家庭基站”设备类似的漏洞所遭受的另一种攻击方式，那就是Verizon和Sprint针对3G“码分多址访问”（CDMA）无线通信网络的攻击。

入侵Verizon公司和Sprint公司的家庭基站

在针对Vodafone公司“Sure Signal”设备成功入侵的事情刚刚平息，紧随其后的另一个独立的攻击事件就接踵而来，不过，这次被攻击的主角变成了Verizon公司的“家庭基站”设备。实施攻击的人分别是Doug DePerry、Tom Ritter和Andrew Rahimi，都来自于“iSEC合作人”（iSEC Partners）组织，通过他们的入侵演示，可以知道针对“家庭基站”设备的恶意攻击问题已不再局限于“全球移动通信”无线通信网络服务提供商，而是延伸到3G CDMA和EV-DO [6] 网络服务提供商。

Doug DePerry和其团队专注于使用Verizon公司的SCS-26UC4设备和Samsung公司的SCS-2U01设备。SCS-26UC4设备的实物图如图12-16所示，此外，该SCS-26UC4设备作为一个Sprint AIRAVE的数据再打包文件，使Sprint用户遭受到类似的攻击。

图12-16　SCS-26uc4设备实物图

通过外形观察，Doug DePerry发现这款Verizon公司的SCS-26UC4设备的外壳上有一个HDMI接口，通过该接口可以插入一个扩展的系统控制台模块，通过操纵控制台，Doug DePerry以及其团队成员就可以轻易地获得该基站设备上root用户的shell外壳命令的访问权，然后轻而易举地识别出该基站设备是建立在MontaVista版Linux操作系统平台上。经过进一步的研究和一些在所难免的弯路，他们能够在这个设备的Linux内核中开发和使用一个定制的Linux内核模块。这个内核模块可以在数据转发之前就捕获和解密“用户设备”的连接活动，虽然这个活动是建立在IPSec协议，与Verizon无线网络服务提供商提供的运营网络的加密后的连接，但这并不影响后面的破解。

如前所述，“家庭基站”设备的两边，分别连接到“用户设备”和无线网络服务提供商提供的运营网络上，因此，既然可以访问到两次连接中解密的数据，那么有几种黑客感兴趣的攻击方式都成为了可能。

·自动的、沉默的“用户设备”加入（automatic，silent UE join）　Samsung的“家庭基站”设备允许任意的“用户设备”加入到“家庭基站”中，这一点不像“Sure Signal”设备的默认配置。不过，Doug DePerry以及其团队成员报道说，当他们的“用户设备”在连接到“家庭基站”设备上的时候，在他们的“用户设备”上并没有显示出连接成功的标志。

·语音通话的侦听（audio eavesdropping）　电话呼叫与接听者之间的语音通话内容，可以通过“家庭基站”设备以“明文” [7] 的方式记录保存在文件中。此外，研究小组发现在“用户设备”连接设备的麦克风（microphone）会不停地将音频内容发送出去，即使是在接收接听方的说话回复的时候，也不会停下。这就为入侵创造了一个机会，他们可以在电话呼叫建立之前，就用周围的声音向对方发送。

·“手机短信服务”和“手机彩信服务”的侦听（SMS/MMS eavesdropping）　“手机短信服务”和“手机彩信服务”的内容可以通过“家庭基站”设备方式以“明文”的方式进行访问。用户可以将侦听得到的文本或媒体内容写入到文件中，以备以后查看。

·数据侦听（data eavesdropping）　同样，CDMA2000的EV-DO版数据，只要是经过了“家庭基站”设备的转发，同样会被保存到libpcap文件中，以备随后查看。

·数据的修改（data manipulation）　Doug DePerry和其团队成员能够修改网络通信的数据包，只要这些数据经过“家庭基站”设备的转发。就可以通过sslstrip工具阻止“加密套接字协议层”（Security Socket Layer，SSL）的使用，进而为黑客创建机会实施数据嗅探。sslstrip工具的下载地址为http://www.thoughtcrime.org/software/sslstrip 。有些应用程序，比如Apple手机中的iMessage工具，对于sslstrip工具的攻击，就没有漏洞可言。但是Apple手机中的iMessage工具在遭受到这种攻击的时候会主动地拒绝使用该设备，然而这样的操作反而会造成iOS手机所发送的“手机短信服务”和“手机彩信服务”内容变得可以被黑客所访问。

·通话的克隆（phone cloning）　“家庭基站”设备对于阻止克隆攻击方面，缺乏现代安全机制。前面提到的数据加密，是指“蜂窝认证和语音加密”（Cellular Authentication and Voice Encryption，CAVE）数据的加密，而不是指手机间通信的协议数据也加密。因此，当被攻击的设备连接到“家庭基站”设备上时，会公开“电子序列号”（Electronic Serial Number，ESN）和“移动识别号”（Mobile Identification Number，MIN），有了这两个数据，就可以很容易将通话内容克隆到一个骗子的电话机上。而这个冒名顶替者的电话可以以“所冒充用户的身份”拨打电话和发送短信，对于接收方来说，根本分不出这是来自被攻击设备发出的信息，还是冒充者发出的信息。更为悲剧的是，冒充者打电话或发短信所产生的费用账单将会算到被攻击设备主人的头上来。

在2013年DEFCON [8] 黑客大会上，Doug DePerry和其团队展示了这些攻击技术，并随后发表了视频，突出强调了攻击视频的内容。读者可以从http://www.youtube.com/user/iSECPartners 网站上查到相关的内容。在写这段文字时，他们在演示实现这些攻击时所使用的工具尚未公开发布。这些攻击方式包括定制所需要的内核模块获得未加密的数据等。有关针对“家庭基站”设备入侵的附加信息可以从“iSEC合作人”组织的网站上找到，该网站的网址是http://www.isecpartners.com/blog/2013/august/femtocell-presentation-slides-videos-and-app.aspx 。

Verizon公司针对入侵的回应

在确定了Verizon公司的“家庭基站”设备存在漏洞以后，Doug DePerry和其团队就通知了Verizon公司该漏洞的各项细节。Verizon公司在确认了这些漏洞的存在以后，马上就推出了对该款“家庭基站”设备新的固件升级版本，并且声称已经解决这些缺陷。尽管进行了版本的更新，但是在随后一年的DEFCON黑客大会上，Doug DePerry和其团队成员展示了他们仍然可以成功地入侵Verizon公司的“家庭基站”设备，这意味着有几种可能，或者是Doug DePerry和其团队成员有办法让“家庭基站”设备拒绝安装无线网络服务提供商提供的运营网络提供的升级程序，或者是Verizon公司针对连接到“家庭基站”设备的修改部分并没有被强制地执行，以至于固件版本并没有得到修复升级。

对于“家庭基站”设备冒充式攻击的防御措施

作为一个终级用户（end-user），一个恶意入侵后的“家庭基站”设备代表着一种威胁。这种恶意入侵行为无疑破坏了3G无线通信网络连接的安全机制。作为一种防御方法，那就是面对存在被入侵可能的“家庭基站”设备，终端用户应该在他连接到这个设备的时候尽可能地识别出来，或者至少知道这样的“家庭基站”设备存在被侦听或被拦截、修改、复制的威胁。

对于基于“码分多址访问”（CDMA）系统的手机，当我们拿起电话话筒，准备打电话连接到一个“家庭基站”设备的时候，手机在通话前会发出一声短促“哔”（beep）的声音。这是“家庭基站”设备识别出要求用户拨打一个电话，然而，对于数据访问和“手机短信服务”和“手机彩信服务”内容收发，当手机在连接到“家庭基站”设备的时候却并不会提供这样声音提示的识别技术。

作为Doug DePerry和其团队成员研究的一部分，他们开发了一个Android操作系统上的应用程序，程序的名字叫作Femtocatcher，从“谷歌玩家仓库”（Google Play store）中可以下载，该应用程序的下载网址是https://play.google.com/store/apps/details?id=com.isecpartners.femtocatcher 。源程序的下载网址是：https://github.com/iSECPartners/femtocatcher 。以后台运行的方式运行FemtoCatcher程序，它会检查“网络标识号”（Network Identification Number，NID），并将其作为连接塔（connected tower）。如果“网络标识号”的值介于十六进制的0xFA和0xFF之间，那就表示这是一个“家庭基站”设备，当Femtocatcher程序检测到有一个“家庭基站”网络的时候，Femtocatcher程序会提醒用户，并且在你手工协助的处理方式下，切换到“飞行模式”（Airplane mode），这样就可以断开与可能是恶意网络的连接。其界面显示如图12-17。

图12-17　Femtocatcher界面

如我们前面演示的一样，一个遭到攻击后的“家庭基站”设备可以成为攻击者的有力工具。虽然无线网络服务提供商们正尽力通过在“家庭基站”设备上推出强制性补丁来削弱这些攻击的效果。一个识别出某产品存在某个漏洞的攻击者，可能会利用这个漏洞最终产品进入该产品的操作系统平台中，然后使用它来引诱不知情的“用户设备”去访问网络，而攻击者则从中侦听通信的数据包，查找敏感的信息。

接下来我们将看一下“第三代移动通信合作伙伴计划”（3GPP）规范在采纳了4G“长期演进技术”（LTE）技术以后，有关对4G无线通信网络上的各项攻击技术的发展状态，以及各无线网络服务提供商们对于黑客的攻击会采用什么样的技术来减轻这些攻击所带来的威胁。

[1] 根据第二代移动通信基站方的简称为“基站收发信台”BTS，所以这里作为第三代移动通信中基站方的NodeB中的“B”指的就是Base（基站）的意思。而第四代基站则称为eNodeB。控制器方面，第二、第三、第四代无线通信的控制器分别简称为BSC（2G）、RNC（3G）、无控制器（4G）。——译者注

[2] 从运营业务上来讲，这也完全可以理解的，无线移动商为我们提供了基站，我们利用基站进行家庭级的内部通信或顶端级基站间的通信，就可以绕开无线移动提供商的计费系统，实现内部免费通信，就像现在很多单位内部的内线电话和内部局域网都是免费的一样。这很显然不是无线移动提供商所想要的。——译者注

[3] Vodafone，中文名“沃达丰”公司，是英国一家跨国性的移动电话运营商，现在为世界上最大的移动通讯网络公司之一。总部设在英国伯克郡的纽布利及德国的杜塞尔多夫。这个名字Vodafone，是语音（Voice）、数据（Data）、Phone（电话）三个单词的语音前缀及稍做调整后的合成词。——译者注

[4] “跨端口中转”相当于端口级的“中间人攻击”，假设Pa、Pb两个程序通过端口p1进行通信，现在有Pc程序处于两个程序中间，通过端口p2与Pa通信，通过端口p3与Pb通信，Pc程序接到Pa的数据就无条件转给Pb，同样接到Pb的数据就无条件转给Pa，同时还可以将二者通信的数据保存到本地。——译者注

[5] “集线器”（hub）是现在交换机的最初形式，其原理是只要有一个端口有数据要发，就将数据发送到所有端口上。这种数据交换设备最大的问题是当多个端口同时有数据通信的时候，会因为数据冲突量暴增而使通信效率急剧下降，甚至导致网络瘫痪。但这种设备对于单向广播式环境（比如有线电视、网络电视IPTV）或黑客入侵场合，是一个极好的通信方式。——译者注

[6] EV-DO是Evolution、Data、Only三个单词的缩写，全称为“CDMA2000 1x EV-DO”。即“‘码分多址’CMMA的2000版中，第一阶段只对数据进行推进的一个版本”。——译者注

[7] 这里的“明文”很显然不是语音通话中，说话内容的文字，而是说话的语音直接以未加密的方式下保存了。随后一项中，“手机短信服务”和“手机彩信服务”的“明文”也是同一意思。——译者注

[8] DEFCON世界黑客大会，每年7、8月间在美国拉斯维加斯举行，交流最前卫的黑客攻防技术。属于世界顶级的黑客大会。——译者注

12.4　4G长期演进技术网络的安全

4G“长期演进技术”（Long Term Evolution，LTE）无线通信网络，不像早期的“第三代移动通信合作伙伴计划”（3GPP）规范下的3G无线通信网络，在第四代网络中，特别是在安全领域，提供了一种相互认证的强有力的机制。该机制可以击败许多已知的，针对蜂窝网络的攻击。此外，“长期演进技术”无线通信网络利用“钥匙保持分离”（key holding separation）和“密钥导出函数”（key derivation function）来限制对安装密钥的访问，该密钥既用于“通用用户识别模块”（USIM）的认证，也用于“后端网络”（back-end network）的认证。这些改进不仅向“长期演进技术”无线通信网络提供了现代的安全功能，同时这些安全功能对于终端用户来说，又是透明的，而且这些改进还为攻击者捕获和窃听的“长期演进技术”无线通信网络的活动创建了一个机会。

在这一部分内容中，我们首先来看看“长期演进技术”无线通信网络的基本架构，然后在认证交换和随后的网络访问过程中，检验一下组件参与这些活动的功能。我们也会看一下“长期演进技术”无线通信网络的认证交换过程，理解一下相比于以前“第三代移动通信合作伙伴计划”规范下的3G无线通信网络，“长期演进技术”无线通信网络究竟在哪些方面有系统地提高。最后，我们来看一个攻击的可能机会，借助于这个机会，一个资深的黑客利用以前曾有的访问权限以明文的方式访问敏感蜂窝网络中的语音通话和数据通信交换的入侵过程。

12.4.1　长期演进技术无线通信网络的模型

一个“长期演进技术”无线网络模型的完整实现过程是一个非常复杂的过程，带有许多不同的组件，可以满足不同需求的不同实现方式。对“长期演进技术”无线网络体系模型的基本理解，可以通过一个基本的移动设备，以及支持这个网络的插图来进行掌握，如图12-18所示。我们可以检查这些组件在网络中的位置，理解它们在网络中所扮演的角色。

图12-18　4G“长期演进技术”基本网络架构

·“通用用户识别模块”/“用户设备” 　“通用用户识别模块”（Universal Subscriber Identity Module，USIM）存在于“用户设备”（User Equipment，UE）之内。“通用用户识别模块”对于网络的识别和提供一个密钥的保存机制来说，扮演的是一个至关重要的角色。“用户设备”就是我们平时用的，连接到“长期演进技术”无线网络的手机或其他设备。

·“进化的节点B” 　“进化的节点B”（Evolved Node B，eNodeB）元素和以前的“第三代移动通信合作伙伴计划”规范中“节点B”元素很相似。两者都提供了以无线访问机制，让“用户设备”连接到“长期演进技术”无线网络的能力。其中，“进化的节点B”提供了到“长期演进技术”无线网络低层次的访问，并且也不会主动地参与到高层次的数据访问和身份验证选项。

·“移动管理实体” 　“移动管理实体”（Mobility Management Entity，MME）接口连同“进化的节点B”，提供了访问“长期演进技术”无线网络时的主要控制节点（primary control node）。“移动管理实体”是在认证交换完成以后，最终负责加密和解密的网络通信数据包的模块，并选择承担“用户设备”连接的“服务网关”任务。

·“家庭用户服务器” 　“家庭用户服务器”（HSS）是用户信息的中心数据库（central database）。“家庭用户服务器”与“移动管理实体”进行交互，从而验证“通用用户识别模块”网络的访问授权，向“移动管理实体”提供必要的信息来验证网络对“通用用户识别模块”身份的有效性。

·“服务网关” 　“服务网关”（SGW）负责通过网络对数据包进行路由操作。“服务网关”与“移动管理实体”进行交互，最终根据认证状态，授予或拒绝其对“用户设备”的访问权限。

·“分组数据网网关” 　“分组数据网网关”（Packet Data Network Gateway，PDN-GW）的作用就是接收来自于“服务网关”的数据包，而该网关的另一侧则是“分组数据网”，是外部的，非“长期演进技术”的无线网络，比如说互联网。

这个模型提供了一种结构化的访问机制，该机制是专门针对“长期演进技术”的无线网络和外部提供网络认证和加密功能网络之间的交互操作。虽然这个模型可以明显地变得更复杂（特别是处于两协议塔之间进行对等漫游的时候 [1] ），该模型提供了了解“长期演进技术”认证功能所需要的必要特征。

12.4.2　长期演进技术无线通信网络的认证

“长期演进技术”网络提供了将要通信的两个手机之间相互认证的机制和网络基础设施所使用的协议“演进的分组系统的认证和密钥协商”（Evolved Packet System Authentication and Key Agreement，EPS-AKA）协议。就像第二代的“全球移动通信”网络和“第三代移动通信合作伙伴计划”规范网络一样，第四代的“长期演进技术”网络依靠的认证功能和共享内容是由“国际移动用户标识符”（International Mobile Subscriber Identity，IMSI）提供的。这个“国际移动用户标识符”码由三个部分组成。

·“移动设备国家代码” 　“移动设备国家代码”（Mobile Country Code，MCC）指的是终端用户所在的国家编码。

·“移动设备网络代码” 　“移动设备网络代码”（Mobile Network Code，MNC）在这里指的是家庭网络（home network）。

·“移动设备用户识别代码” 　“移动设备用户识别代码”（Mobile Subscriber Identification Number，MSIN）指的是在“移动设备用户识别代码”和“移动设备网络代码”相结合后，所对应的那个上下文网络中每一个用户的代码。

“国际移动用户标识符”值存储在“通用用户识别模块”上，是一个固定的值；只要“通用用户识别模块”不更换，那么“国际移动用户标识符”的值就不会改变。“国际移动用户标识符”值对于“用户设备”来说，是一个共享的标识符。例如作为“长期演进技术”手机来说，“家庭用户服务器”关联了认证主键“K”，那么无论是“用户设备”，还是“家庭用户服务器”都会使用这个“K”的值，进行二者之间的相互认证。

注意

在“长期演进技术”无线通信网络中，基本安全组件就是“共享密钥K”（shared secret K），它的作用是用于认证过程和动态密钥派生。“共享密钥K”保存在“通用用户识别模块”和“家庭用户服务器”中。对比一下前面第4章中曾提到过的“Wi-Fi保护访问下的预共享密钥”认证方式，我们发现“Wi-Fi保护访问下的预共享密钥”认证方式虽然也依赖于一个共享的密钥，但是无论是“个人版”还是“企业版”，所用的“共享密钥”都是预先定义的，并且保存在认证服务器上的，并且“个人版”的“共享密钥”是全网只有一个，“企业版”的“共享密钥”是每一个认证服务器一个；而在“长期演进技术”无线通信网络中就不一样，这里的“共享密钥K”对于每一个终端用户就有一个，并且在连到网上时都是唯一的。

认证交换过程是在终端用户和“长期演进技术”网络基础设施之间进行的。交换的数据至少有：“通用用户识别模块”，“用户设备”，“移动管理实体”和“家庭用户服务器”四个数据。一个简化的“长期演进技术”认证交换过程如图12-19所示。

图12-19　4G“长期演进技术”网络的认证交换过程

1）“通用用户识别模块”与“用户设备”之间共享了“国际移动用户标识符”值。请注意，“通用用户识别模块”从未向“用户设备”透露过“共享密钥K”的值，也没有通过任何网络接口传输过该值。

2）“用户设备”会转发“国际移动用户标识符”值给“移动管理实体”。

3）“移动管理实体”再将“国际移动用户标识符”值转发给“家庭用户服务器”。有了“国际移动用户标识符”值，“家庭用户服务器”就可以识别出其中的“共享密钥K”。注意这个密钥值从不会与“移动管理实体”进行共享的。有了“共享密钥K”，“家庭用户服务器”就会选择一个随机数，假设这个随机数用RAND表示，然后就可以派生出一个“访问安全管理实体密钥”（Access Secure Management Entity Key，KASME）、一个“认证值”（Authentication Value，AUTN）、一个“预期响应值”XRES（Expected Response Value，XRES）。

4）“家庭用户服务器”会与“移动管理实体”共享“访问安全管理实体密钥”、“认证值”、“预期响应值”，以及随机数RAND。至此，“家庭用户服务器”就基本完成了认证交换过程，剩下的就是“移动管理实体”再进行身份的验证工作。

5）“移动管理实体”保留“访问安全管理实体密钥”和“预期响应”作为本地的密钥，然后和“用户设备”共享“认证值”和随机数RAND。

6）“用户设备”与“通用用户识别模块”共享“认证值”和随机数RAND。

7）“通用用户识别模块”，就像“家庭用户服务器”一样，是知道“共享密钥K”的，所以它会计算自己的“认证值”，并将自己计算的值与从“家庭用户服务器”接收到的原始“认证值”进行一下对比，如果两个“认证值”是相互匹配的，那么“通用用户识别模块”就会认为“家庭用户服务器”也有一个相同的“共享密钥K”，下一步，“通用用户识别模块”会计算它自己的“响应值”（Response Value，RES）以及一个“中间密钥值”（intermediate key value），这个“中间密钥值”最终会用于派生出“访问安全管理实体密钥”，但不会发送给“用户设备”，不过“访问安全管理实体密钥”倒是会发送给“用户设备”的。

8）“用户设备”保存“访问安全管理实体密钥”，为以后使用作准备，然后转发其中的“响应值”到“移动管理实体”上。

9）“移动管理实体”会用收到的“响应值”，与之前从“家庭用户服务器”接收到的“预期响应值”进行比较。通过这两个值的比较，“移动管理实体”就知道“通用用户识别模块”有一个正确的“共享密钥K”。这时，“用户设备”和“移动管理实体”这两个实体之间，也就完成了相互的认证过程。

10）在认证之后的正常数据交换过程中，“用户设备”和“移动管理实体”通过使用“访问安全管理实体密钥”值就可以对数据进行加密和解密，二者之间通过无线介质进行传输的通信数据包。

图12-19中有一个最坏的情况，那就是“国际移动用户标识符”在发送的时候，是以明文方式通过“长期演进技术”的无线网络接口发送的。这种情况的发生，一般是在“用户设备”和“移动管理实体”之间进行初始连接的交换过程中最容易发生的。但随后的连接就不再使用“国际移动用户标识符”，而是使用“全球唯一临时身份标识”（Globally Unique Temporary Identity，GUTI）来代替。在认证交换的过程中，“全球唯一临时身份标识”并不会发生动态的改变，而只是在“移动管理实体”向“家庭用户服务器”发送“国际移动用户标识符”之前，多加了一次“国际移动用户标识符”对“全球唯一临时身份标识”的查找过程而已。查找的目的自然不言而喻，是为了在以后的通信中，由后者取代前者。

尽管使用“全球唯一临时身份标识”的目的是为了身份认证，但是在“长期演进技术”无线通信网络中，仍然存在针对“‘国际移动用户标识符’捕获器”攻击（IMSI catcher attack）的漏洞存在。那就是当“用户设备”在第一次连接到“移动管理实体”所在的网络时，必然会暴露“国际移动用户标识符”至少一次，而一旦“国际移动用户标识符”被黑客捕获到，那么黑客同样也可以由该值派出生“全球唯一临时身份标识”。我们再来想想，为什么网络的认证要发生在“国际移动用户标识符”出现之后呢？这是因为“国际移动用户标识符”需要确定“共享密钥K”，而“共享密钥K”又是派生出“认证值”、“预期响应值”、“访问安全管理实体密钥”等值的不二人选。所以我们很容易就会想到，如果黑客只要在“用户设备”第一次连接“移动管理实体”的时候拿到“国际移动用户标识符”，那么用同样的方法，黑客也能推算出后面各个重要的值，那么随后的加密的通信数据自然会土崩瓦解。怎样拿到“用户设备”在第一次连接“移动管理实体”时的“国际移动用户标识符”呢？办法就是攻击者越俎代庖，建立一个“流氓”的“长期演进技术”无线通信网站，然后吸引终端设备过来进行连接，一旦这个方法奏效，该网站上的“移动管理实体”就会初始化一个连接，向对方的“用户设备”发送一个“身份请求消息” （identity request message），强制对方的“用户设备”乖乖地将“国际移动用户标识符”发送过来。

尽管存在“‘国际移动用户标识符’捕获器”攻击的隐私威胁，“长期演进技术”的认证交换仍然还是提供了一个强有力的，基于“密钥值分别持有”的相互认证机制。在基础设施方面，“长期演进技术”网络可以通过“共享密钥K”尽可能少地向“家庭用户服务器”暴露的方式限制黑客对“共享密钥K”攻击的可能性，也从整体上减少黑客的攻击面。同样，“通用用户识别模块”从不向“用户设备”公开“共享密钥K”，也防止了恶意程序窃取的“共享密钥K”值，直接限制了攻击者将该值克隆到另一个“通用用户识别模块”卡上，然后以冒充者的身份继续使用的能力。

接下来，我们来看看在“长期演进技术”网络中，用来提供数据保密的加密机制以及随后进行的认证交换。

12.4.3　长期演进技术无线通信网络的加密机制

就像现代很多加密系统一样，“长期演进技术”网络也支持加密算法的灵活性。而早期的“第三代移动通信合作伙伴计划”规范网络系统仅限于极少数的加密算法，并且如果没有网络基础设备和“用户设备”设备的重大变化，这些加密算法是轻易不会更换的。而在“长期演进技术”网络中，这一现象得到了较大的改观。在“长期演进技术”网络中，只要协议认为有必要，那就可以随时加入一个新的加密算法。假如明天有人发现在“高级加密标准”算法中存在毁灭性缺陷，那么“长期演进技术”网络就能通过加入一个新的算法选项，或者是切换到一个已经支持的不同的算法上，系统中的设备就可以很快适应新的算法，从而减轻由该缺陷所带来的威胁。

12.4.4　长期演进技术无线通信网络的空算法

在无线网络服务提供商提供的运营网络上，为其提供的服务是非常复杂的。在某些情况下，实际需要提供的服务比“长期演进技术”网络对安全所渴望的服务还多。这包括了对“空算法”（Null Algorithm）的使用。

“长期演进技术”网络的“紧急呼叫系统”（emergency calling system），在美国，该系统的号码是911电话，必须支持发自任何终端设备的主动连接，甚至包括那些没有“通用用户识别模块”卡的终端设备的主动呼叫。在这种情况下，虽然提供紧急服务的需求超过了对安全的需求，虽然“共享密钥K”就保存在“通用用户识别模块”卡里，但是我们还缺乏用于派生密钥的必要信息，要知道，这个派生密钥是用来加密和解密来往的通信数据包的。为了满足这种特殊需求，“长期演进技术”网络的解决是支持“空算法”。该算法并不提供网络通信数据包的保密性。这种认证机制或加密算法的缺失，使得攻击者获得了入侵系统的机会，只要通过冒充合法运营商的网络，那么不需要密码，黑客就可以发动一个攻击过程，从而简化攻击的难度。

12.4.5　长期演进技术无线通信网络的加密算法

除了上面提到的“空算法”，“长期演进技术”网络还支持128位的“演进的分组系统加密算法第1版”（Evolved Packet System Encryption Algorithms 1，EEA1）算法，该算法的别名是“SNOW 3G”算法，以及128位的“演进的分组系统加密算法第2版”（EEA2），该算法的别名为“AES-CTR-128”算法。其中“SNOW 3G”算法是从3G网络中提出的，这个算法其实在3G网络中已经使用了很多年，但当时它只是作为一个无线网络服务提供商提供的运营网络上一个可选的算法，如今改头换面，变成了现在的“SNOW 3G”算法。采用“SNOW 3G”算法有助于稳定“长期演进技术”网络的安全控制，能起到该效果的原因是这个算法重新使用了一个已被大众很好地理解的算法，并且该算法已经成功地部署了多年。

然而，在第一次使用时，“长期演进技术”网络的运营商也在“计数模式”（Counter mode，CTR mode）下使用了一个128位密钥长度的“高级加密标准”加密算法。在“计数模式”中，“高级加密标准”加密算法可以采用并行硬件进行加速，并且算法本身的安全性已经在其他知名的部署方案（如IEEE 802.11的“Wi-Fi保护访问版本2”安全）得到证明。“高级加密标准”提供了一条前进的道路，那就是用现成的算法（off-the-shelf algorithm）为“长期演进技术”网络提供安全，而不是为了提供安全而重新设计新的加密算法。这样做可以很大程度上减少协议设计的复杂度，并且由于采用的是成熟的算法，所以也可以加速被用户采纳的速度。

通过力度很强的相互认证算法，加上高强的保密性和完整性机制，使得“长期演进技术”网络得以提供强大的抵抗力，相比于其前身的3G网络，“长期演进技术”网络可以抵御许多应用于3G网络的攻击。即使是利用网络，通过“家庭基站”的硬件发动一次“3G的攻击向量”，从而操纵接收到的数据，最终该方式取得了显著的关注，有关这部分内容将在下一节中进行介绍。

12.4.6　长期演进技术无线通信网络的平台安全

按“长期演进技术”网络的说法，“家庭扩展基站”单元对“获得许可的射频服务”进行了扩展，当然，该服务也是在所安装家庭的许可条件下安装的，所以这种网络更多地被称为“家庭扩展基站”网络（Home eNodeB，HeNB）。“家庭扩展基站”网络提供了与其3G对手“家庭基站”网络相似的功能，是利用用户的“宽带互联网”连接到IPSec隧道上的数据服务，然后再连接到无线网络服务提供商提供的“安全网关”（Security Gateway，SeGW）上，如图12-20所示。

图12-20　家庭扩展基站网络示意图

“安全网关”设备同时担任了几个角色，包括安全协商、加密、网络数据包的解密。其中解密的数据有些是发往“家庭扩展基站”的，有些是来自于“家庭扩展基站”的。网络运营商使用IPSec协议，结合IKEv2加密算法，用于“家庭扩展基站”和“安全网关”之间的认证，二者相互之间的认证证书使用的是X.509数字证书。当一个“用户设备”连接到“家庭扩展基站”设备的时候，它的工作方式类似于一个“扩展的节点B”基站，考虑到之前“移动管理实体”和“家庭用户服务器”都分别曾对“服务网关”和“分组网关”进行过访问，所以都获得过二者的授权，尽管这样，通过对“通用用户识别模块”的使用，运营商还是提供了“用户设备”和“家庭扩展基站”设备相互间的认证。

在传统“长期演进技术”设备的部署中，“移动管理实体”并不负责使用“访问安全管理实体密钥”对数据包进行加密和解密。而“家庭扩展基站”设备则不同于上面的方式，相反，“家庭扩展基站”设备在接收到由“用户设备”发送过来的数据包时，会在将数据通过IPsec隧道连接转发到互联网之前，主动将数据解密。这就意味着，对于入侵者来说，在这里的“家庭扩展基站”设备处有一个攻击的入口点可以为来自网络的攻击者提供一些进攻的机会：

·一个捕获器，一个小的、轻量级的、便携式的“国际移动用户标识符”捕获器。

·一个入口点，一个无线网络服务提供商提供的运营网络上的一个入口点（entry point），通过该入口点就可以攻击目标设施。

·一个机会，一个诱骗“长期演进技术”网络被攻击移动设备通过该设备上网的机会，只要这个移动设备连接上网，那么随后通过侦听和操纵网络的活动，就可以完成其该网络设备上游或下游数据之间的传送。

认识到这些问题，并针对之前3G“家庭基站”网络的各种攻击，“第三代移动通信合作伙伴计划”规范网络对“家庭扩展基站”设备的要求提出了几点看法：

·物理安全的需求（physical security requirement）　“第三代移动通信合作伙伴计划”规范要求“通用用户识别模块”必须是物理安全的，以便缓解系统遭到“篡改攻击”（tampering attack）或“未经授权访问攻击”（unauthorized access attack）的威胁。尽管有这样的要求，但“第三代移动通信合作伙伴计划”规范并没有测试方案和合规判断细则。所以为了达到这一目标，只能允许制造商“既当运动员，又当裁判”，自己制定自己的判断标准，然后自己判定自己的安全控制是否符合无线网络服务提供商所应提供的安全需求的。

·仅限信任的根结点，以及可信运算的环境（root of trust and trusted execution environment）　“家庭扩展基站”设备必须使用一个信任的“根结点”（root），随后该权限会被用来验证“可信运行环境”（Trusted Execution Environment，TEE）。通过这种机制，所有代码必须通过签名的方式得到验证，只有基于信任的“根结点”才能运行，通过这种方式可以阻止“恶意代码攻击”。具体来说，“可信运行环境”必须延伸到启动过程，涵盖所有的操作系统以及在“家庭扩展基站”上运行的其他可执行文件的管理。

·内部数据的分割（segmentation of internal data）　“家庭扩展基站”必须将操作系统和“长期演进技术”数据包之间的数据分割，以便减轻“网络窃听攻击”对“家庭扩展基站”网络的影响。

·设备和数据整合检查（device and data integrity check）　家庭基站必须提供设备和数据完整性检查功能，以便识别“篡改攻击”，避免威胁到“家庭扩展基站”、用户数据、无线通信网络运营商网络的安全。

·地理位置信息（geolocation）　确保“家庭扩展基站”网络在某些频率不允许发送的区域内，不发即使是在其他区域内许可的频率。“家庭扩展基站”使用“全球导航卫星系统”（Global Navigation Satellite System，GNSS），通常会通过使用GPS接收器进行定位。

·时钟同步（time synchronization）　“家庭扩展基站”设备必须保持一个精确的时钟系统，以确保可以通过IPSec验证证书期限的有效性。

同时符合上述要求的产品尚未公开审查，所以上述规则将大大提高“家庭扩展基站”设备的安全，减少一些较早对3G网上“家庭基站”设备平台的攻击，也还是完全有可能的。然而，对于“第三代移动通信合作伙伴计划”规范网络设备和第四代的“家庭扩展基站”设备，缺乏对认证和符合性的测试方法和判断细则，这可能导致设备的加工制造商为了降低设备生产成本，而“缺斤少两”走“捷径”，从而做出带有隐患，但他却能自圆其说，最终仍然存在漏洞的产品。最后，对一个“家庭扩展基站”设备，在未经授权情况下进行访问，最终会给攻击者提供机会，使攻击者可以像侦听类似3G网络的设备一样，偷听到4G“长期演进技术”网络的数据传输，最终仍然可以造成入侵攻击。

[1] 大概的意思是：要进行数据交换，双方就必须具有同样多，且对等的协议，如果把每个协议的各层竖放比喻成一个协议塔的话，那么对等的通信双方，二者协议塔不仅要等高，每一层之间还具有一一对应关系。——译者注

12.5　本章小结

在这一章中，我们看到了蜂窝网络技术中的安全问题。早期的2G无线通信网络是脆弱的，有几种攻击方式都源于这种网络技术使用弱的加密技术和弱的认证协议上。对2G无线通信网的攻击工具有AirProbe、Kraken和Pytacle，这些工具都允许攻击者建立被动式嗅探、密钥还原、数据包解密和使用数据提取工具等攻击方式；另有一些工具，如OpenBTS和YateBTS，可以创建直接的机会，从而加载一次针对“全球移动通信”网络的“中间人”攻击。

作为蜂窝网络技术的演化，安全性得到了较大提升的版本。3G网络技术利用改进的认证技术和加密密码，挫败了许多早期的针对2G无线通信网络的攻击。然而，3G技术引入的“家庭基站”体系结构作为一种蜂窝网络技术的演化版，已多次证明是蜂窝可以对外泄露网络无线通信网络运营商和终端用户的信息。作为一个授权的3G网络“终端点”（termination point），“家庭基站”设备已经被攻击者所利用，可以用来窃听用户信息，并且黑客可以访问电话语音通话、“手机短信服务”和“手机彩信服务”和数据的通信。作为一个“中间人”角色的接口，“家庭基站”设备也会被黑客所，用来操纵网络通信数据包。无论是由无线通信网络提供商提供的网络到“用户设备”，还是按相反的方向，只要数据经过了“家庭基站”设备，都会为入侵者创建创造很多的进攻机会。

最新的4G“长期演进技术”网络技术不断提高蜂窝网络的安全，包括对“家庭扩展基站”设备的物理安全控制进行严格要求。到目前为止，我们还没有在“长期演进技术”网络技术出现重大安全突破，这会让使用该技术的消费者有了更大的信心。

在本章，我们看到了攻击远程蜂窝网络协议的多项技术。其实，类似的威胁也困扰着短距离的网络技术，我们将在下一章，一起看看在ZigBee和IEEE 802.15.4协议中存在的漏洞。

第13章　破解ZigBee网络

ZigBee是一项已经建立，然而仍在不停增长的无线技术，为多种工业领域所采纳。这些领域都希望使用一款有简单的协议堆栈、小规格、低数据速率，以及较长的电池寿命的电子产品，于是大家选择了ZigBee技术。ZigBee技术由“ZigBee联盟”（ZigBee Alliance）开发，它作为一项集成组件，在工业生产和家庭应用中首先被发现，然后迅速扩散到广大的技术领域，从家庭影院的遥控，到医院的患者监护系统。

因为这本书是第3版，ZigBee技术已确立了其在外围设备的牢固地位，比如，在家居领域和楼宇自动化市场中，用在工业控制系统市场中，都有重要的增长。虽然“低功耗蓝牙”技术已经在医疗器械、移动电话及移动电话周边市场上占据主导地位，ZigBee技术也不示弱，在智能能源应用方面不断成为其无线平台的选择。所连接设备，如“智能温控计”（smart thermostat）就是通过ZigBee接口连接家庭其他ZigBee接入的设备上的，另如，在建设管理集团中，用于监测基础设施组件的，如“暖通空调”（Heating、Ventilating and Air Conditioning，HVAC），“气水分配线”（gas and water distribution line），“锅炉”（boiler），“照明控制器”（lighting controller），以及更多的领域，都有广泛的应用。从企业的角度来看，ZigBee技术可以用于在许多现代的度假村和酒店，具体应用点如这些地方的“门锁管理与开关审核”（door lock management and auditing），以及在高端数据中心的“环境监测系统”（environmental monitoring system），可以实时地报告“温度”（temperature），“湿度”（humidity），“烟雾监测”（smoke），“空气中的颗粒数”（air particulate count）和其他具有“关键数据中心运算”（critical data center operating）特点的环境。

一些分析家认为，ZigBee已经在支持“物联网”（Internet of Things）的无线通信技术的选择中，占据了一个重要的地位。“物联网”是一个概念，在这个网络中，我们平时进行信息交互的物理对象，都可以成为网络中正常的基本成员。从沙发到冰箱，都被配上了“传感器”（sensor）或“控制器”（controller），这就使这些设备可以与物理世界进行交互，而不像以前只能由人来直接手工控制。作为一种低成本、低功耗、简单的技术，在设计上，也不需要引发专有软件供应商的兴趣参与设计与开发，因此，ZigBee技术是支持下一代智能设备互联互通的一个合乎逻辑的选择。事实上，我们已经在这个模型中看到ZigBee技术在智能设备设计上的引入实例，如从“谷歌Nest智能温控计”（Google Nest Smart Thermostat）可以和“飞利浦色调LED灯泡”（Philips Hue LED light bulb）相连，到“Comcast公司的XFINITY家庭安全路由器”（Comcast XFINITY Home Security router）已经可以连上“家用灯光开关”（home light switch）和其他外设，并且该路由器已连接到公共的互联网了。通过上面的实例，我们不难想象，ZigBee技术已经融入到“物联网”的世界中了。

在本章中，我们将回顾ZigBee协议栈的功能，检查一下某个问题的原因，那就是为什么ZigBee会在自己的协议簇中放入那么多相互竞争的无线协议？我们也会讨论ZigBee技术在通信领域内的部署现状和使用情况。在过去的几年中，ZigBee技术已经扩展，并添加了许多新的功能和特性，包括重大的安全改进，因此，我们会随着ZigBee协议栈的层状结构逐层审视每一层的安全。我们也会检验几个工具，这些都是可以用来攻击ZigBee网络的工具。我们使用这些工具，一步步地对一些ZigBee设备中的公共的漏洞进行攻击，然后查看攻击效果，随着每一个攻击的完成，也会逐步得出攻击的结论。当然，伴随着的是一些针对该漏洞防御上的建议，主要是在我们自己的ZigBee部署中识别一些新的ZigBee威胁。

13.1　ZigBee简介

ZigBee技术为低功耗无线网络定义了一系列的标准，许多设备的电池寿命都能够达到5年之久。这些可观的节能特性都很大程度上来源于ZigBee设计中的一些让步，比如“较低的数据传输速率”（low data-rate transfer）、“相对近距离的传输”（relatively short-range transmission）、“持续供电网络协调器和路由器”（persistent-powered network coordinator and router），以及一个简单的协议堆栈，这个协议堆栈由多种“片上系统”（System-on-Chip，SoC）实现的。所谓的“片上系统”，就是将整个ZigBee协议堆栈（stack）、“无线传输器”（wireless transceiver）和“微处理器”（microprocessor）都集中在一个“集成电路”（Integrated Circuit，IC）上。

13.1.1　ZigBee在无线标准中的地位

一个最普遍的，也是最重要的问题是，当人们听到ZigBee的时候，他们常常会问“为什么说ZigBee是必不可少的？”。在一个拥有Wi-Fi、蓝牙，以及其他专有的解决方案的世界里，为什么我们还需要使用ZigBee呢？

这个问题只能在两个条件都成熟的时候才能回答，那就是“如果”ZigBee作为一个无线协议被广泛应用的时候，和“当”ZigBee作为一个无线协议被广泛应用的时候，我们才能找到这一问题的确定答案，现在，尽管许多迹象都表明ZigBee会继续获得更大的成功，但就目前来说，还不能过早下结论。同蓝牙和Wi-Fi相比，ZigBee是一个相对简单得多的协议，它全部的功能堆栈都在120KB的“非易失性随机访问存储器”（NVRAM） [1] 内实现了，一些生产商甚至声称他们研制出了精简版本的功能堆栈（reduced-functionality stack），它的大小只有区区40KB。现在，大部分Wi-Fi网络的传输速率是54Mbps（不包括IEEE 802.11n网络和IEEE 802.11ac网络），就连蓝牙的传输速率也在3Mbps，然而ZigBee的数据传输速率只有20~250Kbps [2] 。许多用户都表示Wi-Fi设备的“电池待机时间”（battery life）相对较短，比如像Wi-Fi VoIP电话这样的嵌入式设备，它充满电后的“电池待机时间”大概是8~12小时，“低功耗蓝牙”可以达到不错的“电池待机时间”，但是“低功耗蓝牙”只是提供了很有限的功率范围，因此只能把目标定位于“个人局域网络”（Personal Area Network，PAN）市场。相比之下，采用ZigBee技术“电池待机时间”能够延长到数月或者数年，对于一些高端（high-end）的服务对象来说，“电池待机时间”可以达到5年之久，并且再次充电后仍然可以继续使用。另外，即使在这种超长待机时间下，在这种低成本的接口上，其传输距离也在10~100米，甚至更长的传输距离。最后值得一提的是，ZigBee使用最简单的通信协议，简单到其协议可以少到只有三个就足够了。

其他无线协议，例如Z-Wave，在简单化和电池保护做得也十分漂亮，在某些项目上甚至超过了ZigBee。然而，Z-Wave是一个专有的协议，使用该协议所做的产品，在出售的时候，所有出售的产品都需要为Sigma Designs（Z-Wave技术的版权所有者）支付所需的许可证费用。可以说，这样一个模式等于是让Sigma Designs控制了产品的市场准入权，最终抑制了Z-Wave技术广泛的发展和创新。有关Z-Wave网络的内容，我们留在第14章讨论。

从应用程序角度来说，ZigBee协议对于高速的数据传输需要来说，并不是一个正确的协议选择，比如X光成像的传输或者BitTorrent方式的数据下载。而且，ZigBee协议对于通过实时的语音流传输语音通话，也同样不是一个正确的协议选择，因为这些实时的语音流数据要求接口有良好的扩展性以及音频鲁棒性。但是，在其他的应用场合下，当Wi-Fi和蓝牙都不能满足程序的要求时，ZigBee无线协议反而大有用武之地，这时选择ZigBee会是一个合适的选择。

13.1.2　ZigBee的部署

有一个市场的ZigBee技术已经蓄势待发，那就是“家庭自动化市场”（home automation market）。在这里，ZigBee会与“家庭控制系统”（home control system）进行连接，所连接的设备中，当然就是可以被控制的设备了，比如“电子应用类设备”、“照明控制”、“家庭安全系统”、“暖通空调”，以及其他更多的设备。除此之外，还有一些中间连接控制设备，如作为加工商生产的CentraLite产品“ZigBee供能照明开关”（ZigBee-powered light switch）和调光器（dimmer），以及用于“家庭照明自动控制智能插座”的需求。其他家庭自动化技术是用于安全目的的；Black&Decker公司（中文名“百得”）是“Kwikset SmartCode”道栓的制造商，该公司生产的“无线键盘输入系统”（wireless keypad entry system），名叫“家的连接”（Home Connect），利用ZigBee无线技术的地方包括从门把手和锁，到与后台服务器进行认证“个人身份码”值的通信，以及当有不速之客入室后，会通过“手机短信服务”短信的方式发给户主的报警机制。

对ZigBee来说，另一个有影响力的市场是的“智能电网”（smart-grid）技术，包括“先进的计量基础设施”（Advanced Metering Infrastructure，AMI）。许多国家会在智能电网技术上进行投资，本地的公共事业部门也会使用覆盖小区的无线网络同用户家中的家庭智能电表进行交互。消费者可以在他们的ZigBee温控计上通过一些智能测试仪器实时获得电价信息，例如“Google的Nest的智能恒温调节器”，其实物图如图13-1所示。

图13-1　Nest智能恒温调节器

提示

“ZigBee联盟”（ZigBee Alliance）负责维护一个产品列表，所列的产品都是已被认证为“ZigBee兼容”（ZigBee compliant）的产品，这个列表的排序原则是市场的影响力、读者或用户，可以从http://www.zigbee.org/ 网址上获得完整的列表。

除了商业ZigBee产品之外，许多组织开发他们自己的软件来使用ZigBee传输技术，可以使用的ZigBee无线芯片有“德克萨斯仪器”（Texas Instrument）、Ember、Microchip，以及Atmel等诸多芯片。这些项目中的许多产品都在积极使用，支持生产运营、环境监测，甚至在零售业务上也可以将信用卡号码通过ZigBee无线技术进行传输。

13.1.3　ZigBee的历史和发展过程

从产品开发的角度来看，尽管ZigBee技术的诞生和技术支持在1998年，但直到2004年12月，“ZigBee联盟”才宣布批准首个“ZigBee规范”正式生效，该规范称为“ZigBee-2004”。这个版本的规范，很好地定义和包括了ZigBee的许多关键的特性，这无疑会在一些重要的技术选型方面，在一些著名的无线协议无法满足要求时，使ZigBee对这组织来说显得很有吸引力。

2006年，“ZigBee联盟”又发布“ZigBee-2006规范”，增加一些重要的特性，如“组寻址能力”（group addressing capabilities），在这个特性中，一个设备可以使用一个单一的数据包，通过向“组寻址能力”发送，就可以将信息发送到多个客户端上。在软件配置文件方面，这个新的规范进一步细化了对ZigBee协议栈软件配置文件之间的互操作性的定义，简化了通过ZigBee技术，开发“跨平台兼容”（cross-platform-compatible）的应用程序的过程。

在2007年年底，“ZigBee联盟”发现了一套新的ZigBee的特性，被称为“ZigBee Pro”。“ZigBee Pro”定义的增强的安全功能包括改进的密钥派生功能，并且能够通过“数据碎片”（data fragmentation）发送大量的信息。“ZigBee Pro”的另一组显著特性就是其增强的可扩展性，这使得一个ZigBee网络支持成千上万的设备的加入，包括一个“自动网络地址分配”机制（automated network address allocation mechanism），这在ZigBee网中，称为“随机寻址”（stochastic addressing）。其意义就是当你需要进行通信，而又不需要刻意地选择必然与谁进行通信的时候，可以由“ZigBee Pro”内置的这一“随机寻址”功能随机选择另一个设备进行通信，通信过程中的协议由二者在通信协议的层面上协商解决。

“ZigBee规范”的最新修正案在2012年发布，这次带来的新的增强特性，就是更好地支持超大规模的ZigBee的部署，包括一个“多跳（multihop）mesh [3] 网范围能力上的扩展。根据该规范，超大规模的ZigBee的部署是通过改进的节点管理和支持机制完成的，这样做的原因，就是考虑到ZigBee网络越来越复杂，因此，作为网络管理员也需要维护ZigBee的部署。“ZigBee-2012规范”引入的新性能，还包括改进的“地址管理”（address management）功能，即ZigBee产品可以自动选择频率，以避免干扰，并且可以将数据包以“组寻址”（group addressing）的方式进行发送。

在ZigBee 2012规范中有一个可选特性，那就是“ZigBee联盟”还推出了一种称为“绿色能源”（Green Energy）的新功能。“绿色能源”让设备没有电池或其他电源持续供电的情况下，在加入ZigBee网络之后，根据其他设备的动作，就可以产生足以满足自己行为控制的电源。比如打开电灯开关，再比如利用振动装置，这些设备上的ZigBee通信功能才会被开启，利用产生的光能或动能获得自己的电力。通过“绿色能源”这个特性，设备加入ZigBee网络，在与ZigBee网络互动的时候不需要外部电源，大大简化了ZigBee设备部署的难度。

13.1.4　ZigBee协议层次结构

有一个机制被“ZigBee联盟”用来保持ZigBee的简单化设计，那就是使用一个结构化的协议栈来定义各个协议层，以及每个协议层上要做的事情。这个协议栈共由四层组成，分别是“物理层”（Physical layer，PHY）、“介质访问控制层”（MAC layer，MAC），“网络层”（Network layer，NWK），“应用层”（Application layer，APL），如图13-2所示。ZigBee协议所使用的“物理层”和“介质访问层”都是在“IEEE 802.15.4规范”中进行定义的，然后以这个成熟的规范为基础来定义ZigBee协议。

图13-2　ZigBee协议栈的层次结构图

1.ZigBee的物理层

ZigBee的物理层由IEEE 802.15.4规范进行定义。该层所使用的频率波段在欧洲使用的是868MHz，在北美洲或南美洲使用的是915MHz，在全世界除了上述地区之外使用的都是2.4GHz。所有这些频率波段一共占用了27个信道，每个波段使用了不同的数据传输速率，如下所示：

IEEE 802.15.4协议与IEEE 802.11协议很类似，都是无线网络协议，只是IEEE 802.15.4采用“直接序列扩频”（Direct Sequence Spread Spectrum，DSSS）技术。可选的物理层还包括有“并行扩频序列的能力”（Parallel Sequence Spread Spectrum，PSSS）技术，虽然这一技术远没有“直接序列扩频”技术那样流行。

同Wi-Fi无线网络中的射频信号使用同一频率一样，在ZigBee无线网络中，其通信也是单个频率中进行，除非通过网络管理员对它进行重新配置，而在蓝牙无线网络中，通信的频率则是一直跳频变化的。因此，要在ZigBee网络进行数据包的嗅探将非常简单，因为负责侦听的程序只需要在一个频率上进行侦听即可，而不需要像蓝牙网络中，还需要不停地同步跳变。我们会在本章的后面部分讲解侦听ZigBee网络的方法。

2.ZigBee的介质访问控制层

ZigBee的介质访问控制层也是由IEEE 802.15.4规范进行定义的。这一层包含了构建扩展ZigBee网络的各项功能，包括设备互连的拓扑结构、“设备的角色”（device role）、数据包的帧结构设计，以及网络上的“建立关联”（association）与“解除关联”（disassociation）的操作。

ZigBee网络采用“设备角色”的概念，即对于每个设备，根据自己的可参与操作的角色，都有一组不同的功能。常见的“设备角色”有以下几种：

·ZigBee信任中心（ZigBee Trust Center，TC）　这是个“全功能的ZigBee设备”（Fully Functional ZigBee Device，FFD）负责对加入ZigBee网络中的其他ZigBee设备进行认证。当一个ZigBee设备试图连接到ZigBee网络的时候，距离该设备最近的“ZigBee路由器”通知“ZigBee信任中心”有一个设备加入到当前的网络中了。“ZigBee信任中心”指示“ZigBee路由器”对那个ZigBee设备进行身份验证，或终止这个新节点的连接请求。

·ZigBee协调器（ZigBee Coordinator，ZC）这是一个“全功能的ZigBee设备”，负责控制“个人局域网”（PAN），代表其他设备完成其信息的中继转发。“ZigBee协调器”允许其他ZigBee设备加入到“ZigBee协调器”的队伍中参与协调，或加入到ZigBee网络中参与其他各项活动。

·ZigBee路由器（ZigBee Router，ZR）　这是一个“全功能的ZigBee设备”，可以完成转发。“ZigBee路由”的功能通常和“ZigBee协调器”相同，只是“ZigBee路由器”是从硬件角度上来看的；而“ZigBee协调器”则是通过软件角度来看的。在软件更改时会将网络管理任务交给“ZigBee协调器”来处理。“ZigBee路由器”允许其他ZigBee设备加入到“ZigBee路由器”的队伍中参与协调，或加入到ZigBee网络中参与其他各项活动。

·ZigBee终端设备（ZigBee End Device，ZED）　这是一个“半功能ZigBee设备”（Reduced-Functionality ZigBee Device，RFD），该设备可以加入ZigBee网络中，但不能为其他设备转发帧。没有设备可以连接到“ZigBee终端设备”上，不过“ZigBee终端设备”可以连接其他特定的设备，这些设备就是“ZigBee路由器”和“ZigBee协调器”。

每个ZigBee网络都有一个协调器设备，网络的结构会决定是否需要额外的ZigBee路由设备。ZigBee网络可以被部署成星形或者网状拓扑结构，如下所示。“ZigBee路由器”为下游节点建立“通信数据包桥接”连接，比如“ZigBee路由器”在接到一个数据包后，发现这个数据包是发向某ZigBee设备或者其他“ZigBee路由器”的，那么这个“ZigBee路由器”就会将该数据包向这两种设备上转发该数据包，或者接收到这两种设备发出的数据包经由自己的路由规则转发出去，这个“ZigBee路由器”也会根据该数据包所要发送的目录节点，对该数据包进行转发，“ZigBee协调器”负责管理整个网络运行。

星形拓扑网络

Mesh网格网络

ZigBee设备能维持如此长的“电池待机时间”得益于它所采用的一种机制，那就是ZigBee设备具有一种进入持续的静止状态的能力，这种状态称为“睡眠模式” （sleep mode）。当一个ZigBee设备进入到“睡眠模式”，它会将所有的传输功能关闭一段时间，这个时间可以是数微秒到数小时不等。同时，在任何时候，ZigBee设备都能从“睡眠模式”中唤醒回来，开始同网络中的“ZigBee协调器”、“ZigBee路由器”或者是网络上的路由节点进行通信，一旦数据交换完毕则再次进入“睡眠模式”。由于随时要准备从ZigBee设备接收数据，所以“ZigBee协调器”和“ZigBee路由器”都不会进入“待机模式”，因此它们通常都会部署稳定持久的电源。

同Wi-Fi和蓝牙无线网络不同的地方是，ZigBee无线网络中，在“ZigBee介质访问控制层”上，有一些帧的类型是用于装载ZigBee的通信数据的。

·信标帧（Beacon frame）　“信标”的作用是扫描网络，寻找可能存在的“ZigBee路由器”或“ZigBee协调器”。

·数据帧（Data frame）　“数据帧”的作用是用来在设备之间交换任意数据，所交换数据包的大小是一个变化量，最高可以达到114字节。具体使用多少，要看“ZigBee介质访问控制层”头部的选项。

·确认帧（Acknowledgement frame）　如果需要的话，发送方的ZigBee设备可以主动要求接收方ZigBee设备发送一个“确认帧”来进行回应。“确认帧”的作用就是用来表示接收方已经成功地接收到发送方所发送的请求。

·命令帧（Command frame）　ZigBee协议中的“命令帧”同802.11的“管理帧”（management frame）十分类似，负责控制网络运作，比如“建立关联”（association）、“解除关联”（disassociation）、“个人局域网ID冲突解决方案”（PAN ID conflict resolution），以及“等待处理的数据发送请求”（pending data delivery request）。

ZigBee协议使用的IEEE 802.15.4“介质访问控制层”数据帧的格式如图13-3所示。“介质访问控制层”数据帧头部的格式是可变的，这取决于其中“帧控制”字段的设置，“介质访问控制层”数据帧头部包括的字段共有“源地址”（source address）、“目标地址”（destination address）、“源个人局域网ID”（source PAN ID）、“目标个人局域网ID”（destination PAN ID），还有代表安全属性字段，这些都在“辅助安全标头”（auxiliary security header）的字段。

图13-3　IEEE 802.15.4“介质访问控制层”的帧格式

3.ZigBee的网络层

ZigBee协议的网络层被单独定义在ZigBee规范中，它负责实现高层的功能，比如“网络成形”（network formation）、“设备发现”（device discovery）、“地址分配”（address allocation）和“数据路由”（routing）。

“网络成形”是指一个处理过程，在该过程中，一个“全功能的ZigBee设备”会首先将自身转变为一个当前网络的“ZigBee协调器”。然后通过“设备发现”，这个“ZigBee协调器”必须选择一个合适的信道（通常情况下，设备会选择当前可用的ZigBee网络信道中编号最小的那个），然后通过随机数产生一个“个人局域网”上的ID值。该值不能与现有正在使用的，其他“个人局域网”上的ID值冲突。“ZigBee协调器”建立完毕以后，周边的其他ZigBee设备和路由器若想加入到这个ZigBee网络的设备，就可以向该网络中的“ZigBee协调器”发送“关联请求”（association request），而此时的这个“ZigBee协调器”就可以对该请求进行响应。一旦某个ZigBee设备加入到这个ZigBee网络以后，该“ZigBee协调器”就会为这个设备节点分配一个16位的网络层地址。

4.ZigBee的应用层

ZigBee的应用层是ZigBee规范中定义的最高层，规定了“应用对象”（application object）的操作和接口，而这里的“应用对象”定义了一个ZigBee设备的功能。“应用对象”是由“ZigBee联盟”参照标准功能规范开发的。还有一种可能，就是制造商为了专有的功能，也会在“应用层”开发一些“应用对象”，其目的是作为一种与ZigBee协议栈的下一层进行数据通信时所用的机制。一个简单的ZigBee设备可以支持的“应用对象”上限可以达到240个。

“ZigBee设备对象”（ZigBee Device Object，ZDO）层存在于所有的ZigBee设备中，负责提供所有ZigBee设备所需的功能接口，包括设置ZigBee“设备角色”，如前所述的“ZigBee协调器”、“ZigBee路由器”、“ZigBee终端设备”等角色；设置“安全服务”，比如设置和删除加密密钥；还有就是设置“网络管理服务”、“建立关联”和“解除关联”。总的来说，“ZigBee设备对象”层定义了一些特定的规范，一般可以称为“ZigBee设备规范”（ZigBee Device Profile，ZDP），这个规范使用保留的ZigBee应用“端点”（endpoint）0 [4] 。

“应用支撑子层”（Application Support Sublayer，APS）为ZigBee上的应用规范提供最基本的功能。通过“应用支撑子层”，ZigBee应用规范可以请求发送和接收无线传输系统上的数据，包括指定可选的“可靠数据传输”（reliable data delivery）方式。从“应用支撑子层”的角度来说，“可靠数据传输”不仅要求发送方在发送一个数据包后，需要接收到针对这个数据包的响应数据包，并且从该数据包中看到有“确认”（acknowledgment）的字段信息，而且还包括了在源设备和目标设备之间存在一个路由，以及包括低层ZigBee的功能可以成功地处理和传送这些帧。

13.1.5　ZigBee规范

除了“ZigBee规范”本身，“ZigBee联盟”同样联合了其他工作组作为“ZigBee联盟”的成员来共同开发“ZigBee规范”。“ZigBee规范”定义了ZigBee设备的实际功能，包括“互通性（interoperability）测试计划”，这一功能可以用于验证设备对一个特定的“ZigBee规范”的吻合度。

完整的或者正在研发中的“ZigBee规范”示例包括下面这些：

·ZigBee网络的建筑自动化（ZigBee Building Automation，ZBA）　它提供以下功能：测量和管理照明镇流器、照明管理系统、传感器占用情况，以及其他商业建筑中常见的设备。

·ZigBee家居自动化（ZigBee Home Automation，AHA）　实现家居的自动管理，包括照明自动控制、暖通空调控制、遮阳防晒和家庭安全报警系统。

·健康护理规范（Health Care Profile，HCP）　支持非侵入性医疗操作，包括血压计、脉搏监视器，以及心电图。规范所关注的是连接这些设备、数据上传、远程监控等传统的网络接口。

·ZigBee光连接（ZigBee Light Link，ZLL）　实现了一个简单的LED灯具控制的规范。通过该规范可以控制灯泡、定时器、遥控器，并在“部署形式工厂”中进行远程切换。这里的部署形式工厂是作为“易于使用的是一种常见的调光开关”。有关这方面的内容可以参见该产品的网页介绍，其链接是：http://zigbee.org/zigbee-for-developers/applicationstandards/zigbee-light-link 。

·ZigBee互联网协议（ZigBee Internet Protocol，ZIP）　该协议基于ZigBee网络实现了IPv6的附加功能。其方式是增加基于“安全传输层协议”（Transport Layer Security，TLS）1.2的网络安全，将通信数据压缩，提供“自愈网mesh网络的支持“（self-healing mesh network），并与全球IPv6网络标准提供互连互通。

·智能能源规范（Smart Energy Profile，SEP）　实现“家域网”（Home Area Networking，HAN），使其能通过接口提供一个“智能温控计”和“智能家电组合”，从而实现实时电费查询，以及远端设备管理和关闭功能（又称“负载控制”）。

随着越来越多的公共“ZigBee规范”推出，以及大量为满足专有技术而开发的私有规范的不断出现，使得ZigBee技术在功能和应用范围上变得日益成熟。纵观ZigBee的功能和使用目的，很显然伴随所提供的功能以外，它还需要一个安全的协议堆栈。

[1] NVRAM，全称是Non-Volatile Random Access Memory，即“非易失性随机访问存储器”，是指断电后仍能保持断电前数据的一种存储器。这种特性对于设备级设备很显然是重要且必要的。——译者注

[2] 在这个看似简单的单位上，有两个重要的，概念上的区别。一个区别是：在存储领域，习惯用“字节”（Byte）表示，所以用“B”作单位；而传输领域，习惯用“位”（bit）表示，所以用“b”作单位，这里的bps即相当于“b/s”（每秒传送“位”的数量）。另一个区别是：二者的“K”都表示“千”，“M”都表示“兆”。但是存储领域内的1K表示1024个字节，1M表示1024K；而在传输领域，1K就是1000，1M就是1000K=1000000。以上例中，120KB的数据，如果让20Kbps的速率来传，假设没有任何附加位，那么需要的时间是：120×1024×8/（20×1000）=49.125秒，而不是48（120×8/20）秒，更不是6秒（120/20）。——译者注

[3] 在1.1.1节中提到了ad-hoc无线自组网，而这里的mesh网，则是由ad hoc网络发展而来，习称“无线网格网”，其特点是通过“多跳”方式解决“最后一公里”问题。该技术在本书第13、14两章多处出现。——译者注

[4] ZigBee中的“端点”（endpoint）用于区分同一个ZigBee设备上的不同“应用对象”，这一点很像是TCP/IP中的“端口”（port）概念。这句话的意思换句话说，就是“端点”0这个号就是专为“ZigBee设备规范”这个“应用对象”所保留的，其他的“应用对象”不能使用。——译者注

13.2　ZigBee安全

“ZigBee规范”包含了很多新设计，使用“高级加密标准”加密算法来加密保护无线通信的机密性和完整性，通过使用一个网络密钥进行设备和数据的认证。为了满足ZigBee设备不同的安全需求，“ZigBee规范”定义了两种安全模式：

·“标准安全”模式（standard security mode）　“标准安全”模式之前的名称是“住宅安全”模式（residential security mode）。“标准安全”模式使用单个共享密钥向ZigBee节点提供认证，“ZigBee信任中心”使用“访问控制列表”（Access Control List，ACL）对设备进行认证。这个模式对于设备来说并不占用太多的资源，因为网络中的每个设备都不需要维护一份设备认证证书列表。

·“高安全”模式（high security mode）　“高安全”模式之前的名称是“商业安全”模式（commercial security mode）。“高安全”模式要求ZigBee网络中的一个设备作为“ZigBee信任中心”，来跟踪网络中使用的所有加密算法和认证密钥，并且强制执行网络认证和密钥升级策略。“ZigBee信任中心”设备需要有足够的资源来保持跟踪网络中使用的认证证书，表示该设备也代表了整个ZigBee网络的一个“失败入口点”（point of failure），言下之意，就是如果这个“ZigBee信任中心”出现问题，导致功能失败，那么当前ZigBee仍然有效，但是不允许任何新设备加入到该ZigBee网络中，直到该点恢复正常工作。

13.2.1　ZigBee的安全设计规则

“ZigBee规范”定义了多条会影响ZigBee通信安全的原则：

·每个负责发送帧的层都要负责保护它。如果“应用层”要求数据必须是安全的，那么“应用层”就会对数据进行保护。“应用层”和“网络层”可以分别独立地使用加密和认证校验对每一个数据进行保护。

·如果要求非认证访问的保护，那么在关联和密钥派生后，“网络层”的安全机制会使用在所有的帧上。“网络层”的安全对它的上层紧挨着它的应用层协议，提供了机密性和完整性控制。

·在单个设备上使用开放信任模型，这就表示允许在各层之间重用密钥，比如“网络层”和“应用层”之间可以使用同一个“高级加密标准”密钥。

·使用“端到端”（end-to-end）的安全机制，这样只有通信双方的源和目标设备能够对对方的信息进行解密。

·为了保持规范的简洁性，网络中所有的设备以及每个设备的所有层都必须采用同一种安全等级。

在知道了上述这些设计理念后，我们就可以开始检验ZigBee设备中所用的加密算法和认证机制了。

13.2.2　ZigBee的加密

ZigBee使用128位“高级加密标准”加密算法来保护数据的机密性和完整性。许多公开发表的出版材料中都声称ZigBee使用了“高级加密标准”作为系统中统一使用的加密算法，因为ZigBee在安全评价上，获得到安全评级都是“高安全”的评价，但是围绕着ZigBee是怎么使用“高级加密标准”加密算法的细节几乎都缄口不言或寥寥的三言两语带过。就ZigBee本身而言，简单地使用“高级加密标准”加密算法，尽管可以算是一个良好的开始，但还远远不能够称为“高安全”，因为在很多情况下，还是有大量的机会以一种不安全的方式使用“高级加密标准”加密算法的。鉴于此，我们会在下面的内容中探索这些话题，主要围绕“高级加密标准”加密算法的使用方法，讨论“ZigBee联盟”在实现这一算法时，所采用的技术是怎么样的。

1.ZigBee的密钥类型

“ZigBee规范”提供了3种类型的密钥来管理ZigBee网络安全：

·主密钥（Master key）　“主密钥”除了在“ZigBee Pro”这一最新版的规范中的协议栈中是必选的之外，在其他各版本规范中都是可选项，“主密钥”的主要作用是联合ZigBee“对称密钥的密钥建立”（Symmetric-Key Key Establishment，SKKE）进程一起来派生其他的密钥。

·网络密钥（Network key）　“网络密钥”的作用是保护“广播”和“组播”（broadcast and group）通信数据包的机密性和完整性，同时也为网络的认证提供保护。“网络密钥”通常保存在网络上的所有节点中。当一个新的ZigBee设备加入该网络的时候，或者当密钥在标准安全环境下在各个ZigBee设备之间进行更新的时候，“网络密钥”都会以明文的形式分配给这个新加入的ZigBee设备，或新更新的ZigBee设备上。这本身就与“高安全”模式是背道而驰的，因为“高安全”模式下，跨越空气这种传输介质，通过无线传输明文的密钥素材很显然是禁止的。

·链路密钥（Link key）　“链路密钥”用来保护两个设备之间“单播” [1] （unicast）通信数据包的机密性和完整性。同“网络密钥”类似，在“标准安全”模式下链路密钥是以明文形式分配的。

为了进行加密以及保护ZigBee帧的完整性，所有的节点都需要“网络密钥”，而“链路密钥”只是两个通信设备之间用来保护这两个通信设备“端到端”的会话。对于某一个具体的设备来说，它的每一个会话都需要有一个“链路密钥”，所以它需要多个“链路密钥”来保护每个“端到端”会话。

2.ZigBee密钥的提供方式

在ZigBee网络的安全部署中，一个意义重大的挑战，就是设备上密钥的提供（provisioning）、更新（rotating）和撤销（revoking）过程，在“ZigBee Pro”中，一个管理员可以使用ZigBee“对称密钥的密钥建立”算法去派生“网络密钥”和“链路密钥”，但是这要求设备已经拥有了一个从“ZigBee信任中心”生成的“主密钥”，同时要求设备已经加入到了该网络中。有两种密钥生成方法可供选择：

·密钥传输（key transport）　在这种生成方法中，“网络密钥”和“链路密钥”通过无线网络以明文形式发送到加入网络的设备中。因为密钥是以明文显示的，所以攻击者能够对网络进行侦听，从而直接捕获到“链路密钥”，进而使用“链路密钥”来解密被侦听设备之后所有的通信数据，或者冒充一个合法ZigBee设备去做其他的事情。

·预安装（pre-installation）　管理员提前在所有的设备上预配好所需的加密密钥，就像工厂内产品出厂前的“出厂默认参数”那样。这个过程非常具有挑战性，因为要协调密钥撤销和更新的方法颇有难度，并且当网络或者链路密钥更改时，需要对每个ZigBee设备进行手动更新。

13.2.3　ZigBee的可靠性

在采用修订版本的“高级加密标准-计数模式和密码块链消息认证码”（Counter Mode with Cipher Block Chaining Message Authentication Code，AES-CCM）协议进行认证以后，ZigBee能够对每个帧进行可靠性控制。“高级加密标准-计数模式和密码块链消息认证码”协议，又可以简称为“CCM*”协议。作为修订版的CCM协议，CCM*和传统的AES-CCM协议相比，CCM*协议只用于提供“只加密”控制、“只完整性”控制，或者既提供加密，也提供完整性控制。

完整性控制能够在接收方认证帧的内容是否完整，它被称为“信息完整性检查码” （Message Integrity Check，MIC）。根据网络的安全性要求，较长的“信息完整检查码”可用于防范暴力攻击。其原因不难理解，在这种攻击中，攻击者以帧的长度和CPU周期为代价，不断地修改一个帧的内容，然后不停地重新发送这个数据帧，直到找到一个合法的“信息完整性检查码”。对于短的“信息完整检查码”，就意味着总的尝试次数，同时也是尝试时间很短；而长的“信息完整检查码”则需要总的破解次数和破解时间都很长。值得一提的是：完整性保护是ZigBee网络中的一个可选项目，这是因为在一些情况下，根本就不需要采用“信息完整检查码”进行完整性的检测。

13.2.4　ZigBee的认证

有三种方法可以对刚加入ZigBee网络的设备进行身份认证：一种是通过“访问控制列表”（Access Control List，ACL）模式进行“介质访问控制层”地址有效性的验证，这种方式又称“ACL模式”，还有两种“信任中心”（Trust Center）认证，主要用于“标准安全模式”和“高安全模式”。

在ACL模式下，一个节点想要识别某个他想进行通信的其他某个设备，这个节点就会根据那个设备的“介质访问控制层”地址进行区分。但这也意味着每个节点都要维护一份授权设备列表来实现这种安全模型。因为攻击者需要知道“网络密钥”或者“链路密钥”才能够冒充一个ZigBee设备，所以如果我们将这个列表的安全性与“CCM*”协议本身特有的完整性保护机制配合使用时，ACL模式就能够提供相当可靠的设备身份认证等级了。尽管ACL模式有时并不需要使用CCM*完整性进行保护，但上面的说法仍然不失为一种好办法，因为ACL模式的重点在于需要在每个设备上维护一份“介质访问控制层”地址列表，这对网络运行带来了一定的难度。比如当有一个新的设备加入网络时，每次都需要所有的设备更新自己的设备列表，同时也需要额外的“非易失性随机访问存储器”内存和常规内存RAM来保存和处理这个列表。

在“标准安全模式”下的网络中，当一个节点被允许加入到一个网络之前，“信任中心”必须明确地授权一个节点具有访问权限，授权方式就是给这个节点指定一个密钥。当一个“ZigBee路由器”节点和一个“ZigBee终端设备”节点开始网络加入的过程时，这个ZigBee设备在与其他ZigBee设备通信之前，将会等待接收来自于“信息中心”发过来的一个密钥确认信息。如果在这个ZigBee设备上已经生成了一个“网络密钥”，比如这个网络采用的是密钥“预安装”机制，那么“信任中心”会向节点发送一个全0的“网络密钥”。这个全0的密钥类似于摆设，是个临时性的密钥，但至少表示这个ZigBee设备可以在网络中与其他设备进行通信了。如果节点没有创建“网络密钥”，“信任中心”会采用密钥“传输机制”模式，以明文形式为它分配一个密钥。在接收到密钥后，这个新加入的ZigBee设备节点就能够自由地同网络中的其他ZigBee设备进行通信了。如果节点没有通过“信任中心”的认证，比如它的“介质访问控制层”地址不满足“信任中心”的“访问控制列表”中对“介质访问控制层”地址的要求，那么“信任中心”就会向这个ZigBee设备节点发送一条断开信息。

注意

在“标准安全模式”下，ZigBee设备是不会相互进行身份认证。需要认证的ZigBee设备节点只会接受“信任中心”的身份认证，认证的方式就是“信息中心”向它发送“网络密钥”，而这个ZigBee设备则不会通过针对网络的身份进行任何合法性检查。所以，如果一个ZigBee设备，只要使用相同的“个人局域网”的ID来冒充一个合法的网络，那么就很容易吸引其他被攻击的ZigBee设备加入到这个网络中。

在“高安全模式”下的ZigBee网络中，“网络密钥”不能够以明文方式发送。当一个ZigBee设备节点要进行认证时，“信任中心”和这个ZigBee设备节点会使用“主密钥”，然后通过“对称密钥的密钥建立”算法来派生“网络密钥”。如果这个ZigBee设备节点不知道“主密钥”的话，“信任中心”会通过明文方式给这个ZigBee设备节点发送“主密钥”，这就在ZigBee网络中为黑客创造了一个可以侦听的漏洞。

“对称密钥的密钥建立”算法的建立过程共需要四个步骤，其主要目的就是要在发起方（initiator）和回应方（responder）之间使用一种标准的“质疑-响应”机制，然后在两个设备上相互验证“主密钥”的知识是否正确，而不会泄露“主密钥”本身。在“对称密钥的密钥建立”算法的“四次握手”的操作完成之后，节点和“信任中心”就能够派生出“链路密钥”，通过“链路密钥”可以用来保护之后由“信息中心”向这个节点传送“网络密钥”时，二者之间的通信安全了。

至此，我们检验了ZigBee的运作方式和功能，并且详细地围绕协议的操作，介绍了一些使用的安全和识别细节。下一步，我们将看一些有用的网络工具，这些工具基本上都是专为攻击ZigBee网络而设计的。

[1] 其实本来通信中没有“单播”这种说法，只是因为有了“广播”（一对所有）和“组播”（一对多）这些名词后，为了名称上的统一，而将正常的一对一通信改称为“单播”。并且该词只在有“广播”和“组播”出现的时候使用。——译者注

13.3　ZigBee攻击

当本书的第2版在2010年出版的时候，作者介绍了KillerBee工具，这是第一套专门用来攻击ZigBee网络和IEEE 802.15.4协议的一组攻击工具套件。从那时以后，对于KillerBee项目的升级维护就转到了另外两个人手里，这两个人分别是卓越的天才Ryan Speers和Ricky Melgares，他俩所做的工作，当然就是继续发挥才能，编写极具天赋的ZigBee黑客工具的源代码。

在本节中，我们将从功能的角度来看看的KillerBee框架，然后分别介绍几个可用的黑客工具，包括了本书的第2版出版以来出现的新的功能和攻击技术。

13.3.1　KillerBee的介绍

KillerBee是一个基于Python语言编写的应用程序框架，可以用来操作和攻击ZigBee网络和基于IEEE 802.15.4协议的网络，该软件的下载网址是http://killerbee.googlecode.com 。整个项目是免费并且开源的，程序的编写和测试都需要在Linux操作系统上完成。项目的目的不是要亲自完成某一个具体的攻击，而是提供一个程序的框架，通过这个程序可以简化常见的攻击过程。具体地说，就是在这个框架中可以加载和授权其他的Python工具，使其可以针对某一ZigBee安全漏洞完成具体的攻击操作。作为框架中的具体攻击工具，KillerBee包括一系列以这个框架为基础编写的，具有特定目的的攻击工具，通过以组合方式使用这些工具，我们既可以实施实际的攻击任务，也可以演示一个KillerBee框架的使用方法。

1.创建一个KillerBee工具包

KillerBee在设计上，就将目标定位为可以操作使用各种支持的硬件设备。不幸的是，攻击ZigBee和IEEE 802.15.4协议上的网络，还真不是三拳两脚就能完成的事，这往往需要很多复杂的交换操作，所以也没有哪一个简单的硬件可供选择。我们只能一步一步地通过配置一个USB接口的，基于IEEE 802.15.4无线接口的设备用于配合最新版的KillerBee软件实施攻击任务。不过，我想指出的是，就目前针对ZigBee网络攻击领域发展的势头，很可能在本书出版之后，会有新的、现成的、可借助KillerBee软件使用其他硬件作为新的选择项，供用户选择使用。

要想使用KillerBee工具包的全部功能，有一些组件，需要被通过编译连接，创建到工具包中，其中主要包括下面的硬件和软件：

·Atmel公司的RZ Raven USB接口的记忆棒，简称“RZUSBstick记忆棒”（硬件）。

·Atmel公司的AVR Dragon片上编程器（硬件）。

·Atmel公司100毫米到50毫米“联合测试行动小组”（JTAG）支撑架适配器（硬件）。

·50毫米“公头对公头 [1] ”的连接头（male-to-male header）（硬件）。

·10针2排5列（2×5）排列100毫米“母头对母头”（female-to-female）带状连接线（ribbon cable），或者采用10针跳线（硬件）。

·免费的AVRDUDE工具（软件）。

·“RZUSBstick记忆棒”的免费的KillerBee固件（软件）。

·一个Windows或Linux主机，用于运行连接和将程序写入到“RZUSBstick记忆棒”中，该操作是一次性操作。

下面我们详细地看一下这些需要中的每一项。

注意

即使是有了“RZUSBstick记忆棒”，但如果你的KillerBee软件未使用上述“专门针对‘RZUSBstick记忆棒’的免费的KillerBee固件”对KillerBee软件进行升级，那么该KillerBee软件的功能会受到限制，你将只能使用其中的“只能侦听”（sniffer-only）功能，而不能使用向网络中“注入数据包”的功能，以及冒充一个合法的ZigBee网络诱骗其他ZigBee设备加入本网络等功能。

（1）Atmel公司的RZ Raven USB接口的记忆棒

为了同ZigBee网络进行交互操作，你需要一个能够支持IEEE 802.15.4标准的硬件设备。而KillerBee的设计初衷就是支持多个硬件设备能够与工作频率为2.4GHz、915MHz和868MHz的设备同时进行交互，完成这一任务的主要开发硬件设备就是“Atmel公司的RZ Raven USB接口的记忆棒”，简称为“RZUSBstick记忆棒”，该产品的实物图如图13-4所示。这个采用USB 2.0接口的设备能够在2.4GHz频率下支持IEEE 802.15.4协议，同时它拥有一个“板上AVR [2] 微处理器”（onboard AVR microprocessor）。Atmel同时开发了设备固件的源代码，只要该程序在RZ Raven硬件上使用，那么如果要修改和重新发布这些代码，需要获得Atmel公司的授权，这样以来，开发者能够可以很轻松地修改“RZUSBstick记忆棒”固件，以便固件中能容纳新的功能。“RZUSBstick记忆棒”硬件可以从大部分电子产品经销商那里购买得到，比如Digi-Key公司和Mouser电子器件公司，其中Digi-Key公司的网址是http://www.digikey.com ，Mouser电子器件公司的网址是http://www.mouser.com 。二者的产品中，使用“AVR微处理器”的，产品编号为ATAVRRZUSBSTICK的产品，售价大概是43美元。

图13-4　RZUSBstick记忆棒

提示

我们建议至少使用两个“RZUSBstick记忆棒”接口，一个接口来发送欺骗对方的帧，而另一个接口用来侦听网络上传输的数据包。

在编写本书时，“RZUSBstick记忆棒”中默认的固件型号是AVR2017。使用默认的固件，“RZUSBstick记忆棒”能够创建一个与“ZigBee-2006”规范兼容（ZigBee-2006–compliant）的网络，或者用来作为一个“被动式数据包嗅探器”（passive packet sniffer）。不幸的是，要完成安全分析功能，需要增加额外的功能模块，比如说需要增加数据包的注入能力，而这些功能在默认的固件都不能使用，需要通过固件升级才行。

（2）Atmel公司的AVR Dragon片上编程器

要解决“RZUSBstick记忆棒”默认固件中的限制，作者开发了一个定制的固件升级程序，该程序以源代码和二进制进形式与KillerBee设备捆绑后同时进行发布。不过，由于这属于硬件芯片级的开发，所以对于一个未从事过硬件开发的人来说，这还真不是件容易的事。要想升级“RZUSBstick记忆棒”的固件，除了固件本身之外，还需要另外一个硬件设备，习惯上称为“片上编程器” （on-chip programmer）。一个Atmel公司的AVR Dragon“片上编程器”实物图如图13-5所示。

“AVR Dragon”是一款低成本的编程器，主要用于Atmel的程序员在通过“AVR微处理器”使用“RZUSBstick记忆棒”固件，最常见的“AVR微处理器”如芯片型号AT90USB1287。该编程器使用多种编程接口，包括一个10针硬件接口，该设备能够同“RZUSBstick记忆棒”上的“联合测试行动小组”接口连接，“联合测试行动小组”接口中，由“联合测试行动小组”（Joint Test Action Group，JTAG）所定义的一个同名接口。通过“联合测试行动小组”接口，可以使用升级的固件刷新板载微处理器，这也包含了针对“RZUSBstick记忆棒”固件升级的KillerBee固件。上述所有可用的软硬件都可以从大部分电子产品经销商那里购买得到，比如Digi-Key公司和Mouser电子器件公司。二者的产品中，使用“AVR Dragon”设备的，其产品编号为ATAVRDRAGON的产品，售价大概是50美元。

图13-5　AVR Dragon片上编程器

注意

有几个用户反馈，在握着“AVR Dragon”产品插入到一个USB设备的时候，可能会破坏设备。这可能是由于接地不当造成的，同时也是“AVR Dragon”产品的一个硬件设计缺陷。所以在使用“AVR Dragon”产品的时候，需要小心一点，特别是在拔插的时候，最好是在外边套一个防静电袋（ESD bag），或者使用一个卡盒包在芯片或外边，然后再插入，甚至可以考虑使用一块在家装店买的热收缩管覆盖在敏感的集成电路元件外边。总之，就是在使用的时候，要防止静电打坏器件。

（3）Atmel公司100毫米到50毫米JTAG支撑架适配器

在“JTAGICE mkII”接口和“RZUSBstick记忆棒”接口之间进行连接，需要一个100毫米间距的“联合测试行动小组”适配器和一个50毫米间距的“联合测试行动小组”适配器之间的转换器。Atmel公司销售一组四种适配器，适合各种情况下的物理连接属性的转换。其中，用于与“Atmel Dragon”接口相连的产品编号是ATAVR-SOAKIT，售价大约是39美元，可以从流行的电子产品经销商处购买。在“AVR Dragon”接口和“RZUSBstick记忆棒”接口之间进行连接，我们使用的“联合测试行动小组”适配器，编号是ATAVR-SOAKIT，该实物图如图13-6所示。

（4）50毫米“公头对公头”的连接头

“AVR Dragon”板上的“联合测试行动小组”连接器是一个50毫米的母头插座，而“RZUSBstick记忆棒”上的“联合测试行动小组”插槽也是一个50毫米的母头插座，要在二者之间进行转换，就需要用于50毫米“公头对公头”的连接头。这个50毫米“公头对公头”的连接头的用法，就是将其插入到一个“联合测试行动小组”的母头插座上，将其转换成公头插头，然后才能插入到“RZUSBstick记忆棒”上的“联合测试行动小组”插槽中。这个小部件通常可以从多个电子网站上买到，包括Digi-Key公司的网站，产品编号是S9015E-05，零售价为1美元，如图13-7所示

图13-6　ATAVR-SOAKIT适配器

图13-7　50毫米“公头对公头”的连接头

（5）10针2排5列（2×5）排列100毫米“母头对母头”带状连接线

从“AVR Dragon”出来，你需要连接一个带状连接线，一头套在“联合测试行动小组”接口的引脚上，带状连接线需要10针，头端需要呈2排5列，即“2×5”的连接布局。这种通用部件通常可以从多个电子网站上买到，包括Digi-Key公司的网站，产品编号是H3AAH-1018G-ND，售价为1.5美元一根。

作为替代品，你可以简单地只用一根10针的“母头对母头”的成型跳线，手工将各自十个引脚一一连接起来即可。要确保你所连接的所有连线都要匹配“AVR Dragon”的引脚和“联合测试行动小组”适配器引脚，并且二者在物理特性上“一一对应” [3] 。这种成型的母头跳线，一组40根，可以从Adafruit.com 网站上找到，其产品编号为266，必须成组购买，一组售价7美元，其实物图如图13-8所示。虽然有一点贵，但是这些跳线还可以用于其他任务，所以成组购买也不会浪费。

在紧要关头，一个老式的IDE硬盘驱动器电缆的工作也可以拿来使用，使用美工刀将连接器的头端切下来，然后将多余的部分切掉，最后只剩下10针，并且呈2×5排列的头部形状即可。

（6）免费的AVRDUDE工具

AVRDUDE是一个开源的命令行程序，可以运行在Windows操作系统上，也可以运行在Linux操作系统上。该工具可以支持许多不同的“AVR编程器”。Windows用户可以下载一个编译版的AVRDUDE程序，该程序是作为WinAVR软件包中的一个工具存在的，所以可以通过下载整个WinAVR软件包获得，WinAVR软件包的下载网址是http://winavr.sourceforge.net 。下载后解压文件WinAVR软件包，并复制avrdude.exe和avrdude.conf文件到你系统中，在系统变量PATH可以找到的位置上，以便在任何目录上通过命令行运行该程序。

Linux用户可以在下载程序包以后安装AVRDUDE程序，下载网址是http://www.nongnu.org/avrdude ，或者也可以从Linux发行版提供的软件包中直接安装使用。比如Ubuntu操作系统中就直接包含了AVRDUDE程序，这时，用户只要运行“sudo apt-get install avddude”命令就可以安装avrdude程序了。

（7）“RZUSBstick记忆棒”的免费的KillerBee固件

KillerBee项目包含了针对“RZUSBstick记忆棒”的定制固件。该固件在维持其他功能的同时，允许硬件完成任意数据包的注入操作。这里的“其他功能”可以是数据包的嗅探，也可以是ZigBee设备作为一个“个人局域网”协调器时，对ZigBee网络的创建动作。这个同KillerBee工具进行绑定的固件的下载地址是http://killerbee.googlecode.com 。

2.安装AVR Dragon设备

要在Windows操作系统中使用“AVR Dragon”设备，你需要首先下载一个libusb-win32的驱动程序，该驱动程序的下载网址是http://sourceforge.net/projects/libusb-win32 。完成下载之后，解压zip文件，然后就可以支持libusb-win32的驱动程序了。运行的方法是执行其中的inf-wizard.exe可执行文件，这时程序会弹出安装向导。通过USB接口将“AVR Dragon”设备插入到Windows上的USB插座中，然后单击inf-wizard.exe程序界面上的“下一步”（Next）按钮，这时这个安装向导Inf-Wizard程序就会检测到“AVR Dragon”设备，并识别出该设备的USB“供应商ID”（即界面中的“Vendor ID”）、“产品ID”（即界面中的“Product ID”）值等值，如图13-9所示。

图13-8　成型的母头跳线

图13-9　检测到AVR Dragon设备

在列表中，选择AVRDRAGON这一项，然后单击“下一步”（Next）。这时Inf-Wizard工具的安装向导将向你提供一个设备配置窗口，如图13-10所示。单击“下一步”（Next）接受系统默认的十六进制“供应商VID”（即界面中的“Vendor ID（hex format）”）、十六进制“产品PID”（即界面中的“Product ID（hex format）”）和本产品“制造商名称”（即界面中的“Manufacturer Name”）和“设备名称”（即界面中的“Devie Name”）等描述性的值。

在Inf-Wizard工具的安装向导的最后一步，单击“马上安装”（Install Now）按钮，如图13-11所示，向导就会将“AVR Dragon”设备的libusb-win32驱动程序安装好，如果安装途中出现一些提示，就选择“按默认配置强制安装这个驱动程序”（Install This Driver Software Anyway）按钮，直到安装成功。

图13-10　设备配置窗口

图13-11　安装驱动程序

对Linux用户来说，在安装“AVR Dragon”设备驱动程序的时候，有一个更简单的配置经验。那就是只要你将“AVR Dragon”设备插入到计算机的USB口中，然后就等着运行即可。

当“AVR Dragon”已经配置完毕，剩下要做的就是准备刷新“RZUSBstick记忆棒”上的闪存替代固件。

3.创建一个KillerBee设备上的RZUSBstick记忆棒

在获取了所有需要的部件后，通过KillerBee设备升级“RZ Raven USB”硬件就易如反掌了：

1）使用USB线缆连接到“AVR Dragon”设备上。打开设备的电源，在Windows主机上从软件上连上“AVR Dragon”设备的驱动程序。如果可能，建议将“AVR Dragon”设备的USB口直接或通过延长线插到计算机的USB插座上，而尽量不要在“AVR Dragon”设备和电脑主机之间再使用USB集线器进行中转。

2）下载KillerBee的固件。最新版本的KillerBee程序发行版的下载地址是http://killerbee.googlecode.com 。下载成功并解压缩后，在“killerbee/firmware”目录中，你会发现一个名为kb-rzusbstick-001.hex或类似的文件。使用此文件就可以更新“RZUSBstick记忆棒”的固件。

3）准备AVRDUDE程序。打开“命令提示符”，并将目录改变到下载KillerBee固件的目录。输入下面的命令，但不要按回车键！因为这个时候，你只有一只手可以按回车键，另一只手则需要握着“RZUSBstick记忆棒”。

4）打开“RZUSBstick记忆棒”的电源。“RZUSBstick记忆棒”本身是无源的，所用的电是从电脑上机上通过USB线取电。供电以后，微处理器开始运行程序。微处理器会通过USB总线连接到“RZUSBstick记忆棒”上，建议使用USB延长线连接电脑主机，这样的好处是方便后面将“RZUSBstick记忆棒”和“AVR Dragon”设备放在一起。将“RZUSBstick记忆棒”插入到电脑主机以后，“RZUSBstick记忆棒”上的蓝色LED指示灯就会亮起来。使用“联合测试行动小组”支撑架适配器连接到“AVR Dragon”设备上，再将“联合测试行动小组”支撑架适配器连同“公头对公头”的连接头插入到“RZUSBstick记忆棒”顶端的引针插座上，捏着引脚针在一个很小的角度将其引脚与与PCB插座接触，如图13-12所示。在“AVR Dragon”设备接口上，“引脚1”（Pin 1）的位置是“RZUSBstick记忆棒”上距离USB接口最远的那个位置。

图13-12　将“联合测试行动小组”编程器插入到“RZUSBstick记忆棒”上

5）最后一步，就是对“RZUSBstick记忆棒”进行编程。连接“AVR Dragon”设备和“RZUSBstick记忆棒”上的“联合测试行动小组”插座，按回车键以便开始运行AVRDUDE编程器。在“RZUSBstick记忆棒”显示的编写器提示的状态信息是“编程完成”时，固件的刷新完成。在Windows操作系统，该程序的显示效果和下面的结果类似。如果换成Linux操作系统，AVRDUDE程序也会产生相同的输出。

随着编程过程的进行，“RZUSBstick记忆棒”上亮的将不再是蓝色的LED指示灯，取而代之的是琥珀色的LED指示灯，这预示着这个硬件准备作为一个KillerBee设备。我们将继续有机会利用KillerBee探讨贯穿本章中的所有进攻机会。

KillerBee硬件的替代品

“RZUSBstick记忆棒”硬件用于KillerBee平台上有几个比较麻烦的问题的，比如缺乏一个标准的可复用并行数据包的接收和发送功能的Linux驱动程序。作为一种“RZUSBstick记忆棒”的替代品，还有其他可用的硬件可供选择，或是正在研发过程中。

TelosB Mote记忆棒　“TelosB Mote记忆棒”硬件（见图13-13）以前被“弩系统”（Crossbow System）销售的时候，是作为一个研究和开发IEEE 802.15.4网络的平台。虽然现在它已不再是可供销售的商品，但该硬件在研究性的高校里却非常流行。这款产品也可以应用于KillerBee，要想使其支持KillerBee作为数据源，只需要使用其替代固件就可以了，替代的方式是运行该系统提供的flash_telosb.sh脚本。

Api-Mote记忆棒　“Api-Mote记忆棒”硬件（见图13-14）是一个持续开发的项目，项目的名称是“河水循环的安全系统”（River Loop Security），项目是由Ryan Speers和Ricky Melgares领导的。“Api-Mote记忆棒”硬件集成到KillerBee系统以后，就可以使KillerBee系统使用“Api-Mote记忆棒”发起所有可访问到的进攻方式。控制这个硬件是通过一系列通过USB的接口实现的，这使得该系统从开发的角度来看，系统的可靠性非常强。在写本书的时候，这款“Api-Mote记忆棒”尚未公开出售，但在不久的将来，就可以在普通电子产品经销商那里买到。比如网址为Adafruit.com的经销店。

图13-13　TelosB Mote记忆棒

图13-14　Api-Mote记忆棒

13.3.2　网络发现

在ZigBee网络的评估中，首要任务是要在自己的功率覆盖范围内先“发现”（discovery）有网络的存在，然后枚举出网络中各设备上采用的配置。收集这些信息的一个简单方法是使用KillerBee模仿ZigBee网络的发现过程。

作为“网络发现” [4] （network discovery）过程的一部分，ZigBee设备会在给定的信道内发送“信标请求帧”（beacon request frames）。所有收到该“信标请求帧”的“ZigBee路由器”和“ZigBee协调器”同样会发送一个信标帧作为响应，不要小看这个响应的信标帧，这会暴露“个人局域网”的ID、“ZigBee路由器”或“ZigBee协调器”的“源地址”（“ZigBee路由器”和“ZigBee协调器”）、“堆栈规范”（stack profile）、“堆栈版本”（stack version）和“扩展的IEEE地址信息”（extended IEEE address information）。使用这项技术，我们可以主动扫描到ZigBee网络的存在。

使用zbstumbler工具进行ZigBee发现

回想一下Wi-Fi网络的“网络发现”中，使用的工具有好几个，比如NetStumbler程序，而在KillerBee网络的“网络发现”中，所用的技术和Wi-Fi网络的“网络发现”所用的技术很类似。在KillerBee网络中的zbstumbler工具也会在信道中进行跳频，并且在跳频的同时发送信标帧，然后根据回应的信标帧中提取有价值的信息并且显示出来。不带任何参数地运行zbstumbler程序，它会开始在ZigBee信道中进行扫描，每两秒跳频到新的信道中，其输出信息如下所示：

zbstumbler也可以以日志信息的方式显示出所发现的网络信息，如果在命令中使用“-w”参数，那么zbstumbler程序就会将发现的网络信息记录到一个CSV文件中，该文件的特点就是以逗号将一条记录（即，行）中的每个字段（即，列）隔开：

一旦发现了ZigBee网络，并将其作为目标，我们可以根据zbstumbler显示的信道编号，选择ZigBee数据包捕获工具来进行数据通信数据包侦听攻击。

防御针对ZigBee网络的主动扫描

通过zbstumbler工具发现ZigBee网络，这种相同的技术被直接用于一些ZigBee产品的设备中。当一个新的“ZigBee路由器”或者“ZigBee协调器”建立完毕后，它会发送一个“信标请求帧”来通知其他ZigBee网络，以避免“个人局域网”上的ID冲突。如果真出现冲突，那么这个设备会随机选择其中一个网络进行连接。当“ZigBee终端设备”想要确认“ZigBee路由器”或者“ZigBee协调器”是否加入到当前ZigBee网络中时，它会发送一个“信标请求”数据包，然后根据对方的响应进行评估，选择加入最佳的网络中。

由于“信标请求”机制对于ZigBee来说是不可或缺的，所以这个机制无法被禁用，这样就使攻击者能够任意使用同样的技术进行ZigBee网络发现。因此，最佳的防御措施就是了解攻击可能会造成的影响，评估攻击者通过这种攻击，能够拿到网络中的何种信息。

13.3.3　侦听攻击

由于大部分的ZigBee网络都不使用加密技术，所以对于攻击者来说，侦听攻击是非常有效的。即使ZigBee网络进行了加密，也只是对通信的数据进行加密，所以攻击者仍然可以使用那些未加密的ZigBee帧信息部分，比如“介质访问控制层”头部，来确认ZigBee网络的存在以及其他重要的特性，比如网络的配置、节点地址和“个人局域网”的ID值。

有几种工具提供了捕获ZigBee网络通信数据包的能力，它们的售价从不贵到稍有些贵，所以我们会给出一些帮助，来帮你实现投资收益的最大化，当然这些帮助都是合法的。

使用Microchip公司的ZENA网络分析器

Microchip技术公司是著名的PIC微处理器生产商，同样也生产了“ZENA网络分析器”（ZENA Network Analyzer）这样一款产品。ZENA产品配有一块USB 2.0的电路板，包括一个PIC18LF微处理器以及一个MRF24J40型号的IEEE 802.15.4无线接口。该接口配合Windows上的软件对2.4GHz频率上的IEEE802.15.4的数据通信数据包进行捕获和保存，其中包括ZigBee和专有的Microchip协议“Mi-Wi”协议和“Mi-Wi P2P”协议。无线工程师可以使用它对网络活动进行排障，ZENA为捕获和分析ZigBee网络活动提供了便利。

ZENA硬件如图13-15所示，既可以从Microchip技术公司，也可以从大部分电子经销商那里购买到，它的售价是130美元。ZENA设备不需要安装特定的驱动程序，使用USB接线直接将设备插在可用的USB端口上，然后使用配套的CD光盘安装ZENA数据包侦听软件即可。

图13-15　ZENA硬件

提示

网站

你也可以从Microchip的网站上下载到“ZENA网络分析器”。该程序的下载地址是http://bit.ly/9siayC 。一个简单的，通过ZENA工具捕获到的数据包文件可以从本书的配套网站上进行下载，其网址是http://www.hackingexposedwireless.com/files/13/sample-zena-packet-captures.zip 。

“ZENA数据包嗅探器”（ZENA Packet Sniffer）软件的功能比较有限。它只能够对无线活动数据进行简略的解码，而不是详细的十六进制数据转储（dump）形式。用户可以选择要进行捕获的信道编号，该值一般是信道11~26，同时选择忽略或者分析“帧校验序列”（Frame Check Sequence，FCS）不正确的帧。它可以对“介质访问控制层”、“网络层”和“应用支撑子层”施加控制，同时以“数字”（numeric）、“摘要”（condensed）、“冗余视图”（verbose views）等多项进行显示。单击“视图（View）|网络信息（Network Messages）”菜单可以显示捕获的数据帧包含的内容，如图13-16所示。

图13-16　捕获的数据帧包含的内容

“ZENA网络分析器”软件是一款在Windows操作系统上的运行的软件，作为该软件及运行环境的一个替代品，软件开发人员Emeric Verschuur推出了一个ZenaNG工具来支持Linux操作系统的用户。该软件的下载地址是https://github.com/Mr-TI/ZenaNG 。ZenaNG软件的作用就是在特定信道中捕获ZigBee设备和IEEE 802.15.4协议下的活动，然后以十六进制格式显示出所捕获数据包的内容，并将所捕获到的数据包都写入到一个libpcap格式的库文件。要下载并编译连接创建ZenaNG软件，其操作步骤如下所示：

在编译连接创建ZenaNG程序以后，你就可以通过“-h”参数在命令行中检验该程序的运行效果了。例如，运行ZenaNG程序，对信道15进行数据包嗅探（使用“-c”参数），并且以十六进制的输出格式将所接收到的数据包显示出来（使用“-f”参数），其命令格式及运行效果如下所示：

在没有指定捕获数据包的文件保存类型时，ZenaNG程序会将接收并捕获到的数据包以libpcap的格式进行保存，如果用户想将该程序在命令行上的输出保存到一个文件中，那么可以使用“重定向” [5] （redirect）命令进行转换，其命令格式及显示效果如下所示：

ZenaNG软件也可以捕获通信数据包，将这些数据包“重定向”后直接转向Wireshark程序，并作为Wireshark程序的输入源，此时数据数据命令格式如下所示。作为数据包捕获行业的专业软件，这时的Wireshark程序将启动一个数据包的捕获线程，并且马上立竿见影，程序立即开始捕获和显示所接收到的数据包，Wireshark程序软件的捕获界面如图13-17所示。

图13-17　Wireshark捕获由ZenaNG软件重定向过来的数据包

破解Microchip公司的ZENA网络分析器

有时Microchip公司的“ZENA网络分析器”设备并不总能让我们满意，所以需要对该设备进行一些改装，这就涉及对该黑客工具进行破解的问题。尽管缺少“ZENA网络分析器”设备的固件、设备电路原理图和必要的技术文档资料，但从硬件和软件角度来看，Microchip公司的“ZENA网络分析器”设备还是一个很明显能够被破解的设备。

在“ZENA网络分析器”设备的原本设计中，在电路板板载天线（circuit-board antenna）的附近还有一个能够安装一个外部天线连接器的接口。利用“印制电路板”（Printed Circuit Board，PCB）上的这个插座接口，你可以使用表面贴装（surface-mount）技术焊接一个的“RP-SMA RF”连接器（该连接器如果购买的话，仍然可以在很多网上零售商店中买到，比如Digi-Key公司网站上，产品编号是CONREVSMA001-SMD-ND，售价是3.18美元）。有了这个连接器，你就可以通过它选择使用外部天线或者PCB天线了。现在，“RP-SMA RF”连接器焊接完毕，然后使用“RP-SMA RF”连接器尾端的“小辫子”连接线连接任何一款2.4GHz的外置天线。这样你就能够在更大的范围内捕获ZigBee网络活动的通信数据包了。

KillerBee数据包侦听工具zbdump

KillerBee软件的工具套件，提供了用于捕获ZigBee协议和IEEE 802.15.4协议设备通信数据包的几个选项。其中的zbdump工具，就是一款包含在KillerBee工具集中的常用工具，其设计理念和流行的tcpdump数据包捕获工具类似。要使用该工具进行正常的数据包侦听工作，可以使用一个定制的KillerBee固件，或者在使用出厂默认固件情况下，使用“RZUSBstick记忆棒”一起协同工作。完成固件升级或加装“RZUSBstick记忆棒”以后的zbdump工具，就可以捕获ZigBee网络和IEEE 802.15.4协议网络的数据通信数据包，并将捕获到的数据包保存到libpcap文件中。

首先，安装KillerBee设备通信所需要的Python模块，然后下载KillerBee的源程序，下载地址是http://killerbee.googlecode.com 。从这里你可以下载KillerBee的最新版，或者拿到最新版源代码，其操作步骤如下所示。

注意

无论使用哪个工具，KillerBee的安装过程都是相同的，所以我们只讲解一次安装步骤。

一旦安装完毕以后，你就可以使用zbdump工具进行数据包的捕获，并将捕获到的通信数据包保存到文件中。使用“-f”参数可以设置“RZUSBstick记忆棒”，以便捕获指定信道的数据包。使用“-w”参数则表示输出文件是libpcap格式。通过Ctrl+C组合键可以中止当前的数据包捕获流程，回到提示符状态。

如果想进行进一步分析libpcap格式的savefile.dump文件，可以使用Wireshark软件打开，这时的程序分析效果如图13-18所示。该格式的保存文件，还可以被KillerBee工具包中和zbdump工具一起的其他几个工具程序所使用。

图13-18　savefile.dump文件分析效果

注意

zbdump工具的“-w”参数可以以libpcap的格式创建数据包捕获文件，或者通过“-W”参数以dcf的格式进行捕获数据包的保存，dcf格式是“商业Daintree网络”（commercial Daintree Network）的“传感器网络分析器”（Sensor Network Analyzer，SNA）数据包嗅探文件的格式。不过，需要注意的是，尽管KillerBee网络设备为了与软件保护“向后兼容”（backward compatibility）还在支持这种格式，现在的“商业Daintree网络”反而不再支持Daintree公司的“传感器网络分析器”产品了。

还有一个能使用zbdump工具捕获ZigBee网络通信数据包，并且所保存的文件能在Wireshark程序中打开的工具，那就是Wireshark程序本身了。不过，Wireshark程序并不能直接从KillerBee设备中捕获数据包。

使用KillerBee设备，加上“RZUSBstick记忆棒”硬件，再加上Microchip公司的“ZENA网络分析器”工具，这套组合的一个很重要的不足是它们都只能侦听2.4GHz信道中的无线ZigBee网络通信数据包。如前所述，其实ZigBee的这一频率只是全球通用频率，还有一些频率虽然不太常见，但在一些ZigBee网络和IEEE 802.15.4网络部署中还是会看到有些网络部署是在“低于1GHz频率”sub-1-GHz信道中。要对这些频率进行侦听，上面的组合工具就无能为力了，只能查找其他的嗅探工具，以便适应这个频率范围内的ZigBee网络的侦听。

在Sewio网络上使用Open Sniffer软件

Sewio网络生产了一个相对低成本ZigBee网络或IEEE 802.15.4网络的嗅探设备，称为“Open Sniffer”，其网址是http://www.sewio.net/open-sniffer ，如图13-19所示。“Open Sniffer”设备是一个“已自足的”（self-contained）的网络节点设备，提供对以太网的支持。该设备不像前面那些设备一样需要将捕获设备与目标的系统通过USB线相连，以至于攻击设备和捕获设备之间的距离因为USB延长线的距离而变的有限，而在“Open Sniffer”中，设备可以部署到一个很远的地方（只要能够通过网络访问到），这样极利于捕获设备捕获对方网络的通信数据包。

图13-19　Sewio公司的“Open Sniffer”产品

“Open Sniffer”设备使用一个默认的IP地址10.10.10.2，所以要连接该设备，你需要先配置你的系统，将IP地址设置为10.10.10.1，然后就可以连接到“Open Sniffer”设备上进行配置了。如果在浏览器里输入这个“Open Sniffer”的IP地址，那么很快就会出现这个设备的配置选项，在“设置”（Settings）页面上包括有IP地址信息，如图13-20所示。将“Open Sniffer”设备默认的IP地址更改成你想用的IP地址，然后放置到你想要进行侦听的网络区域范围内，在下面的配置示例中，我们使用“Open Sniffer”设备默认的IP地址与该设备进行交换操作，直接将设备连接到我们的Linux主机系统上。

图13-20　Sewio公司“Open Sniffer”设备IP地址的配置页面

提示

默认情况下，该Sewio公司的“Open Sniffer”设备会传送一个正确的或不正确的“循环冗余校验校验”校验码，如果想限制接口只接收数据包为有效的数据包，那么就导航到“Open Sniffer”设备浏览器界面中的“设置”页面，然后设置“循环冗余校验校验”过滤选项。

“Open Sniffer”设备可作为一个数据包捕获源，向KillerBee设备的zbdump程序输送捕获来的数据。要完成这种数据流的“重新定向”，只需要简单地在zbdump工具的配置界面中指定一个将“Open Sniffer”设备的IP地址作为一个“设备名称”字符串即可。详细的格式如下所示：

Sewio公司的“Open Sniffer”设备是当前目前唯一一个能在“低于1GHz频率”信道上支持KillerBee设备进行侦听操作的设备。随着越来越多的设备拥挤在2.4GHz频段，许多制造商正在寻找可用的频率，比如美洲的900MHz、欧洲的868MHz、中国的780MHz都是可以作为无干扰（interference-free）的频谱。表13-1中列出这些频率的“信道数”、匹配的频率和国际上使用这一频率的地域范围。

表13-1　可作为无干扰的频谱的相关信息

注意

用在美洲和欧洲的“低于1GHz频率”信道频率数字与中国的“低于1GHz频率”信道频率的数字冲突。所以Sewio公司针对上述区别销售两种型号的“Open Sniffer”设备，其中一个用于调谐美国和欧洲的频率，另一个调谐中国的频率，所以在购买“Open Sniffer”设备的时候，要根据所侦听的频率认准所购买设备的识别范围。

捕获“低于1GHz频率”上的ZigBee网络或IEEE 802.15.4网络活动，只需简单地指定相应的信道即可，命令格式如下所示：

虽然“低于1GHz频率”的ZigBee网络和IEEE 802.15.4网络与2.4GHz的同类网络相比并不太常见，但是我们可能更希望继续看到有新产品切换到这个频率范围。许多行业分析师预测，“低于1GHz频率”将成为“物联网”演变中至关重要的一个环节，另外，在ZigBee网络和IEEE 802.15.4网络的安全评估的部署中，这也是不应忽视的一个环节。

防御数据侦听

不论攻击者使用Microchip公司的“ZENA网络分析器”、还是Sewio公司的“Open Sniffer”，或者是KillerBee设备上使用zbdump工具，在ZigBee网络中传输的数据都有遭受到侦听攻击的危险。从深层角度来看，我们应该明白攻击者能够对你的无线网络进行侦听，捕获和分析你们所传输的数据包。所以可行的安全措施是尽量减少攻击者在拿到数据以后所能做的事。

在“ZigBee规范”中唯一能够防御这种类型攻击的措施是采用CCM*（即“高级加密标准-计数模式和密码块链消息认证码”协议的修订版）密码套件中可用的加密机制。并且，要确保你选择了高强度的密钥，尽最大的可能保证这些密钥的机密性。

13.3.4　重播攻击

“重播攻击”的概念非常简单：“使用之前观测到的数据重新发送这些数据包，就好像原始的发送者重新发送了一遍一样。”一次“重播攻击”的效果，很大程度上取决于重播时所使用的数据内容，以及所使用的协议本身的自然特点。

举例来说，有一个网络用来支持电子银行，如果攻击者可以实施一次“重播攻击”，重新发送之前向银行发送过的交易数据，这样原来发送的金额可能会翻上两倍、三倍或者四倍，具体的倍数取决于攻击者重新发送重复数据的次数。在ZigBee设备中，重播攻击的手法是类似的，但是效果却并不相同。

根据作者的研究，很多针对ZigBee协议堆栈的操作都没有使用加密算法，所以这个漏洞使得ZigBee很容易遭受到“重播攻击”。在这些情况下，原始的数据帧可以重新发送，这样会将一个给定的动作重复多次。例如，来自“德克萨斯仪器”（Texas Instrument）的一个采样应用程序协议栈可以实现ZigBee网络上的“灯光切换开关”（light-switch）应用。当开关打开或者关闭的时候，一个攻击都可以捕获到这时所生成的通信数据包，那么这个攻击者就可以有选择地“重播”这些数据包，按着自己的意愿打开或关闭开关。如果和物理攻击相结合，比如在视频监控的情况下，要想进入某个大门，只能选择破门而入，这是会被立即发现的；而现在，这种远程操纵开关的能力就会变得十分有用，同样在视频监控的情况下，就可以先控制大门打开，然后大摇大摆地进入而不会被察觉。或者攻击者只是制造一个恶作剧，通过快速不停地打开和关闭操作，让一个灯变成一个不停闪烁的灯，对于被入侵的ZigBee网络的管理者来说，也是件头疼的事。

KillerBee数据包重播工具zbreplay

可以使用KillerBee中的zbreplay工具进行数据包“重播攻击”，它能够从数据包捕获文件中读取数据，然后按照指定的延时间隔重新发送这些数据包。这里的延时间隔可以是数秒，也可以是短短的一瞬。程序运行的时候，zbreplay会重新发送每个数据包帧，同时会保持整个通信数据包的原始完整性。当然，这些重发的数据帧中并不包括“确认帧”。以上的操作格式和操作效果如下所示：

注意

zbreplay不会重新发送“确认帧”，原因也很简单，因为这些帧是在接收方成功接收后自动生成的。也就是说，所谓“重播攻击”不是停掉原来的协议职能，而一味重发，而是重播的过程中，原来的功能还在，并且当被“重播攻击”的对方向你发出“确认请求帧”的时候，你的协议会自动向对方发送“确认帧”，所以你就不需要再重播“确认帧”了。

在本例中，zbreplay重新发送了libpcap捕获文件中的内容。这个捕获文件所捕获的也正是“灯光切换开关”的动作，保存的文件名是lightswitch-onoff.pcap。ZigBee运行的信道是20信道，这个是通过参数“-f 20”指定的，延时为十分之一秒，这是通过参数“-s.1”体现的。在重播完捕获的数据包内容后，zbreplay显示总共发送了4个数据帧。另外，作为可选的参数，你可以使用“-n”参数来限制需要重播的数据帧的数量，比如你只想重播数据包捕获文件中的前两个帧，那么只需指定“-n 2”参数即可。

注意

在同一个接口上，既使用zbdump工具捕获数据帧又使用zbreplay工具重新发送这些数据帧是行不通的，所以如果想在zbdump工具记录数据的同时，也能查看通过zbreplay工具生成的ZigBee设备的活动，你需要有两根“RZUSBstick记忆棒”。

因为zbreplay会重播所捕获数据包的内容，所以有时需要你在发起“重播攻击”之前先对所捕获的文件进行一番“整理”，使得文件中只保存要发送的数据帧，这样重播工具就只需要发送这些需要重播的帧了。这个操作非常容易，只要使用Wireshark软件所提供的功能即可完成。

首先，在Wireshark程序中打开捕获的数据包文件。右键单击选中一个你想要提取或解包的数据帧，然后选择“标记数据包”（Mark Packet），这是一个“反转”（toggle）操作模式，所以如果你发现你误标了某个数据包，只需要按这个过程再操作一遍即可。被标记选中的数据包，Wireshark会以黑色背景高亮显示该数据包所在行。一旦“高量标记”完所有在数据包捕获压缩文件中所需的数据包项以后，选择“文件（File）|导出所选数据包（Export Specified Packets）”菜单，然后输入一个新的文件名。在“数据包范围”（Packet Range）分组框中，选择“只保存已标记的数据包”（Marked Packets Only）单选项，这时的界面截图如图13-21所示。

图13-21　标记数据包

一个“重播攻击”的有效性，在很大程度上取决于作为目标的那个ZigBee设备在软硬件设计时采用的实现方式，也就是说，只能具体问题具体分析，必须是在具体必须在逐项（case-by-case）分析的基础，再进行总的评价。通常情况下，“重播攻击”所针对的是未加密的网络，或者是那些我们已经知道“加密密钥”（encryption key）的网络。幸运的是，对于一个攻击者来说，如果遇到一个加密的ZigBee网络，攻击者仍然也还是有专门针对加密网络的攻击选项。

防御重播攻击

要弱化“重播攻击”，ZigBee协议堆栈中应该在接收数据包中配置一个“序列码”（sequence number），以便验证数据的有效性。在每次新的数据包中，这个“序列码”都至少比上一次成功地接收到的数据包中的“序列码”大1 [6] 。不过，不幸的是，“ZigBee规范”并不要求这点，并且虽然ZigBee“网络层”中也有一个“序列号”的字段是可以用来当此用途的，但是这里的“序列号”字段，它的“熵”（entropy）也只有8位，也就是说它总共可以表示的有效数据量只有28=256种可能，明显偏少。举例来说，假设ZigBee的“网络层”采用了这一机制，一个攻击者可以捕获到一个数据包，如果现在发送这个数据包，就会因为“序列码”不满足“大于1”的要求而失效，但这个问题不大，因为发送程序只要再等待255个帧之后，再次发送这个捕获的数据包时就能够匹配到正确的“序列号”了。

在高层应用中，一些安全防御的方法也可以作为一种额外的方法用于防御“重播攻击”，比如可以应用上面提到过的“序列号”机制，设计一套“高级序列号强化机制”（high-level sequence number enforcement mechanism）来防御“重播攻击”。就目前来说，这些机制应该从单独使用的基础上进行评估，然后根据具体的应用决定所使用的“序列号”的有效位数（也就是上面提供的“熵”）是否够用。

13.3.5　针对加密的攻击

加密密钥的生成、更新、撤销以及管理对于ZigBee网络来说是一个很难安全处理的挑战性问题。几乎所有的ZigBee设备都没有“人机接口”（Man-Machine Interface，MMI），所以即使是管理员用户在将设备用于实际使用之前，也很少有机会买到一个能在本地配置密钥的产品。在其他情况下，比如在“家域网”（Home Area Networking，HAN）中，一个智能温控计和一个智能电表之间进行通信，由于加入这个ZigBee网络中的多个设备之间，每个ZigBee设备的责任都是分离的，所以不存在管理上的关系，因而这就使它们的密钥管理成为了一个复杂的问题。

在“ZigBee-2012网络”、“ZigBee-2007网络”，以及更早的使用“标准安全模式”的网络中，如果设备还不知道自己的特定密钥，那么它可以通过向“应用支撑子层”发送一个“请求密钥”（Request-Key）命令的方式，请求“ZigBee信任中心”分配给它一个密钥即可。如果“ZigBee信任中心”的配置策略允许新设备请求密钥，那么“ZigBee信任中心”就通过“应用支撑子层”向发出请求的设备回送一个“传输密钥”（Key-Transport）命令。

知道了“网络密钥”后，其他的密钥都可以通过这个“网络密钥”进行派生，比如“链路密钥”。可见，“链路密钥”交换的安全性取决于前面“网络密钥”的完整性，但是，这里的“网络密钥”是以明文的方式发送的，所以隐患极大。不过，尽管这是一个很大的威胁，但是许多ZigBee网络中，也都只能依靠这一个可用的传输机制来动态分配密钥和实现密钥的更新 [7] ，并将这一机制作为网络所要求的安全模型，所以这是一种无奈之举。

KillerBee密钥侦听工具zbdsniff

KillerBee工具集中的zbdsniff工具，在设计的时候，就考虑到用该工具可以对数据包捕获文件的内容进行处理，无论文件的格式是libpcap格式，还是“传感器网络分析器”保存的格式。所处理的数据包内容不是所有内容，而是只关注其中的“应用支撑子层”的数据帧，并且只关注其中的“传输密钥”命令，在命令行中可以同时指定多个捕获文件。每当有一个捕获文件中包含有“传输密钥”命令，同时命令中存在泄露的网络密钥，那么zbdsniff工具会显示密钥的内容、相关ZigBee设备的源地址和目标地址，其命令格式及破解示例如下所示：

一旦获取了“网络密钥”之后，你就可以使用Wireshark工具解密数据包捕获文件的内容了。操作步骤是先打开Wireshark程序的“用户图形界面”，首先选择一个密钥加密方式（即图中左边列表中的“ZigBee网络层”（ZigBee NWK）），然后通过选择“编辑（Edit）|偏好（Preferences）|协议（Protocols）|ZigBee网络层（ZigBee NWK）”菜单打开“ZigBee网络层”（ZigBee Network Layer）对话框，并且在对话框指定位置输入密钥，如图13-22所示。同时，还必须指定“信息完整检查码”的长度（即图13-22中“安全级别”（Security Level）），该长度通常都是32位的密钥长度，这同时也是Wireshark软件的默认值。密钥输入完毕后，Wireshark程序就会在数据包捕获文件解密数据包中的每个帧，这样就能看到每个帧解密后的内容了。

图13-22　输入网络密钥

防御密钥传输攻击

“ZigBee规范”也支持提供加密密钥的其他机制，其中包括“预配置密钥”机制和“密钥协商”。其中的“预配置密钥”就是当设备在工厂制造阶段就预先设置好密钥；“密钥协商”就是使用“对称密钥建立”（Symmetric Key-Key Establishment，SKKE）协议，动态地交换密钥。

“预配置密钥”机制的优势在于，在工厂的生产阶段就配置好了密钥，所以就缓解了密钥在传送过程中遭受攻击的威胁，因为ZigBee网络上的设备在传输以前就已经知道网络上其他设备的密钥，所以可以直接用来保护要发送的数据。不过，“预配置密钥”机制的劣势也很明显，那就是密钥的更新（rotating）和撤销（revoking）变得非常困难，一旦遇到这两种操作，就不得不需要管理员手工依次处理ZigBee网络中的每个设备了。

“ZigBee Pro规范”支持“对称密钥建立”协议，通过该协议的派生功能可以派生出密钥，“ZigBee信任中心”可以将这个派生的密钥作为一个“群组密钥”（group key），然后在ZigBee设备进入网络要求认证的时候，使用这一“群组密钥”进行通信。然而，要想使用“对称密钥建立”协议，通信双方的设备都必须配置一个“主密钥”（master key）。“主密钥”的分配有两种方式，一种是通过空中在没有保护的无线传输，另一种是在设备上“预配置密钥”的方式。无论采用哪种方式，都存在前面作为密钥建立过程中已讨论过的风险和劣势。

13.3.6　伪造数据包攻击

KillerBee的设计对于软硬件开发者来说是很友好的，该设备使用Python编程语言实现了所有的非固件代码。除了支持Python语言的开发者，KillerBee还集成了由Philippe Biondi开发的数据包嗅探和一个制作开发的“框架类”的程序，名叫Scapy。

不过，Scapy框架本身既不支持IEEE 802.15.4协议或ZigBee协议，也不能与像“RZUSBstick记忆棒”这样KillerBee所支持的硬件设备进行交互操作。为此，在KillerBee项目中，Ricky Melgares和Spencer McIntyre为了将KillerBee设备和Scapy框架集成到一起做出了重大贡献。通过这些工作，KillerBee也提供了个zbscapy工具，该工具允许用户嗅探和伪造ZigBee协议和IEEE 802.15.4协议的数据包，并且使用了与Scapy框架相似的语法。

提示

这本书的目的并不是要作为一本资料大全，让读者详细了解Scapy框架的每一句语法和每一个功能点，我们只会从中挑选出该框架中，使用IEEE 802.15.4网络和ZigBee网络相关的协议，与数据包嗅探和制作相关的那部分zbscapy功能和Scapy语法的使用方法。如果用户对Scapy框架是个新手，那么应该先读一下Scapy教程的文档，该文档的网址是http://www.secdev.org/projects/scapy/doc/usage.html 。

1.设置zbscapy程序

要想zbscapy工具正常使用，需要首先安装Scapy项目中一款名叫scapy-com软件的修改版本。scapy-com是Scapy框架的“社区版本” [8] （Community Edition），由众多用户参与了开发上的贡献和功能增强。在你的Linux主机上，可以通过Mercurial项目中的hg工具自动下载scapy-com项目所提供的该程序的源代码，下载成功以后，就可以安装了，其安装命令的格式及效果如下。

随着scapy-com软件的安装，你可以调用zbscapy工具访问交互式shell环境，如下所示：

2.通过zbscapy伪造数据包

当你以root用户调用zbscapy命令的时候，如果系统中有多个KillerBee设备，那么你可以通过参数决定使用哪一个设备，否则系统就默认使用第一个设备。与Scapy程序相似，比如“ls（）”命令会显示所支持的，可以通过手工方式伪造的数据包类型，其中很多“介质访问控制层”的附加函数都是以Dot15d4（）作为前缀，几个新的“逻辑链路控制”（Logical Link Control，LLC）层函数因为和ZigBee相关，所以都是以ZCL作为前缀，这些功能都属于“ZigBee协议簇库文件”（ZigBee Cluster Library）开发包中。具体的示例如下所示（注意，为了本书格式上的简洁，在下面输出内容中，我们对不是很关键的内容进行了裁剪，所以下面的函数也不是“ls（）”命令输出的全部函数）。

zbscapy工具引入了一个名为killerbee_channel的配置项，目的是用于指定发送数据包时要使用的信道号码。在设置此值之后，你就可以通过KillerBee对象的killerBee（）方法完成对KillerBee对象的初始化工作 [9] ，并且手工伪造一个数据包，并将其发送出去。下面的例子演示了zbstumbler工具中的一些功能，即从信道15上发送一个单一的IEEE 802.15.4协议信标请求数据帧。

在这个例子中，我们通过Dot15d4Cmd（）函数进行数据包内容的填充，手工创建了一个基本的IEEE 802.15.4数据帧，将该数据帧指定为信标请求命令类型以后，就可以通过调用kbsendp（）函数发送这个数据包的数据了。作为可选项，你可以在调用kbsendp（）函数的时候，将其参数设置为mypkt，除此之外通过在命令中增加“loop=1”和“inter=1”参数设定发送的动作不停地重复，并且每个数据包之间的间隔是1秒。由于程序会无限地循环下去，所以如果要中止这个发送过程，可以通过组合键Ctrl+C中断传输：

通过使用zbscapy工具，使得伪造任意格式的数据包的操作变得简单且直观，也让我们可以以非常灵活的方式，通过各种类型的数据包数据对目标设备进行各种测试。例如，我们可以把类似的信标请求帧，通过遍历的方式把所有可能的命令类型的值测试一遍，甚至可以生成包括无效命令类型和不支持的命令类型，对对方ZigBee设备的鲁棒性进行测试。其具体的做法也不难，就是插入一段Python语言的代码，在代码中通过一个while形式的循环 [10] 命令，周期性调用kbsendp（）函数。其过程和效果如下所示：

除了伪造数据包，zbscapy也可以让接收数据包变得简单，接收到的数据包同样可以用于后续的处理。具体参见后面的内容。

3.通过zbscapy嗅探数据包

在前面的例子中，我们发送了各式各样，或有效，或无效的IEEE 802.15.4数据帧，包括信标请求数据包。默认情况下，通过发送信标请求数据帧，我们可以复制一些zbstumbler工具曾经做过的动作，但对接收到的数据包并不会显示任何信息。不过，这没关系，因为我们可以通过修改这个脚本来让zbscapy工具既可以发送数据包，也可以同时接收数据包。对如何接收数据包，一个简单的小结如下：

在这个例子中，我们伪造了一个有效的IEEE 802.15.4协议数据帧，所用的类型就是“信标请求”，指定“目的地址”是广播地址0xffff。发送数据帧的命令不是用kbsendp（）函数，因为这个命令发送完一帧数据以后就会立即返回，至于是否收到对方的回复并不知道。为了避免这种效果，我们改用kbsrp1（）函数进行发送，这种发送方式会在发送该数据帧后进入等待状态，直到等到一个来自网络的响应数据包才返回。这样做的好处是我们可以很容易在一个单一的流程（a single line）中，通过show（）函数将接收到的数据包进行汇总分析并显示出来。同时，如果想显示“响应列表”（resp list）中接收到的数据帧的附加信息，还可以使用show2（）函数。

提示

通过kbsrp1（）函数发送数据包的时候，会让脚本进入“阻塞”（block）状态，直到收到一个数据包后才会返回。如果对方ZigBee设备根本就不存在，那么当前这个函数就会进入“死等”状态。为了避免这种情况发生，可以在调用kbsrp1（）函数时，指定一个以秒为单位的时间值，即在该指定的秒数内，如果收到对方回复的数据包，则立即返回；如果在到达该秒后，仍然没有接收到数据包，则函数同样返回，同时会报一个“超时值”（timeout）错误，也就是说，要避免程序死等，只要在调用脚本前设置这个“超时值”作为参数即可。

zbscapy工具除了数据包注入任务之外，还可以通过调用kbsniff（）函数使其单独作为一个嗅探器。与Scapy框架非常相似的是，kbsniff（）函数会返回一个接收到的数据包的列表，至于这个列表中捕获到数据包的个数，则取决于kbsniff（）函数什么时候停止运行了。kbsniff（）函数停止运行有三种可能：一种是在kbsniff（）函数运行的时候，人为的中断（比如用户按了Ctrl+C组合键）；第二种可能就是用户在调用kbsniff（）函数的时候，设置了一个数量参数，那么当该函数捕获的数据包数量达到这个数量时，就会主动退出来；还有一种可能就是用户在调用kbsniff（）函数的时候，设置了一个以秒为单位的时间参数，那么当该函数运行的累计秒数达到这个时间参数时，也会主动退出来。在下面的例子中，我们也可以“重载” [11] （override）函数中的conf.killerbee_channel参数，以便在调用kbsniff（）函数的时候，设置一个可以作为变量的信道序号：

在这个例子中，函数kbsniff（）在信道20上嗅探了30秒的时间，一共捕获到4个数据包。我们可以通过每一个数据包前面的索引序号 [12] ，汇总显示这个数据包的详细内容，或者与例子中一样，通过调用packets.show（）函数显示出一行一总结式的效果。

像Scapy框架中的sniff（）函数一样，kbsniff（）函数还提供了以“回调函数” [13] （callback function）的方式进行调用的能力。这样每次接收到一个数据包，系统就会主动调用“回调函数”完成指定的功能，具体是什么功能，则取决于我们如何编写“回调函数”，比如我们可在“回调函数”中编写定制的代码，当有数据包捕获的时候，可以处理这些数据包。本例就是在接到数据包的时候，将该数据包填充给一个“列表对象”（list object）：

注意

在上面例子的输出内容中，有些内容已被修改，以便在不影响理解的同时，保持格式上的简洁。

在这个例子中，我们定义了一个processpkt函数，每当有一个数据包被捕获到的时候，processpkt函数就会被kbsniff函数所调用。这时，processpkt函数会检查是否这个捕获到的数据包是否有“ZigBee的安全头部数据”（ZigBeeSecurityHeader）这一层数据，如果有，processpkt函数会继续检查这个头部中的“帧类型”（frametype）字段是否为0，根据“ZigBee规范”中约定，如果该字段为0，就表示这是一个“数据的数据帧”（data frame）。还有一个代表当前数据包中“ZigBee安全状态”字段是否已设置的数据“位”，如果没有设置，那就表示这是一个“数据没有加密的数据帧”（unencrypted data frame）。如果这些条件都满足，那就意味着，当前所捕获到的这个数据包是一个没有加密的明文数据包。那么processpkt函数就会调用hexdump函数，将数据包内有效载荷直接以十六进制的方式全部打印出来。

因为接收和发送数据包的这一基本功能很容易做到，所以我们可以简单地部署一个新的ZigBee或IEEE 802.15.4的攻击工具。接下来，我们看一个开发某攻击工具的例子，该例子使用zbscapy工具，利用加密的IEEE 802.15.4网络中一个已公开已发表的“拒绝服务”（Denial of Service，DoS）漏洞，采用一种非公开的攻击方式进行攻击，这种攻击方式目前仍然是有效的。

通过zbscapy攻击IEEE 802.15.4网络

IEEE 802.15.4协议支持“介质访问控制”层加密和数据帧验证功能，这是通过AES-CTR（即“演进的分组系统加密算法第2版”的别称）加密算法和一个“信息完整性检查”（MIC）函数。这个安全控制在IEEE 802.15.4设备的部署中虽然不是强制性的，但是从使用用例中可以发现，IEEE 802.15.4协议很需要有这种很强的保密性强和真实性。

不幸的是，在这些安全的IEEE 802.15.4网络部署中，对数据帧处理的设计暴露了系统很容易遭到一个持续的“拒绝服务”攻击。首先，在2006年，由Rui Silva和Serafim Nunes在论文“IEEE 802.15.4标准的安全”（“Security in IEEE 802.15.4 Standard”）中指出一种以二者姓名命名的“Silva/Nunes”攻击，在这种攻击中，攻击者可以操纵目标设备，使这些ZigBee设备拒绝对所有“进接口”（inbound）数据的后续处理。并且这种攻击所造成的“拒绝服务”攻击效果是：管理员必须手动刷新组织内所有ZigBee设备，然后才能使ZigBee设备恢复对“进接口”数据的处理。

针对IEEE 802.15.4标准的“Silva/Nunes拒绝服务” 　DoS攻击所利用的攻击漏洞，是ZigBee设备通过“进接口”处理数据的时候，会参照一个IEEE 802.15.4标准的“数据帧计数器”（Frame Counter，FC）。每当设备的节点发送一个安全的数据包，这个数据包就会包括一个连续的数据帧控制值。这个数据帧控制值就是“数据帧计数器”，存在于每一个数据帧中，它的范围是0~4294967294，换算成十六进制就是0到0xffffffff-1。“数据帧计数器”值本身是不加密的，但是该值参与了数据包中“信息完整检查码”的运算。

接收节点需要记住来自网络上所有其他节点发送来的最后一个观察到的“数据帧计数器”值，这样做的目的也是很明确的，作为其通信安全的一种机制，避免对方欺骗自己，发起“重播攻击”，从而不需要对对方重复发送的数据包进行多次处理。这样一来，接收节点只接收来自对方的数据包中，“数据帧计数器”值比上一次来自同一对方设备中至少大1的那些数据包。这种数据包有效性的通用检验机制被应用于许多协议中，对协议进一步的解释，详见图13-23。

图13-23　IEEE 802.15.4协议中，处理数据包的步骤

对于接收节点，另外一个要考虑的地方是IEEE 802.15.4规范将“数据帧计数器”值作为一个输入参数，用来加密和解密处理，也就是在“每一个数据包生成”（per-packet key-generation）机制中，IEEE 802.15.4规范都要求“数据帧计数器”的值作为该机制的一部分参与运算。“数据帧计数器”的生成一般是使用一个nonce类型的值。该值所处的结构如下所示。

“数据帧计数器”是特定的节点在发送每一数据帧的时候，用来标识和区分每一个数据包的一个独一无二的值。如“WPA的预共享密钥模式”中的注解所述，这个值是一个与时间有关的随机数。对于IEEE 802.15.4规范来说，要使用AES-CTR机制在“‘高级加密标准-计数模式和密码块链消息认证码’（AES-CCM）协议的修订版”CCM*中进行加密，那么这是一个重要组成部分：重复的nonce值会导致“初始化向量的碰撞攻击”（initialization vector collision attack），让攻击者通过已知密文/明文数据解密未知密文。由于缺乏密钥的更新机制的支持，所以“IEEE 802.15.4规范”进一步明确：当“数据帧计数器”的值等于0xffffffff时，接收节点必须立即确定发送这一值的节点，停止与该节点所有进一步的数据处理，并将该发送设备添加到“黑名单”里，之后也不再与该设备进行任何处理，这个规定详见《IEEE标准802.15.4-2006》7.5.8.2.3小节中的“步骤j”和“步骤o”。要想从黑名单中删除这个设备，需要管理员通过修改所有设备的“网络密钥”而使黑名单失效，确切地说就是得一个设备，一个设备地重新刷新修改后的固件才行，可见这是一个复杂的操作流程。

在IEEE 802.15.4规范的预期使用情况中，设备是不可能达到这个最大的“数据帧计数器”值的 [14] 。因为我们假设，某一个ZigBee设备每秒钟发送一个数据包，那么即使是用这么一个不太可能的数据包持续发送速率，一个ZigBee设备节点要想达到这个最大的“数据帧计数器”值，也需要136年 [15] 之久。我们总不会希望到了下个世纪还依赖于IEEE 802.15.4规范进行ZigBee设备的安全控制吧。

在Silva和Nunes对IEEE 802.15.4规范的安全组成部分所做的分析中，他们发现了一个漏洞，那就是规范规定处理“进接口”数据包的时候，需要参考“数据帧计数器”的值。如图13-23中的流程图所示，当“数据帧计数器”的值为0xffffffff时，节点就停止处理该数据包。然而对于任何小于最大“数据帧计数器”值的值，接收节点会查看这个“数据帧计数器”，看值是否比最后一次记录的“数据帧计数器”至少大1。如果某个数据包通过“进接口”时，符合这个小于最大“数据帧计数器”的条件，那么这个数据包将通过检查，接收节点同时会使用接收到的这个值作为下一个“数据帧计数器”值，然后开始解密当前接收到的这个数据包。这就产生了严重的缺陷，问题就出在“当该值为0xffffffff时就停止处理”、“每接到的值必须比上一次的值大”和“每接收到一个值，就将该值作为一个用于下一次接收时判断的新的值”这三点规定之间的矛盾上。攻击者在IEEE 802.15.4网络上，通过伪造数据包冒充一个合法节点，向要攻击的节点设备上发送一个“数据帧计数器”值为0xffffffff-1的数据包。对于接收节点来说，通常情况下，这个数据包总是符合“每接到的值必须比上一次的值大”，因而是合法的，并且在接收以后会按“每接收到一个值，就将该值作为一个用于下一次接收时判断的新的值”的规定将0xffffffff-1作为新的“数据帧计数器”值。这样一来，问题就出现了，如果一个合法的设备使用小于或等于0xffffffff-1的“数据帧计数器”FC值向该被攻击的节点发送数据，那么会因所发数据不符合“每接到的值必须比上一次的值大”而被拒绝；如果所发数据的“数据帧计数器”值为0xffffffff，虽然符合了“每接到的值必须比上一次的值大”，但是也会因符合“当该值为0xffffffff时就停止处理”而被拒绝处理，甚至被直接加入到“黑名单”中。

在写这篇文章的时候，还没有公开可用的工具来实现和验证“Silva/Nunes攻击”。然而，我们利用zbscapy工具的特点，可以快速地开发出一个类似的攻击工具。

攻击IEEE 802.15.4规范中“数据帧计数器”有效性验证机制　最有效的“拒绝服务”攻击条件下，一个攻击工具可以按如下几个步骤进行操作：

·自动通过数据包嗅探的方式，确定对方的网络是一个IEEE 802.15.4网络。

·从观察到的数据包中提取所需的字段：“数据帧控制”（frame control）、“源地址”（source address）、“源‘个人局域网’的ID”（source PAN ID）字段、“目的地址”（destination address）字段，“目的‘个人局域网’的ID”（destination PAN ID）字段、“安全控制”（security control）字段。

·使用上述字段，再将“数据帧计数器”值设定为0xfffffffe（即0xffffffff-1），一起伪造一个数据包，并发送出去 [16] 。

·还有一个可选的步骤：周期性的跳频，以最大化地攻击分布于各个频率点的所有潜在的ZigBee设备。

使用zbscapy工具，我们可以调用kbsniff（）和kbsendp（）函数查看IEEE 802.15.4的数据帧，主要关注与漏洞相关的必要的安全元素，然后选定一个以前捕获到的数据帧，修改其版本，将其中的“数据帧计数器”值设置为会触发“拒绝服务”的条件，然后通过注入（injecting）的方式发送出去。

在这个例子中，“while（1）”命令的意义是，后面的命令将是一个循环，该循环会无限地运行下去，那么这个命令的作用就是让攻击永远不停地进行下去。在循环的内部，信道变量是用来覆盖每一个2.4GHz频率的IEEE 802.15.4通道的，程序会在每一个信道嗅探10秒钟，然后移到下一个信道中继续嗅探。在这里的进攻中，嗅探不是目的，嗅探只是为了接收一个数据包，然后提取必要的参数，所以每次kbsniff（）函数一接收到一个数据包，程序就会调用attack（）函数。

attack（）函数会检查所捕获的数据包的内容，先确定这个数据包是否具有“辅助安全头信息”（auxiliary security header information）和“数据帧计数器”字段。如果这些字段存在，那么这个数据包就会被修改，其中的“数据帧计数器”值会被设置成最大允许值0xfffffffe。修改后的数据包以“注入”的方式连续三次发送到对方被攻击的ZigBee设备上，每次发送有一个1秒的延迟间隔。发送的信道当然就是接收到该数据包的信道。发送结束后，就可以结束该函数的功能了。

警告

在生产环境中运行这个脚本是不可取的，因为它会盲目地停止所有的IEEE 802.15.4设备的通信。从这一攻击的结果中进行正常状态的恢复，将会是代价昂贵，甚至是不可能的，因为有些ZigBee产品根本就不向管理员提供密钥修改的功能。

除了KillerBee工具套件之外，zbscapy工具就是一个最强大的工具了，它最大的特点莫过于允许用户使用脚本进行开发，这样的优势就是用户可以对设备的各种攻击方式，通过脚本快速地实现并投入实验。不过，具体到攻击，虽然有很多ZigBee和IEEE 802.15.4产品已经部署，但每个产品都有自己独特的细微差别，所以要想完成对其成功地攻击，需要额外的实验。从安全的角度来看，多花一些时间来研究和试验zbscapy的功能，你会发现这是一个物有所值的投资。

[1] 硬件接口上的术语，公头（male）指外形是针形的一头；母头（female）是外形是针孔插座的一头。——译者注

[2] AVR的体系结构是由“挪威技术学院”（Norwegian Institute of Technology，NTH）两名学生Alf-Egil Bogen和Vegard Wollan最先提出的，由于系统采用了增强型内置Flash的“精简指令集”（Reduced Instruction Set CPU，RISC），所以用两名学生名字的首字母“A”和“V”，再加上RISC的首字母“R”共同组成了“AVR”。——译者注

[3] 需要注意的是，这里的“一一对应”不是按各引脚在针座上排列的顺序一一连接，也不是作用相同的信号连在一起，而是“AVR Dragon”的引脚定义，和JTAG的引脚定义。在连线的时候，要按作用匹配的方式进行相连，比如两边的地线要相连，而一方的发送连另一方的接收。——译者注

[4] “网络发现”属于“服务发现”的一个分支，该技术本身并不简单，但该技术是现代操作系统中的标准配置，而不是黑客专用的程序。任何普通人都可以实施该操作，可见其攻击极具普及性和普遍性，所以称为“简单的”网络发现。本书中多处出现的“发现”一词都是这个意思。——译者注

[5] 任何一个命令行程序都有默认的输入和输出，并且默认的输出大多数都是键盘（cin），默认的输入都是屏幕（con）。所谓“重定向”就是改变默认的输入为指定的输入，或改变默认的输出为指定的输出。重定向的命令是“>”、“>>”或“<”，比如上面“sudo zenang -c 15 >zena.pcap”就表示将“sudo zenang -c 15”本应输出到屏幕的内容，输出到“zena.pcap”的文件中（如果是“>>”则保留原来的内容，在文件的尾部进行追加），而后面的“sudo wireshark -k -i <(zenang -c 15)”命令表示“sudo wireshark -k -i”命令的默认输入本应该是键盘，但现在换成“zenang -c 15”命令输出的内容作为其输入。实际上，本书其他部分，特别是第5章中很多“重定向”并不是这个意义上的重定向，而只是指将某个数据流“重新指定一个流向”的意思。——译者注

[6] 这种机制在很多协议中使用，比如在TCP/IP协议中广泛使用，只不过TCP/IP协议中是双向的，发送方先产生一个随机数，然后双方按顺序依次加1。这里需要说明的有两个地方。一个这里的加1，具有“循环”的意思，比如下面的例子中，255加1，就变成了0，所以0反而比255“大”1。第二个地方就是这里的“至少”是一个模棱两可的说法，因为只是比一个数大，就很容易做到，比如你一直发送一个最大的值即可实现。所以这里的“至少”的本意就是“每次都大于，但不能大得太多”。至于不强制要求每次只能大于1是因为有丢包的可能，如果强制该要求，则一旦丢包就会导致联系中断。——译者注

[7] 在信息安全领域，只要是不能防止侦听的环境，如果必须传密钥，都建议使用另一种方式传送密钥。比如你用邮件传送了一个带有密码的RAR文件压缩包，那么这个密码就可以通过手机短信的方式告诉对方，而不要在邮件中告诉对方，即使使用不同的邮件，甚至是不同的邮箱。——译者注

[8] 在英美国家的一些社区（相当于中国的住宅小区）中，有些人会将家里不再使用，但还不至于扔掉的东西拿出来低价出售。所以这里的“社区版本”也就是指该软件的版本属于低价甩卖性质的，通常有较大的功能限制。——译者注

[9] 这一句里的“对象”、“方法”是面向对象编程中的术语，转化成面向过程编程的术语，这两个概念和“属性”一起，大致相当于“模块”、“模块中的函数”和“模块中的变量”。——译者注

[10] 高级语言中的编程，一般循环语句大同小异，一般有三种：for循环（事先知道循环次数时用）、while（事先不知道循环次数，且可能一次也不执行时用）、do…while（事先不知道循环次数，但至少执行一次时用）。在Python语言中，只有for循环和while循环两种。值得一提的是，本处虽然说是while循环，但下面的例子使用的却是for循环。——译者注

[11] 重载是面向对象开发语言中的一个术语，指从一个基类中继续新类的时候，新的类中的“方法”可以与所继承类的“方法”重名，这时新的“方法”就称为重载。对于新类来说，父类的“方法”相当于被自己重写并在支持的时候载入。——译者注

[12] 有相当多的编程语言，在使用序号的时候，习惯从0开始，比如上面例子中，4个数据包的序号是0~3，而不是1~4。——译者注

[13] “回调函数”，是由已方提供的供对方调用的函数。以数据包嗅探为例，这属于不定时的、突发性的事件，如果不停地查询有没有接收到数据包，在数据量小的时候会浪费很多查询的资源，如果换成对方在接收到一个数据包后，就主动调用我们提供的“回调函数”，那就会节省很多资源。——译者注

[14] “数据帧计数器”FC值的最大值0xffffffff-1，所以确切地说，这个最大的值不是“数据帧计数器”值的最大值，而是一个4字节无符号整数所能表示的最大值。——译者注

[15] 4294967295（即0xffffffff）/（60×60×24×365）≈136.2年。不过，客观地讲，ZigBee设备的发送速率和串口差不多，1秒钟发送十几个小包还是有可能的，所以上面说“不可能的速率”并不准确。不过，总的来说，这种说法对于结论并没有影响。——译者注

[16] 这个描述，个人觉得有不科学的地方，发送“数据帧计数器”值为0xfffffffe的数据包，第一次会使被攻击的ZigBee设备将其期望的“数据帧计数器”也改为0xfffffffe，如果之后攻击者仍旧发送“数据帧计数器”值为0xfffffffe的数据包，则后续的这些数据包将会被被攻击的ZigBee设备扔掉，这样做只能让合法的（被攻击者冒充的）节点无法正常通信。由于合法的节点是不会发送“数据帧计数器”值为0xffffffff的数据包的，因此要想让被攻击设备进入到“黑名单”中，攻击者至少还要再发一个“数据帧计数器”值为0xffffffff的数据包。所以“数据帧计数器”FC值为0xfffffffe的数据包导致合法节点无法正常通信，为0xffffffff的数据包将合法节点加入到“黑名单”。——译者注

13.4　攻击演练

下面，我们会讲解和检验一种“端到端”的ZigBee攻击方法，这种攻击方法所针对的目标是专门针对某种特定自定义ZigBee设备上的实现方式的。这种攻击方式已经被作者组合出几种现实世界中实施攻击的实现方式上的实例。通过这一攻击方式所实施的渗透测试和组装测试中，我们可以将原来无法识别的网络识别出来。

在这种攻击方法中，我们利用了ZigBee技术的另一个公共的漏洞：设备上物理特性的安全。由于ZigBee技术具有天然的分散性地理位置特点，以及作为外设，尺寸相对较小的特点，所以设备的盗取也成了攻击者绝佳的攻击机会。对于像黑客这样性格的人物，盗取一个ZigBee设备很显然不是为了这个设备本身，而是要对这个物理设备进行逆向工程，随后在了解了其原理、获得一些原始参数和发现攻击漏洞以后，进而攻击其他设备。这种看似荒唐的想法是完全可行的，同时所面临的风险也是最小的。

由于ZigBee设备的成本都很低，所以每个ZigBee设备的节点都不可能采用“防篡改的硬件解决方案”（tamper-proof hardware solution）。这一漏洞所带来的结果就是：攻击者一旦盗取了物理设备，就能够利用这个设备打开ZigBee无线接口，然后与同网其他的ZigBee设备或外部设备进行通信（比如微处理器，或者加密加速器）。对于许多最新的ZigBee无线接口，如果攻击者能够物理接触到该设备的话，那么他们就可以通过调试或者开发者使用的配置接口来获取加密的原始密钥，下面你就会看到这种攻击手法。

13.4.1　网络发现和定位

攻击的第一步，是对ZigBee设备的物理位置进行定位。我们假设攻击者针对于本次攻击流程已经选定了准备攻击的一个特定网络或者机构。这里的攻击流程可以是一次渗透测试，也可以是攻击者从攻击中获得收益的过程。首先要做的是通过无线信号分析先找到一个处于“可被发现的”模式的设备。完成这一任务，攻击者所用的攻击工具，可以使用笔记本电脑、上网本（netbook）或者小型手持设备（handheld），具体操作是查找附近ZigBee发送的数据源，实施这个操作的硬件是ZigBee的无线接口，而软件则是ZigBee工具包中的zbfind程序。

KillerBee设备位置分析工具zbfind

zbfind工具是包含在KillerBee工具套件中的一个程序，通过该工具，入侵者可以识别出IEEE 802.15.4设备，只要这些设备都在自己的功能覆盖范围内向外发送信息。zbfind是图形化的程序，所以提供了一个简单的设备视图，用户只要从这个设备列表中选择一个设备，那么程序就会进一步显示有关这个设备更详细的信息内容。比如所选目标设备所使用的数据帧类型，以及观察该设备活动时第一次和最后一次捕获到该设备数据包的时间。

对于已选择的设备，zbfind会以两种方式显示数据包接收端的信号强度（signal strength）。第一种显示方式会以“速度仪表盘”（speedometer widget）的方式，以图形化的效果来表示最后一次接收到数据包时自己接收到的对方发送信号的信号强度。指针的指向越远离右边，就表示对方的发送信号越强，也就表示攻击者所选择的设备越靠近 [1] 。第二种显示方式就是以一个“信号历史图”（signal history graph）的方式显示，其中包括了信号强度跟随时间的变化情况，如图13-24所示。

图13-24　信号历史图

安装好KillerBee设备之后，从命令行运行zbfind命令，格式如下所示：

为了跟踪设备的位置，攻击者需要向信号逐渐变强的方向移动，直到信号的强度最大为止。一旦达到信号最大强度的地方后，攻击者可以通过“目视检查”（visual inspection）的方式对区域内的目标设备进行寻找。

随时关注目标设备信号强度的变化，只要目标设备需要与其他设备进行通信，那么它发出的数据包就会不停地被侦听到，其信号强调也会随之变化。但在实际侦测中，由于ZigBee设备通常自身几乎不会产生什么流量，所以靠等着对方的设备发送的数据包的方式来更新信号强度，有一定的操作难度，对于攻击者来说，想要收集足够的信息来进行信号分析就变得十分困难。要解决这个难题，最好的办法就是主动出击，变被动为主动。zbfind工具每5秒就会向目标设备发送ping信息，这种办法还是很奏效的，因为数据包到达目标设备之后，只要对方有回复，就不需要考虑对方是同意还是拒绝，都可以从目标设备的每次响应中测得对方的信号强度。有了新的信号强度，就可以刷新“速度仪表盘”的指针显示，同时在“信号历史图”中生成新的数据点。

通过使用zbfind工具，以及信号强度分析，你可以侦测到周边存在的一个ZigBee发送器设备，并且通过对“速度仪表盘”和“信号历史图”的分析，越来越靠近这个发射源。如果目标设备没有采取保护措施，那么对于黑客来说，盗取到这个设备就是一件非常容易做到的事情了。

13.4.2　分析ZigBee硬件

盗取了ZigBee设备后，攻击者可以打开设备的外壳，或者是连接到实验盒中核查该设备所用的线路图外的那些外围设备接口，识别其中的ZigBee设备的无线接口和微处理器。在一些新的无线接口设计中，为了更好地节能，这些组件都会被集成到“片上系统”（System-on-Chip，SoC）中，比如像来自“德克萨斯仪器”（Texas Instrument）公司生产的“Chipcon CC2540”芯片。这个芯片集成了Intel公司的8051微处理器 [2] ，它能够支持128KB的永久闪存以及8KB的RAM内存。

要对“Chipcon CC2540”实施芯片级的攻击，一个方法就是通过串行接口，以调试（debugging）的模式将芯片直接插到某个外设上。借助于这根连接线，我们可以通过芯片接口向芯片发送调试命令，并收集芯片所响应的数据，以及芯片提取后载入到RAM内存中的数据。有了上面的准备，再通过盗窃来的ZigBee设备给该“Chipcon CC2540”芯片加电，该微处理器芯片就会运行保存在闪存中的指令。芯片首先准备的是初始化流程，以便将芯片运行到可以使用的状态，这个初始化过程包括了将“公共变量”（common variable）加载到内存中。即使芯片中采取了安全措施，可以防止攻击者访问“Chipcon CC2540”芯片中的闪存，但是RAM内存仍然是不受到保护的，所以攻击者仍然能够很容易地读到并在几秒钟的时间内转储（dump）芯片RAM内存的内容到外围设备的RAM内存或硬盘中。这样，我们就可以在Linux或者OS X主机上，通过GoodFET工具，提取这段RAM内存的内容，并写入到外围设备的一个本地文件中。

通过GoodFET工具连接CC2540芯片

GoodFET工具是由Travis Goodspeed公司生产的硬件设备，这个硬件设备使用“联合测试行动小组”协议作为其接口的通信协议，通过该“联合测试行动小组”接口，可以直接连接到目标芯片上，然后就可以进行接口调试，配置固件升级，以及使用软件工具。这套系统既可以用在Linux操作系统上，也可以用在OS X操作系统上。GoodFET的硬件和软件组件，都是以开源的方式发布的，包括一份“材料清单”和“Eagle CAD电路设计图”，对于已创建好的GoodFET设备，可以从一些在线零售商那里买到，比如在Adafruit的售价为50美元，其在线网址是http://www.adafruit.com/products/1279 ，一个完整的GoodFET 4.2版本的电路板实物图，如图13-25所示。

图13-25　GoodFET 4.2版本的电路板实物图

GoodFET配套软件的网址就是该项目的主页，其网址是http://goodfet.sf.net 。可以使用Subversion工具下载最新的源代码，然后安装Debian风格的附属插件：

注意

在编写本书时，连接Chipcon芯片的GoodFET客户端并不支持向Chipcon设备的RAM内存写入代码或数据，而只能从中读取数据。这一功能可能会在以后的版本中得以实现。

GoodFET工具通过ChipCon芯片的调试接口连接到“ChipCon CC2540”芯片上。这个接口同“串行周边设备总线”（Serial Peripheral Bus，SPI）类似，都是用于电路板上的“集成电路”（Integrated Circuit，IC）这一级别互联互通的主要接口类型，但是它使用单条双向数据线而不是“主输出从输入”（Master-Out Slave-In，MOSI）和“主输入从输出”（Master-In Slave-Out，MISO）数据线。

在GoodFET工具和“ChipCon CC2540”芯片之间有4条连接线。“ChipCon CC2540”芯片上的“调试”引脚（debug pin）可以从下面的“‘ChipCon CC2540’芯片调试引脚”列表中查到，这个总结性的表格如表13-2所示。

表13-2　GoodFET工具和CC2540引脚说明

对于一个使用“ChipCon CC2540”芯片的ZigBee设备，要将GoodFET工具连接到这个指定的设备上，其详细的步骤会因设备型号的不同而有所不同。尽管通常的处理步骤都是先通过“通断测试器”（continuity tester）识别出“ChipCon CC2540”芯片，然后将一个“好点”（fine-point）连接到目标“ChipCon CC2540”芯片的引脚上。比如连接到DEBUG_DATA引脚上，也就是“ChipCon CC2540”芯片的第46引脚上，然后依次测试其他的“阻焊层” [3] （solder mask）、通孔（复杂的电路板内部的线路一般都是分层的，通孔就是从顶部一直贯穿到底部的孔）和分支引脚来测试导通性。在最糟糕的情况下，可以使用类似医用注射管这样的工具来探测“ChipCon CC2540”芯片的引脚，相比之下，确认在开发调试过程中使用的焊点或者分支引脚会相对容易一些。一旦确认了第一个目标引脚同电路板的连通性后，对其余的引脚重复这些步骤。确认完每个引脚后，根据前面表13-2中的描述使用小的跳线将GoodFET同引脚连接起来。图13-26是一张GoodFET工具同“ChipCon CC2540”芯片的连接图，其中通过连通性测试确认了两个分支引脚。

图13-26　GoodFET工具与ChipCon CC2540芯片的连接图

一旦已经完成了GoodFET的硬件接口的配置，并通过该接口与目标“ChipCon CC2540”芯片连接起来，你就可以使用goodfet.cc命令信息验证连接的有效性。第一，你导出GOODFET变量，该变量指向一个USB串口设备（该串口是当你插入GoodFET设备的时候自动在系统中注册的串口），在Linux下，该设备通常注册的串口名称是“/dev/ttyUSB0”，除非你的主机上事先已经有另外一个USB转串口的设备或连接线的驱动程序，比如，你在插入这个串口设备之前，已先插入过一个USB转RS232口的GPS设备。那么这时注册的串口会依次顺沿为“/dev/ttyUSB1”。然后你就可以通过芯片调试接口上读取的数据识别目标设备。

在确认了从芯片上读到的数据以后，就可以将目标设备上的所有内存中的内容，转储到外设上硬盘的一个dump文件中，其操作格式和命令效果如下所示：

一旦你已经完成了对“ChipCon CC2540”芯片中RAM内存数据包的提取，就可以从目标设备上复制出来，生成到一个文件中，继续从设备中提取感兴趣的敏感信息了。

13.4.3　设备RAM数据分析

在最近几年公开发表的论文中，讨论的都是如何使用取证分析的方法从设备的RAM内在中获取敏感的信息。在微处理器的世界里，它们的理论是相同的，包括搜索数据模式、使用“熵分析技术”（entropy analysis technique）测量数据的随机性。此外，由于可用于处理的数据量只有8K，而不是好几GB的内存，所以使用暴力破解的方式也未尝不可。

通过Intel公司的8051微处理器，访问RAM内存的速度比访问闪存（flash）的速度快，所以经常看到有人为了提高效率而将频繁使用的变量放入到RAM内存中进行处理。对于ZigBee设备，其中一个经常使用的变量是“群组密钥”（group key），它的作用是加密和解密通信数据包，所以能从设备RAM内存中提取的这个值，也是黑客们最想要的值。不过现在面临的问题是，RAM内存中的数据是加密的，虽然加密算法是公开的，内存中的所有数据也被转储出来，并且这8K数据的数据结构也知道，但内存加密的密钥值却不知道。事实上，破解这个问题并不难：要从内存转储文件中提取这个变量，我们可以使用转储文件中任何可能的数据来解密捕获到的数据。如果数据的解密结果不正确，那么我们继续进行猜解，直到获得了正确的密钥或者尝试完了所有可能的数值。因为密钥的长度是16个字节（128位），所以在8K大小的RAM中我们在最差的情况下，也最多只需要进行8177 [4] 次猜解就可以获得密钥，这个猜测量可以在数秒甚至更短的时间内完成。

KillerBee密钥还原工具zbgoodfind

KillerBee工具套件中，zbgoodfind工具的设计目的就是协助GoodFET工具，针对由GoodFET工具转储的内存数据文件，完成对该文件的攻击。zbgoodfind工具共可以接收两种输入文件：一种是加了密的数据包捕获文件，另一种是二进制内存转储文件（以前通过渗透式攻击入侵成功了的ZigBee网络中，一个加密后的ZigBee设备内存文件）。首先，zbgoodfind工具会解析数据包捕获文件中的数据包，通过特征值来判断这是不是一个加密后的数据包。一旦确认完毕后，zbgoodfind工具会使用内存转储文件中连续的128位数值作为可能的“高级加密标准”密钥来解密数据包。这个过程会一直持续到数据包被正确解密，或者zbgoodfind工具尝试完了内存转储文件中所有可能的密钥，最终以破解失败告终。在这两种情况下，zbgoodfind工具都会继续下一个数据包如法炮制地解密这个新的数据包，直到全部的数据包读取完毕后自动退出程序。

首先，我们需要安装binutils工具包，以便从中解压出objdump工具，其操作命令如下所示：

接下来，我们将GoodFET工具转储输出的内容，由十六进制文件转换为二进制文件：

最后，我们在内存转储文件中查找存在的密钥，该文件是使用zbgoodfind工具捕获到的数据包转储文件，文件名为encdata.dcf，其操作命令及输出样例如下所示：

提示

zbgoodfind工具既可以读取libpcap格式文件，也可以读取Daintree网络中“传感器网络分析器”所保存的格式。如果是读取前者格式，则使用“-r”参数；如果是读取后者格式，则使用“-R”参数。

在本例中，我们发现在6379次猜解后，最终成功破解了用来解密数据的“网络密钥”。一旦密钥值被还原，攻击者既可以破解所有加密的内容，也可以亲自完成对数据的加密，所以，这时的攻击者可以返回到目标网络中，在通信数据包都被加密的情况下进行侦听，或者伪造一个合法设备，加入到要攻击的ZigBee网络中。

防御硬件攻击

在这种攻击中，我们高调地突出了实物盗取ZigBee设备，以及通过还原加密的密钥原材料的方式来攻击硬件的所有步骤。那么对于这种方式的防御也只能对症下药，从物理安全的角度来看，你可以通过传统的视频监控和防盗技术防止ZigBee设备的盗窃，这包括视频监控、保安看守、硬件上锁，以及设备栓绑等生活中的非技术手段。然而这些措施通常不能很好地与ZigBee技术相融合，在很多情况下，这些设备暴露在一个未受保护的物理区域内，或者在另一些情况下，因为消费者需要使用这些系统，而使得这些设备干脆就在消费者的手中。比如，在一个零售商店里，可以刷卡的自动结账和付款设备（俗称“POS机”）就属于这种情况。由此可见，设备的实物盗取方式是完全可能的。

这里我们重点讲解了“德克萨斯仪器”公司生产的“Chipcon CC2540”芯片。该产品上的漏洞，同样也存在于其他同类设备中，包括“Chipcon CC2530”芯片和“Chipcon CC2531”芯片，还有其他一些ZigBee芯片制造商的产品，比如Ember公司的同类产品。传统的芯片都采用了外部微处理器，比如“Chipcon CC2420”芯片，也同样包含有类似的漏洞。所以攻击者可以在系统启动时侦听微处理器和无线接口之间传输的配置数据，所用的方法，就是在“串行周边设备总线”上通过加装接口，然后在侦听到配置数据后，提取其中的密钥信息，最后再使用zbgoodfind工具对密钥进行破解。

针对上述破解攻击，可以考虑引入“防篡改检测系统”（Tamper-proof detection system），比如只要ZigBee设备被打开，那么系统自动销毁无线芯片。尽管这些“防篡改检测系统”的成本对于ZigBee设备来说都是无法接受的，但这样做无疑会增加入侵者实施攻击的难度。同样还可以采取物理防护措施，比如使用黑色的绝缘环形树脂将电路板包裹起来，但是这些措施都不是万无一失的，因为有许多方法可以在不破坏电路板的情况下去除环形树脂胶带。

[1] 实际中的测试效果取决于多种因素，首先所有设备都必须是同一发射功率，这一条不难做到，其次就是各设备与自己之间没有干扰源，比如一堵墙、周边的电子设备，甚至是天气原因都会对信号强度产生较大的干扰，这一条就很难保证了。所以上述方法只能粗略地测试，无法用于准确的定位。——译者注

[2] 这里提到的“芯片”，由于是片上系统，所以我们完全可以将其理解为就是一个“设备”，只不过这个设备被集成到一个芯片中了，所以这个设备即有内存，也有CPU，甚至还有接口，可以进行数据通信。——译者注

[3] 简单地说，阻焊层就是指印制电路板上要上绿油的部分。——译者注

[4] 8K内存共8×1024=8192个字节，从中取连读的16个字节，共有8192-16+1=8177种可能。——译者注

13.5　本章小结

ZigBee是一个快速发展的、低速的、超低功耗的应用协议，它服务于多种工业领域，比如卫生医疗、家居自动化、智能电网系统以及安全系统中。ZigBee拥有保护数据机密性的措施，在整个协议层中，多次频繁地使用“高级加密标准”加密算法来高效地防御黑客的攻击。ZigBee中漏洞的形成原因多数是因为低成本设备中的有限功能所导致的。

有好几个开源的工具可以用来评估ZigBee技术的安全性，其中KillerBee工具套件为ZigBee技术的评估和攻击工具的开发，提供了一套简单而强健的攻击机制。对于物理安全方面的攻击，可以通过GoodFET和zbgoodfind工具实施，之所以这种功能方式也能成行，是因为在常见的无线接口和微处理器之间的集成环节，也都包含漏洞。

随着ZigBee的应用越来越广泛，它也会逐渐受到类似黑客和研究者等人的深度剖析。尽管ZigBee的一些特性非常适用于某些应用程序，但是在ZigBee协议的安全性方面，还需要加大力度，进行更多的分析，特别是在那些通信时数据需要机密性和完整性的领域，这种需要更有必要。

随着ZigBee技术因为企业和工业部署而不断增长的时候，另一种可替代的协议正在进入消费的公共领域，特别是在家庭消费的部署中，这种现象成为了家常便饭。在下一章中，我们将介绍和验证Z-Wave协议的优势，以及困扰着许多智能家居部署的一些不足。

第14章　破解Z-Wave智能家居网络

尽管在商业环境中，Z-Wave协议在提供无线连接的方面取得了很大的进步，但Z-Wave协议的目标也还仅限于智能家居市场。通过使用Z-Wave设备，消费者可以将传统的设备与Z-Wave设备进行互连，这些传统的设备如灯光、电器、门锁、运动传感器等。随着一些智能设备，如智能灯泡、智能门锁、智能运动传感器等的出现，人们设想，这些智能设备最终会连接到一个“中央控制设备”（central control device），而这个“中央控制设备”也会最终连接到互联网上。这样一来，这些智能设备就与互联网处于互联互通的状态，就可以从网络另一端的移动设备和传统计算设备控制和监测这些智能设备。

“Z-Wave联盟”（Z-Wave Alliance）是一个由数百个独立的设备制造商组成的团体，该团体同时参与设计和销售使用Z-Wave技术的设备。也就是说，“Z-Wave联盟”负责Z-Wave产品的设计、测试，以及Z-Wave技术的市场营销。“Z-Wave联盟”承诺消费者：Z-Wave会为智能家居提供生活便利、能源管理、远程设备监测与控制，为消费者节省能源，且Z-Wave设备易于安装，像网上银行一样安全。相关的内容可参见“Z-Wave联盟”的网站，网址是http://www.z-wave.com/what_is_z-wave 。全世界有超过2千万的Z-Wave产品应用于家居领域。在“智能家居设备”（smart-home-device）的互联互通领域（interconnectivity），Z-Wave技术有机会成为“事实上”的选择。

14.1　Z-Wave技术简介

在前面提到的所有协议中，无一例外都是先由某个国际组织提出或认证，然后作为国际或行业免费标准建议广大设计和生产商设计和生产，但Z-Wave并不是这样。相反，Z-Wave是“西格玛设计”（Sigma Designs）公司的专有协议，并且除非其他的设备制造商与“西格玛设计”公司签署了“保密协议”（Nondisclosure Agreement，NDA），否则“西格玛设计”公司不会公开Z-Wave协议的细节，与此同时，“西格玛设计”公司控制所有Z-Wave芯片的制造和交付，全球除了“西格玛设计”以及其授权的日本三美（Mitsumi）公司之外，其他公司都无权向产品制造商提供Z-Wave芯片。由于这些原因，现在许多Z-Wave的细节未被公开，这也导致针对Z-Wave安全的分析工具相对不是很成熟。

注意

在没有公开审查的前提下，就在重要的应用领域广泛地部署无线技术，最终导致了重大安全上的失败，在历史上是有先例的。本书的配套网站中有一个关于DECT协议分析免费试读章节的内容，其中有一个无绳电话系统存在类似的问题，即由于缺乏审查而投入部署，最终因为安全部分而使设备普遍存在安全故障。该章内容的网址是http://www.hackingexposedwireless.com/chapters/ch05.pdf 。

14.1.1　Z-Wave协议的层次

与ZigBee协议类似，Z-Wave芯片使用电源保护技术以延长电池的待机时间，使用mesh网络模型以适应更大的设备通信的范围。但总的来说，Z-Wave也是一个相对简单的协议，在基本框架的基础上支持主动的“确认”（acknowledgement）和“数据帧重传”（frame retransmission），提供“自形成”（self-forming）和“动态路由拓扑更新”（dynamic routing topology updates），以及“应用程序特定的配置文件”（application-specific profile）等技术。Z-Wave采用结构化的协议栈，其堆栈结构如图14-1所示。我们将逐个检查这些组件，以便在我们通过技术攻击Z-Wave部署的时候，能更好地了解协议的每一个功能。

图14-1　Z-Wave协议栈结构

注意

一些构成Z-Wave协议的细节会在随后的章节中描述。这些内容都取材于公开的标准文件、产品展示和研究工作。在可能的情况下，这里展现的细节都已经通过观察Z-Wave协议的活动而得到了验证。

1.Z-Wave的物理层

Z-Wave协议是在使用“低于1GHz频率”（sub-1-GHz）频段作为无线连接频率的协议之一。这个频段曾经一度受很多流行的无线应用所钟爱，包括用作Wi-Fi网络三个介质使用频段中的一个，最初就想选该频段作为其使用频段，不过随后，该波段改用2.4GHz频段，以便与全球共用的频段相兼容。近年来，许多标准实体已经回归到使用“低于1GHz频率”作为其通信频段，以避免在2.4GHz上跟其他无线网络冲突。同时，这样做的好处也很明显，那就是由于使用了较低的频率发射功率电平，所以在相同功率下可以发射更远的距离。不过，目前来说，使用“低于1GHz频率”频段通信的网络协议还多是一些专有协议供应商的协议，比如前面提到的“西格玛设计”公司的Z-Wave协议。

“低于1GHz频率”主要是用来指由政府相关实体分配 [1] 的，低于1GHz且位于1GHz附近的850~950MHz频段的频率分配。由于是政府分配，所以这个频段就与2.4GHz频段的使用存在差异，那就是2.4GHz频段的使用全球统一，而“低于1GHz频率”的频段的使用情况会因全球国家和地区的不同而有所不同。例如，在美国，“美国联邦通讯委员会”（FCC）将902~928MHz的频段设置为“不需授权的使用”（unlicensed use），但这种分配存在很大的问题，因为除美国以外的“全球移动通信”（GSM）使用的是900MHz的频率（确切地说，是890~960MHz的频段），并且这个频率在全世界很多地方都在使用，包括欧洲、中东、非洲、澳大利亚、亚洲等地。另外，在欧洲，“低于1GHz频率”指的是可以在850MHz附近提供的“不需授权的使用”的频段，而这个频段又与美国以及其他使用824MHz和894MHz地区中，使用850MHz频段的“全球移动通信”相重叠。

对于制造商来说，面临的挑战是：在世界不同国家中允许使用的频率不一样，要想使用“低于1GHz频率”这个频段，自己的产品就必须能适应所有这些不同的频率。“西格玛设计”公司的处理办法是：为了应对频率不同这一挑战，根据国家和地区设计和生产相应的芯片，所以对于某一个指定的地区，该区域内的Z-Wave和其他单一频段源制造商在选择芯片的时候，只要选择支持该区域芯片的优质加工商即可。相应地，Z-Wave产品内部也能够使用多种频率，只是在出厂前，根据当地所在区域设置使用的频率即可。具体可用的频率如表14-1所示。

表14-1　不同国家和地区的Z-Wave使用频率表

注意

Z-Wave协议还可以根据物理层的解调和使用率的方案，允许操作人员对所用的频率进行微调。比如，据报道，欧洲的Z-Wave设备的实际使用频率是868.42和868.4MHz，而本书作者了解到，美国的Z-Wave设备实际的工具频率是908.42和908.4MHz。

2012年，“国际电信联盟”（International Telecommunication Union，ITU）发布了ITU-T G.9959推荐规范《短距离窄带数字无线通信物理层收发器和介质访问控制层规范》（Short range narrow-band digital radiocommunication transceivers——PHY and MAC layer specifications）。这个文档描述了Z-Wave协议的低层功能，重点对“物理层”（physical layer）组件、“介质访问控制层”（Media Access Control，MAC）的数据帧结构，以及数据包的发送和接收的操作要求进行了详细的介绍。

从“国际电信联盟”的这个规范中，我们得知Z-Wave的规范共分为3个参数配置方案，分别称为R1配置、R2配置和R3配置，每一个Z-Wave设备都是根据自己的需要，按照三个无线射频规范中的一个进行操作。这些射频规范定义了物理层无线调制方式、编码机制，以及数据的速率，如表14-2所示。有消息称，最慢的Z-Wave“R1配置”，正在或已经被“Z-Wave联盟”拒绝通过，虽然遵从该协议的新设备仍在销售的过程中使用此版本的配置。

表14-2　Z-Wave射频规范参数表

Z-Wave设备在发送无线射频信号的时候，采用发射功率的组合方式，所以其无线信号的功率覆盖范围是3英尺~75英尺 [2] ，具体取决于被发送的信息量和发送器的发射功率。在一个mesh网络配置的操作中，Z-Wave能够在大多数家庭实现合理的区域覆盖，加上一个持续供电的“中继器”（repeater）设备，还可以将发送到“非本网络节点”的数据包转发到其他网络上。之所以要使用“中继器”是因为出于电池保护策略的一部分，由电池供电的Z-Wave设备只负责数据的收发操作，而不会参与网络数据包的转发操作。

2.Z-Wave的介质访问控制层

Z-Wave的“介质访问控制层”负责Z-Wave协议中的几个属性，具体如下：

·数据包的帧结构和格式

·对请求的主动确认

·错误检测

·重传数据包

·单播、广播，以及组播的处理

·地址的选择和分配功能

Z-Wave网络的基本架构由“控制设备”（controller device）和“从设备”（slave device）组成。一个单一的“主控制设备”（primary controller device）负责建立网络，并选择一个独一无二的“网络标识符”（network identifier），或者说一个HomeID。“控制设备”能够在网络上初始发起一个传输操作，以“推送”（polling）或“要求对方更新”（updating）的方式向目标设备发送数据包；“控制设备”还负责维护网络的路由信息。相比之下，“从设备”则被动得多，它只需要按照“控制设备”的指令执行即可，既不需要担心网络上的路由，也不需要针对其他的Z-Wave设备主动初始发起一次连接或传送的操作，但“从设备”可以对途经的数据包进行中转。

Z-Wave规范中的“控制设备”根据定义可以进一步分为“便携式控制设备”（portable controller device）和“静态控制设备”（static controller device）两种：

·“便携式控制设备” 　通常由电池供电，当该设备在家中移动的时候，设备能够自动重新测算网络的拓扑结构。“便携式控制设备”是Z-Wave网络所包含设备中的一个重要组成部分，我们将在后面的内容中检测该类设备。

·“静态控制设备” 　由于不需要移动，所以该设备的供电是直接通过电源统一供电，比如通过一个交流电的适配器供电。该设备除了连接本网设备之外，也可以连接到其他的网络上，比如，该设备可以同时连到Z-Wave网络和IP网络上，在这两个网络之间提供网关服务。

无论是“静态控制设备”，还是“从设备”，都使用统一的电源设备，并且都可以参与网络上数据包的转发。这些设备都会侦听网络上的通信数据包，一旦侦听到一个数据包，并且发现该数据包不是给自己的，该设备就会形成一个“mesh网格化”（meshed）的“桥接基础设施”（bridging infrastructure），然后对该数据包进行转发，这种转发无疑扩大了网络的范围。不过，为了避免路由表过于复杂，所以Z-Wave限定这种转发的次数是有上限的，最多只能使用4跳。

根据Z-Wave设备所用的射频规范不同，Z-Wave数据帧的格式也会有所变化。基本的单播数据帧格式适用于R1配置和R2配置的Z-Wave网络，如图14-2所示。使用R3配置的R1配置和R2配置单播数据帧，其格式如图14-3所示。

图14-2　Z-Wave规范R1配置和R2配置中，“介质访问控制层”单播数据帧格式

图14-3　Z-Wave规范R3配置中，“介质访问控制层”MAC单播数据帧格式

每个Z-Wave网络都有一个随机选择的值作为网络的唯一标识符，称为HomeID。该值出现在Z-Wave网络通信的所有发送数据包中，并且位于数据包的前4个字节中。从功能上来看，HomeID很像是IEEE 802.11网络中的“基本服务集标识”和ZigBee网络中的“个人局域网”的ID值。其主要作用是当有多个不同的Z-Wave网络在物理位置上交织在一起时，所有的Z-Wave节点可以区分出哪个网络是自己所处的网络，哪个网络不是，以及哪个数据包属于是自己网络的，哪个数据包不是给自己网络的，还可以协助某些节点加入到一个相同的网络中。HomeID的值是在网络建立伊始，由“主控制设备”随机选择的。

跟在“HomeID”字段后面的是1个字节长度的“源节点ID”（Source NodeID）字段，该字段表示的是Z-Wave节点在本地独有的源地址，Z-Wave节点的分配策略详见表14-3。当一个Z-Wave节点添加到某个Z-Wave网络时（该过程所包含的细节请参见本章后面的内容），该设备的“节点ID”应该设置为0，“主控制设备”会在范围1~232中找一个未使用的值分配给该新加入节点，供其作为“节点ID”使用。而该设备也会在随后的通信中，自始至终地使用这个值作为其“节点ID”，直到网络关闭或退出网络。因此，一个Z-Wave网络中，节点的最大数目是232个，如表14-3所示。

表14-3　NodeID的分配策略

注意

按作者的经验，Z-Wave设备在进行地址分配的时候并没有完全遵守上述“介质访问控制层规范”中的地址分配规则，最常见的现象是有些“控制设备”的“节点ID”使用了“保留”字段区间中的保留值。

16位的“帧控制”（Frame Control）字段还可以再分成几个以“位”为单位的子字段，其中包含两个保留位，如图14-4和图14-5所示代表几个子字段。

图14-4　Z-Wave规范R1/R2配置中，“帧控制”字段的格式解释

图14-5　Z-Wave规范R3配置中，“帧控制”字段的格式解释

·“路由” （Routed）子字段　用来表示该数据包是从上一个节点处通过路由转发而来，而不是由上一个节点主动发起连接后发送来的。同样由于自己也不是连接发起方，所以在向下一个节点发送的时候，应该也设置这个字段。

·“确认请求” （AckReq）子字段　用来表示这是一个接收节点，对发送节点所发“请求”数据包的一个确认数据包。

·“低功耗” （Low Power）子字段　用来表明该数据包以低功率的方式发送，以便减小发送范围。

·“速度调整” （Speed Modified）子字段　该字段仅用于“R1配置和R2配置”，表示的意思是如果源节点和目的节点都支持速率调整的话，那么二者之间采用较低的数据发送速率进行传输。

·“头类型” （Header type）子字段　该字段用来表示一个数据包的类型，有效的类型有：单播（unicast或singlecast）、组播（multicast）、确认（acknowledgement）三种。值得一提的是，如果想使用广播（broadcast）方式，那么在这里要选择“单播”，然后在“介质访问控制层”单播数据帧格式（图14-2或图14-3）的“目的节点ID”中输入0xFF即可。

·“电子束控制” （Beam Control）子字段　表示该节点应该在一连串连续的“电子束”提醒下，从省电的“节能”（power-conservation）状态下苏醒过来，进入正常的工作流程。

·“顺序号” （Sequence number）子字段　该字段仅用于“R1配置和R2配置”，用于识别某一个数据包发送后，对方对该数据包的确认数据包，只有响应数据包中该字段与发送数据包中该字段的值相等的两个数据包，才会将前者识别为后者的确认数据包。需要说明的是，一些老的Z-Wave设备中并没有使用此字段，在这些老版本的实现方式中，所有数据包的该字段都为零。

“帧控制”字段后面的“长度”（Length）字段表示整个数据包的长度，包括数据包的头部（“HomeID”字段到“目的节点ID”字段）、有效载荷、“帧校验序列”等信息。整个内容，有时也称为“介质访问控制层协议数据单元”（MAC Protocol Data Unit，MPDU）。

“目的节点ID”（Destination NodeID）表示的是当前的发送方式使用的是“单播”还是“组播”。注意，跟“帧控制”字段中的“头类型”子字段不同的地方是，这里没有“确认帧”一说，“目的节点ID”所表示的只是接收方的地址。再下一个字段就是“数据负载”（Data payload）字段，即本数据包所传的具体内容。如果是“Z-Wave规范”中的R1配置和R2配置版本，如果数据为“非多播数据包”（nonmulticast packet），那么其“有效载荷”的长度为0~54个字节，如果数据为“多播数据包”（multicast packet），那么其“有效载荷”的长度为0~25个字节。如果是“Z-Wave规范”中的R3配置版本，那么其“有效载荷”的长度为0~158个字节，同时，除非该数据包为“多播数据包”，否则其“有效载荷”的长度不能超过129个字节。

最后，“帧校验序列”的作用是对数据包内容的完整性进行检查。如果是“Z-Wave规范”中的R1配置和R2配置版本，那么该校验算法使用“异或”（XOR）算法；如果是“Z-Wave规范”中的R3配置版本，则使用16位的“循环冗余校验校验”（CRC）校验算法，简称为CRC-16算法。

现在，我们已经从内容上涵盖了“介质访问控制”层，所提供的内容细节已足够解释针对Z-Wave网络的攻击了，在这一节的后面，我们还需要了解Z-Wave网络层的内容。

3.Z-Wave的网络层

Z-Wave协议的“网络层”定义了三大功能。其一，定义了网络中各种设备类型的职责，例如“控制设备”和“从设备”的作用；其二，定义了网络中各设备对于其他网络组件所应做出的责任，如选择“HomeID”的值以便将本网络与其他网络区分开，分配“节点ID”以便网络中应对网络路由建立时的处理；还有一个区域，那就是从安全的角度来看，攻击者特别有兴趣的，对于网络上Z-Wave节点“纳入”（inclusion）和“排除”（exclusion）的概念。

当用户想要添加一个Z-Wave设备到某个Z-Wave网络中，那么这个用户就必须完成Z-Wave节点的“纳入”处理。通常情况下，这涉及将“控制设备”设置到“纳入”模式，在这一模式下，允许其他新的节点加入到本网络中。按一下设备面板上的按钮，或者选择一个菜单项，在新设备节点上按下按钮，就可以将该“控制设备”设置为“纳入交换”（inclusion exchange）状态。当一个新的节点初始化“纳入”处理时，该设备会发送一个Z-Wave“节点信息数据包”（node information frame），在该数据包中，“HomeID”字段是0x00000000，目的设备“节点ID”是0x00，这意味着这是一个“广播”方式下的“节点ID”。“节点信息数据包”最终到达“控制设备”以后，“控制设备”根据以前给新设备分配过的“节点ID”数字，按“先来后到”的顺序，将“节点ID”数字递增，也给这个新设备分配一个“节点ID”，使其可以在随后的网络中使用。然后更新路由表，以便以后发送给这个设备的数据包也能传送到这个新节点上。

和“纳入”处理类似但功能相反的过程就是Z-Wave节点的“排除”处理。一个已经通过“纳入”处理加入到某个Z-Wave网络的节点，在没有经过允许加入到网络的节点的“排除”操作之前，是不能退出该网络而加入到另一个Z-Wave网络的。就像进入“纳入”状态一样，要进入“排除”状态通常也是在“控制设备”上按一下设备面板上的按钮，这时，这个设备节点切换到“排除”状态，然后在之前加入网络的节点上也按一下面板上的按钮，那么这个设备就会返回到“未分配节点ID”的状态，也就是说这时该设备的“HomeID”会变成0x0000。

“纳入”和“排除”过程的简单化，加上必须要到设备上按两个设备的按钮这一要求，共同构成了Z-Wave网络整体安全模型的一个重要组成部分。对于攻击者来说，不到“控制设备”上按一下按钮（即“排除”处理），这个设备就无法离开这个网络，同样攻击者也无法操纵一个新设备进入到这个网络中。就像在后面看到的一样，由于Z-Wave设备出自同一家公司，所以良好的举止使得Z-Wave设备都会共同遵循这些规则。不过，如果通过低层访问Z-Wave的介质访问控制层和网络层，那么该攻击者还是可以实现“节点ID冒充攻击”（NodeID spoofing attack），通过一个未加密的Z-Wave网络与其他节点进行交互。为了弥补这一不足以及避免或减弱其他相关的攻击，Z-Wave网络也提供了一个可选的逻辑上的安全层，该层是在“应用层”上实现的。

4.Z-Wave的应用层

Z-Wave的“应用层”负责的是解析和处理请求数据包及响应数据包中作为有效载荷的数据部分。应用层所能控制的数据中，既有应用层特定的数据，也有Z-Wave应用控制的数据，最基本的应用层有效载荷数据的格式如图14-6所示。

图14-6　Z-Wave应用层有效载荷的格式

Z-Wave网络使用应用程序“命令分类”（command class）的方式来区分网络上的“行为”（action）和“响应”（response）。然而“Z-Wave联盟”对于“命令分类”本身并没有公开的文档说明，只是在一些开放源码项目中可以找到一些蛛丝马迹，比如在一个开源的“OpenZWave Library”项目的一些源码中给出了许多提供给程序员用于识别命令功能的“命令分类”；在表14-4中列出了这些“命令分类”的一个简短的列表 [3] 。

表14-4　Z-Wave规范中“命令分类”的一些实例

每个“命令分类”支持一个或多个命令，这些命令归属于这个“命令分类”中，每一个命令定义了“应用层”的一个基本功能。比如，CLASS_SWITCH_ALL这个基本“命令分类”的作用是通过Z-Wave设备来控制多个网络设备的电源“开/关”控制的命令，所以消费者可以通过按下一个单一的按钮，把所有加入到Z-Wave网络中的电灯或其他电器一次性全部关掉。CLASS_SWITCH_ALL支持多个命令，在设备加入到这个“命令分类”的时候，会对该“命令分类”中的各个命令分别定义一个对应的功能。

·SWITCH_ALL_SET命令　配置设备加入或退出某个“并行处理命令”的成员列表，这里的“并行处理命令”指的是打开或关闭某一个命令功能。

·SWITCH_ALL_GET命令　要求设备报告自己是否加入或退出某个“并行处理命令”的成员列表的当前状态。一个具体的设备，可以加入到某个“并行处理命令”的成员列表中，也可以不加入到该“并行处理命令”的成员列表，或者只加入“并行处理命令”中的某一个命令的成员列表中。以电灯开关为例，某一个电灯，可以加入”同时开关”的成员列表，这样接到同时开的命令就开，接到同时关的命令就关；也可以不加入“同时开关”的成员列表，无论是否接到同时开或同时关的命令，都不予处理；还可以只加入“同时开”或“同时关”的成员列表，但不加入“同时开和关”的成员列表。

·SWITCH_ALL_REPORT命令　跟在SWITCH_ALL_GET命令的后面，作为该命令的响应命令，一次性向查询方回复当前设备上所有开关的状态。

·SWITCH_ALL_ON命令　命令网络上所有的设备都将开关切换到“打开”（ON）状态，该命令只会向那些加入到自己“并行处理命令”的成员列表的设备发送。

·SWITCH_ALL_OFF命令　命令网络上所有的设备都将开关切换到“关闭”（OFF）状态，该命令只会向那些加入到自己“并行处理命令”的成员列表的设备发送。

每个Z-Wave应用程序都有一组定义好的功能，这个功能基于Z-Wave的设备类型，对制造商的应用程序的“命令分类”提供支持。在数据有效载荷中，跟随着“命令分类”字段和“命令”字段，后面的“命令分类数据”的长度是变长的，具体取决于前面“命令”字段中具体命令的需要。

虽然没有公司的协议文档的支持，但毕竟我们还有“国际电信联盟”ITU-T G.9959规范和一些开放源码项目（比如OpenZWave项目），这些规范和源码都有助于我们理解和用文档记录Z-Wave这个专有协议。但对于接下来我们要看的有关Z-Wave网络中目前的安全功能，则几乎无章可循了。

14.1.2　Z-Wave协议的安全

在第四代“Z-Wave规范”中，“Z-Wave联盟”添加了对协议的安全控制。这种现象对于其他协议来说是司空见惯的现象，但对于关键的Z-Wave部署中，在要求了低成本和简单化的部署前提下再要求安全，就显得很奇怪了。当初在设计Z-Wave协议的时候，一个显而易见的事就是“Z-Wave联盟”认为需要在安全和操作使用方便性方面仔细斟酌，所以在随后所创建的协议上，在使用的限制范围内提供合理的安全性考虑。

注意

“Z-Wave联盟”并不提供任何公开的文档用于描述Z-Wave协议中所用的安全机制。2013年，SensePost信息安全咨询公司的两位安全顾问Behrang Fouladi和Sahand Ghanoun在美国拉斯维加斯（Las Vegas）黑帽子大会上发表了一篇对Z-Wave协议的安全性研究的报告和论文。对于Behrang Fouladi和Sahand Ghanoun的研究结果，“Z-Wave联盟”并没有证实或否认，不过，本书的作者对该报告的论文进行了足够的后续分析和验证。

Z-Wave协议采用“高级加密标准-输出反馈模式”（Advanced Encryption Standard-Output Feedback Mode，AES-OFB）协议为自己提供网络上数据的保密性，同时，使用“高级加密标准之密码块链消息认证码”（Advanced Encryption Standard Cipher Block Chaining Message Authentication Code，AES CBC-MAC）协议提供数据完整性的保护。这些协议都可以很好地被创建，并且可以和“密码块链消息认证码”（CBC-MAC）协议在许多其他重要的密码套件中很好地配合使用。不过“高级加密标准-输出反馈模式”协议并不常见，所以尽管该协议仍然是一个“美国国家标准与技术研究院”（National Institute of Standards and Technology，NIST）批准的分组密码的操作模式，但是在Z-Wave数据帧发送的时候，节约所发送数据包中有效载荷的长度是一个聪明的选择。

提示

上面加密协议中的MAC指的是指“消息认证码”，不要与本书前面提到的Z-Wave协议中第二层的“介质访问控制层”混淆。

有关Z-Wave协议，更有趣的是“高级加密标准之密码块链消息认证码”和“高级加密标准-输出反馈模式”协议是怎么使用的，特别是密钥生成以后是如何应用到Z-Wave网络安全中去的。

如表14-4所示，Z-Wave协议实现了一个CLASS_SECURITY的“命令分类”，该“命令分类”用于在设备之间交换安全信息。当一个支持这个安全类的Z-Wave设备处于当前网络时，这两个设备完成密钥交换的过程，并且将得到的密钥用于此后这两个设备的加密和数据完整性保护。其完整的交换流程如图14-7所示。

图14-7　Z-Wave密钥交换流程

在密钥交换过程的第1步和第2步，“控制设备”和“安全设备”准备好了密钥交换。这是该过程中至关重要的一步，允许“控制设备”建立的设备所应支持的CLASS_SECURITY“命令分类”。随后“控制设备”请求“安全设备”返回一个随机数，很快“安全设备”也返回“控制设备所需要的随机数Nonced （Nonced 即“Device Nonce”，意指由设备产生的随机数）。有了这个随机数Nonced ，“控制设备”就可以使用“临时密钥”（temporary key）K₀ 加密“网络密钥”（network key）Kn 。“网络密钥”是在网络创建的时候，由“控制设备”随机选择的，并且该值对于每一个Z-Wave网络来说都是独一无二的。相比之下，“临时密钥”是由16个字节组成的，每个字节的值都是0x00的数组。

注：本处的Nonce、Nonced 以及后面的Noncec 并没有本质的区别，都表示一个随机数。其实作者的这种表述，反而容易让读者误会，为什么一方要的是Nonce，另一方返回的却是Nonced 和Noncec ，二者是否相等？我们只要理解为流程中的第一个Nonce和Nonced 是同一个值，第二个Nonce和Noncec 是同一个数即可。另外，顺便提一下，如本书前面所述，一般来说以Nonce命名的随机数，虽然并不一定是协议要求的，但通常都与时间有关。——译者注

当“安全设备”从“控制设备”处接收到加密的网络密钥Kn 和“消息认证码”之后，“安全设备”会验证“消息认证码”，并使用K₀ 解密所接收到的消息。然后“安全设备”会注册解密后的Kn ，并将其作为当前的密钥。下一步，“安全设备”反过来请求“控制设备”给一个随机数，“控制设备”也会返回一个随机数Noncec （Noncec 即“Controller Nonce”，意指由“控制设备”产生的随机数）。拿到这个随机数以后，“安全设备”会使用Kn 加密一个“密钥设置完毕”（该消息的“命令”字段值为0x07）的消息发送给“控制设备”。“控制设备”在接收到“密钥设置完毕”消息以后，使用Kn ，加上“消息认证码”一起对数据内容进行解密，解密后看到消息是“密钥设置完毕”就知道双方的密钥交换过程成功。

然而，上面Z-Wave密钥的交换过程存在着漏洞，很容易受到几种攻击。

·中间人攻击（MitM attack）　“安全设备”除了在使用“临时密钥”K₀ 加密和“网络密钥”Kn 消息时，会验证“消息认证码”值，其余的时间，“安全设备”都不验证“控制设备”的身份。所以对于一个攻击者来说，可以使用任意支持SECURITY“命令分类”的Z-Wave“控制设备”拦截该“控制设备”与目标设备之间的“纳入”过程，这会导致被攻击的设备关联到一个恶意网络上。

·密钥还原攻击（Key recovery attack）　因为“临时密钥”K₀ 的值是众所周知的，并且通过网络传送“网络密钥”Kn 的时候，并没有提供机密性保护。所以攻击者只需要被动式地观察“纳入”过程中含有CLASS_SECURITY的通信数据包，就可以还原出“网络密钥”Kn 。通过这个密钥值就可以解密随后的所有通信数据包，并且可以在这个网络上伪造任意的数据包。

最有可能的是，“Z-Wave联盟”在早期这些漏洞安全框架开发的时候，就承认在密钥交换过程中存在这些漏洞。但是这种Z-Wave密钥交换过程中的漏洞并不是Z-Wave网络中独有的漏洞，如果没有对系统的体系结构进行重大改变，以及重要协议复杂化设计，一般很难解决。为了在最小代价的前提下从整体上解决这些漏洞，“Z-Wave联盟”在过程中增加了一个新的处理，那就是“低功率纳入模式”（low power inclusion mode）。

“低功率纳入模式”更贴切的解释应该是：“控制设备”和“安全设备”使用最小的发射功率收发数据，这就要求这两个设备在间隔不超过3英尺（约为1米）的情况下完成密钥交换过程。也就是说，这种方式使用现代无线发射器的动态“发射功率控制”（Transmit Power Control，TPC）能力，在“控制设备”和“安全设备”临时切换到最小的发射输出功率状态的时候进行数据交换，其目的就是减少入侵者在“纳入”过程中发生密钥交换的时候进行侦听的机会。虽然这不是一个完美的安全解决方案，但是将“低功率纳入模式”与新设备入Z-Wave网络这种本来就极少遇到的行为相结合，也会在一定程度上使攻击者在密钥交换协议的设计上攻击这些漏洞成为不可能。

注意

“低功率纳入模式”的使用有一个假定的前提，那就是在这个Z-Wave网络中至少有一个Z-Wave设备是便携式设备，且在两个设备需要进行“纳入”操作的时候，该便携式设备可以移动到离需要交换密钥的设备足够近的距离，然后完成“纳入”操作。但在实际系统中，两个设备之间最有可能的情况是有固定的距离。为了实现通信，许多Z-Wave装置都包括一种“重载模式”（override mode），在该模式下，“纳入”过程不但不会使用“低功耗模式”，反而是用更高的发射功率级别。因而有些设备如果要进行这样的“纳入”操作，反而使系统更容易受到攻击，但从设备的“纳入”操作本来就很少见的角度来看，这样的设计对于减少被黑客攻击的可能性来说还是有一定的好处。

在加载“网络密钥”Kn 以后，“安全设备”生成两个额外的密钥，Kc 和Km ，（其中，Kc 是“数据包加密密钥”，Km 是“信息认证密钥”），然后使用“高级加密标准-电子密码本模式”（Advanced Encryption Standard-Electronic Codebook Mode，AES-ECB）加密算法生成密码。

在论文中，Behrang Fouladi和Sahand Ghanoun指出Passwordc 和Passwordm 的值都是静态的，定义在Z-Wave固件文件中，并且所有设备对该值的定义都是一样的。不过，即使这样，也不足以威胁Z-Wave协议中各安全套件的机密性和完整性，因为现在的Kn 值仍然还是一个秘密。

当一个“控制设备”想要发送一个消息到一个安全的“从设备”上，那么这个“控制设备”必须首先向这个“安全设备”请求一个随机数，然后使用这个随机数作为“消息认证码”MAC的一部分参与运算，并将其回复给“从设备”。当“从设备”返回随机数后，“控制设备”会选择自己的随机数，将该随机数与从“从设备”发送给“控制设备”的随机数组合起来，生成一个“初始向量”（Initialization Vector，IV）值。通过“初始向量”值，“控制设备”可以使用“初始向量”和“数据包加密钥”Kc 加密数据包的有效载荷（简称P），然后使用“信息认证密钥”Km 计算“消息认证码”。“消息认证码”的计算包括“初始向量”，“安全头”（HDR），“源节点ID”（SRC），“目的节点ID”（DST），“有效载荷的长度”（LEN）和“加密的有效载荷”（ENC（P））。这个交换过程如图14-8所示。

图14-8　Z-Wave解密数据包的传送过程

在计算“消息认证码”的时候，通过包含“源节点ID”和“目的节点ID”的值，Z-Wave挫败了数据包伪造的尝试，因为这种攻击方式可以操纵“目的节点ID”字段，从而达到向任意设备发送伪造数据包的目的。同时，这个Z-Wave协议可以在发送之前，通过从“安全设备”请求随机数的方式，实现对拒绝“重播攻击”的可能性。当“安全设备”接收到来自“控制设备”发送的数据，“安全设备”就会将“初始向量”最后8个字节的数据与之前选择的随机数进行比较，在处理数据包剩下的内容之前，先确保这两个值是匹配的。如果一个攻击者后来“重播”之前发送过的加密包，接收方可以根据“初始向量”最后8个字节与随机数不匹配的结论，导致“控制设备”丢弃掉该数据包。

对于Z-Wave设备技术实现，由于没有权威的安全信息来源，评估设备的功能和行为的所有细微差别是很困难的，而这又正是协议攻击的关键。由于缺乏这种文档资料的来源，所以我们不得不借助于手头现有的资源和工具，通过针对Z-Wave设备的攻击实验来发现设备中存在的漏洞。

[1] 无线频率的分配是由国际组织负责的，少数频段由政府或组织负责。我国的无线频率分配工作是由工业和信息化部（原信息产业部）负责。有关内容可参见工信部网站http://www.miit.gov.cn/n11293472/n11294912/n11296542/12169542.html。——译者注

[2] 1英尺=0.3048米，所以此处3英尺～75英尺即0.9米～22.8米。——译者注

[3] 在惜字节如金的Z-Wave协议中是不可能传输这样的字符串命令的，所以根据猜测，这个列表中的命令应该是一个宏指令（macro），在实际的编程中都会被转换成具体的指令码。——译者注

14.2　攻击Z-Wave网络

接下来，我们对Z-Wave网络的技术实现实施多种攻击，借此发现和检验漏洞。作为一个专有的和介绍资料少得可怜的技术（除了不必与“西格玛设计”公司签署“保密协议”的技术），能够用于攻击Z-Wave网络的工具也显得尴尬和相对不成熟。在接下来的内容里，我们会对所使用的工具在用法上提供简明的指导，虽然这样做会导致攻击平台的成长和成熟，但这也会帮助该领域内获得持续的发展。

14.2.1　对Z-Wave网络的侦听攻击

对任何无线网络，最常见的攻击技术就是窃听网络上通信的数据包，以观察其中以明文方式传送的敏感数据。在对Z-Wave攻击技术的覆盖范围内，我们将通过多种技术利用三个主要工具，开始我们的侦听攻击。

Z-Force侦听工具

Z-Force是一款Windows操作系统上的工具，是由Behrang Fouladi和Sahand Ghanoun共同开发的，这是二人研究Z-Wave网络漏洞的一部分。Z-Force工具作为一款基本的数据包嗅探器，还有对Z-Wave网络攻击的附加功能，这一点我们会在本章后面进行介绍。

对于嗅探器的硬件，Behrang Fouladi和Sahand Ghanoun为德克萨斯仪器公司的“CC1110芯片的迷你开发套件”（CC1110 Mini Development kit）开发了一个定制的固件程序。该固件程序的产品编号是CC1110DK-MINI-868。该套件包括两块“CC1110开发板”和用于对CC1110芯片进行编程的德克萨斯仪器公司的“CC Debugger”调试器。这两个开发板和“CC Debugger”调试器的实物图如图14-9所示。

图14-9　CC1110芯片的迷你开发套件

“CC1110芯片”是一个“片上系统”设备，包括一个8位8051微处理器，有一个支持868MHz和915MHz频段的无线接口。由于Z-Wave开发板没有与“Z-Wave联盟”签署“保密协议”就不能使用，所以“CC1110芯片的迷你开发套件”是在一个合理的价位上的不错的选择，其单价是75美元。

作为一个开发套件工具，该CC1110DK芯片是为开发人员设计的，目的是向使用Z-Force技术的开发人员提供一些一些额外的组件：

·基本通孔焊接工具，包括烙铁（iron）、焊锡丝（solder wire）、助焊台（helping hand）、老虎钳（vise）。

·双面0.1厘米间距2排7列（2×7）“公头对公头”的连接头，外形如Adafruit.com网站上产品编号为1539的产品（该产品是2×36的连接头，由于没有2×7的连接头，所以只能用这种2×36的连接头手工切成5个2×7排列的连接头）。

·6根“母头对母头”成型跳线，外形如Adafruit.com网站上产品编号为266的产品。

·1根“USB转串口”桥接转接头，主要用于串行访问，如Adafruit.com上名称为“飞特帝亚公司之友”（FTDI Friend）的产品，产品编号是284。

提示

我们列出了部分商品在在线电子商店Adafruit.com上的产品编号，但这些商品都是通用产品，所以这些或类似的产品也可以通过别的渠道购买得到，例如digikey.com 、mouser.com 或ebay.com 。

首先，你需要使用Z-Force固件程序刷新CC1110DK芯片的接口，然后你需要将CC1110DK接口连接到“USB转串口”的转接头上，通过笔记本电脑的USB接口连接到你的Windows操作系统上，接下来，我们来看看这些步骤。

（1）刷新CC1110DK接口的固件程序

CC1110DK在出厂时就预装了基本的“主/从”模式固件，可以通过发送或接收功能来估计测试距离。为了通过CC1110DK接口使用Z-Force工具，你必须在双方的接口中刷上新的固件程序。

Z-Force的设计可以同时容纳两个CC1110DK接口，通过“USB转串口”的适配器进行连接，连接的原则就是：每一头的“发送引脚”（TX）连接另一头的“接收引脚”（RX）。你需要将两头的固件文件都刷上最新的固件程序，每一个不同的CC1110DK芯片都要使用Z-Force固件程序的全部功能。

Z-Force的作者提供的固件程序只能使用欧洲的Z-Wave频率进行无线程序的发送和接收。在向Z-Force的作者提出索要项目源代码以便修改频率的时候，遭到了作者的拒绝，对方指出是因为“保密协议”的原因。幸运的是，使用欧洲频率的Z-Force固件二进制补丁程序还是可以直接使用北美洲频率的，所以，下面我们就可以直接将内容跳转到欧洲和北美洲相应的章节中，然后根据你所处的无线监管区域，查看相应章节的内容。

支持欧洲Z-Force频率的固件文件

默认的固件文件主要就是向Z-Force提供对868.4MHz频率的支持，所遵从的规范是“Z-Wave无线规范”的R2配置版本，传输速率是40 Kbps（详见表14-2）。发送TX和接收RX的固件文件可以从Z-Force工具的SVN [1] 仓库处下载，其网址是https://code.google.com/p/z-force/source/browse （在该网页上查找“trunk/firmware”（中继线/固件）相关的内容）。

Z-Force固件文件是以二进制格式发布的，但是我们需要将它们转换为Intel公司十六进制格式，然后才能刷新到“CC1110DK记忆棒”的内存中。要完成这种固件文件内部格式的转换，需要下载一个SRecord-Win32转换工具，该软件的下载网址是http://sourceforge.net/projects/srecord/files/srecord-win32 。下载成功后，解压缩所下载的srecord-X.YY-win32.zip文件（X.YY表示的是SRecord-Win32软件的最新版本号），然后将解压后的srec_cat.exe二进制文件复制到Z-Force固件文件所保存的目录中。打开命令shell外壳程序，由于是Windows操作系统，所以也就是打开“命令提示符”，然后在命令提示符中切换到上述Z-Force固件文件所保存的目录，这样就可以在命令行中将二进制文件转换为Intel公司的Hex格式文件了。其操作系统的格式及运行效果如下所示：

接下来，我们可以将这两个固件文件刷新到CC1110DK的电路板上芯片中了。

支持北美洲Z-Force频率的固件文件

为适应在北美洲使用Z-Force工具，作者创建了一个Z-Force固件的修订版本，新版本的下载地址为http://www.willhackforsushi.com/code/z-force-northamerica.zip 。下载并解压z-force-northamerica.zip，可以得到两个固件文件，分别是Z-Force_Firmware_RX-US和Z-Force_Firmware_TX-US。

同时，下载得到的Z-Force北美洲版工具解压缩后的文件中，既有二进制格式的固件文件，也有Intel公司的十六进制格式的固件文件，以及针对本次支持北美洲Z-Wave频率的修订版所做出的详细修改注释。

（2）CC1110DK固件的刷新

无论你使用支持哪个洲Z-Force频率的固件文件，在CC1110DK硬件上刷新固件文件的过程都是一样的。首先，通过DBG_CONNECTOR板，将CC1110DK与“CC Debugger”调试器连接起来，如图14-10所示。在连接硬件的逻辑上，跳线桥的第3、第4引脚应该连接在CC1110芯片的下面；“CC Debugger”调试器的USB接口应该连接到计算机主机系统上，然后在计算机主机上运行“SmartRF固件烧录程序”（SmartRF Flash Programmer）。

“SmartRF固件烧录程序”允许你直接与得克萨斯仪器公司的CC1110芯片以交互的方式完成读取和写入固件文件的刷新操作，“SmartRF固件烧录程序”工具可以从得克萨斯仪器公司的官网上下载，网址是http://www.ti.com/tool/flash-programmer 。下载并解压所下的压缩文件，然后运行其中的安装程序（installer）完成安装过程。下一步，运行“SmartRF固件烧录程序”软件。

图14-10　CC1110DK与“CC Debugger”调试器的连接

注意

在写本书的时候，得克萨斯仪器公司推出了“SmartRF固件烧录程序版本2”（SmartRF Flash Programmer 2），“版本2”下载的网址和“版本1”的下载网址相同，所不同的是“版本2”（即标为“v2”的这一版）的软件并不能与使用CC1110芯片的“CC Debugger”调试器保持兼容，取而代之的是使用CC1110DK芯片的“CC Debugger”调试器。既然前面的例子都是使用CC1110芯片的“CC Debugger”调试器，所以我们现在运行“SmartRF固件烧录程序”（注意不是“版本2”），继续看下面的步骤。

当启动“SmartRF固件烧录程序”工具以后，会出现通过“CC Debugger”调试器升级固件之类的提示信息，按照提示就可以完成固件的更新。

随着“SmartRF固件烧录程序”工具的打开，你可以选择或输入要刷新的Z-Force固件文件，然后在“动作”（actions）分组框中选择“擦除、写入并验证”（Erase，Program And Verify）单选框。再在所选接设备的列表中选择“CC Debugger”调试器接口，并且查看一下使用的芯片是CC1110，然后单击“动作完成”（Perform Actions）按钮，其效果如图14-11所示。在上述过程中，如果“SmartRF固件烧录程序”没有在所连接设备的列表中列出要刷新固件程序的CC1110芯片，那就先检查确认你的DBG_CONNECTOR连接器的连接线连接是否正确，该连接图如图14-10所示，以及跳线的位置是不是在第3和第4引脚上。

图14-11　“SmartRF固件烧录程序”设置主界面

CC1110DK固件的刷新操作与CC1110固件的刷新操作一样，故不再重复，并且下面改用CC1110DK进行介绍。

提示

在成功地使用CC1110DK芯片完成对Z-Force固件的刷新工作之后，该设备上的红色和绿色的LED指示灯都会被点亮。

重复上面为电路板上CC1110DK芯片的刷新过程，每个电路板所对应的设备功能不一样，所以刷的内容也不一样。一边接收方要刷的是接收固件RX，另一边发送方要刷的是发送固件TX。因为两者之间没有视觉上的差异，为了防止混淆，我们建议直接在板子上贴上一个标签，明确标明这个电路板是刷新了发送固件TX的电路板，还是刷新了接收固件RX的电路板。

下一步就是在CC1110DK接口中刷新欧洲Z-Force固件，或者刷新北美洲Z-Force固件，你可以从电路板上断开“CC Debugger”调试器接口，然后将“USB转串口”的桥接转接头连接到电路板上，对使用Z-Wave协议的设备进行处理。

（3）连线CC1110DK接口

要使用CC1110DK接口，首先要将双面“公头对公头”的连接头焊接到CC1110DK主板上标有INTIO的socket引脚插座上，主板上的插座是2×7引脚布局。现实中很难找到这种引脚排列的连接头，一个简单的办法就是买一个其他布局的，比如本节一开始提到的2×36排列的连接头，然后手工切割 [2] 一个2×7的连接头使用。接下来，使用成型跳线连接CC1110DK公头引脚的“USB转串口”桥接连接线上，连接示意图如图14-12所示，引脚的连线对照表详见表14-5 [3] 。

图14-12　CC1110DK与“飞特帝亚公司之友”的连线示意图

注意

我们在这里详细地介绍了“飞特帝亚公司之友”（FTDI）的“USB转串口”桥接转接头连线方式，只要连接正确，那么从电脑主机向“USB转串口”桥接转接头发送的数据都会导致该设备上的LED灯闪烁。比如，你从终端仿真器上按下一个回车键，由于有数据传输，所以设备LED灯就闪烁一下后灭掉。间接地，使用这个方法你也可以知道当前数据是否通信。如果你使用的是另外一个不同型号的“USB转串口”的适配器，你要查阅该产品的文档来确定正确的引脚，特别是其中的地线GND、发送线TX和接收线RX。

要在两个设备上分别应用正确的固件程序，我们需要使用两节AAA电池为CC1110DK主板供电。将主板上P1插线排上的引脚1和引脚2通过跳线连接到电池的两端，使其向主板提供电源。再将刷新过接收固件RX的CC1110DK板上的“USB转串口”桥接转接头连接到计算机主机上，通过Windows的“即插即用”功能自动安装所需要的驱动程序。关注这里用于接收RX接口的串口的端口号。重复上述步骤，再将刷新过发送固件TX的CC1110DK板上的“USB转串口”桥接转接头连接到计算机主机上，自动安装所需要的驱动程序。并同样关注一下这个用于发送RX接口的串口的端口号。

注：这里的“USB转串口”其实只是一种接口转换线，就是外形是USB口的线，但实际上运行的是串口的协议。对于操作系统来说，看到的是一个串口，而不是一个USB口，从软件的角度来看，这个串口与实际的物理串口并没有什么区别。这里所说的“关注串口的端口值”，在Windows操作系统上，是依次打开“开始/控制面板/设备管理器”，然后查找其中的“端口（COM和LPT）”（如果没有此项，则表示你的计算机中没有任何串口），然后就会列出该主机上所有的串口，其中名字的最后通常都是“（COMn ）”结尾，其中的n就是上面要关注的串口端口值，以后所有对该串口的操作也都要使用该值。即使同样多个的“USB转串口”，插入顺序不同，各连接线的串口值也不一样，所以需要“关注”并记下来。——译者注

表14-5　CC1110DK与“飞特帝亚公司之友”的连线对照表

提示

对于CC1110DK设备，你还可以不使用电池供电，而改由“飞特帝亚公司之友”的“USB转串口”桥接转接头供电。要这样做，需要进行一些改装。首先，将板上的5伏电源（即标有“5V VCC”的位置）连线剪断然后连到“飞特帝亚公司之友”板背面的3V跳线焊点处将其焊上，然后将四个跳线针中的引脚1连接到“飞特帝亚公司之友”电源VCC引脚上，这样CC1110DK的供电将通过USB由主机电源供电。主机电源给USB口供电，USB口再通过“飞特帝亚公司之友”板给CC1110DK设备供电，但注意不要将第2根电源线连接到CC1110DK设备上。

所有的工作完成以后，你就可以开始运行Z-Force应用程序了。单击“选项（Options）|射频板（RF Boards）”菜单，分别选择和设置前面发送固件TX所对应的COM串口端口值和接收固件RX所对应的COM串口端口值。然后程序就做好了开始捕获Z-Wave网络上的通信数据包的准备，这时选择“工具（Tools）|开始捕获（Start Capture）”菜单。Z-Force程序就会显示所捕获到的数据包，其效果类似图14-13所示。单击“工具（Tools）|停止捕获（Stop Capture）”菜单就会停止当前的数据包捕获过程。

图14-13　Z-Wave数据的捕获实例

遗憾的是，作为一个嗅探工具，Z-Force程序只是做到了最基本的数据包捕获功能，对于常见数据包捕获工具上的通用型功能，Z-Force程序并没有提供。可以说，Z-Force程序只是完成了嗅探类工具中最小的数据包的解码能力，所完成的功能只是做到了提取HomeID、源节点ID、目的节点ID等寥寥几个字段，这也是在识别数据包中Z-Wave电子束控制和其他部分的时候得到的。同时，由于Z-Force工具缺少以任何格式保存所捕获的数据包到文件的能力，因此即使该工具捕获到一些数据包，也无法通过其他工具进行进一步的分析。还有，因为Z-Force的固件只支持“Z-Wave规范”中的R2配置版本，所以Z-Force工具也只支持“Z-Wave规范”中的R2配置版本，而不支持R1配置版本、R3配置版本，以及“Z-Wave Plus规范”。最后，作为一个“闭源项目”（closed source project），自2013版的Z-Force工具推出以来，就再也没有进行后继的开发，所以添加新功能也是不可能的。为了解决这些限制，本书的作者在写这一章的过程中启动了一个新的Z-Wave嗅探项目，名为：KillerZee。

基于CC1110DK芯片攻击Z-Wave网络的开源工具

作为一种Z-Force工具的替代品，研究人员Jean-Louis Bourdon开启了ZTsunami项目，其设计目标是打造一个只需要使用一个CC1110DK接口，既能进行Z-Wave嗅探，又能实施数据包注入的工具。为了使ZTsunami成为一个强有力的工具，Jean-Louis Bourdon对“Z-Wave规范”进行了更深入的分析和剖析。作为一个开源项目，ZTsunami已在多个方面优于Z-Force工具，包括日益增长的社会支持和越来越多的项目志愿者积极参与开发。

虽然对于Z-Wave网络在欧洲和北美洲使用频率上，ZTsunami工具已经能够捕获Z-Wave通信数据包，并将捕获的数据包写入到文件中了，但在本书的写作过程中，作为一个新的工具，ZTsunami仍然还只能提供有限的功能。同时，如果对你来说，如果无论是固件，还是Windows下嗅探软件源代码，都愿意接受“GPLv2许可 [4] ”，那么可以使用CC1110DK硬件平台进行Z-Wave网络嗅探开发的开源项目就多了，这些项目也都是直接将其项目开发目标定位于取代Z-Force工具。

ZTsunami的资料可以从https://code.google.com/p/ztsunami 网址上查到或下载。一个较早捕获到数据包的实例结果显示如下：

KillerZee设备的侦听

KillerZee项目是出于简化Z-Wave嗅探开发、扩展数据包嗅探的功能，以及利用开源项目的优势这几个目标而创立的。项目通过加入各网络嗅探功能中公共的功能实现，而开源项目最大的优势就是可以遇到全世界范围内的针对Z-Wave攻击平台上频繁的要求。就在本书写作的时候，虽然现有的功能已经满足这些目标的要求，但针对KillerZee的发展仍然处于进行中。

KillerZee工具既是一个Z-Wave网络安全评估的工具集，又是一个新的Z-Wave工具的开发框架。使用KillerZee工具，你可以侦听到Z-Wave网络上的一举一动，列举出连接到Z-Wave网络上的外围设备，利用Z-Wave技术使用上的漏洞，操纵Z-Wave网络的活动，最终识别出一个可以使用的新的攻击漏洞。

KillerZee工具并没有使用CC1110DK的硬件，而是使用了CC1111芯片，结合“得克萨斯仪器”公司USB接口的“评估模块集”（Evaluation Module Kit，EMK）作为其攻击硬件，该设备的实物图如图14-14所示。CC1111EMK设备使用一个类似于CC1110DK芯片的芯片，但是增加了USB功能，另有一些引脚的针用于程序的烧录。有一个灵活的按钮可以用于自定义功能。不幸的是，这款CC1111EMK芯片相比于CC1110DK芯片少了一些功能，但对于执行一些Z-Wave网络上数据包的捕获操作，已有的功能绰绰有余。

图14-14　“得克萨斯仪器”公司的CC1111EMK设备实物图

有一个名为RfCat的，同时使用了CC1111EMK设备和KillerZee工具的项目，它利用了二者的固件以及Python开发框架，也在做类似的Z-Wave网络侦听工具的制作。作者的网名叫“@tlas 0f d00m” [5] ，其项目名RfCat的绰号是“低于1GHz频率无线攻击的瑞士军刀 [6] ”（the Swiss army knife of sub-GHz radio）。作为一个研究和攻击“低于1GHz频率”网络的开发框架，RfCat采用Chipcon公司的CC1111芯片，包括CC1111EMK芯片。项目的固件程序开源，这是一款用“小设备C语言编译器”（Small Device C Compiler，SDCC）结合Python编程框架，通过与CC1111芯片进行交换操作设计而成，负责交互的程序名叫rflib。RfCat项目既可以作为一个平台对“低于1GHz频率”网络进行攻击实验，也可以提供一套“应用程序接口”，使第三方可以拿来用于开发定制的工具。

RfCat项目需要一些初始化设置，然后才能将RfCat固件程序刷入到CC1111芯片中。在刷入RfCat固件程序以后（系统加载程序bootloader和固件程序都是为CC1111EMK所提供，按着RfCat项目的说法，这个程序叫“DonsDongle” [7] ），还有做一些维护工作，然后才能跳转到Z-Wave嗅探的攻击之中。要将RfCat固件刷新到CC1111EMK芯片中，你还需要下面的组件。

·1个或多个CC1111EMK接口，可以从http://www.digikey.com 或其他受欢迎的在线电子网站购到。

·1个GoodFET接口，主要用于刷新CC1111EMK芯片的固件，可以从Adafruit.com 上找到，产品编号是1279。在本书13.4节中有GoodFET接口其他方面的资料介绍。

·5根“母头对母头”的成型跳线，可以从Adafruit.com 网站上查到，产品编号是266。

·1台至少有一个空闲USB接口的Linux主机。

首先，我们看一下如何安装RfCat工具和GoodFET工具，然后我们再了解连线过程以及刷新CC1111EMK芯片固件程序的过程，通过将RfCat刷新到CC1111EMK设备中，我们会专注于使用KillerZee，结合硬件对Z-Wave网络进行攻击。

（1）安装RfCat工具

RfCat项目的源代码是使用Mercurial这样的“版本控制系统”（version control system）进行管理的。所以，要使用这套源代码，还需要安装Mercurial程序。在Linux主机使用由Linux提供商发布的“程序包管理工具”（package management tool）来安装Mercurial程序，下面的命令是假设读者使用的是基于Debian，或基于Ubuntu的Linux操作系统上，通过“程序包管理工具”来安装Mercurial程序命令格式。

下一步，使用Mercurial工具中的hg程序，从RfCat项目中下载源代码，下载成功以后，从命令行切换到rfcat目录中，其操作步骤和命令效果如下所示：

接下来，构建和安装Python的rfcat工具，以及rflib开发库：

在没有root权限的前提下使用RfCat，然后在bootloader模式下设置正确的设备访问链接，并且你还需要在udev目录下修改Linux“设备管理配置”（device management configuration）。结束以后，复制RfCat提供的配置文件到Linux的udev规则目录，然后重装udev目录下的配置内容，如下所示：

最后，复制RfCat工具生成的bootloader.py脚本到系统PATH路径可以找到的一个目录中，比如复制到“/usr/local/bin”目录中，则命令格式为：

现在，你已经完成了RfCat工具安装，下面就可以继续安装GoodFET软件了。

（2）安装GoodFET工具

我们用GoodFET来刷新初始的引导程序bootloader代码到CC1111EMK设备的硬件上。首先，安装git的“版本管理工具”（version management tool），因为这是GoodFET程序开发包所需要的，然后下载最新版的GoodFET源代码，其操作命令格式如下。

下一步，切换到GoodFET客户端的目录，创建一个到GoodFET客户端的“符号链接” [8] （symbolic link），其命令格式及运行效果如下。

最后，添加你的用户账户到dialout组，这样就可以在没有root权限的情况下使用GoodFET工具了。

注意

因为组成员发生了变化，为了使新的组成员关系生效，你将不得不注销系统，并再次登录。这样就可以正常使用了。

在完成RfCat工具和GoodFET工具的安装后，你就可以通过连线将CC1111EMK设备与GoodFET设备连接起来。

（3）连线CC1111EMK接口

接下来，我们使用GoodFET工具向CC1111EMK设备载入RfCat项目的CCBootloader代码。这是一次性的操作，一旦完成，那么以后你如果要更新RfCat固件，就不需要再通过连接线接入GoodFET设备了。

CC1111EMK设备有两组连接头，一组用于测试（test），一组用于调试（debug）。其中调试用的连接头是必须要与GoodFET设备相连的，二者之间的连接方式是“母头对母头”的跳线连接器。连接示意图如图14-15所示，引脚的连线对照表详见表14-6。

图14-15　CC1111EMK工具与GoodFET工具的连线示意图

表14-6　CC1111EMK工具与GoodFET工具的连线对照表

因为GoodFET设备为CC1111EMK设备提供电源，所以你不需要为CC1111EMK提供电源就可以完成芯片固件的刷新。只要简单地将GoodFET设备插入到Linux操作系统主机的USB口上，很快就可以从CC1111芯片上获得该设备的基本信息，其命令格式及效果如下所示：

如果goodfet.cc工具运行后报告一个芯片ID值为0x0000，那就说明读取失败，这时，你需要检查你的接线，以确保连接方式与图14-15是匹配的。

（4）刷新CC1111EMK芯片

现在，GoodFET就可以与CC1111芯片进行通信了。下一步，将CCBootloader代码刷到芯片上，该步骤的运行结果如下所示：

通过上面的操作，GoodFET已经将CCBootloader的代码刷入到CC1111EMK芯片中，下面你可以从CC1111EMK设备上将GoodFET的连线断开了。之后的CCBootloader程序，允许你刷新（flash）或再刷新（reflash）CC1111EMK设备，如果需要，你甚至可以用不同的固件文件进行刷新。

下一步，将CC1111EMK设备设置为bootloader模式，设置的方式是按住设备面板上的按钮，然后将设备插入到计算机上一个可用的USB端口，一旦插好，就可以放开按钮。这时，你会看到CC1111EMK设备外壳上绿色的LED类就会亮起来，这时查看Linux操作系统上的内核日志，你会看到有一个新的串口设备在系统中注册，其效果如下所示：

接下来将CC1111EMK设备也设置为bootloader模式，不过，这个设备设置为bootloader模式不需要按按钮，而是运行bootloader.py脚本。运行后，该程序会从可访问的闪存区域删除其中原有的所有内容：

随后，从https://bitbucket.org/atlas0fd00m/rfcat/downloads 网站上下载RfCat项目中最新版本的CC1111EMK固件程序。选择文件名以“RfCatDonsCCBootloader-”作前缀，后面跟着版本号，并以“.hex”结束的文件。在这个例子中，我们使用版本号为140904的文件进行创建，其命令格式如下：

下一步，使用bootload.py脚本程序刷新RfCat的固件。

使用bootload.py脚本运行RfCat的固件程序，其命令格式如下所示，或者干脆拔掉RfCat接口，然后重插一下，利用系统自动运行的功能运行固件程序：

使用CC1111EMK接口上的RfCat固件，现在，你可以开始使用KillerZee工具对Z-Wave网络进行窃听了。

（5）安装KillerZee工具

最后，下载并安装最新版本的KillerZee软件。这是一个简单的过程，只要按如下所示的格式操作即可：

使用固件已经刷新过的CC1111EMK接口与已经安装好的KillerZee程序，你就可以开始对Z-Wave网络进行窃听了。

（6）KillerZee的嗅探操作

KillerZee工具中的zwdump程序很像Linux系统中的tcpdump程序。不同的只是zwdump程序用于Z-Wave网络中的侦听，而tcpdump程序则是对以太网（不分有线无线的）进行侦听。如果只是想捕获和显示Z-Wave网络的基本信息，那么在运行zwdump程序的时候，就不需要带任何参数，其效果如下所示：

如果你希望以类似于tcpdump的方式显示捕获到的数据包格式，zwdump程序也可以将写到文件中的数据包以libpcap文件格式进行保存，并且zwdump程序还可以从保存数据包的文件中将捕获的数据包读取出来，并以tcpdump格式进行显示：

提示

如果在zwdump命令的后面加上一个“-v”参数，那么当zwdump程序在写入到libpcap文件所捕获的数据包时，zwdump程序还会对数据包进行解码，并且将解码结果以及接收数据包的内容都显示出来。

KillerZee工具包以及该工具包下所包含的各个工具，虽然都是专为Z-Wave网络而做的，但是在设计的时候，都考虑到了全球范围使用的兼容性。比如说，这里的每个工具都支持“Z-Wave规范”中“R1配置”和“R2配置”的版本规范。默认情况下，对于北美洲的用户，zwdump以及其他的工具都会默认地应用“R2配置版本”，以便适用北美洲的频率，不过，你可以在命令行中改变这种默认的配置。下面的示例就是使用“R1配置”版本在美国捕获Z-Wave设备的网络活动。

使用KillerZee工具，比如其中的zwdump程序，如果是到了除北美洲之外的其他无线管理域该怎么办呢？其实，只要在命令行中使用“-c”参数，并在该参数后面跟上两个字母的国家和地区代码 [9] 就可以了。其示例及运行效果如下所示。

注意

在本书写作的时候，KillerZee支持射频管理域已达60多个国家和地区，范围从加拿大（Canada）到新西兰（New Zealand）。

不幸的是，尽管对于KillerZee项目的路线图（roadmap）来说，早已将Z-Wave网络数据包的解码列为一项紧迫任务，但对于Wireshark的项目，则仍然未将Z-Wave网络数据包的解码集成到其程序中。如果想检测KillerZee系统的最新版本，可以到其网站上查找，网址是http://killerzee.willhackforsushi.com 。

3.对Z-Wave侦听攻击的防御措施

就像任何其他无线技术一样，Z-Wave网络的用户应该牢记：攻击者可以通过捕获网络通信数据包来实施“侦听攻击”。在这些例子中，网络活动并没有通过加密程序的保护来保证数据的机密性和完整性。在可能的情况下，用户应该利用内置Z-Wave加密功能，或第三方加密程序来防止敏感信息的泄露。

不幸的是，“Z-Wave联盟”并没有强制要求Z-Wave产品必须应用加密技术，这使得许多消费者很容易受到“侦听攻击”。在多数情况下，防止敏感信息泄露的唯一的防御措施是让供应商提供网络的保密性和完整性控制。

14.2.2　对Z-Wave网络的注入攻击

尽管没有参照“Z-Wave规范”，但我们还是可以推断出对产品供应商来说，他们并没有要求必须支持加密技术。事实上，许多Z-Wave产品厂商销售智能家居产品，从温控计到遥控电源插座，都无一例外地缺乏基本的加密技术和对完整性保护的支持。在这些网络中，攻击者可以“注入”（inject）任意数据包内容，或“重播”（replay）之前捕获的数据包来操纵Z-Wave网络中的任意一个Z-Wave设备节点。

注意

在一个网络中不使用加密技术，那么Z-Wave的“纳入”处理（inclusion process）就相当于加载（amount）了一个无连接（connectionless）的“基于地址的过滤”机制（address-based filtering）。就像其他网络中无连接的“基于地址的过滤”机制一样，攻击者可以通过“源地址欺骗”（spoof the source address）的方式达到冒充Z-Wave网络上合法节点的目的，并且以被冒充节点的名义，即使明确没有在某个网络中，仍然可以“注入”任意内容的数据包。

通过未加密数据发起重播攻击

在“重播攻击”中，攻击者“重复发送”（retransmit）以前捕获并保存的数据包，借助于不需要认证的网络“再现”（reproduce）网络事件。执行一次“重播攻击”非常简单：重新播放存储的数据包捕获文件的内容即可。这种攻击产生的影响差异显著。

我们考虑一种实例，在一个未加密的Z-Wave网络中有一个Z-Wave温控计和一个Z-Wave“控制设备”。有一个攻击者捕获并保存了一个“温度增加一度”的数据包，并且“重播”了这个数据包多次，这样就可能将温度增加到一个不舒适的程度。另一个攻击的实例是针对Z-Wave门锁的：捕获和重新播放以前车门开锁的数据包，可能会产生未经授权的访问，导致车门在车主不知情的情况下打开。

（1）使用Z-Force工具进行重播攻击

Z-Force工具包括数据包的发送功能，要进行“重播攻击”的时候，在该软件的“工具（Tools）|发送数据包（Send Packet）”菜单选项里，输入目标网络的“HomeID”（即界面上的“Home ID”）、“源节点ID”（即界面上的“src Node”）、“目标节点ID”（即界面上的“Dst Node”）、“帧控制”（frame control）的值（就是Z-Wave数据包头中的“有效载荷头部”Header字段，也是界面上的同名项），上述各值都是以十六进制格式表示，接下来输入你要发送数据包的有效载荷的内容（即界面上的“Payload”），输入发送重复次数，然后单击“发送”按钮，程序的界面如图14-16所示。

注意

在“注入数据包”的尾部，不需要包括“帧校验序列”。这是因为Z-Force工具会在发送前计算数据包的“帧校验序列”，并将计算的结果填在相应的位置处。

除了“重播”以前观察到的数据包的能力之外，Z-Force工具还能够“注入”修改过的数据包的内容。这时的Z-Force工具就会变成简单的数据包“Fuzzing测试工具” [10] ，通过“重用”（reuse）以前捕获和保存过的数据包有效载荷数据，针对新的目标“节点ID”只是简单地改变其“目的节点ID”的值以达到“重播”的功能。

图14-16　Z-Force工具中数据包“注入”发送的一个样例

（2）使用KillerZee工具进行重播攻击

KillerZee使用一个短的Python脚本，同样可以像Z-Force工具一样发送任意内容的数据包，使用Z-Force工具发送数据包的程序主界面如图14-16所示，使用KillerZee同样可以发送相似效果的数据包，如下所示：

注意

在这个例子中，字节0c是长度字节，表示数据包的长度为0x0c，或十进制的12个字节。使用Z-Wave的“消息认证码”是单播形式，如图14-2所示，在创建和解码数据包的时候使用。

使用一个脚本发送Z-Wave数据包时，如果你的心中有一个特定的数据包格式，那么发送会变得得心应手，然而，如果使用KillerZee工具集中的zwreplay工具，那么这种使用Z-Wave数据包发起“重播攻击”的体验就更容易了。

Zwreplay工具接受将一个libpcap数据包捕获文件作为输入参数，然后Zwreplay工具会重新发送数据包中的每一个数据类数据包中的有效载荷内容。这种技术在Z-Wave网络中主要用于实验，或是实验随后的数据包捕获能力，或是作为一个自动重复发起攻击状态的机制。

在这个例子中，我们从Z-Wave网络中捕获到10个数据包，并将捕获到的这些数据包保存到experiment.pcap文件中。接下来，我们使用zwreplay工具，转发每个数据包中的有效载荷的内容，在每两个相邻数据包的发送之间有一个1秒的时间间隔。

要评价这种类型的攻击所造成的影响，你需要捕获一些数据包并“重播”一下，然后观察目标Z-Wave设备的行为。例如，把温度计设置为恒温，向其发送“降低1度”的指令，然后观察随着每个重播数据包的发送，该温度计的设定温度是不是持续降下来了。如果你从捕获数据包的文件中找到一个特定的数据包，然后你想将这个数据与其他剩余的数据包隔离开，那么你只需要使用Wireshark工具集中的tshark工具就可以将所选的这一个或几个特定的数据包单独再生成一个新的数据包捕获文件。在下面的示例中，我们就从原始捕获的数据包文件中提取出帧顺序号为5的那个数据包帧，并将该数据包保存到一个单独的数据包捕获文件中。其操作命令格式的效果如下：

使用KillerZee工具可以完成注入任意数据包的能力，攻击者就有机会采取特定的数据帧来完成一个想要的行动，并由简单的工具自动化完成。接下来，我们看两个例子，这两个例子所用的工具都是KillerZee项目中所使用的工具。

通过注入控制Z-Wave电灯开关

通过前面Z-Wave数据包捕获和重播攻击的试验，我们可以识别和评估Z-Wave攻击所造成的影响。攻击的适用性可能会因不同生产厂家的产品不同，而差异巨大。比如，对一个供应商未使用加密的产品的攻击，并不能用于另一个供应商使用加密了的产品，但在很多情况下，对前一种产品的攻击，总还是能用在对其他产品的攻击上。

Z-Wave产品中一个常见的应用就是远程打开和关闭电源插座，其实物如图14-17所示。

图14-17　远程打开和关闭电源插座

这些设备实现COMMAND_CLASS_SWITCH_ALL的功能，使用一个单一的Z-Wave数据包就可以打开插座开关，或关闭插座开关。只要知道这个插座所在网络中的HomeID，那么使用KillerZee工具集中的kzpowerdown工具就可以产生强制关闭电源的事件，其操作流程及效果如下所示：

在这个例子中，当有用户通过合法的Z-Wave设备“打开”这个插座的命令时，我们使用zwdump工具捕获和保存到这个命令的数据包。我们可以从中获取到这个Z-Wave网络的HomeID，随后攻击者可以使用这个HomeID值，向广播地址发送“关闭”的命令。由于命令是广播地址，所以会使这个Z-Wave网络上所有的Z-Wave开关统统断电。上例中的zwpoweroff脚本会不断发送“关闭”信息，所以这时，即使合法用户再使用“打开”命令发送到这些Z-Wave开关上，在“打开”这些开关的时候，攻击脚本仍然会因为继续发送“关闭”命令而使这些电源开关再次“关闭”电源，最终完成实质性攻击。

提示

除了上面的广播方式，你也可以针对某个Z-Wave网络中的特定设备，通过zwpoweroff命令的“-d”参数，指定“目标节点ID”以及目标网络的“HomeID”。

操纵温控计

智能温控计是“智能能源系统”（smart energy system）的一个重要组成器件。通过使用智能温控计，在一些基于电力和其他自然资源的动态定价环境中，这种智能温控计可以根据需要自动地加热或冷却，从而使消费者的能源消耗达到优化。也正是因为这个因素，基于Z-Wave技术的温控计在全球范围内都很流行。

根据测试，我发现许多Z-Wave温控计并不使用Z-Wave的加密或认证机制。这意味着使用这款温控计的Z-Wave设备容易遭受数据包的“注入”攻击，最终让攻击者通过远程操纵该温控计。KillerZee工具集中包含两个工具，可以用于发起针对这个漏洞的攻击。

这款Z-Wave温控计实现COMMAND_CLASS_THERMOSTAT_MODE功能，该功能用来设置温控计的操作模式。一个“控制设备”可以通过发送命令来控制温控计，改变预设将要达到的温度，所改变的值可以是一个或多个数值，例如加热、冷却、只通风、空气干燥，节省加热或冷却，以及更多功能的值。要完成上述操作，攻击者可以使用zwdump工具来捕获和保存这些行为的通信数据包，该命令的格式和执行效果如下所示：

在这个输出中，攻击者可以通过捕获发现一个THERMOSTAT_MODE命令发送到“节点ID”为0x02的设备上，将这个温控计设备设置为“制冷”模式（cooling mode）。攻击者也可以使用KillerZee工具集中的zwthermostatctrl工具将这个温控计的模式设置为“制热”模式（heating mode），其命令格式和执行效果如下所示：

同样的方法，Z-Wave温控计通过COMMAND_CLASS_THERMOSTAT_SETPOINT命令实现控制温控计的温度的功能。在这款温控计上，设定温度是用华氏温度 [11] 表示的（这是作者测试后得出的结论），其分辨级别用0~255来表示。在通过zwthermostatctrl工具设定温控计为“加热”模式以后，攻击者就可以通过zwthermostattemp工具，改变温度到该设备任意支持的数值上。

当温控计接收由攻击者发送来的数据包时，它就会按数据包中的要求调整目标温度，如图14-18所示。通过不停地继续发送该设置数据包，攻击者可以保持对这一指定的温度的设定操作，即使有其他Z-Wave设备，或者是这个设备的主人试图降低所设定的温度，也无法奏效，最终同样可以完成实质性的攻击效果。

图14-18　目的温控计面板上显示所要设置的温度（当前是华氏76度，要设置为华氏95度）

对Z-Wave注入攻击的防御措施

就像Z-Wave侦听所带来的威胁一样，Z-Wave的部署中，如果不使用可选的Z-Wave数据加密和完整性保护机制，那么Z-Wave网络和Z-Wave设备也容易受到“注入”攻击。为了减轻“注入”攻击所带来的威胁，那么只要加密方法可用，就务必要使用加密。然而，事实上，很多产品缺乏安全控制机制，这样它们就难免会遭受到攻击了。

[1] SVN：即subversion的缩写形式，是近年来崛起的版本管理工具。目前，很多开源软件都使用SVN作为代码版本管理软件。——译者注

[2] 中间绝缘橡胶体内部没有任何线路，各引脚也都是完全独立且绝缘的，所以这种直接的物理切割不会有任何电器特性上的影响——译者注

[3] 串口根据其连线方式和电气特性，又可以分为RS232、RS422、RS485三种，这里很显然使用的是RS232的方式，共使用三根线，分别是地线（GND）、发送线（TX）、接收线（RX）。与对方对接的时候，RS232的地线连接对方的地线，RS232的发送线要连对方的接收线，RS232的接收线连接对方的发送线。——译者注

[4] “通用公开授权协议”（General Public License，GPL）是众多软件开放协议中的一种。简单地说，就是符合“GPL许可”的软件都是开源且免费的，只要你的某个软件中使用到了符合“GPL许可”的软件源代码或类库，那么你的软件就必须也开源且免费。GPLv2是其第2版，是在GPL的基础上，在开源且免费的基础上不得加上自己对自己所开发那部分软件进行限制；GPLv3是其第3版，加上了并且参与的硬件也必须公布。——译者注

[5] 根据网络常用的俏皮语（有点像中国的“火星文”）分析，应该是“altas of doom”，意为“死亡之神”。——译者注

[6] 瑞士军刀不同于我们理解的战争中用于拼杀的砍刀，而是一种组合刀具，由于其功能强、质量好而闻名。现在的“瑞士军刀”常指这是一件质量非常好的工具。——译者注

[7] 根据名字猜测，应该是属于加密狗性质的软件。——译者注

[8] 符号链接（symbolic link），又叫“软链接”，是UNIX/Linux上为了克服硬链接的局限性而使用的一种软件方式的逻接，类似于Windows操作系统中的“快捷方式”。——译者注

[9] 本程序所用的两字母国家和地区代码编码规则尚不得而知，不过，可以将ISO国际标准作为一个参考。国际标准的网址是http://userpage.chemie.fu-berlin.de/diverse/doc/ISO_639.html。——译者注

[10] Fuzzing是介于测试工具和黑客工具之间的一种软件自动测试技术。其原理就是通过穷举或随机数的方式，在不断调整各字段数值的前提下，测试系统的稳定性或抗攻击能力。——译者注

[11] 华氏温度即“Fahrenheit temperature scale”，表示符号为℉，是由德国人华伦海特制定的，规定为一定浓度的盐水凝固时的温度定为0℉，把纯水的冰点定为32℉，把标准大气压下水的沸点温度定为212℉，中间分为180等份，每一等份代表1度。华氏温度向摄氏温度转换的公式为℃=(°F-32)/1.8，根据这一公式，本例中温控计华氏[0～255]对应的摄氏温度范围是[-17.8～123.9]，下面例子中所要设置的华氏95度，对应的摄氏温度是35度，而图14-18中的华氏76度，对应的摄氏温度是24.4度。——译者注

14.3　本章小结

就像任何其他无线协议一样，当厂商不愿意采取必要的安全措施来保护协议完整性的时候，也正是该协议安全漏洞百出的时候。Z-Wave技术同样存在这样的问题，因而也有漏洞可以被黑客所利用。不幸的是，对于消费者，在Z-Wave产品中缺乏安全性的这一状态并没有被产品的设计者广而告之，这让消费者在家庭中或企业里使用Z-Wave产品时，会因缺乏信心而对其安全产生怀疑。

通过对KillerZee项目的介绍，分析人士可以开始探讨Z-Wave网络部署的安全，以便使硬件投资最小化。随着KillerZee设备开始对全球Z-Wave频段的支持，该设备也开始面向国际社会提供支持了，目前已对Z-Wave网络的多个部署环节都提供必要的检测和评估工具。随着KillerZee项目逐渐发展成熟，相信KillerZee设备会对加密的Z-Wave网络上进行安全评估的方法提供额外的支持，也会对这种日益增长的无线网络技术提供一种探索的选择和安全的验证。