As a CTF organizer you can provide us a scoreboard feed, so we can parse it in realtime and provide more information to CTF teams.
In your CTF management panel you can specify the URLs for the feeds. Feed polling interval is 60 sec.
On getting the feed URL we expect to receive a JSON object/array with a corresponding set of fields.
After the CTF finish you can submit the final results via form available at: Manage CTFs -> Existing CTF events -> Manage results.
- "tasks" (optional) — array of task names. Each task in this array will have a separate score shown on the scoreboard (e.g.: ["PPC 100", "Web 200", "Beer Challenge"]). Can also be used in Attack-Defense CTFs for fields like Attack, Defense and Advisories. If this field is specified, each team object must have a "taskStats" field.
- "standings" — array of team standings. Each element of the array is an object with following fields:
- "pos" — team position (e.g.: 1). If omitted, team positions will be calculated by sorting using "score" field.
- "team" — team name (e.g.: "More Smoked Leet Chicken"). NB: Unicode symbols in team names should be converted to unicode notation (\uXXXX).
- "score" — overall team points (e.g.: 4700 or 0.972 for "9.72%"). Decimal up to 4 digits after delimiter, required if "pos" is omitted.
- "taskStats" (optional) — an object, representing team's tasks solving progress. The object keys must be equal to that in "tasks" field. Each element is an object with following fields:
- "points" (optional) — how much points team got for the task (e.g.: 503).
- "time" (optional) — UNIX timestamp when the team has solved the task (e.g.: 1352651080, meaning 11 Nov 2012 16:24:40 UTC).
- "lastAccept" (optional) — UNIX timestamp of team's last accepted task (e.g.: 1352651080).
- "outward" (optional) — flag showing that this is a guest team, playing out of overall stanginds.
{ "standings": [ { "pos": 1, "team": "Intergalactic Pwners", "score": 1700 }, { "pos": 2, "team": "h4ckmeifyouc4n", "score": 1200 }, { "pos": 3, "team": "MV Tech", "score": 100 } ] }
{ "tasks": [ "PPC 100", "Web 200", "Beer Challenge" ], "standings": [ { "pos": 1, "team": "Intergalactic Pwners", "score": 401, "taskStats": { "PPC 100": { "points": 103, "time": 1352647482 }, "Web 200": { "points": 201, "time": 1352652183 }, "Beer Challenge": { "points": 97, "time": 1352651383 } }, "lastAccept": 1352652183 }, { "pos": 2, "team": "h4ckmeifyouc4n", "score": 291, "taskStats": { "Web 200" : { "points": 202, "time": 1352649284 }, "Beer Challenge": { "points": 89, "time": 1352649511 } }, "lastAccept": 1352649511 }, { "pos": 3, "team": "MV Tech", "score": 203, "taskStats": { "Web 200": { "points": 203, "time": 1352650418 } }, "lastAccept": 1352650418 } ] }
{ "tasks": [ "Attack", "Defense", "Advisories" ], "standings": [ { "pos": 1, "team": "Intergalactic Pwners", "score": 1, "taskStats": { "Attack": { "points": 1 }, "Defence": { "points": 0.984 }, "Advisories": { "points": 1 } } }, { "pos": 2, "team": "h4ckmeifyouc4n", "score": 0.548, "taskStats": { "Attack": { "points": 0.733 }, "Defence": { "points": 0.651 }, "Advisories": { "points": 0.25 } } }, { "pos": 3, "team": "MV Tech", "score": 0.283, "taskStats": { "Attack": { "points": 0.49 }, "Defence": { "points": 0.796 }, "Advisories": { "points": 0 } } } ] }
The URL that you specify for this type of feed will receive a "lastId" GET parameter. The log should only include the events that happened later than this value. Also, if you want, you can purge from your DB the events that have ID ≤ to this value: we already have them recorded, guaranteed.
- "id" — number of the event (e.g.: 5). Event that happened later must have a greater "id". This field is used for pulling delta updates, so IDs should not repeat.
- "time" (optional) — UNIX timestamp of the event (e.g. 1352655412, meaning 11 Nov 2012 17:36:52 UTC).
- "type" (optional) — event type. Right now can be one of the following:
- "taskCorrect" — team submitted the correct answer to a task
- "taskWrong" — team submitted an incorrect answer to a task
- "flagRead" — team captured another team's flag
- "flagWrite" — team committed a "deface" on another team's box
- "team" — the name of the team that captured a flag / solved a task (e.g.: "More Smoked Leet Chicken").
- "victim" (optional) — the name of the team whose flag was captured, if applicable (e.g.: "PPP").
- "task" (optional) — the name of the task that team has solved, or name of the service whose flag was captured (e.g.: "Web 200" or "parrot").
- "pointsDelta" (optional) — the amount of points team has earned (or lost, if negative) upon capturing the flag (e.g.: 103).
- Although most fields here are optional, be sure to provide as much information as you can, so that we can draw nice charts and graphs and provide exhaustive CTF statictics.
[ { "id": 1, "time": 1352656809, "type": "taskWrong", "team": "More Smoked Leet Chicken", "task": "37", "pointsDelta": 0 }, { "id": 2, "time": 1352656827, "type": "flagRead", "team": "PPP", "victim": "More Smoked Leet Chicken", "task": "reactor" }, { "id": 3, "time": 1352656829, "type": "taskCorrect", "team": "More Smoked Leet Chicken", "task": "37", "pointsDelta": 500 }, { "id": 4, "time": 1352656846, "type": "flagRead", "team": "More Smoked Leet Chicken", "victim": "PPP", "task": "perlache" }, { "id": 5, "time": 1352656855, "type": "flagRead", "team": "PPP", "victim": "More Smoked Leet Chicken", "task": "reactor" }, { "id": 6, "time": 1352656861, "type": "flagRead", "team": "More Smoked Leet Chicken", "victim": "PPP", "task": "gitnick" }, { "id": 7, "time": 1352656871, "type": "flagRead", "team": "More Smoked Leet Chicken", "victim": "PPP", "task": "ips" } ]Second request, in a minute: ?lastId=7
[ { "id": 8, "time": 1352656875, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 }, { "id": 9, "time": 1352656876, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 }, { "id": 10, "time": 1352656879, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 }, { "id": 11, "time": 1352656881, "type": "flagRead", "team": "More Smoked Leet Chicken", "victim": "PPP", "task": "gitnick" }, { "id": 12, "time": 1352656881, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 }, { "id": 13, "time": 1352656886, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 }, { "id": 14, "time": 1352656889, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 }, { "id": 15, "time": 1352656889, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 }, { "id": 16, "time": 1352656891, "type": "flagRead", "team": "More Smoked Leet Chicken", "victim": "PPP", "task": "reactor" }, { "id": 17, "time": 1352656896, "type": "flagRead", "team": "More Smoked Leet Chicken", "victim": "PPP", "task": "ips" }, { "id": 18, "time": 1352656899, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 }, { "id": 19, "time": 1352656904, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 }, { "id": 20, "time": 1352656907, "type": "flagRead", "team": "More Smoked Leet Chicken", "victim": "PPP", "task": "perlache" }, { "id": 21, "time": 1352656907, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 }, { "id": 22, "time": 1352656907, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 }, { "id": 23, "time": 1352656909, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 }, { "id": 24, "time": 1352656910, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 }, { "id": 25, "time": 1352656914, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 }, { "id": 26, "time": 1352656918, "type": "taskWrong", "team": "PPP", "task": "12", "pointsDelta": 0 } ]
Sign in to comment.