相比于“有线等效保密协议”(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个小写字母总数为268 ,1天的秒数是(3600×24),所以两个GPU总运算时间为:268 /(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亿(108 )个PIN码后AP接入点仍然可以正常地受理新的认证请求。那么以这样的速度,要想试完所有可能的PIN码中的一半,你仍然需要大约578天(或一年半)。
注:因为所有的PIN码都是等概率的,所以破解的时候,可能第一个你猜的PIN码就是路由器上的PIN码,也可能最后一个才是,所以从概率的角度来看,一般来说,猜对的平均次数是所有PIN码所需时间的一半。由于PIN码是8位数字组成,所以共有108
个,1秒1个,1天3600×24秒,所以算一半约需要108
/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)。因此,在上面校验和参与的情况下,暴力破解的次数甚至不会到达107 。而且被分为两次独立的PIN认证,攻击者也只需要分暴力破解这两次独立的PIN码即可。其中第一次暴力破解的次数为104 次,第二次暴力破解的次数103 次。所以攻击的总数锐减为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下,右击某个程序,然后在弹出的菜单上选择“以管理员身份运行”一样。——译者注