2016-08-08 12 views
0

私はpython SHA512 brute forcerを書こうとしています。値を繰り返すPythonスレッド

私は、キューを使用してワードリストに値を格納し、それらを暗号化されたハッシュと比較します。

問題は、値がキューからポップされる代わりに、他のスレッドによって再利用されることです。基本的には、スレッド間で作業全体を分割して処理を高速化する代わりに、同じことを行うスレッドがいくつかあります。これをどうすれば解決できますか? 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:私はこのような何かをしたい

私はこれを行うことができ、2つの方法があります実現: 最初は、私は私が欲しいものではありません各ユーザのためのスレッドを作成することができます。 第2に、各ユーザーの作業を複数のスレッドで分割することができます。

答えて

0

のは、このコードブロックを見てみましょう:

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

とのこれはあなたが開始する各スレッドのために何をしているかを説明しましょう:build_wordlistで定義されているよう

  1. test.txtから新しいQueueオブジェクトを作成します
  2. ステップ1のキューを処理します。

同じキューの重複を作成するのではなく、1つのキューで複数の処理ステップをマルチスレッド化するのが望ましいようです。つまり、あなたの "testPass"メソッドはおそらくQueueオブジェクトを取り込むべきです。

def testPass(queue, cryptPass, user): 

    word_queue = queue 
    ... stuff ... 
:すなわち

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

testPassは次のようになります。

関連する問題