• Python 黑客 --- 002 入门级 ZIP压缩文件口令暴力破解机


    Python 黑客 入门级实战:ZIP压缩文件口令暴力破解机

    使用的系统:Ubuntu 14.04 LTS
    Python语言版本:Python 2.7.10 V


    编写zip 压缩文件口令破解器需要使用到Python 内自带的一个库:zipfile库。

    Step 1 .
    在终端中输入 python,启动Python交互终端。

    aobosir@ubuntu:~$ python
    Python 2.7.6 (default, Jun 22 2015, 18:00:18) 
    [GCC 4.8.2] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> 

    使用 help() 函数来查看 zipfile 。执行下面的命令来进一步了解 zipfile 这个库。

    >>> help('zipfile')

    输出:(内容太多,这里只截个图,自己看吧。也可以不用看,因为下面我就使用我自己的语言来介绍这个zipfile库如何使用。)

    这里写图片描述

    键盘输入 q 退出 help() 函数。

    Step 2 . 我们先建立一个加密的zip压缩文件:

    1. 创建一个文件,取名为:evil

    这里写图片描述

    1. 对文件右键,选择:Compress… 压缩

    这里写图片描述

    1. 选择 .zip 格式,并设置密码为:secret。点击 Create 创建。

    这里写图片描述

    1. 现在这个带有口令的 zip 文件就创建出来的。现在我们将原来的evil文件删除掉:

    这里写图片描述

    版本1 使用正确的密码对带有口令的zip文件进行解压

    Step 3 .

    在刚刚创建的带有口令的 zip 文件的路径下,新建一个Python脚本文件取名为:1-4-4-zipCrack.py

    这里写图片描述

    现在,使用 zipfile 库来编写一个简单的解压缩文件的程序:

    import zipfile
    zFile = zipfile.ZipFile("evil.zip")
    zFile.extractall(pwd="secret")

    Step 4 .

    接着,运行这个python脚本:

    $ ls
    1-4-4-zipCrack.py  evil.zip
    $ python 1-4-4-zipCrack.py
    $ ls
    1-4-4-zipCrack.py  evil  evil.zip

    解压成功。

    版本2 加入异常处理程序

    Step 5 . 删除刚刚解压出来的文件 evil

    $ rm evil
    $ ls
    1-4-4-zipCrack.py  evil.zip

    Step 6 . 继续完善程序,加入异常处理程序,我们给 extractall(p) 函数的 pwd 参数传入错误的密码:

    import zipfile
    zFile = zipfile.ZipFile("evil.zip")
    try:
        zFile.extractall(pwd="oranges")
    except Exception, e:
        print e
    

    Step 7 . 运行程序

    $ python 1-4-4-zipCrack.py
    ('Bad password for file', <zipfile.ZipInfo object at 0xb742162c>)

    因为口令错误,所以抛出异常。

    版本3 读取一个字典文件,使用字典文件中的所有单词对带有口令的zip文件进行暴力破解

    我们在程序里面读取一个字典文件(下载:dictionary.txt),里面存储的都是常用单词,对每一个单词都测试,是否是Zip文件的口令。

    Step 8 . 升级后的程序,如下

    import zipfile
    zFile = zipfile.ZipFile("evil.zip")
    passFile = open('dictionary.txt')
    
    for line in passFile.readlines():
            password = line.strip('
    ')
            try:
                    zFile.extractall(pwd=password)
                    print '[+] Password = ' + password + '
    '
                    exit(0)
            except Exception, e:
                    print e
    

    Step 9 . 运行脚本:

    $ ls
    1-4-4-zipCrack.py  dictionary.txt  evil.zip
    $ python 1-4-4-zipCrack.py 
    ('Bad password for file', <zipfile.ZipInfo object at 0xb743962c>)
    ('Bad password for file', <zipfile.ZipInfo object at 0xb743962c>)
    ('Bad password for file', <zipfile.ZipInfo object at 0xb743962c>)
    ('Bad password for file', <zipfile.ZipInfo object at 0xb743962c>)
    ('Bad password for file', <zipfile.ZipInfo object at 0xb743962c>)
    [+] Password = secret
    
    $ ls
    1-4-4-zipCrack.py  dictionary.txt  evil  evil.zip

    成功解压

    版本4 整理程序,将部分功能代码模块化

    Step 10 . 整理程序: 用函数将部分功能代码模块化。在程序里面并没有添加任何新的功能。

    import zipfile
    def extractFile(zFile, password):
        try:
            zFile.extractall(pwd=password)
            return password
        except:
            return
    
    def main():
        zFile = zipfile.ZipFile("evil.zip")
        passFile = open('dictionary.txt')
        for line in passFile.readlines():
            password = line.strip('
    ')
            guess = extractFile(zFile, password)
            if guess:
                print '[+] Password = ' + password + '
    '
                exit(0)
    
    if __name__ == '__main__':
        main()
    

    你可以自己运行试试看,这里就不运行了。

    版本5 多线程同时测试字典中的多个口令

    之前的版本,都是逐个测试字典词库中的单词,同一时间只测试一个单词。这次的版本利用线程同时测试字典中的多个单词。

    Step 11 . 删除刚刚解压出来的文件 evil

    $ rm evil
    $ ls
    1-4-4-zipCrack.py  dictionary.txt  evil.zip

    Step 12 .
    升级后的程序

    import zipfile
    from threading import Thread
    def extractFile(zFile, password):
            try:
                    zFile.extractall(pwd=password)
                    print '[+] Found password = ' + password + '
    '
            except:
                    pass
    
    def main():
            zFile = zipfile.ZipFile("evil.zip")
            passFile = open('dictionary.txt')
            for line in passFile.readlines():
                    password = line.strip('
    ')
                    t = Thread(target=extractFile, args = (zFile, password))
                    t.start()
    
    if __name__ == '__main__':
            main()
    

    Step 13 . 运行脚本

    [+] Found password = secret
    

    版本五 (终极版本) 在终端中制定zip文件 和 字典文件 的路径

    Step 14 . 删除刚刚解压出来的文件 evil

    $ ls
    1-4-4-zipCrack.py  dictionary.txt  evil  evil.zip
    $ rm evil
    $ ls
    1-4-4-zipCrack.py  dictionary.txt  evil.zip

    Step 15 . 最终的脚本程序

    #! /usr/bin/python
    # -*- coding: utf-8 -*-
    import zipfile
    import optparse
    from threading import Thread
    def extractFile(zFile, password):
        try:
            zFile.extractall(pwd=password)
            print '[+] Found password = ' + password + '
    '
        except:
            pass
    
    def main():
        parser = optparse.OptionParser("usage: python 1-4-4-zipCrack.py "+
        "-f <zipfile> -d <dictionary>")
        parser.add_option('-f', dest='zname', type='string',
        help='specify zip file')
        parser.add_option('-d', dest='dname', type='string',
        help='specify dictionary file')
        (options, args) = parser.parse_args()
        if (options.zname == None) | (options.dname == None):
            print parser.usage
            exit(0)
        else:
            zname = options.zname
            dname = options.dname
        zFile = zipfile.ZipFile(zname)
        passFile = open(dname)
        for line in passFile.readlines():
            password = line.strip('
    ')
            t = Thread(target=extractFile, args = (zFile, password))
            t.start()
    
    if __name__ == '__main__':
        main()
    

    Step 16 . 运行:

    $ python 1-4-4-zipCrack.py -f evil.zip -d dictionary.txt
    [+] Found password = secret
    

    搞定,大功告成

    讲解代码:

    下面这段程序是 帮助程序

        parser = optparse.OptionParser("usage: python 1-4-4-zipCrack.py "+
        "-f <zipfile> -d <dictionary>")
        parser.add_option('-f', dest='zname', type='string',
        help='specify zip file')
        parser.add_option('-d', dest='dname', type='string',
        help='specify dictionary file')
        (options, args) = parser.parse_args()
        if (options.zname == None) | (options.dname == None):
            print parser.usage
            exit(0)

    使用下面的两个方式执行1-4-4-zipCrack.py 脚本就可以调用上面的if语句下的代码。

    $ python 1-4-4-zipCrack.py 
    python 1-4-4-zipCrack.py -f <zipfile> -d <dictionary>
    $ python 1-4-4-zipCrack.py -h
    Usage: python 1-4-4-zipCrack.py -f <zipfile> -d <dictionary>
    
    Options:
      -h, --help  show this help message and exit
      -f ZNAME    specify zip file
      -d DNAME    specify dictionary file

  • 相关阅读:
    用Javascript进行简单的Table点击排序.
    asp也来玩三层?
    用在JavaScript的RequestHelper
    一个JavaScript方法的演变
    自己动手,实现jQuery中的ImageCopper.
    notes on relations
    mutex and condition variable
    virtual destructor
    virtual inheritance
    一道概率题
  • 原文地址:https://www.cnblogs.com/aobosir/p/5928580.html
Copyright © 2020-2023  润新知