Team Rocket
Team Rocket is looking for new members to join their global conquest! They have set up a new system to recruit new members. Can you infiltrate their system and find out what they are up to?
Source Code Analysis
from flask import Flask, render_template, request, redirect, url_for, abort, session, flash
from models import Grunt, Commander, Member
from utils import set_attr
import os
import functools
app = Flask(__name__)
app.secret_key = os.urandom(32).hex()
admin = Commander("Giovanni", "Mewtwo", app.secret_key)
Member.add_member_to_list(admin)
# Login required decorator
def login_required(view):
@functools.wraps(view)
def wrapped_view(**kwargs):
if 'user_id' not in session:
('You need to login first')
return redirect(url_for('login'))
return view(**kwargs)
return wrapped_view
def get_user_information(id):
member = Member.member_list.get(id)
if member:
return {
'id': member.id,
'name': member.name,
'role': member.role,
'pokemon': member.pokemon
# Password removed for security
}
return None
@app.route("/")
def index():
return render_template("index.html")
@app.route("/login", methods=['GET', 'POST'])
def login():
if request.method == 'POST':
name = request.form.get('name')
password = request.form.get('password')
for member_id, member in Member.member_list.items():
if member.name == name and member.validate_password(password):
session.clear()
session['user_id'] = member.id
session['user_name'] = member.name
session['user_role'] = member.role
return redirect(url_for('dashboard'))
return render_template('login.html')
@app.route('/logout')
def logout():
Member.clear_member_from_list(session.get('user_id'))
session.clear()
return redirect(url_for('index'))
@app.route("/dashboard", methods=['GET'])
@login_required
def dashboard():
current_user_id = session.get('user_id')
all_members = []
for member_id, member in Member.member_list.items():
if member.role == 'Commander' or member_id == current_user_id:
all_members.append({
'id': member.id,
'name': member.name,
'role': member.role,
'pokemon': member.pokemon,
'tagline': member.intro()
})
return render_template("dashboard.html", list_of_members=all_members)
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == "POST":
name = request.form["name"]
pokemon = request.form["pokemon"]
password = request.form['password']
if not name or not pokemon or not password:
abort(400)
for member_id, member in Member.member_list.items():
if member.name == name:
flash(f"Username '{name}' is already taken. Choose another one.", "error")
return render_template("register.html")
user = Grunt(name, pokemon, password)
Member.add_member_to_list(user)
return redirect(url_for("index"))
return render_template("register.html")
@app.route('/under_construction', methods=['POST'])
@login_required
def under_construction():
if request.method == "POST":
current_user_id = session.get('user_id')
member = Member.member_list.get(current_user_id)
if member:
field = request.form['field']
value = request.form['value']
set_attr(member, field, str(value))
return redirect(url_for('dashboard'))
@app.route('/control_panel', methods=['GET', 'POST'])
@login_required
def control_panel():
current_user_id = session.get('user_id')
member = Member.member_list.get(current_user_id)
if not member or member.role != 'Commander':
return redirect(url_for('dashboard'))
if request.method == 'POST':
output = member.execute_command()
return render_template('control_panel.html', output=output)
return render_template('control_panel.html', output='Top Secret')
if __name__ == '__main__':
app.run()
Privilege Escalation


A Twist


Challenges

Pasting set_attrfunction into ChatGPT
References
Last updated