数年前,为了帮助系统管理员发现漏洞,我编写了一个密码破解工具,用于恢复Microsoft的用户密码。当时,这个工具称为L0phtCrack,后来重命名为LC5。再后来,Symantec(得到了它的版权)担心违反国际武器限制公约(ITAR)而将它停用了。(注2)网络和技术书籍上有许多文章描述了L0phtCrack的工作原理,但没人关注它为什么会起作用。L0phtCrack所利用的Microsoft Windows的漏洞可能会产生什么影响呢?
事实上,这个工具直接利用了Windows的加密程序的实现和使用中所存在的大量问题。所有这些问题都源于各种版本的Windows(直到Vista)中继续使用的遗留LAN Manager(LANMAN)的散列函数。它的散列表示形式尽管基于已经成熟的数据加密标准(DES),但并没有包含salt。另外,LANMAN中的密码不区分大小写。这个函数把14个字符(或更短)的密码分解为2个7字节的值,每个值根据同一个键进行加密,并连接在一起。当我于20世纪90年代后期在BugTraq的一个帖子上描述这个问题时,基本的加密序列是(见图1-1):