2016-08-08 47 views
0

Ich versuche, einen Python SHA512 Brute Forcer zu schreiben.Python-Threads, die Werte wiederholen

Ich verwende eine Warteschlange, um die Werte in der Wortliste zu speichern und sie dann mit dem verschlüsselten Hash zu vergleichen.

Das Problem ist, dass anstelle der Werte aus der Warteschlange, werden sie von anderen Threads wiederverwendet. Also im Grunde, anstatt die ganze Arbeit zwischen Threads aufgeteilt zu haben, um die Dinge schneller zu machen, habe ich mehrere Threads, die genau dasselbe machen. Wie kann ich das beheben?

Ich möchte etwas wie folgt aus: https://github.com/WillPennell/Python/blob/master/Black-Hat-Python/BHP-Code/Chapter5/content_bruter.py#L20

import threading 
import thread 
import Queue 
import os,sys 
import crypt 
import codecs 
from datetime import datetime,timedelta 
import argparse 
today = datetime.today() 
resume = None 
threads = 5 



def build_wordlist(wordlist_file): 

    fd = open(wordlist_file,"rb") 
    raw_words = fd.readlines() 
    fd.close() 

    found_resume = False 
    words  = Queue.Queue() 

    for word in raw_words: 

     word = word.rstrip() 

     if resume is not None: 

      if found_resume: 
       words.put(word) 
      else: 
       if word == resume: 
        found_resume = True 
        print "Resuming wordlist from: %s" % resume 

     else: 
      words.put(word) 

    return words 


def testPass(cryptPass,user): 

    word_queue  =  build_wordlist('test.txt') 


    while not word_queue.empty(): 
     attempt = word_queue.get() 
     ctype = cryptPass.split("$")[1] 
     if ctype == '6': 
      print "[+] Hash type SHA-512 detected ..." 
      salt = cryptPass.split("$")[2] 
      insalt = "$" + ctype + "$" + salt + "$" 
      word = attempt 
      cryptWord = crypt.crypt(word,insalt) 
      if (cryptWord == cryptPass): 
       time = time = str(datetime.today() - today) 
       print "[+] Found password for the user: " + user + " ====> " + word + " Time: "+time+"\n" 
       return 

    print "Password not found for the user: " + user 
    print "Moving on to next user..." 
    exit 

def main(): 
    parse = argparse.ArgumentParser(description='A simple brute force /etc/shadow .') 
    parse.add_argument('-f', action='store', dest='path', help='Path to shadow file, example: \'/etc/shadow\'') 
    argus=parse.parse_args() 
    if argus.path == None: 
     parse.print_help() 
     exit 
    else: 
     build_wordlist('test.txt') 
     passFile = open (argus.path,'r') 
     for line in passFile.readlines(): 
      line = line.replace("\n","").split(":") 
      if not line[1] in [ 'x' , '*' , '!' ]: 
       user = line[0] 
       cryptPass = line[1] 
       for i in range(threads): 
        t = threading.Thread(target=testPass,args=(cryptPass,user)) 
        t.daemon = True 
        t.start() 
if __name__=="__main__": 
    main() 

EDIT: Ich erkannte, gibt es 2 Möglichkeiten, wie ich dies tun können: zuerst, ich kann für jeden Benutzer einen Thread erstellen, das ist nicht das, was ich will. Zweitens kann ich die Arbeit von jedem Benutzer durch mehrere Threads teilen, was ich will.

Antwort

0

der an diesem Code-Block Werfen wir einen Blick:

for i in range(threads): 
    t = threading.Thread(target=testPass,args=(cryptPass,user)) 
    t.daemon = True 
    t.start() 

Und lassen Sie uns beschreiben, was das für jeden Thread tut Sie beginnen:

  1. erstellen Sie ein neues Queue Objekt aus test.txt wie build_wordlist definiert
  2. Verarbeiten Sie die Warteschlange von Schritt 1

Es klingt wie Ihr gewünschtes Verhalten ist Multithread einige Verarbeitungsschritt in einer einzigen Warteschlange, anstatt Duplikate der gleichen Warteschlange zu erstellen. Das bedeutet, dass Ihre "testPass" -Methode wahrscheinlich ein Queue-Objekt aufnehmen sollte. das heißt

q = build_wordlist('test.txt') 
for i in range(threads): 
    t = threading.Thread(target=testPass,args=(q, cryptPass,user)) 
    t.daemon = True 
    t.start() 

und testPass sollte wie folgt aussehen:

def testPass(queue, cryptPass, user): 

    word_queue = queue 
    ... stuff ...