Mini CTF tool is a quick and easy tool to manage the challenges for a CTF in a controlled, automated fashion.
It cleanly handles challenge creation and deployment scripts as well as integrating with the CTFd platform as a scoreboard.
Simply copy the ctftool.py script into the root directory of your CTF
challenge directory.
The script depends on:
- colorama
- requests
- pyyaml
To install all of the dependencies:
$ pip3 install colorama requests pyyaml
To upgrade your existing installation (and overwrite the existing script):
$ ./ctftool.py upgrade
Ctftool automatically detects challenge.json and challenge.yaml files in
the challenges/ directory.
$ mkdir -p challenges/demo
$ cat << EOF > challenges/demo/challenge.yaml
name: demo
category: web
description: >
Just a demonstration challenge!
flags:
- "FLAG{demo}"
files:
- flag.txt
points: 50
EOF
List all challenges:
$ ./ctftool.py list
[web] demo - challenges/demo/challenge.yaml
Validate all challenge configs:
$ ./ctftool.py validate
Upload the challenges to CTFd:
$ ./ctftool upload https://demo.ctf.io -u USERNAME -p PASSWORD
Fields:
-
nameName of the challenge. Must be unique and stable over time.
-
displayDisplay name of the challenge. This corresponds to the CTFd challenge name. Must be unique and stable over time (otherwise you'll get challenge duplication).
-
categoryThe "type" of challenge. This corresponds to CTFd categories, and challenges will be shown grouped into these categories.
-
descriptionPlain text description of the challenge, may include some arbitrary HTML.
-
generateMap containing filenames as keys and a string command to generate that file as a value.
The command is executed with the current working directory as the directory of the challenge file.
-
cleanRemove all generated files.
-
pointsHow many points the challenge is worth
-
flagsA list of strings that are valid flag submissions.
If the flag starts and ends with a
/, e.g./FLAG{demo}/, the internal parts will be interpreted as a regex. -
filesA list of files that should be uploaded to CTFd as part of the challenge.
The path to the file should be relative to the directory of the corresponding challenge file.
-
hintsA dictionary which contains the hints and the associated costs.
field type description cost int the 'cost' of the hint to the CTF user text string A plain text hint to the user, describing how to approach the challenge (but not give any solutions) -
deployfield type description docker bool should deploy this challenge as a docker container ports [{internal, external, protocol}] list of port mappings into the container
Note that while ctftool interprets all of the above fields, it will not give warnings/errors on unknown fields. This means that you can use any additional keys for your own purposes.