Zip-File Password Cracker

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Sécurité offensive — cassage de mot de passe
Type Script Python 2 (proof of concept)
Modules zipfile, optparse, threading
Voir aussi Test de penetration · Rappel python

Zip-File Password Cracker illustre l'extraction d'une archive ZIP protégée par mot de passe et le cassage par dictionnaire : le script essaie chaque mot d'un fichier de dictionnaire jusqu'à trouver le mot de passe qui permet l'extraction. Une variante multi-thread accélère le test. Exemples en Python 2.

Extraction d'un fichier

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

Avec gestion d'erreur :

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

Cassage par dictionnaire

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

Organisation en fonctions

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('\n')
        guess = extractFile(zFile, password)
        if guess:
            print '[+] Password = ' + password + '\n'
            exit(0)

if __name__ == '__main__':
    main()

Version multi-thread

Chaque test de mot de passe est confié à un thread :

import zipfile
from threading import Thread

def extractFile(zFile, password):
    try:
        zFile.extractall(pwd=password)
        print '[+] Found password ' + password + '\n'
    except:
        pass

def main():
    zFile = zipfile.ZipFile('evil.zip')
    passFile = open('dictionary.txt')
    for line in passFile.readlines():
        password = line.strip('\n')
        t = Thread(target=extractFile, args=(zFile, password))
        t.start()

if __name__ == '__main__':
    main()

Ajout d'options en ligne de commande

import zipfile
import optparse
from threading import Thread

def extractFile(zFile, password):
    try:
        zFile.extractall(pwd=password)
        print '[+] Found password ' + password + '\n'
    except:
        pass

def main():
    parser = optparse.OptionParser("usage %prog -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('\n')
            t = Thread(target=extractFile, args=(zFile, password))
            t.start()

if __name__ == '__main__':
    main()

Voir aussi