Skip to content

Setting up a challenge repository

Note

This guide assumes that you have already installed CTF-Architect. If you haven't, see the installation guide.

Create a new repository

To create a new challenge repository, run the following command:

$ ctfa repo init
Enter the name of the CTF: Example CTF
CTF Name: Example CTF
Enter the flag format: flag{.*}

Would you like to specify a starting port? Yes
Enter the starting port: 8000
Starting Port: 8000

───────────────────────── Challenge Categories ──────────────────────────
Enter the categories for the CTF (one per line, empty line to stop).
Category Name (empty to stop): web
Category "web" added.

Category Name (empty to stop): forensics
Category "forensics" added.

Category Name (empty to stop): crypto

Category Name (empty to stop): misc

Category Name (empty to stop): re

Category Name (empty to stop): pwn

Category Name (empty to stop): osint

Category Name (empty to stop):
Categories:
  - Web
  - Forensics
  - Crypto
  - Misc
  - Re
  - Pwn
  - Osint

Enter the difficulties for the CTF (empty name to stop).
Difficulty Name (empty to stop): easy
Difficulty "easy" added.

Difficulty Name (empty to stop): medium
Difficulty "medium" added.

Difficulty Name (empty to stop): hard
Difficulty "hard" added.

Difficulty Name (empty to stop): insane
Difficulty "insane" added.

Difficulty Name (empty to stop):
Difficulties:
  - Easy
  - Medium
  - Hard
  - Insane

───────────────────────────── Extra Fields ──────────────────────────────
Would you like to specify extra fields for challenges? Yes

Extra Field Name (empty to cancel): discord
Extra Field Description: The discord tag of the challenge creator
Extra Field Prompt (shown to challenge creators): Enter your discord tag
Is this extra field required? Yes
Extra Field Type: string
Extra Field "discord" added.
Add another extra field? No
Extra Fields:
  - discord (string)
╭─ CTF Config ──────────────────────────────────────────────────────────╮
│  CTF Name: Example CTF                                                │
│  Flag Format: flag{.*}                                                │
│  Starting Port: 8000                                                  │
╰───────────────────────────────────────────────────────────────────────╯
╭─ Categories ──────────────────────────────────────────────────────────╮
│   - Web                                                               │
│   - Forensics                                                         │
│   - Crypto                                                            │
│   - Misc                                                              │
│   - Re                                                                │
│   - Pwn                                                               │
│   - Osint                                                             │
╰───────────────────────────────────────────────────────────────────────╯
╭─ Difficulties ────────────────────────────────────────────────────────╮
│   - Easy                                                              │
│   - Medium                                                            │
│   - Hard                                                              │
│   - Insane                                                            │
╰───────────────────────────────────────────────────────────────────────╯
╭─ Extras ──────────────────────────────────────────────────────────────╮
│   - discord (string)                                                  │
╰───────────────────────────────────────────────────────────────────────╯
Are you sure you want to create this Challenge Repository? Yes
✨ Challenge repository initialized! ✨

This will create a new challenge repository in the current directory. The repository will contain a ctf_config.toml file with the specified metadata.

Add challenges to the repository

To add a new challenge to the repository, add the zipped challenges to the root of the repository, run the following command:

$ ctfa repo import
Successfully imported example-challenge
Updating stats...
✨ Repository stats updated.
✨ Successfully imported 1 challenges. ✨

Once the challenges are imported, the repository will be updated with the new challenges. You can then proceed to manually delete the zipped challenges from the repository.

Lint the repository

To check the repository for any potentially problematic challenges, run the following command:

$ ctfa repo lint
╭──────────────────────────── Lint Results ─────────────────────────────╮
│ challenges/ (1 failed)                                                │
│ ├── web/ (all passed)                                                 │
│ │   └── ✓ All challenges passed                                       │
│ ├── forensics/ (all passed)                                           │
│ │   └── ✓ All challenges passed                                       │
│ ├── crypto/ (all passed)                                              │
│ │   └── ✓ All challenges passed                                       │
│ ├── misc/ (1 failed)                                                  │
│ │   └── example-challenge (2 violations)                              │
│ │       ├── ⚠ F002 - No writeup.md with content in solution folder    │
│ │       │   found                                                     │
│ │       └── ✕ C011 - Requirements in chall.toml file could not be     │
│ │           found or loaded:                                          │
│ │             - Example Requirement                                   │
│ ├── re/ (all passed)                                                  │
│ │   └── ✓ All challenges passed                                       │
│ ├── pwn/ (all passed)                                                 │
│ │   └── ✓ All challenges passed                                       │
│ └── osint/ (all passed)                                               │
│     └── ✓ All challenges passed                                       │
╰───────────────────────────────────────────────────────────────────────╯

Additionally, you may also specify challenges to lint:

$ ctfa repo lint example-challenge
╭─────────────────── example-challenge Lint Results ────────────────────╮
│ example-challenge (2 violations)                                      │
│ ├── ⚠ F002 - No writeup.md with content in solution folder found      │
│ └── ✕ C011 - Requirements in chall.toml file could not be found or    │
│     loaded:                                                           │
│       - Example Requirement                                           │
╰───────────────────────────────────────────────────────────────────────╯

Note

This is equivalent to running ctfa chall lint example-challenge, except the ctf_config.toml file is automatically loaded.