Kali渗透测试:散列密码破解
某些网站的安全机制设置有缺陷,导致自身的关键数据库被渗透。很多用户在不同网站使用的是相同的用户名和密码,因此黑客可以通过获取通过获取用户在A网站的用户名和密码从而尝试登录B网站,这就是“撞库攻击”。 如2014年12月25日开始在互联网上“疯传的”12306网站用户信息,就是黑客通过撞库攻击所获得的。
被泄漏的数据库中的数据大都是明文,不过,现在的数据库大都采用了散列加密的方式保存。如Windows操作系统就采用散列加密的方式保存登录密码。这些密码都是经过了散列加密后保存到数据库中的,密码的散列值就是对口令进行一次性的加密处理而形成的杂乱字符串。这个加密过程被认为是不可逆的,也就是说,从散列值中是不可能还原出原口令的。如密码“999999”经过散列加密(MD5)之后就变成了“52C69E3A57331081823331C4E69D3F2E”。这个散列值保存在了数据库中,在进行验证的时候,我们只需要将输入的值经过散列加密之后再与保存的值进行比较,就可以知道密码是否正确。即使黑客获得了“52C69E3A57331081823331C4E69D3F2E”,也不能逆向还原出原来的密码“999999”。这样就保证了保存密码的数据库即使被攻破,也不会导致密码被泄露。
由于各种攻击手段的出现,散列加密也并非是安全的。下面介绍一些散列加密的破解方法。
1.1 对基本的LM散列加密密码进行破解
Windows XP操作系统可以说是Microsoft影响力最大的产品之一。虽然这款操作系统在大多数人眼里已经“老迈不堪”,就连Microsoft自己也已经在2014年宣布放弃了对其的支持,但是由于软件兼容性的问题,目前很多机构仍然在使用Windows XP。即使现在,我们仍然有必要来研究一下Windows XP的安全性问题。
首先我们来研究的就是Windows XP的密码安全。我们对于Windows XP开机时或者远程连接时的登录界面并不陌生,我们需要在这个界面输入用户名和密码,操作系统会将我们输入的信息与保存的信息进行对比,如果相同,就可以登录到系统。那么我们是不是趁着计算机的主人离开计算机的时候,就可以偷偷地将里面保存的密码找出来“偷走”呢?事实上,这个想法并非天方夜谭,因为Windows XP中确实保存了密码,而且这个密码也确实可以找到。这个密码就保存在C:\Windows\System32\config\SAM中。在Windows XP和Windows 2003中,我们可以通过工具来抓取完整的LM散列加密密码。我们可以使用一款名为SAMInside的工具来完成这个工作,其工作界面如下图所示。
SAMInside 是一款Windows密码恢复工具,支持Windows NT/2000/XP/Vista操作系统,主要用来恢复Windows操作系统的用户登录密码。需要注意的是,SAMInside需要依靠读取破解的操作系统中SA M、System两个文件破解出用户密码。这两个文件均位于C:\Windows\System32\config目录。但是在操作运行时这两个文件时受到保护的,无法进行读取操作。因此我们需要在DOS操作系统下,或者WindowsPE操作系统下使用这个工具来查看SAM文件。
执行这个工具后,SAMInside中就会显示出WindowsXP中的密码。那么Windows XP是如何对密码进行加密的呢?这个操作系统采用了一种名为LM散列的加密模式。下面我们就给出加密过程。
◆ 输入的密码值最多位14个字符
◆ 将输入的密码转为大写字符
◆ 将密码转换为大写字符之后转换为十六进制字符串
◆ 密码不足14个字节将会用0来补全
◆ 固定长度的密码被分成两个长度为7个字节的部分
◆ 将每一组7个字节的十六进制转换为二进制,每7位一组末尾加0,再转成十六进制组成得到两组8字节的编码
◆ 将两组8字节的编码,分别作为DES key为”KGS!@#$% ”进行加密
◆ 将两组DES加密后的编码拼接,得到最终的LM散列值
后来对这个加密过程进行了改进,目前的操作系统拥有多种加密方法,其中一种最为有效的方法是“Salting the password”。所谓加“Salt”值,就是加点“佐料”。当用户首次提供密码时(通常是注册时),由系统自动往这个密码里加一些Salt值,这值是由系统随机生成的,并且只有系统知道。然后进行散列。当用户登录时,系统为用户提供的代码加上两个用户使用了同一个密码,由于系统为它们生成的Salt值不同,他们的散列值也是不同的。即便黑客可以通过自己的密码和自己生成的散列值来找具体特定密码的用户,但这个概率太小了(密码和Salt值都得和黑客使用的一样才行)。不过LM散列算法中并没有使用这个机制,所以虽然我们不能直接由散列值推导出密码,但是两个相同的密码进行LM散列加密之后的值是相同的,因此也为我们提供了破解LM散列加密密码的方法。
1.2 在线破解LM散列加密密码
现在很多网站都提供了破解LM散列加密密码的服务,也就是说你只需要在这些网站上提交找到散列值,这些网站就会在自己的数据库里进行比对,如果找到这个散列值,就可以得到对应的密码。这些网站大都是用一种名为<**“彩虹表”**的技术。你可以访问在线网站cmd5来实现在线破解LM散列和NTLM散列加密密码。如下图所示,为cmd5网站的界面,该网站可以实现密码散列加密的运算。
该网站可以实现密码散列加密的运算。可以先尝试一些常见的散列值破解,然后逐渐加大密码的难度。下面我们对一个已经加密的值“32ed87bdb5fdc5e9cba88547376818d4”(NTLM散列加密)进行破解,散列值的逆向运算结果如下图所示:
1.3 在Kali 中破解散列值
在线破解散列值十分简单,但是实际上散列值的加密方法有很多,常见的有MD5、LM、NTLM这3种加密方法,那么我们如何知道散列值是通过哪一种加密方法得到的呢?这一点很关键,因为不同的加密方法有不同的解密方式。同样Kali中提供了两种用来分辨不同加密方法的工具:一种是hash-identifier另一种是Hash ID。
hash-identifier的使用方法很简单。在Kali中,启动一个终端,输入hash-identifier命令即可启动该工具,命令如下:
┌──(kali㉿kali)-[~]
└─$ hash-identifier
如下图所示:
将加密之后的散列值输入, hash-identifier就会分析出该散列值的可能加密方法,如下图所示:完成以后使用Ctrl-c组合键退出即可。
另外,Hash ID也是一个十分有效的工具。打开一个终端,输入命令hashid,然后输入破解的散列值,按Enter键。
┌──(kali㉿kali)-[~]
└─$ hashid 32ed87bdb5fdc5e9cba88547376818d4
1.4 散列值传递攻击
前面已经介绍了如何破解基于LM散列方法加密的Windows密码,但是Windows操作系统中除了会使用LM散列方法之外,还会使用NTLM散列方法对密码进行加密。这是一种比LM散列安全性高很多的方法。实际上我们无须进行密码的破解。如果已经取得了一台计算机中加密之后的密码值,无论是使用LM散列还是NTLM散列加密的,都可以利用这个值直接获得系统的权限,这种方式被称为“散列值传递攻击”。 这是一种经典的攻击方式,虽然每一种网络攻击方式慢慢地都会过时,但是这种攻击方式目前仍然可以起作用,而且这种攻击方式也可以为我们提供一个较好的思路。
有些操作系统采用了一些可以阻止这种“散列值传递攻击”的机制,Windows7操作系统使用了用户账户控制(User Account Control, UAC)技术,这个技术最早出现于Windows Vista,并在更高版本的操作系统中保留下来,它可以阻止恶意程序(有时也称为恶意软件)损坏系统,同时也可以帮助组织部署更易于管理的平台。
使用UAC技术,应用程序和任务总是在非管理员用户的安全权限中运行,但管理员专门系统授予管理员级别的访问权限时除外。UAC技术会阻止未经授权的应用程序的自动安装,防止无意中对系统设置进行更改,这种机制已经解决了Windows XP的大量安全方面的问题。但是这种机制时可以关闭的。所以散列值传递攻击仍然有我们值得学习的地方。
我们以一个Windows7操作系统作为攻击目标。首先开启Win7操作系统的文件共享功能,最简单的做法就是共享一个目录,这一点很重要,如果我们不这样做,就无法实现远程攻击。
我们可以提前关闭这个系统上的UAC功能(也可以不关闭,而是在Meterpreter控制中远程关闭),关闭的步骤如下所示:
◆ 1. 在“开始”菜单的文本搜索框中输入“UAC”,如下图所示:
◆ 2.这样就可以打开“用户账户控制设置”,然后将“选择何时通知您有关计算机更改的消息”改为“从不通知”(即将左侧的滑动条拖动到最下方),如下图所示:
◆ 3. 单击“确定”按钮,重启计算机。
现在我们可以开始攻击了,首先我们需要想办法获得目标主机加密之后的密码散列值,上面我们介绍了两种方法。就利用Windows XP启动系统, 然后复制出SAM文件。
另外,当我们利用Metasploit控制目标主机的时候,也可以获取它的密码散列值。演示如下:
我们要从已经成功渗透的目标主机中导出加密之后的密码散列值,这个操作需要系统级(管理员级别)的管理权限,而且需要关闭目标主机上的UAC功能。在这个实验中,我们事先关闭了UAC功能,所以无须再进行这方面的操作。如果事先没有关闭就可以使用bypassuac_eventvwr模块来远程关闭。
首先需要将当前session切换到后台,使用background命令;然后使用命令use exploit/windows/local/bypassuac_eventvwr, 如下图所示,注意,只有当前你没有修改UAC设置时,才能使用这个模块。
本实验我们只需要获取系统级别管理员权限即可,这里可以使用getsystem命令,如下图所示:
我们已经获取了系统管理权限,然后我们使用getuid命令获取用户名,如下图所示:
接下来,我们就可以到处目标系统的密码散列值了,使用命令hashdump, 如下图所示:
如果这个命令不成功,可以尝试将Meterpreter的进程迁移到其他进程上,如拥有系统级system管理权限的进程;如果还不成功,可以使用post/windows/gather/smart_hashdump模块。如下图所示:
利用在线cmd5,根据散列值进行查询,如下图所示:
我们还可以在Meterpreter中使用kiwi模块,这个模块可以获取明文密码,先使用load kiwi命令载入这个模块,然后使用creds_all 命令显示明文密码,如下图所示:
1.4 字典
当对密码进行破解的时候,一个字典示必不可少的。所谓字典就是一个由大量词汇构成的文件。
在Kali 中字典的来源一共有3种,如下所示:
◊ 使用字典生成工具生成需要的字典,当我们需要字典,手头又没有合适的字典时,就可以考虑使用工具来生成 所需要的字典。
◊ 使用Kali 中自带的字典,Kali将所有的字典都保存在了/usr/share/wordlists/目录下,如下图所示:
◊ 从互联网上下载热门的字典。如下图所示:
dirb目录中包含3个目录和9个文件,其中, big.txt是一个比较完备的字典,大小为179KB;相对而言,small.txt则是一个比较精简的字典,大小只有6.4KB;catala.txt为项目配置字典;spanish.txt为方法名或库目录字典。3个目录中,others目录主要包含一些与漏洞相关的字典,如其中的tomcat.txt就是与tomcat配置相关的字典。
另外,在fern-wifi目录中只有一个common.txt,主要是一些可能的公共Wi-Fi账户的密码;metasploit目录中文件比较多,几乎包含各种常用类型的字典;wfuzz目录主要用来进行模糊测试。Crunch的主页提供了这个工具的使用方法和范例。这个工具的使用十分简单,你所做的只是向Crunch提供以下3个值。
◊ 字典中包含词汇的最小长度
◊ 字典中包含词汇的最大长度
◊ 字典中包含词汇所使用的字符。要生成密码包含的字符集(小写字符、大写字符、数字、符号)。这个选项是可选的,如果不选这个选项,将使用默认字符集(默认为小写字符)。
剩下的工作只需要交个Crunch去完成就可以了。下面我们给一个简单的Crunch使用实例。首先在Kali中启动一个终端,然后输入如下命令:
┌──(kali㉿kali)-[~]
└─$ cruch 2 3 -o /home/kali/Downloads/passwords.txt
结果如下图所示:
这条命令会生成长度为2位或3位的密码,然后将这些密码爆存在passwords.txt中。默认会生成“aa”“ab”之类的密码,如下图所示:
如果我们对目标比较熟悉,也可以指定目标常用的字符。如我们看到某人的键盘上的Q、W、E、R、T和1、2、3、4几个键磨损的比较厉害,就可以指定这几个字符来生成一个密码。执行的命令如下:
┌──(kali㉿kali)-[~]
└─$ cruch 4 4 quert1234 -o /home/kali/Downloads/password2.txt
生成的密码如下图所示:
现在可以看到我们生成的密码只包含q、w、e、r、t、1、2、3、4这几个字符。