加密的 ZIP 文件可以有两个正确的密码——这就是原因
2022-8-23 12:58:43 Author: mp.weixin.qq.com(查看原文) 阅读量:6 收藏

开卷有益 · 不求甚解


前言

img

受密码保护的 ZIP 存档是压缩和共享文件集的常用方法——从敏感文档到恶意软件样本,甚至是恶意文件(即电子邮件中的网络钓鱼“发票”)。

但是,您是否知道加密的 ZIP 文件可能有两个正确的密码,并且在提取 ZIP 时都产生相同的结果?

带有两个密码的 ZIP 文件

Positive Technologies 的网络安全研究员Arseniy Sharoglazov周末分享了一个简单的实验,他制作了一个名为x.zip的受密码保护的 ZIP 文件。

Sharoglazov 为加密他的 ZIP 选择的密码是1987 年热门歌曲的双关语,该热门歌曲 已成为流行的技术 meme:

Nev1r-G0nna-G2ve-Y8u-Up-N5v1r-G1nna-Let-Y4u-D1wn-N8v4r-G5nna-D0sert-You

但研究人员证明,当 使用完全不同的密码提取x.zip时,他没有收到任何错误消息。

事实上,使用不同的密码成功提取了 ZIP,原始内容完好无损:

pkH8a0AqNbHcdw8GrmSp

相同 ZIP 文件的两个不同密码导致成功提取(Sharoglazov)

BleepingComputer 能够使用不同的 ZIP 程序成功地重现该实验。我们使用了p7zip(macOS 的 7-Zip 等效项)和另一个名为 Keka的 ZIP 实用程序。

与研究人员的 ZIP 档案一样,我们的档案是使用上述更长的密码创建的,并启用了AES-256 加密模式。

虽然 ZIP 使用较长的密码加密,但使用任一密码成功提取了存档。

这怎么可能?

在回应 Sharoglazov 的演示时,一位好奇的读者, Rafa 提出了一个重要的问题,“为何????”

Twitter 用户 Unblvr 似乎发现了其中的奥秘:

在启用 AES-256 模式生成受密码保护的 ZIP 存档时 ,如果密码太长,ZIP 格式使用PBKDF2算法并对 用户提供的密码进行哈希处理。研究人员解释说,太长是指超过 64 个字节(字符)。

这个新计算的哈希值不是用户选择的密码(在本例中为“ Nev1r-G0nna-G2ve-...*),而是文件的实际密码。

当用户尝试提取文件并输入超过 64 字节的密码(“ Nev1r-G0nna-G2ve-... ”)时,用户的输入将再次被 ZIP 应用程序散列并与正确的密码进行比较密码(现在它本身就是一个哈希)。匹配将导致成功的文件提取。

此示例中使用的替代密码(pkH8a0AqNbHcdw8GrmSp)实际上是较长密码的SHA-1 哈希的 ASCII 表示。

Nev1r-G0nna-G2ve-...的 SHA-1 校验和 = 706b4838613041714e62486364773847726d5370

此校验和在转换为 ASCII 时产生:pkH8a0AqNbHcdw8GrmSp

但是请注意,在加密或解密文件时,仅当密码长度大于 64 个字符时才会进行哈希处理。

换句话说,较短的密码在压缩或解压缩 ZIP 的任何阶段都不会被散列。

这就是为什么在加密阶段选择长Nev1r-G0nna-G2ve-...字符串作为密码时,ZIP 程序设置的实际密码实际上是该字符串的 (SHA1) 哈希值。

在解密阶段,如果您输入Nev1r-G0nna-G2ve-...,它将被散列并与之前存储的密码(即 SHA1 散列)进行比较。但是,在解密阶段输入较短的“pkH8a0AqNbHcdw8GrmSp”密码将使应用程序直接将此值与存储的密码(也就是 SHA1 哈希)进行比较。

Wikipedia 上 PBKDF2的 HMAC 冲突小节为感兴趣的读者提供了更多技术见解。

“当使用 HMAC 作为其伪随机函数时,PBKDF2 有一个有趣的属性。可以简单地构造任意数量的不同密码对,每对密码对都有冲突,”该条目指出。

“如果提供的密码长于底层 HMAC 散列函数的块大小,则密码首先被预先散列成摘要,然后将该摘要用作密码。”

但是,现在同一个 ZIP 有两个可能的密码这一事实并不代表安全漏洞,“因为仍然必须知道原始密码才能生成密码的哈希值,”该条目进一步解释道。

得到一个完美的密码

这里要注意的一个有趣的关键方面是,每个 SHA-1 哈希的 ASCII 表示不必是字母数字。

换句话说,假设我们在这个实验中为我们的 ZIP 文件选择了以下密码。密码长度超过 64 个字节:

Bl33pingC0mputer-Sh0w-M3-H0W-t0-pR0Duc3-an-eNcRyPT3D-ZIP-File-in-the-simplest-way

它的 SHA-1 校验和是:bd0b8c7ab2bf5934574474fb403e3c0a7e789b61

这个校验和的 ASCII 表示看起来像一组乱码——不像研究人员为他的实验生成的替代密码那样优雅:

乱码密码

Bl33pingC0mputer的 SHA-1 哈希的 ASCII 密码

BleepingComputer 询问 Sharoglazov 他如何能够选择一个密码,其 SHA-1 校验和将使得其 ASCII 表示产生一个干净的字母数字字符串。

“这就是使用 hashcat 的原因,”研究人员告诉 BleepingComputer

通过使用开源密码恢复工具hashcat的略微修改版本,研究人员使用字母数字字符生成了Never Gonna Give You Up...字符串的变体,直到他得到一个完美的密码。

“我测试*了 Nev0r*、*Nev1r*、*Nev2r*等等……我找到了我需要的密码。”

而且,Sharoglazov 就是这样得到一个大致读作“Never Gonna Give You Up...”的密码,但其 SHA-1 校验和的 ASCII 表示是一个简洁的字母数字字符串。

最后

对于大多数用户来说,创建一个受密码保护的 ZIP 文件并选择他们的密码就足够了,这就是他们需要知道的全部内容。

但是,如果您决定冒险,这个实验可以让您一窥围绕加密 ZIP 的众多谜团之一,例如拥有两个密码来保护您的机密信息。

译文申明

  • 文章来源为近期阅读文章,质量尚可的,大部分较新,但也可能有老文章。
  • 开卷有益,不求甚解,不需面面俱到,能学到一个小技巧就赚了。
  • 译文仅供参考,具体内容表达以及含义, 以原文为准 (译文来自自动翻译)
  • 如英文不错的,尽量阅读原文。(点击原文跳转)
  • 每日早读基本自动化发布(不定期删除),这是一项测试

最新动态: Follow Me

微信/微博:red4blue

公众号/知乎:blueteams



文章来源: https://mp.weixin.qq.com/s?__biz=MzU0MDcyMTMxOQ==&mid=2247487055&idx=4&sn=e46c141265b2c9cea837f06e2c0677ae&chksm=fb35a787cc422e919c67f8acd928e8179b56af3ab79e35d073a40532bebd220490febac47660#rd
如有侵权请联系:admin#unsafe.sh