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.