- Add support for branches to challenge repo URLs
- Add support for solutions based on writeups in the challenge repo
- Add
sha1sumto--ignoreas part ofctf challenge syncto allow syncing files when the remote checksum or local checksum is corrupted
- Fix an issue where if deployment returned updated connection info we wouldn't update it in challenge.yml
- Fix an issue where relative paths would not deploy due to a logging error
- Challenges without an image will be considered a skipped deploy instead of a failed deploy
- Switch from poetry to uv
- Switch from to ruff
- Support for hint titles
- Support
logickey for challenges
- Fix issue with resolving relative challenge paths during install
- Added support for
ctf instancewith thectf instance configcommand which can be used togetandsetconfiguration on CTFd - Added
ctf media add,ctf media rm,ctf media url- Allows ctfcli repos to manage files locally and reference the actual server URLs of media files in Pages
- Adds concept of replacing placeholders like
{{ media/ctfd.png }}with the actual URL on the server
- Added the
attributionfield to challenge.yml - Added the
nextfield to challenge.yml - Added ability to anoymize challenges while specifying prerequisites
- Added specifying CTFd instance URL and access token via envvars:
CTFCLI_URL,CTFCLI_ACCESS_TOKEN
- Fix issue with managing challenges with an empty files section
- Fix issue where images could not be deployed due to being named incorrectly
- Added support for
git subrepoinstead of onlygit subtree - Added the
--createswitch toctf challenge mirrorto create local copies of challenges that exist on a remote CTFd instance
ctf challenge {push, pull}will now push / pull all challenges instead of the challenge in the current working directory.
- Use
--loadswitch as part of docker build to support alternate build drivers
- Before uploading files to CTFd, ctfcli will check for CTFd's SHA1 hash of the previously uploaded file and skip uploading if it is the same
- Support using remote Docker images instead of having to build and push local images
- Added
ctf challenge mirrorcommand to pull changes from the remote CTFd instance into the local project
- Properly include challenge.yml when generating a challenge from a template
- No longer require a ctfcli project to run all
ctf challenge(e.g.new,format,lint)
- ctfcli has been separated into two main modules
cliandcore. Thecoremodule now packages logic previously found insideutils, wrapped into classes. - The classes in the
coremodule will only print out warnings instead of interrupting the whole process. Everything else will throw exceptions which can be caught and handled however desired cliandcoreinternal modules have type hints- Improved error messages
- Unit tests have been added for the entire
coremodule - ctfcli will now ask to initialize a new project if one does not exist
- Added
--hiddentoctf challenge installwhich will deploy the challenge / challenges in a hidden state regardless of theirchallenge.ymlvalue. - Added
ctf challenge edit <name>andctf challenge edit <name> --dockerfileto open challenge.yml or Dockerfile for that challenge - Added aliases under
ctf templatesandctf pluginsfordir(path) and forview(show) - Progress bars for
ctf challenge deploy/ctf challenge install/ctf challenge sync ctf challenge deploywill now deploy ALL deployable challenges if a specific challenge is not specified- For the SSH and Registry deployments, to facilitate this behaviour the challenge name will be automatically appended. So the host should be for example:
registry://registry.example.com/example-projectand the challenge name will be appended for a full location.
- For the SSH and Registry deployments, to facilitate this behaviour the challenge name will be automatically appended. So the host should be for example:
ctf challenge deploywill now also automatically login to the registry with Cloud and Registry deployments.- For cloud deployments the instance url must be ctfd assigned (e.g. example.ctfd.io) - this is because to log-in to the registry we require a username like
admin@example.ctfd.io. The deployment will use the access token as the password. - For registry deployment it will look for the
usernameandpasswordkeys inside a[registry]section in the project config file.
- For cloud deployments the instance url must be ctfd assigned (e.g. example.ctfd.io) - this is because to log-in to the registry we require a username like
- ctfcli will read a
LOGLEVELenvironment variable to enable DEBUG logging has been added
- When syncing a challenge to a remote instance, state specified in challenge.yml will now be ignored to prevent accidental challenge leaking
- The CLI will now exit with a 0 if everything went right, and 1 if something went wrong.
- With
install/sync/deploy- exit code will be 1 if ANY of the challenges failed toinstall/sync/deploy.
- With
- Built using poetry and
pyproject.toml python-firehas been updated to 0.5.0
- Removed the
ctf challenge finalizecommand
- Add env variable
CTFCLI_PLUGIN_DIRto override the default plugin dir for development. - Add
--directoryargument toctfcli challenge add- Can also be called as
ctf challenge add git@github.com:repo.git directory - Useful for grouping challenges into separate directories like:
web/challenge1.
- Can also be called as
connection_infospecified in challenge.yml will be used instead of details generated by a deploy handler
- Bump PyYAML version to 6.0.1
- Add cloud deploy for hosted CTFd instances
- Add the
protocolfield in the challenge.yml spec - Further define what other deployment methods should provide & return
- Add the ability to add HTTP cookies to ctfcli requests via the config file
- Allow ignoring category during challenge sync
- Added a restart policy and container name to services deployed via ssh
- Added
--yaml-pathtoctf challenge addto specify a specificchallenge.ymlpath that will be added to the .ctf config
- Fixed issue in
ctf templates listwhere not all templates would be listed - Bumped version of dependencies to support Python 3.11
- Bumped
cookiecutterto 2.1.1 - Bumped
requeststo 2.28.1 - Bumped
coloramato 0.4.6
- Bumped
- Add support for pages in event repos
- Add the
ctf pages installcommand that looks for markdown and html files with frontmatter in a special pages folder
- Add the
- Add
healthcheckkey inchallenge.ymlto specify a healthcheck script- Add
ctf challenge healthcheck [challenge_name]
- Add
- Add
ssl_verifyin the.ctf/configfile to support SSL verification disabling.ssl_verifycan betrueorfalseor a string (specifying the trusted SSL certificates) - Adds a
--no-gitoption toctf initto skip git repo creation in event folder
- Allow empty string in CTFd URL and CTFd access token values for
ctf init ctf initwill not attempt to create git repos when the event folder is in a git repo alreadyctf init <folder>can now be used to create the event folder instead of creating the folder beforehand
- Fix issue in
ctf challenge addwhere challenges weren't being added to.ctf/config - Fix issue where plugins couldnt be installed if only pip3 was available
ctf challenge add/update/restorewill now use git subtrees when working with git repos instead of direct cloningctf challenge push [challenge]can now be used to push local changes to the upstream challenge repo- Added challenge topics from CTFd 3.4 to the challenge.yml spec
- Added challenge topics from CTFd 3.4 to the challenge
syncandinstallcommands - Added challenge connection_info from CTFd 3.4 to the challenge.yml spec
- Added challenge connection_info from CTFd 3.4 to the challenge
syncandinstallcommands
- Added an
extrafield in challenge specification to support different CTFd challenge types- This adds support for dynamic value challenges in CTFd > 3.3.0 (Must have commit df27d0e7a9e336b86165d41920aa176db4ff0e06).
- Improved
ctf challenge lintto catch some common mistakes in a challenge - Added an
--ignoreflag toctf challenge installandctf challenge syncto disable installation of certain challenge properties (e.g. flags, tags, hints, etc).- Usage:
ctf challenge install challenge.yml --ignore=flags,tags - Usage:
ctf challenge install --ignore=flags,tags - Usage:
ctf challenge sync challenge.yml --ignore=flags,tags - Usage:
ctf challenge sync --ignore=flags,tags
- Usage:
- Automatic releases from Github to PyPI
- Fix web challenge template for serve.sh
- Changed all Alpine images in Dockerfiles to use Debian
- Add examples or more complicated flag creation examples to challenge specification
- Added the following commands:
ctf templates install [repo] ctf templates uninstall [folder] ctf templates dir ctf templates list ctf challenge templates - Modified
ctf challenge newto accept and search through installed third-party templates - Added a parameter to
ctf challenge updateto allow updating a single challenge - Added a login system for the default web template
- Added a blank challenge template
- Moved challenge template writeups into their own dedicated folder
- Fixed an issue when using CTFd in a subdirectory
- Properly default the challenge state to visible during sync
- Added
stateparameter to control whether a challenge is visible or not - Make the
ctf challenge restorecommand be able to take arguments to only restore one challenge - Add an
ctf challenge updatecommand to get the latest version of challenges
- Fix the sync and install commands to properly install challenge files relative to the
challenge.ymlpath - Update dependencies in the web challenge template
ctfcliwill now load all challenges regardless of visibility when using an admin token. Requires CTFd v2.5.0
ctf initnow saves the CTFdaccess_tokenproperly
- Initial release of ctfcli
ctf initcommandsctf challengecommandsctf configcommandsctf pluginscommands- README and basic example on plugins
- Nothing
- Removed initial stub release from source control
- Initial stub release of ctfcli
- Nothing
- Nothing