【问题标题】:Bruteforcing zip file gives weird results暴力破解 zip 文件会产生奇怪的结果
【发布时间】:2016-07-21 21:53:29
【问题描述】:

所以我写了这个程序来在 python 中暴力破解一个 zip 文件:

def Main():
    parser = argparse.ArgumentParser()
    parser.add_argument("zfile", help = "The encrypted zip file you wish to crack")
    parser.add_argument("length", help="Define the max length of password combinations you want to bruteforce")
    args = parser.parse_args()

    zFile = zipfile.ZipFile(args.zfile)
    keywords = [''.join(i) for i in itertools.product(ascii_lowercase, repeat = int(args.length))]

    for i in keywords:
        print "[*] Testing password: "+i
        try:
            zFile.extractall(pwd = str(i))
            print "[+] Password Found: "+i
            break
        except:
            pass    

if __name__ == '__main__':
    Main()

但它的行为异常......我有一个密码为“dog”的存档,当我运行该程序时,它会找到一大堆密码,这些密码据称“有效”但实际上并没有。如果我手动将这些密码输入到 zip 文件中,它会提取损坏的文件。 该程序说诸如“aqw”之类的密码可以使用,而且其中有很多。最奇怪的部分是程序在说这些不起作用的密码之一可以工作后不会从 for 循环中中断。

我不知道发生了什么!

【问题讨论】:

  • 我对这句话有两个疑问:“如果我在 zip 文件中手动输入此类密码,它会提取损坏的文件。” (1) 在 zip 文件中输入密码是什么意思?我认为密码被输入到程序而不是 zip 文件中;然后程序从文件中提取数据。你在用什么程序? (2) 提取损坏文件的“它”是什么?当试用密码失败时,您列出的程序不会打印任何内容。你确定这曾经发生过吗?
  • 好的,让我重新表述一下。我有一个存档,当我尝试使用 Stuffit Expander 解压缩它时,它会提示我输入密码。我知道密码是“狗”。但是,当我运行我的脚本时,它会输出几个其他密码,例如“aqw”或“how”(例如,程序将打印“[+] Password Found: how”),说这些在我尝试时会起作用展开 zip 文件。当我在 Stuffit Expander 中输入这些密码时,它们实际上会提取 zip 文件,但提取的文件会损坏。抱歉,我打错字了
  • 谢谢,现在明白了。我不确定您是否遇到了 Python 问题,因为 Stufit Expander 和 Python 是一致的:它们都不会在应有的情况下给您提供无效的密码结果。我查看了 zipfile.py 代码(标准 Python 库),它使用了一种名为 _ZipDecrypter 的东西,它是用纯 Python 编写的。当它失败时,你会得到一个 RuntimeException(“文件密码错误”),但它不是很复杂。也许查看库源代码会给你一个线索。奇怪的问题。
  • 您认为这可能是 zip 文件中内置的安全功能,因此您无法暴力破解吗?
  • 我认为更有可能是密码功能不太好。也许它部分依赖于人类而不是程序来检测错误的解密。从我对 Python 代码的阅读来看,密码本身似乎并未存储在 zip 文件中,因此该算法无法从字面上检查是否匹配。相反,它会尝试推断猜测密码的正确性,但并不总是正确。不幸的是,在这种情况下,您要编写的程序将永远无法运行。然而,我可能都错了。

标签: python python-2.7 encryption zip brute-force


【解决方案1】:

这是因为 ZIP 文件格式使用一种非常粗略的方法来确定输入的密码实际上是正确还是不正确。

基本上,存档目录中存储了一个字节,表示密码“正确”。问题是,当你进行暴力破解时,你会经常在字节匹配的地方触发误报(可能每 255 次尝试一次左右),但密码实际上并不正确。

当您找到这样的潜在匹配项时,我们的想法是使用该密码完全解密存档。完全解密后,程序应将解密数据的 CRC 与存储的 CRC 进行比较,并检查密码是否正确。

这是您确定已找到匹配项的唯一方法。

【讨论】:

  • 没错。我还要补充一点,通常用来消除这样的误报的方法是测试存档中多个文件的密码(在过程中使用多个测试字节)。假设您的存档中有多个文件。
猜你喜欢
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 2015-10-04
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
相关资源
最近更新 更多