hashcat,利用 GPU 进行密码恢复(爆破)
信息安全一直以来都是计算机业界的一大问题,虽然我们看不见,但是在网络空间内,实际上大到企业网站,小到个人网站,它们每天都会受到各种各样的攻击。即使是笔者名不经传的个人博客,在曾经的一段时间里也遭受过密集的黑客攻击。
如果你有做渗透的经验,在新手起步的那一段时期里,在面对很多渗透目标的时候,你都会被「登录」这堵墙给拦住。很多系统是没有办法直接从前台进行渗透的,想要进入系统内部做更深入的挖掘,如何绕过登录,或者如何获取某个账户信息进入系统可以说是非常考验渗透人员的一个难题。
虽然现在很多的系统已经是转用动态密码、动态数字令牌(即手机号+短信验证码,或者是账号+密码+手机令牌/验证码)的方式来进行登录鉴权了,但是还有很多系统还是会使用账号密码来进行登录。
出于安全方面的原因,在这些网站、系统内,密码自然都不会用明文来存储,而是会采用一种特别的摘要算法(又称哈希算法)对密码进行不可逆的加密。
在业界常用的哈希算法中,算法的输入输出是一个完全一对一的关系,得益于算法的先进,其输出是具有唯一性的,安全的哈希算法并不会出现输入不同但输出相同的情况(这种情况也被称为「哈希碰撞」)。
这些系统在校验密码的时候,会对用户输入的密码用同样的摘要算法进行加密,然后和用户注册时存储到系统中的密码加密结果进行比对,如果二者一致,则表明用户输入的密码是正确的,进而系统会对用户进行放行。
这种经过摘要算法加密的密码我们称其为「hash」(哈希值),在今天 hash 的用途非常广泛,从简单的文件校验,到现在仍然比较热门的区块链技术,我们都能够见到它的身影。
实际上,我们每天都接触到的操作系统,比如说 Windows、Linux 等,他们使用的也是这样一套机制在本地存储用户的账号密码,以 Linux 为例,用户的密码往往就以 hash 的形式存储在 /etc/shadow 里。
虽然说出于安全方面的考虑,不论是操作系统也好,还是部署在网络上的网站以及其他各类系统也好,只要开发者有一定的安全意识,这样的系统往往都会有一定的安全措施来防止用户接触到这些关键的文件/数据。
但是,程序是人写的,即使是开发者,他也不能保证这个代码是绝对安全、没有疏漏的,尤其是在一个复杂的系统之中。这意味着渗透人员有时候还是可以通过「漏洞」来接触到用户的关键信息,比如说密码。
这个时候,hash 就成了用户信息的最后一道防线。即使用户的密码已经发生了泄露,但由于 hash 本身是不可逆加密,渗透人员没有办法还原出 hash 对应的明文,即真实的用户密码。
但是 hash 加密过的密码一定是安全的吗,答案是,不是。虽然哈希算法是不可逆的,我们并没有办法通过 hash 还原出明文,但是我们利用 hash 的另一个特性还是可以解出 hash 的明文 —— 唯一性。
比如密码是「123456」,那么它得到的 hash 是唯一的,即「7c4a8d09ca3762af61e59520943dc26494f8941b」。假如密码只有 6 位数,这个时候我们可以通过自动化程序用同样的哈希算法暴力地计算出「000000 - 999999」的所有哈希值,并把这些哈希值存储起来。
这样一来,在这个哈希算法下,任何 6 位数密码的哈希值对应的明文都是可知的了,我们只需要对着我们算出的那一张所有 6 位数密码哈希值的表反查明文即可。
这样的表又称为「彩虹表」,专门用于反查 hash。在国内有一些团队专门提供这样的 hash 反查服务,他们拥有记录数高达数十亿条的彩虹表,覆盖了非常多的 hash 算法,例如非常知名的 CMD5,他们应该是国内最大的一家了。
前面我们有说到过,区块链技术本质上也和 hash 有很大的关系,一方面,hash 在区块链技术中会被用来校验各种各样的数据,另一方面,在我们都熟知的「比特币」等各种币的体系内,挖矿这个事情的本质实际上是计算机不断运用算力基于某个算法生成 hash,尝试 hash 碰撞。
比特币挖矿给安全领域的人提供了一个新思路,既然比特币挖矿可以用 GPU(显卡)来源源不断地、高速地生成 hash,那么理论上对于各种公开的,业内常用的哈希算法,我们也可以用 GPU 来高速生成 hash,以得到彩虹表或是对特定的 hash 进行爆破。
在国外已经有一些团队利用这样的方式做有偿的 hash 反查、解密,他们会利用算法生成极为庞大的字典,然后基于这些字典源源不断地生成 hash,试图撞到待解密的 hash。由于 GPU 的计算速度很快,在算力的支持下他们可以在很短的时间内尝试很多的可能,使得很多 hash 在很短的时间内就能被解密。
这样的程序并不只在机房里可以跑,实际上在你自己的电脑上,你也可以运行类似的程序来做 hash 的恢复、破解、碰撞。
这就是本文的主角 —— hashcat。在铺垫了这么久之后也到了介绍主角的时候,hashcat 是一款完全免费的,基于 OpenCL 做 hash 碰撞的程序。
只要你有一块强劲的显卡,在 hashcat 的帮助下,你可以以几千到上万的速度进行高速的 hash 碰撞,这意味着在爆破某一 hash 的时候你可以尝试更大的字典,例如数百 MB 甚至是数 GB 的字典。
你可能会问,既然已经有团队提供非常庞大的彩虹表进行反查,hashcat 这样的高速 hash 碰撞程序存在的意义在哪呢?答案是,彩虹表根本没有办法覆盖各种各样的 hash。
以 Linux 的 shadow 文件为例,其 hash 在计算的过程中就加入了 salt。salt 是一个附加在输入上的随机数据,它会和最终的 hash 一并保存在 shadow 文件内。由于有 salt 的加入,彩虹表很难覆盖到 hash 对应的明文,这也就一定程度上保证了用户密码本身的机密性。
hashcat 的用途正是利用 GPU 生成 hash 来高速碰撞这些彩虹表没有办法覆盖到的 hash。
hashcat 支持的算法非常非常多,覆盖了业内常见的各类算法,可以说是一个相当全能的工具了。它也提供了多种生成 hash 的模式,有直接基于本地字典生成的,也支持掩码或者掩码与字典混合的模式。
对比很多传统的暴力破解 hash 的程序来说,hashcat 不论是在支持算法的广度上,还是计算的效率上都是非常出众的,对于数据恢复或安全、渗透等领域的专业人士来说,hashcat 是一个非常优秀的工具。
值得一提的是,由于它采用的是 OpenCL 而非 CUDA,所以即使你使用的是 AMD 的显卡,你也可以使用 hashcat 来进行高速、高效率的 hash 碰撞。
工具本身可以直接在官网下载,有 Windows 版本,也有 Linux 版本,其中 Windows 是解压即用的。hashcat 并没有 GUI,只提供命令行工具,同时工具本身不包含任何字典,字典需要用户自行搜集。
其用法官方文档并没有写得很详细,不过在网上你可以搜到一些关于 hashcat 使用的文章,所以综合来看其使用并没有什么门槛。就笔者个人的使用体验而言,这个工具确实很强悍,就是非常吃硬件资源。
hashcat 的官网是hastcat.net,非官网下载渠道下载的软件,笔者不保证其安全性。