开卷有益 · 不求甚解
受密码保护的 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