278 lines
13 KiB
Python
278 lines
13 KiB
Python
import werkzeug
|
||
from flask import Flask, render_template, request, url_for, session, redirect, g, abort, send_file, render_template_string
|
||
import sqlite3
|
||
from random import getrandbits
|
||
from func import *
|
||
import base64
|
||
#Вот сюда тебе и надо, начинающий мастер OSINT'а! Только не смотри другие флаги: кто посмотрит, тот ***** :>
|
||
|
||
|
||
connection = sqlite3.connect('database.db')
|
||
cursor = connection.cursor()
|
||
cursor.execute('''
|
||
CREATE TABLE IF NOT EXISTS Users (
|
||
id INTEGER PRIMARY KEY,
|
||
login TEXT NOT NULL,
|
||
password TEXT NOT NULL
|
||
)
|
||
''')
|
||
cursor.execute('SELECT * FROM Users where login = "admin"')
|
||
if not cursor.fetchone():
|
||
cursor.execute('INSERT INTO Users (login, password) VALUES (?, ?)', ('admin', '12345678'))
|
||
connection.commit()
|
||
|
||
app = Flask(__name__)
|
||
app.config['SECRET_KEY'] = 'ca4ac4ada05f91a5790d2132992bfaed86df15c4d08f2dfe'
|
||
DATABASE = 'database.db'
|
||
|
||
@app.route("/osint/found_me", methods=('GET', 'POST'))
|
||
def osintfound():
|
||
Y0u_Fin4ly_F0und_7his = 'C4TchFl4g{Pls_supp0rt_my_pr0j3ct}'
|
||
if request.method == 'POST':
|
||
user_flag = request.form['user_flag']
|
||
if user_flag == Y0u_Fin4ly_F0und_7his:
|
||
return render_template('found-me.html', flag=Y0u_Fin4ly_F0und_7his, success_flag='.')
|
||
return render_template('found-me.html', flag=Y0u_Fin4ly_F0und_7his, error='Ошибка: неверный флаг!')
|
||
return render_template('found-me.html')
|
||
|
||
def get_db():
|
||
db = getattr(g, '_database', None)
|
||
if db is None:
|
||
db = g._database = sqlite3.connect(DATABASE)
|
||
return db
|
||
|
||
@app.teardown_appcontext
|
||
def close_connection(exception):
|
||
db = getattr(g, '_database', None)
|
||
if db:
|
||
db.close()
|
||
|
||
@app.route("/")
|
||
def index():
|
||
return render_template('index.html')
|
||
|
||
@app.route("/web")
|
||
def web():
|
||
return render_template('web-main.html')
|
||
|
||
@app.route("/forensic")
|
||
def forensic():
|
||
return render_template('forensic-main.html')
|
||
|
||
@app.route("/osint")
|
||
def osint():
|
||
return render_template('osint-main.html')
|
||
|
||
@app.route("/web/sql-injection", methods=('GET', 'POST'))
|
||
def websql():
|
||
if request.method == 'POST':
|
||
login = request.form['login']
|
||
password = request.form['pass']
|
||
cursor = get_db().cursor()
|
||
cursor.execute(f'SELECT * FROM Users WHERE login == "{login}" AND password == "{password}"')
|
||
user = cursor.fetchone()
|
||
if not user:
|
||
return render_template('sql-injection.html', error='Ошибка: неверный логин или пароль')
|
||
session['sql_flag'] = f'C4TchFl4g{{{hex(getrandbits(45))[2:]}}}'
|
||
return redirect(url_for('success_login'), code=302)
|
||
return render_template('sql-injection.html')
|
||
|
||
@app.route("/web/success_login-sqltask", methods=('GET', 'POST'))
|
||
def success_login():
|
||
flag = session.get('sql_flag')
|
||
if request.method == 'POST':
|
||
user_flag = request.form['user_flag']
|
||
if user_flag == flag:
|
||
return render_template('success-sql.html', flag=flag, success_flag='.')
|
||
return render_template('success-sql.html', flag=flag, error='Ошибка: неверный флаг!')
|
||
if flag:
|
||
return render_template('success-sql.html', flag=flag)
|
||
abort(404)
|
||
|
||
idor_main_users = {}
|
||
|
||
@app.route("/web/idor", methods=('GET', 'POST'))
|
||
def webidor():
|
||
if request.method == 'POST':
|
||
if 'user_flag' in request.form.keys():
|
||
flag = session.get('idor_flag')
|
||
user_flag = request.form['user_flag']
|
||
if user_flag == flag and 'idor_id' in session.keys() and session['idor_id'] in idor_main_users.keys():
|
||
del idor_main_users[session['idor_id']]
|
||
return render_template('idor.html', flag=flag, success_flag='.')
|
||
return render_template('idor.html', flag=flag, error='Ошибка: неверный флаг!')
|
||
|
||
login = request.form['login']
|
||
mail = request.form['mail']
|
||
password = request.form['pass']
|
||
if not login:
|
||
return render_template('idor.html', error='Ошибка: не оставляйте себя без имени!')
|
||
if not password:
|
||
return render_template('idor.html', error='Ошибка: Пароль важен, заполните поле!')
|
||
|
||
session['idor_flag'] = f'C4TchFl4g{{{hex(getrandbits(45))[2:]}}}'
|
||
session['idor_id'] = id = getrandbits(8) + 16
|
||
idor_main_users[id] = {'login': login,'mail': mail}
|
||
return redirect(url_for('webidor_user', id=session['idor_id']), code=302)
|
||
return render_template('idor.html')
|
||
|
||
|
||
@app.route("/web/idor/user_id<int:id>", methods=('GET', 'POST'))
|
||
def webidor_user(id):
|
||
if 'idor_id' not in session.keys():
|
||
abort(404)
|
||
if id <= 15:
|
||
idor_users = {0: ('admin', 'superadmin@codrs.ru', 'Самый крутой админ EVER!!! Не согласен - не прав!'), 1: ('Y0ur_m0m', 'l0ser@codrs.ru', 'Ха-ха! Тупой юзер, ******, **** и *****'), 2: ('meg4_c4t', 'meowmeow@codrs.ru', 'Мяу-мяу, мяу-мяу... мяу-мяу, мяу-мяу'), 3: ('Pepeg4', 'pepeg@codrs.ru', 'Pepe love you too'), 4: ('ChestWithCat', 'chast@codrs.ru', 'Сундук из майнкрафта. На сундуке кот. Есть рыба, кота приручить?'), 5: ('legacy_user', 'legacy@coders-squad.com', 'А вот прошлый домен был лучше! Продались российским корпорациям!!!!!'), 6: ('m&ms', 'm&ms_lover@codrs.ru', 'Ставлю лайки за покупку m&ms, писать в ТГ'), 7: ('am0ng US', 'US_agent@gmail.com','Russishe Sweine!'), 8: ('anime_girl', 'megumin@codrs.ru', ''), 9: (session['idor_flag'], 'supercat@codrs.ru', 'О, смотри! Там флаг!!! Ты нашёл:3'), 10: ('b0ss_0f_this-GYM', 'b0ss@codrs.ru', 'И что же ты хотел увидеть в описании у Босса качалки?'), 11: ('CS2_Destroyer', 'player777@codrs.ru', 'Погнали в Напы выскочим, размотаем всех. Не играешь? Я в соло вытащу, а ты посмотришь'), 12: ('VerySweetBread', 'sweetbread@codrs.ru'), 13: ('pupok', 'pup_zemli@codrs.ru', 'Whait.. WHAT?!'), 14: ('secret_KGB_agent', 'b0rn_in_US4@codrs.su', 'Союз нерушимый республик свободных!'), 15: ('nikitata', '1ida_1over@codrs.ru', 'Раст победа?')}
|
||
return render_template('idor_user.html', user=idor_users[id])
|
||
if id not in idor_main_users.keys():
|
||
abort(404)
|
||
return render_template('idor-main-user.html', login=idor_main_users[id]['login'], mail=idor_main_users[id]['mail'])
|
||
|
||
|
||
@app.route("/web/path-traversal", methods=('GET', 'POST'))
|
||
def webpt():
|
||
flag_task3 = 'С4Tch_Fl4g{Y0u_Find_4_littl3_kitty}'
|
||
if request.method == 'POST':
|
||
user_flag = request.form['user_flag']
|
||
if user_flag == flag_task3:
|
||
return render_template('path-traversal.html', flag=flag_task3, success_flag='.')
|
||
return render_template('path-traversal.html', flag=flag_task3, error='Ошибка: неверный флаг!')
|
||
filename = request.args.get("file")
|
||
if not filename:
|
||
return render_template('path-traversal.html')
|
||
try:
|
||
return send_file(filename)
|
||
except FileNotFoundError:
|
||
abort(404)
|
||
|
||
@app.route("/web/ssti", methods=('GET', 'POST'))
|
||
def webssti():
|
||
id = session.get('ssti_id')
|
||
flag = session.get('flag_ssti')
|
||
if id not in comments.keys():
|
||
session['ssti_id'] = id = hex(getrandbits(45))[2:]
|
||
comments[id] = []
|
||
session['flag_ssti'] = flag = f'C4TchFl4g{{{hex(getrandbits(45))[2:]}}}'
|
||
|
||
if request.method == 'POST':
|
||
if 'user_flag' in request.form.keys():
|
||
user_flag = request.form['user_flag']
|
||
if user_flag == flag:
|
||
return render_template('ssti.html', flag=flag, success_flag='.')
|
||
return render_template('ssti.html', flag=flag, error='Ошибка: неверный флаг!')
|
||
|
||
username = request.form['username']
|
||
comment = request.form['user_comment']
|
||
comments[id].append((username, comment))
|
||
def render(x):
|
||
try:
|
||
return render_template_string(x, flag=flag)
|
||
except:
|
||
return x
|
||
return render_template('ssti.html', render_template_string=render, comments=comments[id], flag=flag)
|
||
|
||
|
||
comments = {}
|
||
|
||
|
||
@app.route("/web/portswigger-guide")
|
||
def webpsguide():
|
||
return render_template('portswigger-guide.html')
|
||
|
||
@app.route("/forensic/metadata", methods=('GET', 'POST'))
|
||
def fmetadata():
|
||
flag_task1 = session.get('flag_task1')
|
||
if request.method == 'POST':
|
||
user_flag = request.form['user_flag']
|
||
if user_flag == flag_task1:
|
||
return render_template('task1-metadata.html', flag=flag_task1, success_flag='.')
|
||
return render_template('task1-metadata.html', flag=flag_task1, error='Ошибка: неверный флаг!')
|
||
|
||
if not flag_task1:
|
||
session['task1_id'] = id = hex(getrandbits(45))[2:]
|
||
session['flag_task1'] = flag_task1 = f'C4TchFl4g{{{hex(getrandbits(45))[2:]}}}'
|
||
task1_flag(flag_task1, id)
|
||
return render_template('task1-metadata.html', flag=flag_task1)
|
||
|
||
@app.route("/forensic/getimg")
|
||
def forensic_task1():
|
||
if 'task1_id' not in session.keys():
|
||
abort(404)
|
||
return send_file(f'/tmp/task1/{session['task1_id']}.jpg')
|
||
|
||
@app.route("/forensic/base-guide", methods=('GET', 'POST'))
|
||
def fbase():
|
||
flag_task4 = session.get('flag_task4')
|
||
if request.method == 'POST':
|
||
user_flag = request.form['user_flag']
|
||
if user_flag == flag_task4:
|
||
return render_template('base.html', flag=flag_task4, success_flag='.')
|
||
return render_template('base.html', flag=flag_task4, error='Ошибка: неверный флаг!')
|
||
if not flag_task4:
|
||
session['flag_task4'] = flag_task4 = f'C4TchFl4g{{{hex(getrandbits(45))[2:]}}}'
|
||
base32str = str(base64.b32encode(flag_task4.encode()))[2:-1]
|
||
base64str = str(base64.b64encode(f"Ой-ой, похоже, что самое главное всё ещё зашифровано.. Сможешь расшифровать, ОП? {base32str}".encode()))[2:-1]
|
||
return render_template('base.html', base_task=base64str)
|
||
|
||
|
||
@app.route("/forensic/.docx_files", methods=('GET', 'POST'))
|
||
def fbinwalk():
|
||
flag_task3 = 'C4TchFl4g{GT4_6_1eaks}'
|
||
if request.method == 'POST':
|
||
user_flag = request.form['user_flag']
|
||
if user_flag == flag_task3:
|
||
return render_template('binwalk.html', flag=flag_task3, success_flag='.')
|
||
return render_template('binwalk.html', flag=flag_task3, error='Ошибка: неверный флаг!')
|
||
return render_template('binwalk.html')
|
||
|
||
@app.route("/forensic/hex", methods=('GET', 'POST'))
|
||
def fhex():
|
||
flag_task2 = "C4TchFl4g{I_hir3d_7his_c4r_t0_st4r3_4t_Y0u}"
|
||
if request.method == 'POST':
|
||
user_flag = request.form['user_flag']
|
||
if user_flag == flag_task2:
|
||
return render_template('hex.html', flag=flag_task2, success_flag='.')
|
||
return render_template('hex.html', flag=flag_task2, error='Ошибка: неверный флаг!')
|
||
return render_template('hex.html')
|
||
|
||
@app.route("/forensic/hash", methods=('GET', 'POST'))
|
||
def fhash():
|
||
flag_task5 = "C4TchFl4g{superadmin}"
|
||
if request.method == 'POST':
|
||
user_flag = request.form['user_flag']
|
||
if user_flag == flag_task5:
|
||
return render_template('hash.html', flag=flag_task5, success_flag='.')
|
||
return render_template('hash.html', flag=flag_task5, error='Ошибка: неверный флаг!')
|
||
return render_template('hash.html')
|
||
|
||
|
||
|
||
@app.route("/osint/mapmaster", methods=('GET', 'POST'))
|
||
def osintgeoguessr():
|
||
flag_task6 = "C4TchFl4g{1905}"
|
||
if request.method == 'POST':
|
||
user_flag = request.form['user_flag']
|
||
if user_flag == flag_task6:
|
||
return render_template('mapmaster.html', flag=flag_task6, success_flag='.')
|
||
return render_template('mapmaster.html', flag=flag_task6, error='Ошибка: неверный флаг!')
|
||
return render_template('mapmaster.html')
|
||
|
||
@app.route("/osint/really_hard_task", methods=('GET', 'POST'))
|
||
def osintrht():
|
||
flag_task7 = "C4Tch_Fl4g{13ts_p14y_min3cr4ft_t0g3th3r}"
|
||
if request.method == 'POST':
|
||
user_flag = request.form['user_flag']
|
||
if user_flag == flag_task7:
|
||
return render_template('osint-hardtask.html', flag=flag_task7, success_flag='.')
|
||
return render_template('osint-hardtask.html', flag=flag_task7, error='Ошибка: неверный флаг!')
|
||
return render_template('osint-hardtask.html')
|
||
|
||
|
||
|
||
@app.errorhandler(werkzeug.exceptions.HTTPException)
|
||
def error_handler(e):
|
||
return f'<img src="https://http.cat/{e.code}.jpg">', e.code
|
||
|
||
app.run(host="0.0.0.0", debug=False)
|
||
connection.close()
|