4.5 获取和破解用户密码
根据定义,密码破解是指从计算机系统中存储或传送的数据中还原密码。密码是用来加固各种类型系统的安全,我们在第3章中介绍攻击Web服务器时提到过。
主机系统通常是Windows系统或基于Linux的系统,在存储和保护用户密码方面有自己独特的方式。本节将会着重介绍如何破解主机系统上的密码文件。我们之所以在本书中介绍这部分内容,是因为主机系统是Web应用常见的一种授权客户端。侵入客户端也就意味着开一个门来访问目标Web应用。
获取用户密码最简单的方式是通过社会工程。如前面所介绍的那样,黑客可以将自己伪装成已授权的个体来获取密码或是获取用户创建密码的线索。举个例子,如果知道所有密码都必须是6~10个字符、必须以大写字母开头并以数字结尾这样的规则,那么黑客破解密码所需要做的尝试就会大大减少。(Kali提供了一个名为Crunch 的工具来生成用于这类攻击的密码列表,极其简便。)
聪明的渗透测试人员应该通过第2章中介绍的侦察技术来找出系统类型、可能的密码规则、参与管理系统的人员以及其他能够帮助缩减破解密码范围的信息。
黑客破解密码一般都是有几种固定方式。我们列在了下面:
密码必须存储起来,这样系统才能验证用户的身份和访问权限。但系统一般不会将密码以普通文本文件的形式存储,原因显而易见。大多数系统都不会将加密当做保护密码的唯一方式,因为还要一个密文来还原,这样就会在保护加密文件上表现出一定的缺点。
哈希化处理(hashing)会将密文或密码转换成完全不同的值(一般是用算术运算)。哈希化处理是不可逆的,并且会针对输入的同一个密文生成同样的哈希,也就是说哈希可以被存储,并用于针对输入的密码来进行身份验证。修改其中某个因子,比如将某个字母大写或是增加一个空格,都会导致生成完全不同的哈希。
哈希也能像密码一样被暴力破解,如果你知道生成哈希的公式的话。许多密码破解工具如John the Ripper都能对哈希进行检测,并用自动生成的哈希输出来对所有哈希的输出组合进行暴力破解攻击。只要找到了匹配的哈希,John the Ripper就会打印出生成匹配的哈希的普通文本密码。
彩虹表(Rainbow Table)是常见哈希算法的共同敌人。彩虹表是与计算好的所有哈希输出的数据库,可以用来通过搜索来找出哈希输出。如www.freerainbowtables.com 之类的网站会提供针对流行的哈希算法的各种版本,如在许多Windows系统中使用的MD5。Kali还提供了如RainbowCrack 之类的应用来自动生成彩虹表。
对哈希进行加盐处理会通过增加定制的比特位来将哈希的输出变成在常见彩虹表中无法找到的哈希。不幸的是,许多系统如Windows并未使用哈希加盐的方式。
Windows密码
Windows是世界范围内商业领域使用最广泛的操作系统。在保护密码方面,微软一直不太靠谱。虽然现在微软的产品已经比早期版本安全多了,不过,它们仍然可以被Kali中提供的很多攻击攻陷。
Windows是将密码都存储到系统账户管理(SAM,System Account Management) 注册文件中。偶有例外,会使用活动目录(Active ) 。活动目录是另外一种身份认证系统,它会将密码保存到LDAP数据库中。SAM文件位于C:\<系统根目录>\sys32\config中。
SAM文件会利用LM或NTLM哈希将密码保存成哈希格式,这样文件能够更安全。在Windows运行时,SAM文件不能被移动或复制。但SAM文件可以被转存,也就是说密码的那些哈希能够被移动到离线环境,进而用暴力破解工具里破解。黑客也可以通过启动另外一个操作系统、挂载C:\ 盘、在硬盘上或是光驱/软盘上启动Linux发行版(如Kali)等方式来获取SAM文件。
有个常见的能找到SAM文件的位置是C:\<系统根目录>\repair目录。默认系统会创建备份用的那份SAM文件,并且通常不会被系统管理员删除。这个备份文件并没有受到任何保护,不过是经过压缩处理的;也就是说,必须先解压文件才能获取哈希文件。你可以用expand工具来解压文件,命令格式是expand [文件名] [目标位置]。这里有个将这个压缩的SAM文件展开成解压后的SAM文件的例子:
C:\> expand SAM uncompressedSAM
为了应对离线破解的威胁,微软的Windows 2000系统和更新的系统添加了一个SYSKEY工具。SYSKEY工具会将SAM文件中哈希化处理的密码用128位的加密密钥来加密,每个不同的安装中这个密钥也不同。
能够物理访问Windows系统的攻击者可以通过以下途径获得SYSKEY (也称为启动密钥):
1.启动另一个操作系统(比如Kali);
2.窃走SAM和SYSTEM文件的老巢(C:\<systemroot>\sys32\config);
3.通过bkreg和bkhive从SYSTEM目录恢复启动密钥;
4.转存那些密码的哈希;
5.用如John the Ripper一类的工具离线破解。
如果访问了Windows中的文件,你会修改MAC(Modify/Access/Create,修改/访问/创建 1 )信息。Windows会利用这些信息来记录你的痕迹。为了避免留下取证的证据,我们建议你先复制目标主机系统,然后再发起攻击。
1 此处作者原文为“modify, access and change”,但这个解释是*nix系列系统的解释。Windows上一般会将MAC理解为“modify, access and create”。——译者注
1.挂载Windows
有很多工具可以用来获取Windows中的SAM和SYSKEY文件。提取这些文件的一个方式是挂载目标系统的Windows系统,这样其他工具就可以访问这些文件,而Windows却没在运行。
第一步是使用fdisk -l命令来找出系统中的分区。你必须找出Windows和分区类型。fdisk 输出会显示一个NTFS分区,如下所示:
Device Boot Start End Blocks Id System
/dev/hdb1* 1 2432 19535008+ 86 NTFS
/dev/hdb2 2433 2554 979965 82 Linux swap/Solaris
/dev/hdb3 2555 6202 29302560 83 Linux
你可以用命令mkdir /mnt/windows来创建一个挂载点。
然后用下面例子中的命令来挂载Windows系统:
mount -t <Windows类型> <Windows分区> /mnt/windows
现在目标的Windows系统已经成功挂载,你可以将SAM文件和SYSTEM文件用下面的命令复制到攻击目录中:
cp SAM SYSTEM /pentest/passwords/AttackDirectory
还有一些工具可以用来转存SAM文件。PwDump 和Cain and Abel 只是其中的两个。Kali还提供了samdump 工具,在4.6.3节中我们会再做介绍。
你需要恢复Bootkey和SAM文件。Bootkey文件是用来访问SAM文件的。用来访问SAM文件的工具要用到Bootkey文件。
bkreg 和bkhive 是用来获取Bootkey 文件的常见工具,如下面的截图所示。
2.Linux密码
Linux主机系统并不像Windows一样常见,获取ROOT访问权限面临的难度也有所不同。如果启用了自动登录,许多系统可能会将密码以明文的形式存储,比如用于Telnet和FTP的.netrc文件。对于多数攻击,你需要提取passwd和shadow文件。它们通常位于/etc/passwd和/etc/shadow。
shadow文件只有ROOT用户可读,通常以MD5哈希的方式储存。shadow文件要比Windows的SAM文件更难获取。一般获取shadow文件都是通过引导加载程序,如grub。
破解Linux的密码跟破解其他系统如Windows的密码基本类似。许多混合型自动破解程序,如John the Ripper,可以识别哈希的类型,并用正确的字典暴力破解shadow文件中的密码。