mirror of
https://github.com/aljazceru/CTFd.git
synced 2025-12-17 05:54:19 +01:00
474 lines
12 KiB
Python
474 lines
12 KiB
Python
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import datetime
|
|
import hashlib
|
|
import random
|
|
import sys
|
|
import argparse
|
|
|
|
from CTFd import create_app
|
|
from CTFd.models import (
|
|
Users,
|
|
Teams,
|
|
Challenges,
|
|
Flags,
|
|
Awards,
|
|
ChallengeFiles,
|
|
Fails,
|
|
Solves,
|
|
)
|
|
from faker import Faker
|
|
|
|
fake = Faker()
|
|
|
|
parser = argparse.ArgumentParser()
|
|
|
|
parser.add_argument("--mode", help="Set user mode", default="teams")
|
|
parser.add_argument("--users", help="Amount of users to generate", default=50, type=int)
|
|
parser.add_argument("--teams", help="Amount of teams to generate", default=10, type=int)
|
|
parser.add_argument(
|
|
"--challenges", help="Amount of challenges to generate", default=20, type=int
|
|
)
|
|
parser.add_argument(
|
|
"--awards", help="Amount of awards to generate", default=5, type=int
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
|
|
app = create_app()
|
|
|
|
mode = args.mode
|
|
USER_AMOUNT = args.users
|
|
TEAM_AMOUNT = args.teams if args.mode == "teams" else 0
|
|
CHAL_AMOUNT = args.challenges
|
|
AWARDS_AMOUNT = args.awards
|
|
|
|
categories = [
|
|
"Exploitation",
|
|
"Reversing",
|
|
"Web",
|
|
"Forensics",
|
|
"Scripting",
|
|
"Cryptography",
|
|
"Networking",
|
|
]
|
|
extensions = [
|
|
".doc",
|
|
".log",
|
|
".msg",
|
|
".rtf",
|
|
".txt",
|
|
".wpd",
|
|
".wps",
|
|
".123",
|
|
".csv",
|
|
".dat",
|
|
".db",
|
|
".dll",
|
|
".mdb",
|
|
".pps",
|
|
".ppt",
|
|
".sql",
|
|
".wks",
|
|
".xls",
|
|
".xml",
|
|
".mng",
|
|
".pct",
|
|
".bmp",
|
|
".gif",
|
|
".jpe",
|
|
".jpg",
|
|
".png",
|
|
".psd",
|
|
".psp",
|
|
".tif",
|
|
".ai",
|
|
".drw",
|
|
".dxf",
|
|
".eps",
|
|
".ps",
|
|
".svg",
|
|
".3dm",
|
|
".3dm",
|
|
".ind",
|
|
".pdf",
|
|
".qxd",
|
|
".qxp",
|
|
".aac",
|
|
".aif",
|
|
".iff",
|
|
".m3u",
|
|
".mid",
|
|
".mid",
|
|
".mp3",
|
|
".mpa",
|
|
".ra",
|
|
".ram",
|
|
".wav",
|
|
".wma",
|
|
".3gp",
|
|
".asf",
|
|
".asx",
|
|
".avi",
|
|
".mov",
|
|
".mp4",
|
|
".mpg",
|
|
".qt",
|
|
".rm",
|
|
".swf",
|
|
".wmv",
|
|
".asp",
|
|
".css",
|
|
".htm",
|
|
".htm",
|
|
".js",
|
|
".jsp",
|
|
".php",
|
|
".xht",
|
|
".fnt",
|
|
".fon",
|
|
".otf",
|
|
".ttf",
|
|
".8bi",
|
|
".plu",
|
|
".xll",
|
|
".cab",
|
|
".cpl",
|
|
".cur",
|
|
".dmp",
|
|
".drv",
|
|
".key",
|
|
".lnk",
|
|
".sys",
|
|
".cfg",
|
|
".ini",
|
|
".reg",
|
|
".app",
|
|
".bat",
|
|
".cgi",
|
|
".com",
|
|
".exe",
|
|
".pif",
|
|
".vb",
|
|
".ws",
|
|
".deb",
|
|
".gz",
|
|
".pkg",
|
|
".rar",
|
|
".sea",
|
|
".sit",
|
|
".sit",
|
|
".zip",
|
|
".bin",
|
|
".hqx",
|
|
".0 E",
|
|
".mim",
|
|
".uue",
|
|
".cpp",
|
|
".jav",
|
|
".pl",
|
|
".bak",
|
|
".gho",
|
|
".old",
|
|
".ori",
|
|
".tmp",
|
|
".dmg",
|
|
".iso",
|
|
".toa",
|
|
".vcd",
|
|
".gam",
|
|
".nes",
|
|
".rom",
|
|
".sav",
|
|
".msi",
|
|
]
|
|
companies = ["Corp", "Inc.", "Squad", "Team"]
|
|
icons = [
|
|
None,
|
|
"shield",
|
|
"bug",
|
|
"crown",
|
|
"crosshairs",
|
|
"ban",
|
|
"lightning",
|
|
"code",
|
|
"cowboy",
|
|
"angry",
|
|
]
|
|
|
|
|
|
def gen_sentence():
|
|
return fake.text()
|
|
|
|
|
|
def gen_name():
|
|
return fake.first_name()
|
|
|
|
|
|
def gen_team_name():
|
|
return fake.word().capitalize() + str(random.randint(1, 1000))
|
|
|
|
|
|
def gen_email():
|
|
return fake.email()
|
|
|
|
|
|
def gen_category():
|
|
return random.choice(categories)
|
|
|
|
|
|
def gen_affiliation():
|
|
return (fake.word() + " " + random.choice(companies)).title()
|
|
|
|
|
|
def gen_value():
|
|
return random.choice(range(100, 500, 50))
|
|
|
|
|
|
def gen_word():
|
|
return fake.word()
|
|
|
|
|
|
def gen_icon():
|
|
return random.choice(icons)
|
|
|
|
|
|
def gen_file():
|
|
return gen_word() + random.choice(extensions)
|
|
|
|
|
|
def random_date(start, end):
|
|
return start + datetime.timedelta(
|
|
seconds=random.randint(0, int((end - start).total_seconds()))
|
|
)
|
|
|
|
|
|
def random_chance():
|
|
return random.random() > 0.5
|
|
|
|
|
|
if __name__ == "__main__":
|
|
with app.app_context():
|
|
db = app.db
|
|
|
|
# Generating Challenges
|
|
print("GENERATING CHALLENGES")
|
|
for x in range(CHAL_AMOUNT):
|
|
word = gen_word()
|
|
chal = Challenges(
|
|
name=word,
|
|
description=gen_sentence(),
|
|
value=gen_value(),
|
|
category=gen_category(),
|
|
)
|
|
db.session.add(chal)
|
|
db.session.commit()
|
|
f = Flags(challenge_id=x + 1, content=word, type="static")
|
|
db.session.add(f)
|
|
db.session.commit()
|
|
|
|
# Generating Files
|
|
print("GENERATING FILES")
|
|
AMT_CHALS_WITH_FILES = int(CHAL_AMOUNT * (3.0 / 4.0))
|
|
for x in range(AMT_CHALS_WITH_FILES):
|
|
chal = random.randint(1, CHAL_AMOUNT)
|
|
filename = gen_file()
|
|
md5hash = hashlib.md5(filename.encode("utf-8")).hexdigest()
|
|
chal_file = ChallengeFiles(
|
|
challenge_id=chal, location=md5hash + "/" + filename
|
|
)
|
|
db.session.add(chal_file)
|
|
|
|
db.session.commit()
|
|
|
|
# Generating Teams
|
|
print("GENERATING TEAMS")
|
|
used = []
|
|
used_oauth_ids = []
|
|
count = 0
|
|
while count < TEAM_AMOUNT:
|
|
name = gen_team_name()
|
|
if name not in used:
|
|
used.append(name)
|
|
team = Teams(name=name, password="password")
|
|
if random_chance():
|
|
team.affiliation = gen_affiliation()
|
|
if random_chance():
|
|
oauth_id = random.randint(1, 1000)
|
|
while oauth_id in used_oauth_ids:
|
|
oauth_id = random.randint(1, 1000)
|
|
used_oauth_ids.append(oauth_id)
|
|
team.oauth_id = oauth_id
|
|
db.session.add(team)
|
|
count += 1
|
|
|
|
db.session.commit()
|
|
|
|
# Generating Users
|
|
print("GENERATING USERS")
|
|
used = []
|
|
used_oauth_ids = []
|
|
count = 0
|
|
while count < USER_AMOUNT:
|
|
name = gen_name()
|
|
if name not in used:
|
|
used.append(name)
|
|
try:
|
|
user = Users(
|
|
name=name, email=name + gen_email(), password="password"
|
|
)
|
|
user.verified = True
|
|
if random_chance():
|
|
user.affiliation = gen_affiliation()
|
|
if random_chance():
|
|
oauth_id = random.randint(1, 1000)
|
|
while oauth_id in used_oauth_ids:
|
|
oauth_id = random.randint(1, 1000)
|
|
used_oauth_ids.append(oauth_id)
|
|
user.oauth_id = oauth_id
|
|
if mode == "teams":
|
|
user.team_id = random.randint(1, TEAM_AMOUNT)
|
|
db.session.add(user)
|
|
count += 1
|
|
except Exception:
|
|
pass
|
|
|
|
db.session.commit()
|
|
|
|
if mode == "teams":
|
|
# Assign Team Captains
|
|
print("GENERATING TEAM CAPTAINS")
|
|
teams = Teams.query.all()
|
|
for team in teams:
|
|
captain = (
|
|
Users.query.filter_by(team_id=team.id)
|
|
.order_by(Users.id)
|
|
.limit(1)
|
|
.first()
|
|
)
|
|
if captain:
|
|
team.captain_id = captain.id
|
|
db.session.commit()
|
|
|
|
# Generating Solves
|
|
print("GENERATING SOLVES")
|
|
if mode == "users":
|
|
for x in range(USER_AMOUNT):
|
|
used = []
|
|
base_time = datetime.datetime.utcnow() + datetime.timedelta(
|
|
minutes=-10000
|
|
)
|
|
for y in range(random.randint(1, CHAL_AMOUNT)):
|
|
chalid = random.randint(1, CHAL_AMOUNT)
|
|
if chalid not in used:
|
|
used.append(chalid)
|
|
user = Users.query.filter_by(id=x + 1).first()
|
|
solve = Solves(
|
|
user_id=user.id,
|
|
team_id=user.team_id,
|
|
challenge_id=chalid,
|
|
ip="127.0.0.1",
|
|
provided=gen_word(),
|
|
)
|
|
|
|
new_base = random_date(
|
|
base_time,
|
|
base_time
|
|
+ datetime.timedelta(minutes=random.randint(30, 60)),
|
|
)
|
|
solve.date = new_base
|
|
base_time = new_base
|
|
|
|
db.session.add(solve)
|
|
db.session.commit()
|
|
elif mode == "teams":
|
|
for x in range(1, TEAM_AMOUNT):
|
|
used_teams = []
|
|
used_users = []
|
|
base_time = datetime.datetime.utcnow() + datetime.timedelta(
|
|
minutes=-10000
|
|
)
|
|
team = Teams.query.filter_by(id=x).first()
|
|
members_ids = [member.id for member in team.members]
|
|
for y in range(random.randint(1, CHAL_AMOUNT)):
|
|
chalid = random.randint(1, CHAL_AMOUNT)
|
|
user_id = random.choice(members_ids)
|
|
if (chalid, team.id) not in used_teams:
|
|
if (chalid, user_id) not in used_users:
|
|
solve = Solves(
|
|
user_id=user_id,
|
|
team_id=team.id,
|
|
challenge_id=chalid,
|
|
ip="127.0.0.1",
|
|
provided=gen_word(),
|
|
)
|
|
new_base = random_date(
|
|
base_time,
|
|
base_time
|
|
+ datetime.timedelta(minutes=random.randint(30, 60)),
|
|
)
|
|
solve.date = new_base
|
|
base_time = new_base
|
|
db.session.add(solve)
|
|
db.session.commit()
|
|
used_teams.append((chalid, team.id))
|
|
used_users.append((chalid, user_id))
|
|
|
|
db.session.commit()
|
|
|
|
# Generating Awards
|
|
print("GENERATING AWARDS")
|
|
for x in range(USER_AMOUNT):
|
|
base_time = datetime.datetime.utcnow() + datetime.timedelta(minutes=-10000)
|
|
for _ in range(random.randint(0, AWARDS_AMOUNT)):
|
|
user = Users.query.filter_by(id=x + 1).first()
|
|
award = Awards(
|
|
user_id=user.id,
|
|
team_id=user.team_id,
|
|
name=gen_word(),
|
|
value=random.randint(-10, 10),
|
|
icon=gen_icon(),
|
|
)
|
|
new_base = random_date(
|
|
base_time,
|
|
base_time + datetime.timedelta(minutes=random.randint(30, 60)),
|
|
)
|
|
award.date = new_base
|
|
base_time = new_base
|
|
|
|
db.session.add(award)
|
|
|
|
db.session.commit()
|
|
|
|
# Generating Wrong Flags
|
|
print("GENERATING WRONG FLAGS")
|
|
for x in range(USER_AMOUNT):
|
|
used = []
|
|
base_time = datetime.datetime.utcnow() + datetime.timedelta(minutes=-10000)
|
|
for y in range(random.randint(1, CHAL_AMOUNT * 20)):
|
|
chalid = random.randint(1, CHAL_AMOUNT)
|
|
if chalid not in used:
|
|
used.append(chalid)
|
|
user = Users.query.filter_by(id=x + 1).first()
|
|
wrong = Fails(
|
|
user_id=user.id,
|
|
team_id=user.team_id,
|
|
challenge_id=chalid,
|
|
ip="127.0.0.1",
|
|
provided=gen_word(),
|
|
)
|
|
|
|
new_base = random_date(
|
|
base_time,
|
|
base_time + datetime.timedelta(minutes=random.randint(30, 60)),
|
|
)
|
|
wrong.date = new_base
|
|
base_time = new_base
|
|
|
|
db.session.add(wrong)
|
|
db.session.commit()
|
|
|
|
db.session.commit()
|
|
db.session.close()
|