第3章口令攻击和防护





3.1概述
身份认证是验证主体的真实身份与其所声称的身份是否相符的过程,它是信息系统的第一道安全防线,如果身份认证系统被攻破,那么信息系统其他所有安全措施将形同虚设,因此,身份认证是信息系统其他安全机制的基础。
口令(Password)俗称密码,是由数字、字母等构成的一个字符串,是只有用户自己和计算机信息系统知道的秘密信息,基于口令的认证简单易行,是最常用的身份认证方式。口令攻击是最易被攻击者考虑的攻击途径,攻击者会采用多种方法试图猜出用户设置的口令,尤其是猜测出管理员的口令以进入系统实施进一步破坏。从安全的角度来说,对口令攻击进行防范、在口令攻击发生时进行告警是安全防护的一个重要内容。
3.2口令攻击技术
3.2.1Windows系统下的口令存储

口令认证机制是Windows系列操作系统提供的最基本的身份认证方式。Windows操作系统口令采用两种加密算法加密后存储在SAM(Security Account Manager)数据库中,一般位于$SystemRoot/System32/Config/目录下,每个用户信息格式形如: Administrator:500:C8825DB10F2590EAAAD3B435B51404EE:683020925C5D8569C23AA724774CE6CC:::,其中Administrator为用户名,500为RID号,C8825DB10F2590EAAAD3B435B51404EE为口令经LMHash算法加密后的值,683020925C5D8569C23AA724774CE6CC为口令经NTLMHash算法加密后的值。
LMHash算法过程如下。
(1)  将用户口令字中的小写字母改写成大写字母。当口令长度大于14个字符时只取14个,当口令长度不足14个时用空格(ASCII码值0X20)补足为14个字符。
(2) 将用户口令所确定的14个字符按前7个和后7个分为两组,记为K1和K2。
(3) 分别以K1和K2为密钥,用DES算法对固定明文P0加密,产生两个8字节的密文C1、C2。其中P0为魔术字符串"KGS!@#$%",转化为十六进制值为0X4843532140232425。
(4) 将两个8字节密文C1、C2连接为16字节的散列值。
LM Hash算法采用了比较弱的DES加密算法,且不管用户设置的口令有多长,算法仅对前14个字符进行加密,因而采用增加口令长度、变换大小写等方法对增强口令安全无用,这种算法比较容易被破解,不够安全。为了保持向后兼容性,Windows Vista之前的版本仍保留了这种加密机制。此后微软又提出了新的口令加密机制NTLM Hash,其加密过程是将用户口令转换成Unicode编码,再利用MD4算法进行加密,就得到了最后的NTLM Hash值。NTLM Hash算法采用了较安全的单向加密算法MD4,且用户可通过增加口令长度、变换字母大小写等方法增强口令安全,相对于LM Hash算法来说,安全性更强,Windows Vista之后的Windows系统中仅存储NTLM Hash算法加密的密文。
3.2.2Linux系统下的口令存储
Linux是类Unix系统,基本沿用Unix中的安全机制。Linux中所有与用户相关的信息存储在系统中的/etc/passwd文件中,该文件是一个典型的数据库文件,每一行都由7个部分组成,每两个部分之间用冒号分隔开,包含用户的登录名、经过加密的口令等,其基本格式为: 

username: password:uid:gid:comments:directory:shell

这7个部分分别描述了以下信息: 用户名、口令、用户ID、用户组ID、用户描述、用户主目录、用户的登录Shell,下面分别描述。
(1) 用户名: 用户的登录名。
(2) 口令: 用户的口令,以加密形式存放。该域值如为x表示口令存储在/etc/shadow中。
(3) 用户ID(UID): 系统内部以UID标识用户,范围为0~32767之间的整数。
(4) 用户组ID(GID): 标志用户所在组的编号。将用户分组管理是Unix类操作系统对权限管理的一种有效方式。假设有一类用户都要赋予某个相同的权限,对用户分别授权将会很复杂,但如果把这些用户都放入一个组中,再给组授权,就容易多了。一个用户可以属于多个不同的组。组的名称和信息放在另一个系统文件/etc/group中,与用户标识符一样,GID的范围也是0~32767之间的整数。
(5) 用户描述: 这个域中记录的是用户本人的一些情况,如用户名称、电话和地址等。该域的作用随着系统功能的增强,已经失去了原来的意义。一般情况下,约定该域存放用户的基本信息,也有的系统不需要该域。
(6) 用户主目录: 这个域用来指定用户的主目录(home),当用户成功进入系统后,他就会处于自己的用户主目录下。
一般情况下,管理员将在一个特定的目录里依次建立各个用户的主目录,目录名一般就是用户的登录名。用户对自己的主目录有完全控制的权限,其他用户对该目录的权限需要管理员手动分配。如果没有指定用户的主目录,用户登录时将可能被系统拒绝或获得对根目录的访问权,这是非常危险的。
(7) 用户的登录Shell: Shell程序是一个命令行解释器,它能够读取用户输入命令,并将执行结果返回给用户,实现用户与操作系统的交互,它是用户进程的父进程,用户进程多由Shell程序来调用执行。在Unix系统中有很多Shell程序,如/bin/sh、/bin/csh、/bin/ksh等,每种Shell程序都具有不同的特点,但基本功能是一样的。
在Linux中,用户登录时通常要求输入用户名、口令信息,用户名是标识,它告诉计算机该用户是谁,而口令是确认数据。Linux使用改进的DES算法(通过调用crypt()函数实现)对其加密,并将结果与存储在数据库中的加密用户口令进行比较,若两者匹配,则说明该用户为合法用户,否则为非法用户。
为了防止口令被非授权用户盗用,对其设置应以复杂、不可猜测为标准。一个好的口令应该满足长度和复杂度要求,并且定期更换,通常,口令以加密的形式表示,由于/etc/passwd对任何用户可读,常成为口令攻击的目标,在后期的Unix版本以及所有Linux版本中,引入了影子文件的概念,将密码单独存放在/etc/shadow中,而原来/etc/passwd文件中存放口令的域用x来标记。文件/etc/shadow只对root用户拥有读权,对普通用户不可读,以进一步增强口令的安全。
3.2.3口令攻击的常用方法
口令攻击常用的方法包括字典攻击、暴力破解、混合破解。
字典攻击是一种典型的网络攻击手段,利用字典库中的数据不断进行用户名和口令的反复试探。一般攻击者都拥有自己的攻击字典,其中包括常用的词、词组、数字及其组合等,并在攻击过程中不断充实、丰富自己的字典库,攻击者之间经常也会交换各自的字典库。
暴力破解是让计算机尝试所有可能的口令,最终达到破解口令的目的。
混合破解介于字典破解和暴力破解之间,字典攻击只能发现字典库中的单词口令,暴力破解虽然一定能破解口令,但速度慢、破解时间长。混合破解综合了字典破解和暴力破解的优缺点,使用字典单词并以在单词尾部串接几个字母和数字的方法来反复试探用户名和口令,最终找到正确的口令。
按口令破解的时机,口令破解又分为在线和离线两种方式。在线破解是指攻击者在口令登录提示框中输入不同的随机口令来猜测正确的口令。目前,大多数账户都会设置一个账户锁定阈值(比如5次),当不成功登录次数超过阈值后就不允许登录,这样就可以锁定攻击者。因为在线猜测的局限性,今天大多数口令攻击采用离线破解的方式。利用离线破解方法,攻击者窃取口令密文文件(通常为摘要文件),破解时可以采用字典攻击或暴力破解方法,依次产生口令,然后生成这些口令的摘要(称为候选口令),将这些摘要与窃取到的摘要值进行比对,如果找到匹配项,则攻击者就能知道与摘要匹配的口令了,这种破解方法的效率比较低。改进方法是可以预先计算各口令的摘要值记录在数据文件中,在需要时直接调用数据文件破解,可以大幅度提高破解的效率,事先构造的Hash摘要数据文件被称为Table表,最有名的就是Rainbow Table,也即彩虹表,后续实验中会依次采用字典攻击、暴力破解和彩虹表实施口令破解。
3.3Windows系统环境下的口令破解实验
3.3.1实验目的

掌握Windows系统环境下的口令散列的提取方法; 掌握利用LC6进行口令破解的方法; 理解设置复杂口令原则的必要性。
3.3.2实验内容及环境
1. 实验内容

本实验主要通过LC6(L0phtCrack 6)利用字典攻击、暴力破解实现对本地Windows系统的口令破解,并通过设置不同复杂度的口令来验证口令复杂度对口令破解难度的影响。
2. 实验环境
主流配置计算机一台,安装Windows 7操作系统、LC6软件和PWDUMP 7软件。
LC6是一款口令破解工具,管理员也可以使用该工具检测用户设置的口令是否安全,被普遍认为是当前最好、最快的Windows系统管理员账号口令破解工具。
PWDUMP是一款Windows系统环境下的密码破解和恢复辅助工具。它可以将Windows系统环境下的口令散列,包括NTLM和LM口令散列从SAM文件中提取出来,并存储在指定的文件中。
3.3.3实验步骤
1.  安装并运行LC6

正确安装LC6软件后运行LC6,出现如图3.1所示的LC6向导,向导通过5个步骤完成口令破解相关参数的设置。



图3.1LC6向导


2. 以默认设置破解本地账户口令
向导中的默认设置是以字典攻击方式破解本地账户口令信息,按照默认设置破解口令结果如图3.2所示,界面显示当前系统中的活动用户lenovo的口令为空。



图3.2破解系统账户口令


3. 添加测试用户
运行cmd.exe,用net user命令给系统添加一个测试用户,并为该用户设置一个纯数字的口令,如图3.3所示。



图3.3为系统添加测试用户


4. 用PWDUMP导出口令散列
在命令行里运行PWDUMP工具,将导出的Windows系统SAM文件内容保存在1.txt文档中,如图3.4所示。



图3.4用PWDUMP导出口令散列


5.  查看SAM文件内容
打开C:\PWDUMP 7\1.txt,可以看到PWDUMP 7将Windows系统环境下的口令散列从SAM文件中提取出来了,由于Windows vista之后的版本不再存储LM加密的密文信息,所以原来存储LM密文的用户信息的第三个域均为空,显示为NO PASSWORD,如图3.5所示。



图3.5导出的口令散列内容


6. 设置口令破解方式
在LC6主界面上单击Session Options图标,出现如图3.6所示的界面,该界面主要用于设置口令破解参数,默认情况下采用字典攻击方式破解LM口令,由于在Windows 7操作系统中不存储LM口令,因而需要勾选Crack NTLM Passwords选项,设置为采用字典攻击方式破解NTLM口令,单击Dictionary图标,可以编辑查看字典文件。


7. 加载破解目标
L6软件启动时就已经为用户建立了一个默认的会话,在此基础上单击Import Hashes图标,加载要破解的系统信息,在选项卡Import from file中选择From PWDUMP,单击右侧的Browse按钮,选择PWDUMP文件,这里选择刚刚利用PWDUMP工具导出的1.txt文件,设置完成后,单击OK按钮,完成口令文件的导入,如图3.7所示。

8.  实施破解
单击工具栏上的Begin图标开始破解,可以发现test用户的口令123456被成功破解,如图3.8所示。
修改test用户的口令,设置为A123DF,按照刚才的步骤重新加载口令文件,采用字典攻击的方式进行攻击,可以看到无法攻击成功,原因是字典文件中不包含口令A123DF,如果在字典中加入该口令,则可破解口令。




图3.6设置口令破解方式





图3.7设置口令文件导入方式





图3.8本地用户口令被破解




9.  暴力破解
打开Auditing Options For This Session界面,在Brute Force Crack栏中勾选Enabled,在右侧的Character Set栏中设置暴力破解方式,设置完成后单击OK按钮,如图3.9所示。



图3.9设置口令破解方式为暴力破解


单击主界面工具栏上的Begin图标开始破解,等待一段时间可以看到口令被破解。设置不同位数和字符集的口令,以观察利用暴力破解方法进行口令猜测的时间。
3.4采用彩虹表进行口令破解实验
3.4.1实验目的

理解彩虹表(Rainbow Table)口令破解的原理,掌握利用Ophcrack工具进行口令提取、散列表加载和口令破解的方法。
3.4.2实验内容及环境
1. 实验内容

本实验通过使用开源彩虹表破解工具Ophcrack对Windows系统环境下的口令进行破解。
2. 实验环境
主流配置计算机一台,安装Windows 7操作系统、Ophcrack软件和彩虹表文件vista_proba_free.zip。
彩虹表是一个庞大的、针对各种可能的字母组合预先计算好的哈希值的集合,其各种算法都有,可以快速破解各种密码。越是复杂的密码,需要的彩虹表就越大,主流彩虹表的大小都是在100GB以上,本实验采用的是600MB的彩虹表,它只能破解较为简单的口令,破解复杂的口令需要下载更大的彩虹表。
Ophcrack是一个使用彩虹表来破解Windows操作系统口令散列的程序,它是基于GPL发布的开源程序,利用内嵌的工具可以提取Windows SAM文件的散列值进行破解。对于LM(LAN Manager)散列,使用免费的彩虹表,可以在短至几秒内破解最多14个英文字母的口令,成功率达99.9%。对于Windows Vista之后的系统,SAM中已经不再存储LM散列,而只存储NTLM散列,从Ophcrack2.3版开始可以破解NTLM散列。对于NTLM散列,一般的彩虹表破解能力大大降低,本实验仅针对7位小写字母组成的口令,使用该工具可以在较短时间内破解。
3.4.3实验步骤
1.  添加账户

在系统中运行cmd.exe,用net user命令修改test用户的口令为7位小写字母口令,如图3.10所示。



图3.10添加测试用户


2.  安装运行Ophcrack
按默认配置安装Ophcrack,运行ophcrack.exe,主界面如图3.11所示。



图3.11Ophcrack主界面


3.  安装彩虹表
将彩虹表文件vista_proba_free.zip解压,打开Ophcrack,单击工具栏上的Tables按钮,进入彩虹表安装对话框,如图3.12所示,在Tables栏中选择Vista probabilistic free,单击Install按钮,选择彩虹表文件vista_proba_free路径,单击OK按钮。

4.  选择散列文件加载方式
在Ophcrack主界面上,单击load图标,在其下拉菜单中选择Local SAM with samdump2散列加载方式,如图3.13所示。
从SAM文件中提取口令散列并加载,如图3.14所示。




图3.12安装彩虹表





图3.13选择口令散列加载方式







图3.14加载口令散列


5. 利用彩虹表进行口令破解
在图3.14中单击Crack图标,用彩虹表进行口令破解。在破解过程中可以单击Statistics标签,查看彩虹表的状态,如图3.15所示。



图3.15用彩虹表进行口令破解


6.  口令破解成功
破解结束后可以看到Ophcrack成功破解了用户test的口令,如图3.16所示。请读者设置不同位数和字符集的口令,以观察利用彩虹表进行口令猜测的时间,并记录。



图3.16利用彩虹表成功破解口令


3.5Linux系统口令破解实验
3.5.1实验目的

掌握Linux口令散列的提取方法,掌握使用John the Ripper进行口令破解的方法。
3.5.2实验内容及环境
1. 实验内容

本实验通过使用John the Ripper工具完成对Linux系统环境下的口令散列的破解。需要掌握Linux系统环境下口令散列的提取方法,以及使用John the Ripper进行口令破解的过程。
2. 实验环境
主流配置计算机一台,安装Ubuntu 14.04操作系统和软件John the Ripper 1.8.0。
John the Ripper是一个快速的口令破解工具。该软件支持目前大多数的加密算法,如DES、MD4和MD5等,可用于破解Windows、Linux系统口令。John the Ripper提供了4种破解模式。
1) 简单破解模式(single crack mode)
这种破解模式主要针对用户设置的口令跟用户名相同或只是用户名的简单变形,如某个账号为admin,口令是admin888、admin123等。在使用这种破解模式时,John the Ripper会根据口令文件中的用户名进行破解,并且基于用户名使用多种字词变化规则进行口令猜测,以增加口令破解的成功率。
2) 字典破解模式(wordlist crack mode)
这种破解模式需要用户指定一个字典文件,John the Ripper读取字典中的单词进行破解。John the Ripper自带了一个字典文件password.lst,里面包含了一些经常用来作为口令的单词。
3) 增强破解模式(incremental mode)
也即暴力破解方式,这种方式会自动尝试所有可能的字符组合进行口令破解,破解时间较长。
4) 外挂破解模式(external mode)
在该模式下用户可以使用自己用C语言编写的破解程序进行口令破解。
3.5.3实验步骤
(1) 进入Ubuntu系统,以root用户身份执行Linux命令useradd test,添加test用户,再执行passwd test命令,更改用户口令。为验证暴力破解,可以将口令更改为6位纯数字口令,如图3.17所示。



图3.17添加测试用户


(2) 获取安装包John1.8.0.tar.gz,利用指令tar xvzf解压该压缩包,得到源代码,如图3.18所示。



图3.18解压得到John the Ripper源代码


(3) 进入刚刚解压的目录下,阅读README和DOC目录下的相关帮助文档,了解软件的安装和使用方法。
(4) 进入john1.8.0/src目录,依次执行make; make clean linuxx8664命令,其中linuxx8664是Linux系统类型,可以根据实际情况进行选择,如图3.19所示。



图3.19John the Ripper源代码编译和软件的安装


(5) 编译完成后进入run目录,可以看到该目录下生成了一些可执行文件,如图3.20所示。



图3.20编译完成John the Ripper软件



(6) 查看帮助文档,了解破解命令的使用方式。输入命令: ./unshadow /etc/passwd /etc/shadow>myshadow,将/etc/passwd和/etc/shadow合二为一到文件myshadow中,用于将用户名和加密后的口令存储在一个文件中,如图3.21所示。


图3.21合并/etc/passwd和/etc/shadow


(7) 进入john/run目录下,运行命令开始破解Linux口令文件,前面介绍过John the Ripper支持4种破解模式,我们验证其中的字典破解模式。首先采用系统默认的字典文件password.lst进行破解,如图3.22所示,可以看到运行结果提示当前系统中有3个用户,其中test用户的口令设置比较简单,很容易就破解出来了,其他两个用户的口令无法破解。



图3.22实施字典破解


(8) 请读者在系统默认的字典文件password.lst中增加其他两个用户的口令,重新进行字典攻击,验证是否能破解。
3.6远程服务器的口令破解实验
3.6.1实验目的

掌握对远程服务器口令的字典攻击方法,以及通过查看日志发现口令攻击的方法。
3.6.2实验内容及环境
1. 实验内容

架设FTP服务器,利用远程口令枚举工具进行字典攻击,并通过配置服务器进行日志记录,利用日志分析口令枚举过程。
2. 实验环境
实验拓扑如图3.23所示,实验需要主流配置计算机两台,一台作为FTP服务器,安装Windows 7操作系统和FileZilla Server软件; 另一台作为攻击机,安装Windows 7操作系统和Fscan软件,IP地址设置如图3.23所示。


图3.23实验拓扑图



FileZilla是免费开源的FTP软件,分为客户端版本和服务器版本。FileZilla客户端具有快速、界面清晰、能管理多站点等特点,是一种方便、高效的FTP客户端工具; 而FileZilla Server则是一个小巧并且支持FTP和SFTP的FTP服务器软件。本次实验利用FileZilla 的服务器版本软件快速搭建一个FTP服务器。
Fscan: 是基于命令行的FTP弱口令扫描小工具,其速度非常快,且使用简单。
3.6.3实验步骤
1. 安装FileZilla Server软件

在FTP服务器上安装FileZilla Server软件,安装过程中需要设置安装路径、FTP监听端口,按照默认选项安装完毕后,打开软件,首先进入连接服务器界面,如图3.24所示,输入正确参数后单击OK按钮,进入如图3.25所示的FileZilla Server主界面。


图3.24连接FTP服务器


2.  添加测试用户
在图3.25中依次选择菜单Edit→Users,或单击工具栏的用户图标,进入用户添加界面,如图3.26所示。单击Add按钮,添加用户test,勾选Password选项,输入测试口令。


图3.25FileZilla Server主界面




图3.26用户添加界面


3.  配置破解字典
将ftpscan工具软件复制到攻击机上,在ftpscan目录中,找到文件username.dic和password.dic,为验证口令字典破解过程,将刚创建的FTP用户的用户名和口令分别添加在这两个文件中,如图3.27和图3.28所示。



图3.27在文件username.dic中添加新增用户名信息





图3.28在文件password.dic中添加新增用户口令信息



4.  实施口令破解
在攻击机的命令行界面中,执行命令“ftpscan.exe 192.168.188.8”针对FileZilla FTP服务器进行在线破解,可以看到口令破解成功,如图3.29所示。



图3.29对FileZilla FTP服务器进行口令破解


5. 配置服务器日志记录
在FileZilla FTP服务器主界面,选择Edit→Settings项,打开服务器配置对话框,单击左侧列表框里的Logging,进入日志配置界面,勾选Enable logging to file选项,如图3.30所示。



图3.30配置服务器日志记录


6. 查看日志文件中的口令破解记录
在配置日志选项后,再次从攻击机进行口令破解尝试。进入FileZilla FTP服务器安装目录下的log子目录,默认路径为C:\Program File\FileZilla Server\Logs,打开FileZilla Server.Logs文件,可以看到大量来自同一IP地址的连接尝试记录,如图3.31所示。



图3.31查看日志文件


3.7练习题
(1) 列举一两种本书未介绍的本地口令破解工具,通过实验掌握其使用方法,记录实验过程。
(2) 在3.4节的实验中,由于Windows 7系统不存储LM散列,无法进行针对LM散列的破解实验。请在Windows XP系统环境下安装Ophcrack工具,通过实验体会Ophcrack破解LM散列的难度,并与对NTLM散列的破解难度进行对比。
(3) 在3.6节的实验中,进行FileZilla FTP服务器口令远程破解的同时,利用Wireshark嗅探器,在同一网段进行监听,以查看用户名和口令是否明文发送。
(4) 在Linux中,在默认字典文件中增加系统用户的口令,用John the Ripper的字典攻击方法进行破解,验证是否能破解成功所有用户口令。
(5) 在Linux中,增加一个用户,设置其口令为其用户名的变形,请采用简单(single)破解方法进行破解,验证是否能够成功破解。