【THM】哈希 - Crypto 101

发布时间 2023-12-05 22:29:01作者: trymonoly

关键术语

在开始之前,我们需要先了解一些行话。
阅读这些内容,并尽可能多地吸收。我们将在稍后的房间里扩展其中的一些内容。

纯文本 - 加密或哈希之前的数据,通常是文本,但并不总是如此,因为它可能是照片或其他文件。

编码 - 这不是一种加密形式,只是一种数据表示形式,如 base64 或十六进制。可立即逆转。

哈希 - 哈希是哈希函数的输出。哈希也可以用作动词,“哈希”,意思是产生某些数据的哈希值。

暴力破解 - 通过尝试每个不同的密码或每个不同的密钥来攻击加密

密码分析 - 通过发现基础数学中的弱点来攻击密码学

这个房间可能会涉及一些研究。善于使用搜索引擎,这对信息安全至关重要。
 

什么是哈希函数?

哈希函数与加密有很大不同。没有密钥,这意味着不可能(或非常困难)从输出返回输入。

哈希函数获取一些任何大小的输入数据,并创建该数据的摘要或“摘要”。输出是固定大小。很难预测任何输入的输出,反之亦然。好的哈希算法将(相对)计算速度快,反转速度慢(从输出转到并确定输入)。输入数据的任何微小变化(即使是一位)都会导致输出发生较大变化。

哈希函数的输出通常是原始字节,然后对其进行编码。常见的编码是以 64 为基数或十六进制。解码这些不会给你任何有用的东西

我为什么要关心?

散列在网络安全中经常使用。当您登录 TryHackMe 时,它使用哈希来验证您的密码。当您登录计算机时,它还使用哈希来验证您的密码。您间接与哈希的交互比您想象的要多,主要是在密码的上下文中。

什么是哈希冲突?

哈希冲突是指 2 个不同的输入给出相同的输出。哈希函数旨在尽可能地避免这种情况,特别是能够设计(故意创建)冲突。由于鸽子洞效应,碰撞是不可避免的。鸽子洞效应基本上是,哈希函数有一定数量的不同输出值,但你可以给它任何大小的输入。由于输入多于输出,因此某些输入必须提供相同的输出。如果你有128羽鸽子和96个鸽子洞,有些鸽子将不得不分享。(条件就是不可能,输入是无穷,输出只有2128个,绝对会有相同的数据)但是只有第三中前缀相同很危险,两个文件不断尝试后缀生成相同的md5.

 

MD5 和 SHA1 遭到攻击,并且由于工程哈希冲突而在技术上变得不安全。但是,还没有攻击同时在两种算法中发生冲突,因此如果您使用 MD5 哈希和 SHA1 哈希进行比较,您会发现它们是不同的。MD5 冲突示例可从 https://www.mscs.dal.ca/~selinger/md5collision/ 获得,SHA1 冲突的详细信息可从 https://shattered.io/ 获得。因此,您不应该信任任何一种算法来散列密码或数据。

我们可以用哈希做什么?

哈希在网络安全中用于 2 个主要目的。验证数据的完整性(稍后会详细介绍),或用于验证密码。

用于密码验证的哈希

大多数 Web 应用都需要在某个时候验证用户的密码。以纯文本形式存储这些密码会很糟糕。您可能已经看到有关数据库泄露的公司的新闻报道。认识一些人,他们对包括银行业务在内的所有事情都使用相同的密码,所以泄露这些密码真的非常糟糕。

相当多的数据泄露泄露了明文密码。您可能熟悉Kali上的“rockyou.txt”作为密码单词列表。这来自一家为MySpace制作小部件的公司。他们以明文形式存储密码,公司发生了数据泄露事件。txt 文件包含超过 1400 万个密码(尽管有些密码*不太可能*是用户密码。如果你想明白我的意思,请按长度排序)。

 

Adobe有一个值得注意的数据泄露事件,略有不同。密码是加密的,而不是散列的,并且使用的加密不安全。这意味着可以相对快速地检索明文。如果您想了解有关此违规行为的更多信息,Sophos 的这篇文章非常出色: https://nakedsecurity.sophos.com/2013/11/04/anatomy-of-a-password-disaster-adobes-giant-sized-cryptographic-blunder/

 

LinkedIn也发生了数据泄露事件。LinkedIn 使用 SHA1 进行密码验证,使用 GPU 计算速度非常快。

您无法加密密码,因为密钥必须存储在某个地方。如果有人拿到了密钥,他们只需解密密码即可。

这就是哈希的用武之地。如果您不存储密码,而只是存储密码的哈希值,该怎么办?这意味着您永远不必存储用户的密码,如果您的数据库被泄露,那么攻击者将不得不破解每个密码以找出密码是什么。这听起来相当有用。

这只有一个问题。如果两个用户使用相同的密码怎么办?由于哈希函数将始终将相同的输入转换为相同的输出,因此您将为每个用户存储相同的密码哈希。这意味着如果有人破解了该哈希值,他们就会进入多个帐户。这也意味着有人可以创建一个“彩虹表”来打破哈希值。

彩虹表是哈希到明文的查找表,因此您可以从哈希中快速找出用户刚刚拥有的密码。彩虹表用破解哈希值所需的时间换取硬盘空间,但它们确实需要时间来创建。
这里有一个简单的例子,所以你可以尝试理解它们是什么样子的。

 像 Crackstation 这样的网站在内部使用巨大的彩虹表来为没有盐的哈希值提供快速密码破解。在排序的哈希列表中进行查找确实非常快,比尝试破解哈希快得多。

防止彩虹桌

为了防止彩虹表,我们在密码中添加了盐。盐是随机生成并存储在数据库中的,每个用户都是唯一的。从理论上讲,您可以对所有用户使用相同的盐,但这意味着重复的密码仍将具有相同的哈希值,并且仍然可以使用该盐创建彩虹表的特定密码。

在对密码进行哈希处理之前,盐会添加到密码的开头或结尾,这意味着即使每个用户具有相同的密码,他们也会有不同的密码哈希。像 bcrypt 和 sha512crypt 这样的哈希函数会自动处理这个问题。盐不需要保密。

在线工具破解哈希website:CrackStation - 在线密码哈希破解 - MD5、SHA1、Linux、Rainbow Tables 等

免费在线解密 MD5、SHA1、MySQL、NTLM、SHA256、MD5 电子邮件、SHA256 电子邮件、SHA512、Wordpress、Bcrypt 哈希 (hashes.com)

 


 

识别密码哈希

https://pypi.org/project/hashID/ 等自动哈希识别工具存在,但它们对于许多格式来说并不可靠。对于具有前缀的哈希,这些工具是可靠的。使用上下文和工具的健康组合。 如果在 Web 应用程序数据库中找到哈希,则它更有可能是 md5 而不是 NTLM。自动哈希识别工具通常会混淆这些哈希类型,这凸显了自己学习的重要性。

理论

有一些工具能够自动识别密码的哈希值,比如 https://pypi.org/project/hashID/ ,但它们往往只能对具有前缀的哈希值进行识别,对于其他格式的哈希值可能并不一定能识别准确,所以我们要将工具与密码的哈希值所在的环境结合起来,如果你在 Web 应用程序数据库中找到哈希值,那么它更有可能是 md5而不是 NTLM,自动哈希识别工具经常会把这些哈希值的类型混在一起。

Unix 风格的密码的哈希值很容易识别,因为它们有一个前缀,前缀会告诉你用于生成哈希值的哈希算法。标准格式是:$format$rounds$salt$hash 。

Windows 密码使用 NTLM 进行哈希计算,NTLM是md4的变体。NTLM在视觉上与md4和md5哈希(散列)相同,因此结合哈希值所在的上下文来判断哈希(散列)类型非常重要。

在 Linux 上,密码的哈希值存储在/etc/shadow 中,此文件通常只能由 root 用户读取,它们过去存储在/etc/passwd 中,每个人都可以读取。

在 Windows 上,密码哈希值存储在 SAM 中,Windows 会试图阻止普通用户转储它们,但是有 Mimikatz 这样的工具可以做到转储密码哈希值。SAM中的哈希值分为 NT 哈希(散列)和 LM 哈希(散列)。

下面你将看到关于大多数 Unix 样式的密码的哈希值前缀的快速表格:

 

能够帮助你找到更多哈希类型和密码前缀的哈希示例网站是:https://hashcat.net/wiki/doku.php?id=example_hashes

关于其他哈希类型的识别,通常需要根据长度判断、根据编码判断或对生成它们的应用程序进行分析才能得出结论。

 

密码破解

我们已经提到彩虹表是一种破解没有盐的哈希的方法,但如果涉及盐怎么办?

您无法“解密”密码哈希。它们未加密。您必须通过对大量不同的输入(通常是 rockyou,这些是可能的密码)进行哈希处理来破解哈希值,如果有的话,可能会添加盐并将其与目标哈希值进行比较。一旦匹配,您就知道密码是什么。像 Hashcat 和 John the Ripper 这样的工具通常用于此目的。

为什么要在 GPU 上破解?

显卡有数千个内核。虽然它们不能像 CPU 那样做同样的工作,但它们非常擅长哈希函数中涉及的一些数学运算。这意味着您可以使用显卡更快地破解大多数哈希类型。一些哈希算法,特别是 bcrypt,被设计成 GPU 上的哈希与 CPU 上的哈希速度大致相同,这有助于它们抵抗破解。

破解虚拟机?

值得一提的是,虚拟机通常无法访问主机的显卡(您可以进行设置,但需要做很多工作)。如果要运行 hashcat,最好在主机上运行它(Windows 版本可在网站上找到,请从 powershell 运行它)。您可以让 Hashcat 在 VM 中使用 OpenCL,但速度可能比在主机上破解要差得多。开膛手约翰默认使用 CPU,因此,在开箱即用的 VM 中工作,尽管在主机操作系统上运行它可能会获得更好的速度,因为它将具有更多线程并且不会因在 VM 中运行而产生开销。

从不(我再说一遍,从不!)对哈希猫使用 --force。它可能导致误报(向您提供错误的密码)和漏报(跳过正确的哈希值)。

更新:从 Kali 2020.2 开始,hashcat 6.0 将在没有 --force 的情况下在 CPU 上运行。如果您有 GPU,我仍然建议在主机操作系统上破解,因为它会快得多。

是时候开始破解了!

我将提供哈希值。破解它们。您可以选择如何。您需要使用在线工具、Hashcat 和/或开膛手约翰。记住对在线彩虹桌的限制。不要害怕使用提示。Rockyou 或在线工具应该足以找到所有这些。

hashcat演示

 hashcat -m 3200 hash.txt(哈希值) rockyou.txt(密码字典)

破解出来了

 

 开膛手杰克演示