0x01、基本概念
SAM(Security Accounts Manager安全账户管理器)是Windows NT操作系统的一个部分,它包含着用户账户数据库,该数据库存储着所有用户的登录名、密码等相关信息。在系统运行期间,SAM文件由system账户锁定,即使administrator账户也无法打开。SAM数据库位于注册表HKLM\SAM\SAM下,受到访问控制列表(ACL)保护。可以使用regedt32.exe打开注册表编辑器并设置适当的权限来查看SAM中的内容。SAM数据库保存在磁盘上的
%systemroot%\system32\config
目录下的SAM文件中,该文件经过了压缩处理,因此文件中的信息无法直接读取。security文件也保存在这个目录下,是安全数据库的内容,但两者之间关联较少。在SAM数据库中,包括所有组、账户的信息,密码的HASH值以及账户的SID等。举个例子,如果Windows系统上有一个名为“Alice”的用户账户,SAM文件中就会包含该用户的登录名“Alice”、密码(已经被HASH加密)、该用户的SID(唯一标识该用户的安全标识符)以及该用户所属的用户组成员身份信息等。username: Administrator password hash: aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0 password expiration date: 01d5dfab SID: S-1-5-21-1957994488-1234567890-1234567890-1001
Windows系统采用了两种密码加密机制在SAM中。因此,SAM文件中保存了两种哈希值。一个是LanMan版本的散列值(LM),另一个是NT版本的散列值(NTLM)。
◆ LanMan 散列算法(LM)
- LanMan散列算法处理用户口令的过程如下:将用户口令分成两半,每一半都是7个字符。不足7个字符的用0x00补齐。然后对这两个口令分别进行加密,最后将得到的散列值串联在一起,形成最终的LM散列值。
◆ NT散列算法(NTLM)
- 首先,将输入数据(例如用户密码)添加一个特殊的字符串“KGS!@#$%”作为前缀。然后,使用Unicode编码将前缀和输入数据转换成一个字节数组,同时将字节数组填充到64字节的倍数。接着,将字节数组分成若干个64字节的块,每个块进行一系列的操作,包括填充、置换、移位和异或等操作,最终得到一个128位的散列值。最后,将128位的散列值转换成一个字符串,这个字符串就是加密后的结果。
从上述LM算法流程来看,可以发现LM安全性上的几点不足:
- LM算法将14个字节的密码分为两组分别进行加密,使得两组密文可以分别破解,并且明文空间从95^14减少到了95^7;
- LM算法不区分密码的大小写字符,使得明文空间从95^7减少到69^7;
- LM算法不像其他散列算法一样包含随机的初始向量IV,使得用空间换取时间的字典攻击(如彩虹表)等成为可能,2^43的明文空间使用彩虹表最多只需几个小时便能破解。
虽然LM非常不安全,但Windows为了保持前后兼容性,是许多以前支持LM认证的经典应用不至于突然不能使用,所以LM扔存在于相当Windows各种版本的操作系统中,不过Vista/7已经默认不使用LM存储账户密码散列。
NTLM散列的安全性较LM有所提升,因为其明文空间扩展到了95^128,采用暴力破解的时间复杂度大大增加。但是NTLM散列和LM散列一样,都没有在算法中包含随机数据(salt),所以仍然会受到字典攻击。但由于NTLM的明文空间较大,其字段占用的空间也会呈几何级数增长(NTLM的彩虹表大小为200G左右,而LM的彩虹表只需几百兆即可),破解时间自然也较LM要长很多。
0x02、SAM的导出方法
SAM文件系统运行时受到保护,仅对是可读写的system,所以在系统运行时不能将SAM文件复制出来,必须使用别的系统启动才能复制SAM文件。
SAM文件的获取方法大致有一下四种:
◆ 通过物理接触主机,启动其他操作系统来获取windows分区上的SAM文件。
◆ 获取
%SystemRoot%\repair\sam
文件。%SystemRoot%\repair\sam
文件通常是Windows操作系统在安装过程中备份的SAM数据库文件。◆ 使用pwdump等工具从注册表中导出SAM散列值,转储成类似与UNIX系统的password格式文件。
◆从网络中嗅探分析SMB报文,从中获取密码散列字符串。
在Windows NT 4.0 SP3 之前,所有的密码散列是以非常简单的DES加密来实现安全存储,DES的密钥只是从用户账户的SID来导出的,所以只需要SAM文件便能破解加密的散列。
但是在NT 4.0 SP3 之后的版本中,Windows引入了
SysKey
,并且在2000之后作为默认执行的加密手段。所以要破解经过SysKey加密的SAM散列,必须要先从system文件中导出boot key
,然后利用MD5导出hashed boot key
,再用hashed boot key
导出RC4 key
,用此RC4 key
便能解密出和Windows NT的 SAM中一样的散列密文。最后用NT中的解密手段即可获得能够进行字典攻击的密码散列。0x03、SAMInside破解软件
SAMInside 为一款俄罗斯人出品的密码破解软件,支持Windows NT/2000/XP/Server 2003/Vista/7等操作系统,主要用来恢复Windows的用户登录密码。与一般的Windows密码破解软件有所不同的是。多数的Windows密码恢复软件都是将Windows用户密码重置,比如Passware Kit 系列中的Windows Key 等等。SAMInside 则是将用户密码以可阅读的明文方式破解出来,而且SAMInside可以使用分布式方式攻击方式同时使用多台计算机进行密码的破解,大大提高破解速度。
SAMInside的离线使用方式需要sam文件盒syskey文件导入后才能进行破解,而在线方式则可以直接从本机获取,可以从LSASS进程直接导入所需要的信息,然后对指定的用户进行破解即可。