VolgaCTF 2024 Final – Technical information

Equipment

Each team will be provided with the following equipment:

please note: no usb type-c to ethernet adapters will be provided!

Network

Each team's network segment has the following address: 10.5.1XY.0/24, where XY stands for a team's number (zero-based).

Scoreboard URL (intranet): https://final.volgactf.ru/scoreboard

Scoreboard URL (public): https://live.volgactf.ru/scoreboard

Vulnbox

Virtualbox 7.1.0 or later is needed to launch the vulnbox. The vulnbox is based on Debian 11, all services are isolated from each other by the means of Docker. Containers start at boot.

please note: the vulnbox won't run on apple silicon!

A vulnbox instance MUST have the following address: 10.5.1XY.3.

before launching the vulnbox instance, do not forget to regenerate your virtual machine instance mac address!

Flag signatures

Flags are stored and transported into so-called capsules. A capsule looks like this: VolgaCTF{eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJmbGFnIjoiYzA4ODI0NjI2MjNkNjFmM2VlYzgwYjcyY2ZlNDQ3NjkifQ.YqcT52o3_S9XhjE6txPayJ-iylCHhpQs4SzfnCwKKsP3_XGol30GQVWf9QZ85RaO4l5uXVOgrkF335UIDn7x4A}

Data between VolgaCTF{ and } is a JSON Web Token signed using ES256 algorithm. You will need an ACS public key to decode a capsule and obtain a flag from it. Flag format is ^[\da-f]{32}=$.

Public key (for the sample capsule) -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5aiazVMn0K9M0PyP4/iGZpKKqYez\n+6rCzO8iUjfkVvH87KcccPfNzv2olMtrFvF1bTLBAchFfDiNqewauTe/GA== -----END PUBLIC KEY-----

Submitting flags

You should submit flags to the REST API server: https://final.volgactf.ru (base URL).

Each flag's lifetime is 6 minutes.

API

Rate limits

An insight into ACS

A game is divided into 2-minute rounds.

When a new round is triggered, ACS tries to push flags (transported in capsules) to every service of every team. If a push attempt of a flag is successful, this particular flag is marked as active. ACS immediately tries to pull active flags.

Every flag expires 6 minutes after it has been marked as active.

Additionally, in each round ACS launches 3 polls: it pulls one randomly chosen active flag from each service from each team.

Scores are updated when all active flags issued in a particular round become expired.

Availability

1 availability point for a flag (AvPflag) is given if all attempts to pull this flag were successful (UP state). Otherwise, a fraction of a point is given according to the equation:

AvPflag = SPAflag / TPAflag,

where SPA stands for the number of successful pull attempts and TPA stands for the total number of pull attempts.

Defence

By default, no defence points for any flag from any service are given.

Defence points for flags from a service are to be awarded starting from the next round a flag from this very service is successfully submitted into ACS by any team (first blood). 1 defence point (DPflag) is given if all attempts to pull a flag were successful and no-one has stolen and submitted this particular flag into ACS.

Attack

1 attack point (AtPflag) is given for each stolen flag.

A team cannot submit a flag stolen from a service X if a state of a service X in their vulnbox is not UP.

Total

Total team score (TtS) is calculated as a sum of total scores (tS) in each category:

TtS = tSattack + tSdefence + tSavailability

In case of equal TtS a team who performed the last attack before the other team is placed higher in the scoreboard.