ctfcli provides a challenge specification (
challenge.yml) that outlines the major details of a challenge.
Every challenge generated by or processed by
ctfcli should have a
The specification format has already been tested and used with CTFd in production events but comments, suggestions, and PRs are welcome on the format of
Working with Challenges
1. Add challenges
Events are made up of challenges. Challenges can be made from a subdirectory or pulled from another repository. Remote challenges are pulled into the event repo and a reference is kept in the
❯ ctf challenge add [REPO | FOLDER]
❯ ctf challenge add crypto/stuff
❯ ctf challenge add https://github.com/challenge.git
Cloning into 'challenge'...
remote: Enumerating objects: 624, done.
remote: Counting objects: 100% (624/624), done.
remote: Compressing objects: 100% (540/540), done.
remote: Total 624 (delta 109), reused 335 (delta 45), pack-reused 0
Receiving objects: 100% (624/624), 6.49 MiB | 21.31 MiB/s, done.
Resolving deltas: 100% (109/109), done.
2. Install challenges
Installing a challenge will automatically create the challenge in your CTFd instance using the API.
❯ ctf challenge install [challenge.yml | DIRECTORY]
❯ ctf challenge install buffer_overflow
3. Update challenges
Syncing a challenge will automatically update the challenge in your CTFd instance using the API. Any changes made in the
challenge.yml file will be reflected in your instance.
❯ ctf challenge sync [challenge.yml | DIRECTORY]
❯ ctf challenge sync buffer_overflow