SKILL.md
CTF Challenge Testing
This skill deploys CTF infrastructure to cloud providers and validates that learners can complete the lab.
When to Use
- Testing changes to
ctf_setup.sh,setup/, orverify/ - Validating challenge setup across AWS, Azure, or GCP
- Running the full contributor-mode test suite before releases
- Verifying services survive VM reboots
Trigger Examples
Use this skill when the user asks things like:
- "Run a basic test on Azure"
- "Run a basic test on GCP"
- "Run a basic test on AWS"
- "Run a full test on Azure"
- "Run a full test on GCP"
- "Run a full test on AWS"
- "Run a basic test on all providers"
- "Run a full test on all providers"
Prerequisites
- terraform (>= 1.0)
- jq - Install:
sudo apt install jq(Ubuntu) orbrew install jq(macOS) - sshpass - Install on macOS:
brew install hudochenkov/sshpass/sshpass - Cloud CLI authenticated for target provider:
- AWS: aws sts get-caller-identity - Azure: az account show - GCP: gcloud auth list --filter=status:ACTIVE
Agent Workflow
- Determine the mode and provider.
- Basic test means no reboot. Use this when the user asks for a basic test or does not mention reboot. - Full test means reboot. Use this when the user asks for a full test or asks to verify reboot behavior. - Provider must be aws, azure, gcp, or all. Azure is usually the fastest single-provider test.
- Check provider authentication before deploying.
- AWS: aws sts get-caller-identity - Azure: az account show - GCP: gcloud auth list --filter=status:ACTIVE
- Run the requested test from the repository root.
| User request | Command | What gets tested |
|---|---|---|
| Basic test on AWS | ./.github/skills/ctf-testing/deployandtest.sh aws |
Verify command sanity checks, all 18 challenges, export certificate, token format, username, challenge count, and frozen completion time |
| Basic test on Azure | ./.github/skills/ctf-testing/deployandtest.sh azure |
Verify command sanity checks, all 18 challenges, export certificate, token format, username, challenge count, and frozen completion time |
| Basic test on GCP | ./.github/skills/ctf-testing/deployandtest.sh gcp |
Verify command sanity checks, all 18 challenges, export certificate, token format, username, challenge count, and frozen completion time |
| Basic test on all providers | ./.github/skills/ctf-testing/deployandtest.sh all |
Same basic checks across AWS, Azure, and GCP |
| Full test on AWS | ./.github/skills/ctf-testing/deployandtest.sh aws --with-reboot |
Basic checks plus reboot, required service checks, and progress persistence |
| Full test on Azure | ./.github/skills/ctf-testing/deployandtest.sh azure --with-reboot |
Basic checks plus reboot, required service checks, and progress persistence |
| Full test on GCP | ./.github/skills/ctf-testing/deployandtest.sh gcp --with-reboot |
Basic checks plus reboot, required service checks, and progress persistence |
| Full test on all providers | ./.github/skills/ctf-testing/deployandtest.sh all --with-reboot |
Same full checks across AWS, Azure, and GCP |
The deployment script uses contributor mode, so Terraform uploads the local setup package and runs the code from your working tree. It does not test GitHub Release assets.
- Treat cleanup as part of the test, not an optional follow-up.
- Verify no test resources remain after the script exits. - If resources remain, run provider-specific cleanup or terraform destroy from the provider directory. - If cleanup still fails, report the remaining resources clearly.
- Report the result plainly.
- Include provider, mode, pass/fail result, cleanup status, and blocker if any. - A successful basic run shows about 27 tests passing. - A successful full run includes a second pass after reboot with 5 service checks and 1 progress persistence check. - Summary line: RESULT: PASS (<providers>) or RESULT: FAIL (<providers>).
Failure Handling
When a run fails, identify the first failing layer:
| Failure point | What to collect |
|---|---|
| Terraform failed | Provider name and Terraform error |
| SSH failed | VM IP and SSH wait output |
| Setup failed | /var/lib/linux-ctfs/setup.failed, /var/log/ctf_setup.log, and /var/log/cloud-init-output.log |
| Challenge failed | Challenge number and failing test output |
| Reboot failed | Failed service name and journalctl -u <service-name> output |
| Cleanup failed | Remaining cloud resources |
CTF Safety Rules
- Do not create committed solution files.
- Keep solution commands only in
.github/skills/ctf-testing/testctfchallenges.sh. - Do not add flags or challenge solutions to learner-facing docs.
- Do not make challenges easier while fixing tests.
Scripts
Reference files - treat as black boxes, run directly:
- 📄 [deployandtest.sh](deployandtest.sh) - Orchestration script (runs locally)
- 📄 [testctfchallenges.sh](testctfchallenges.sh) - VM test script (copied to and runs on deployed VM)