密码的载体是认证系统,密码破解实际上指的是对认证系统的破解。密码认证系统如图2.1所示。
图2.1 密码认证系统图
一套密码认证系统由认证模块、系统功能模块、数据库三部分组成。其中的认证模块负责接收用户输入的密码,对用户输入的密码进行加密,或对数据库中事先保存的密码进行解密,然后将二者进行比较,如果一致则通过认证,随后用户“通过”认证系统进入系统功能模块。数据库是一个“广义”的数据库,只要能保存密码,则小到一个程序中的变量,大到一个专业数据库中的一个记录,都可以称为数据库。系统功能模块与认证系统直接相关,通过认证则可以使用相应的模块。之所以将系统功能模块归为认证系统的一部分,是因为很多系统功能模块是依赖于密码本身进行加密的。
在破解方式中,绕过式破解、修改式破解、系统间破解、暴力破解都是针对某具体密码的破解方式;撒网式破解、撞库式破解是针对集体密码的一种破解方式;嗅探式破解则取决于攻击点的位置。
绕过式破解的原理非常简单,其实就是通过设置错误、后门使密码认证机制得到许可,甚至绕过整个密码认证系统。绕过的方式也多种多样,完全取决于不同的软件本身,并且与某一软件的版本紧密相关。
在绕过机制中最常见的是万能密码(又称“后门”),例如一些主机开机密码中有一些万能密码。有了万能密码,就可以在不知道实际密码的前提下,直接通过万能密码进入系统。
例如,“Award BIOS”主板的通用密码为j256、LKWPPETER、wantgirl、Ebbb、Syxz、aLLy、AWARD?SW、AWARD_SW、j262、HLT、SER、SKY_FOX、BIOSTAR、ALFAROME、lkwpeter、589721、awkard、h996、CONCAT、589589。“AMI BIOS”主板的通用密码为AMI、BIOS、PASSWORD、HEWITT RAND、AMI_SW、LKWPETER、A.M.I。不过,上述数据多来自于网友的总结,多出现在一些较老(5年前)的主板上,在新式的主板上并不一定有效。早期的文字编辑软件WPS无论设置什么密码,都可以通过输入Ctrl+QIUBOJUN(“裘伯君”是当前WPS的设计者)进入其系统。
在B/S架构中,访问对网页采用的是URL(Uniform Resource Locator,统一资源定位)方式,URL的完整格式是:
关于HTTP协议的详细内容请参考RFC 2616。在该格式中,“文件名”及其之后的部分就是对方服务器上确切的文件,以及该文件所附带的参数。
在正常情况下,凡是需要认证的网页在用户认证成功时,都会获得一个Session(会话),之后的网页凭借当前的用户有没有Session就知道他有没有通过认证,对于没有通过认证的,则显示“当前页面已过期”,对于已通过认证的,则可以进行之后的各项操作。
然而,有很多网站在制作时,有时会因为缺少Session机制而导致用户只要根据URL就可以访问所有网页,这等于一个有门有锁的院子,却没有院墙,其门锁被直接绕过,其安全性不言而喻。
Windows固然有一套完整的密码认证体系,却只在你将Windows作为一套操作系统时有效。若你只是将其视为一个硬盘,则Windows认证系统就土崩瓦解了。也就是说,无论你的密码设置得多复杂,系统多安全,若他人将你的硬盘取出来,加上硬盘的USB接口后作为一个系统硬盘使用;或者直接放入电脑中作为非系统硬盘使用,那么在其Windows系统正常启动后,你的Windows系统则失效,变成了他人的本地磁盘盘符,对于存储在上面的文件,自然是随意存取的。
如果能确定密码的位置,那么还可以通过修改密码对系统进行破解。
替换法就是用已知原密码的加密信息覆盖未知原密码的加密信息,从而将未知密码设置为已知密码。该方式看似简单,实际上极具实用性。
例如,现在互联网上有很多主页空间和论坛使用的是直接从网上下载的空间和论坛模板,这些模板有很多是免费的,任何人都可以自由下载,所以黑客也可以下载一份,在自己的电脑上也创建一套空间或论坛,然后以管理员的身份设置密码,随后打开数据库,就可以找到当前所设密码加密后的密文。黑客一旦有机会获得了某个采用相同模板空间或论坛数据库的网站的写入权限,则可以把这个加密后的密码写入数据库中,这意味着对方当前的管理员的密码已变成了其设置的密码了。
再如,某个程序正常运行的前提是运行该程序的主机网卡MAC地址为唯一指定地址。各网卡的硬件厂商在生产之前需要经国际MAC统一分配地址,获取一段地址后才会生产,所以MAC地址是网卡的全球唯一地址。然而,Windows为了读取方式的统一,会在板卡安装时一次性读取到注册表,之后则直接从注册表中读取,那么对于这类程序的破解,只要手工把MAC地址改为程序指定的地址即可。
即使对程序一窍不通,我想你也能明白一个简单的逻辑,那就是所有密码认证系统都是:判断用户输入的密码,如果密码对,则转到“同意进入系统的地址”;如果密码不对,则转到“拒绝进入系统的地址”。上面的“转到”其实只是一个电脑指令,即“跳转+要转到的地址”。那么,如果有可能将上面的“拒绝进入系统的地址”换成“同意进入系统的地址”,则意味着无论输入什么密码,系统都会正常进入系统。只是这种方式理论上简单,实际则比较复杂,涉及反向工程、截获断点、解密、程序解锁等多项技术。
如果某黑客发现某个论坛使用某公司的上网系统,于是也下载并在自己的电脑上安装了一份。随后发现对方的系统有“注入式”漏洞,于是不能采用密码替换法更改密码。但是该黑客发现论坛采用了ASP+MDB数据库,于是就用系统默认的MDB文件名到那个论坛上试了一试,居然可以将其MDB数据库直接下载到本地。这意味着,黑客拿到了论坛上的所有信息和加了密的密码,现在,黑客可以轻松地修改本地所有用户的密码,然后在本地查看所有人的个人信息。
在这里,由上面仅仅修改密码变成了换掉整个系统,至于黑客看到的信息是从论坛泄露的,还是自己从本地读取的,谁还会在乎呢?
系统间破解法利用的是两个子系统之间相互信任的关系,在其中一个子系统中产生一个对于另一个子系统合法但不符合其本意的数据,导致另一个系统产生曲解,最终被整个破解。
有些系统在设计时出于各种因素考虑,会设计多个安全环节。这些环节之间互不通信,最终却相互矛盾,甚至有可能修改其中一个环节而导致另一个环节整体性被破坏。
以CMOS为例,在CMOS中有两个环节,其中一个环节是在设置密码时,将用户输入的密码通过一定的加密算法加密后存储在指定的位置,如果有人向这个位置写入其他数字,则意味着密码也跟着变成了其他密码。从这个角度来看,向该位置写入数字是很危险的事情。CMOS中的另一个环节是,系统有一个校验和的操作,即将CMOS中指定的数据通过一定的算法运算后,与特定位置的数据进行比较,如果相同,则认为数据正确,否则认为数据出错,需要重新设定。
根据上述两个环节我们突然发现,不管系统中有什么密码,我们只需要向其中任意一个位置写入任意一个随机数,虽然密码因之而改变,但是校验和在判断到运算出错后,反而认为数据出错,在不顾原来的密码是多少的情况下,要求用户重新设置新的密码。
这意味着,要想破解CMOS中的密码,一个简单的方式就是向其随便写入一个数据,则该密码系统就被轻松地破解了。
注入式主要是利用系统中某一模块或组件的设计约定、语法约定等特点,采用组成新的合法设计、合法语法,获得新的解释来进行攻击。由于新的解释中有一部分内容根本不是程序设计者的原意,是被攻击者在原意基础上新“注入”的,所以被称为“注入式攻击”。
当前最流行的注入式攻击是“SQL注入式攻击”,其原理要讲清,需要说明SQL是什么。SQL(Structured Query Language,结构化查询语言)是目前关系数据库的操作标准,几乎所有主流数据库都支持SQL语言,并且每个数据库还根据自己的特点进行了扩充。
例如下面的SQL语句:
该语句将查出数据库表T_USER中字段username为“张三”的所有记录。如果语句中的“张三”不是固定的常量,而是用户输入的内容,则通常情况下,该语句将会查出数据库的T_USER表中,username为所输入的那个人的所有记录。但如果用户输入的内容是“1’or’1’=’1”(全角双引号不属于输入内容,后同),则SQL语句就变成了:
因为“'1'='1'”是永真式(即恒等于TRUE的表达式),而与永真式进行“逻辑或(OR)”操作的,还是永真式。所以这时本应是条件表达式的SQL语句,变成了一个永真式,从而所列的不再是username为“1”的这个记录内容,而是T_USER表中记录的所有内容。
在实际应用中,该现象是普遍存在的,几乎涉及所有程序,只是该系统是否构成攻击主要看具体情况,因此更多地把这种问题归为程序设计的BUG(是指程序设计的错误),而没有列为攻击方式。近几年,基于B/S的架构随着网络的普及而大行其道,这种攻击方式被广泛使用,并且很有市场。
生活中,这种注入式攻击也很容易找到原型。某单位为了安全,给所有员工都配了员工卡,该卡既可以进大院的大门,也可进办公区的各办公室。为了外来人的方便,对通过审核的外来人也会配发临时卡,但该卡只能进大门,不能进各办公室。而为了他们也能进入各办公室,约定所有员工可以给进入大门的外来人开门。
事实上,这套系统存在严重的注入式漏洞。某单位先有两个人以送快递为名申请了两张临时证,然后在进入大门后,一人留在大门内,另一个人带两张卡出来,并带第三个人进入,随后这两个人带卡出了大门以避嫌。而那第三个进入的人只要敲门,便可以随便进入各个办公室,并且,由于没有认证,他做了坏事也无从查起。很显然,这个人是通过上述漏洞“注入”到大门和各办公室的。
对于上述SQL注入式漏洞,其实并不难防御,只要将用户输入的内容进行检查(例如输入内容不能有单引号),就可以避免。
以实际的例子来说明什么是穷举式破解,现在的人旅行时常喜欢带上一个箱子装衣物,而箱子上只配备一个密码锁。该密码锁由三个转轮组成,每一个转轮分别有0~9这10个数字。拨动三个转轮,只要将三个转轮的数字各自指向特定的值,锁就可以打开。而穷举法就是按一定的顺序依次转动三个转轮组成所有可能值,其中必然有一个值是可以打开该锁的。
虽然有些系统针对穷举式破解提出了一些预防方案,比如,有些系统在判断对方连续若干次出错后,会“冻结”出错的账户,但这种方案会导致对方的DoS(拒绝服务)攻击,即通过几个简单的连接就使正常用户无法使用,因此真正采用冻结用户方案的系统并不是很多。
理论上,穷举式破解是一种近乎“放之四海而皆准”的攻击方式,但如此“完美”的通用破解方式,其实并不总是有效的。假设密码穷举时,连接对方时的速度均匀,并且不会被中断,则按照等概率来分析,穷举成功的时间应该是穷举一半的可能性密码所耗费的时间。
证明:将所有可能的密码按任意顺序排成一个数列,假设总共有n个密码。由于是等概率的,所以是不管是第几个,其概率都是1/n。假设真正的密码是第1个,但这种可能性是1/n,则猜的次数是1,即花的时间也是1个单位,同样,假设真正的密码是第2个,但这种可能性是1/n,则猜的次数是2,即花的时间也是2个单位。以次类推,最后,假设真正的密码是第n个,但这种可能性是1/n,则猜的次数是n,即花的时间也是n个单位。最后,整个时间=1/n+2/n+…n/n=(1+2+…+n)/n=(1+n)*n/2/n=(1+n)/2,并且,平均时间=整个时间/n=1/2n+1/2,当n比较大时,该值近似为1/2。
所有可能的密码共同组成穷举空间。不难算出,上面的密码锁的穷举空间是000~999这1000种可能,那么电脑密码的穷举空间是多少呢?
首先,密码是通过键盘手工输入的,可输入的字符又根据其意义,可以分为四组,分别是“大写字母”“小写字母”“数字”“其他”。之所以要人为地把大写字母和小写字母分成两个组,是因为在实际使用时二者的密码使用概率相差极大,见表2.1。
表2.1 可通过键盘输入的字符分类列表
其次,再来分析密码的位数,假设确切知道用户输入的密码有n位,则由这n位密码所生成的所有可能密码(称为排列空间)位数和遍历一半空间所用时间见表2.2~表2.4。
表2.2 全集密码穷举一半空间所耗时间表
续表
表2.3 全小写密码穷举一半空间所耗时间表
表2.4 全数字密码穷举一半空间所耗时间表
续表
在实际使用中,绝大多数人的密码只由小写字母字符集或数字字符集(如银行的密码系统通常由和电话机按键一样定制的键盘组成)组成,即使有人使用两个字符集,也多半先全是一个字符集,后全是另一个字符集,例如“小写字母+数字”这种方式最多。这时,不难发现,由于字符集变得单一,所以穷举空间和穷举时间大为减少,这也正是很多系统比想象中更容易破解的一个重要原因。
穷举式破解最大的缺点是一般密码系统的穷举空间太大,并且每个密码都有时效性,破解时间很客观。不过,我们发现,密码有个很重要的特性,就是容易让人记住。根据这个特点并分析我们平时的思维习惯,可发现一些密码的规律,并将这些规律的全集或其中常用的部分作为一个密码列表,这就是“密码字典”(Dictionary),简称“字典”。
密码字典的作用就是减少穷举时总的穷举空间,因而密码字典中密码范围的选择直接决定了密码字典的破解成功率,为此,黑客常将密码进行分类,以避免明知对方的密码是由一系列数字组成的,而使用人名字典,做无用功。
(1)英文单词
英文单词有多少个?有人说大约75万个。其实,这个数字并不重要,重要的是其绝大多数使用的是人们在高中或本科学习时感觉不错的某些词。因而这种字典通常只要找大学四级或六级词汇表就足够了,大约有5500个英文单词。
(2)外国人名字典
总数有800多个。详细的还可以分为男人名、女人名,甚至还有首字母大小写之分。不过,不管怎么分,充其量不过1600多个。
(3)中国人名字典
中国汉字约有11万个,由于密码不能用汉字,因而很多人在用名字作密码时,采用的是没有声调的拼音形式,汉字的拼音只有518个,所以中国三个字人名发音的总数是518 3 =138,991,832。两个字人名发音的总数是518 2 =260,324个。
(4)生日字典
显然,以年为单位的生日为366个。不过,有些人对于小于10的月或日,喜欢加一个前缀“0”,有些则不喜欢,如果都包括则约为400个。有些人写年份时,喜欢带上世纪,有些人则不喜欢,再算上无非有800个左右。有资料显示,有很多网民尤其是中老年网民,其网络注册信息中的很多密码是用生日表示的。
很显然,良好的字典不仅要避免一些垃圾数据(如生日字典中出现2月31日),更要将精力放在内容的顺序上,好的顺序意味着及早猜中,可以大大减少破解的总时间。例如,中国人名字典中,第一个字是姓氏,将一些大姓的发音排在前面,也能减少总的搜索次数,缩短搜索时间。
很多黑客书都会提到“密码字典”,但密码字典长的是啥模样恐怕就不是每个人都见过的了。实际上,密码字典是一个字符串表,表中的每一项都是可以作为密码的字符串,但并不需要对该字符串做解释,因而密码字典并不是真正的字典,更像一个词汇列表。图2.2就是两个典型密码字典的“庐山真面目”。另外,密码字典中的词汇顺序并不一定要像普通字典可以按使用频率由高到低排列,以缩短破解时间。
图2.2 英文人名字典(在)和80年代生日字典(右)实例图
嗅探式破解,就是通过网络监听程序,监听网络上带有密码的数据包,然后从数据包中找到密码。该技术是黑客最常用的手法之一,虽然其原理和应用对密码系统的破坏性较大,却与密码算法的“破解”关系不大。
撒网式破解原理非常简单,当你获得一个系统的访问权,并知道了所有的用户名时(这对于系统密码加密的情况下,是很普遍的),可先假设密码中存在“脆弱的短板”,其密码是“12345”(或与用户名相同),于是就一个用户、一个用户地试下去,这种方法从来不保证“指哪打哪”,也从不保证“贼不走空”,只要有一个能成功,就能入侵成功,不成功,也不过是换下一个目标。
近几年常见的密码排行榜:123456、password、12345678、qwerty、abc123、123456789、111111、1234567、iloveyou、123123、admin、1234567890。具有中国特色的还有:666666、888888、000000、5201314(谐音:我爱你一生一世)、qq123456、woaini、buzhidao。一些系统为了达到保密的要求,限定了密码的最少位数,这无疑增大了记性的难度,反而在密码位数增加的前提下减少了密码的复杂度。如很多单位的Wi-Fi密码是:1234567890、qwertyuiop、asdfghjkl、zxcvbnm、qweasdzxc。一些看似复杂的密码,也常在黑客字典中排在前列,如a1b2c3、p@ssword。再如无线Wi-Fi的密码有:qwertyuiop[]\、asdfghjkl;’、zxcvbnm,./、~!@#$%^&*()_+(这是Shift+`1234567890-+)。
如果上面的密码中有你们单位的Wi-Fi密码和主机密码,那么你很可能会首先成为撒网式破解的突破口。
撞库式破解由来已久,这里的“撞”并没有“暴力”的意思,反而是“撞大运”的意思。其原理也非常简单:假设某人在多个系统中使用了相同的用户名和密码。因此,只要黑客成功破解了一套系统,就可以利用获得的用户名和密码再到另一个系统中进行尝试,成功率往往很高。
社会学攻击是利用人的社会经验、思维惯性或已掌握的间接条件进行攻击。这种攻击方式虽不总是有效的,却往往出奇制胜。
笔者有一次无意中看到某同事在输入密码时快速连敲很多按键,就开玩笑地问:“你的密码怎么这么长呀?”他则得意地答道:“我的密码有31个字母,我就不信哪个黑客能破解!”我听过后的第一感觉就是,这么长的密码怎么记呀?能记住的一定是他非常熟悉的一串符号,于是就开玩笑地说道:“这么长的密码,唯一的可能性就是你和你女朋友的姓名拼音前后相连。”他笑而不语。不过之后看到他所输入的密码长度锐减。后来发现他和他女朋友的姓名拼音总长还真恰好31个拼音字母。