2021 update

This commit is contained in:
nemunaire 2020-11-13 10:24:48 +01:00
parent 16c5d728d1
commit ab99106592
7 changed files with 54 additions and 55 deletions

View File

@ -7,7 +7,7 @@ weight: 10
Afin de pouvoir être importé automatiquement sur la plate-forme, vos scénarios Afin de pouvoir être importé automatiquement sur la plate-forme, vos scénarios
doivent respecter une certaine arborescence que voici : doivent respecter une certaine arborescence que voici :
<pre> ```
. .
├── AUTHORS.txt ├── AUTHORS.txt
├── overview.txt ├── overview.txt
@ -32,7 +32,7 @@ doivent respecter une certaine arborescence que voici :
├── CHID-Titre du défi/ ├── CHID-Titre du défi/
│ └── ... │ └── ...
└── ... └── ...
</pre> ```
{{% notice info %}} {{% notice info %}}
N'ajoutez pas inutilement de dossiers ou fichiers vides. Ceux-ci doivent sans N'ajoutez pas inutilement de dossiers ou fichiers vides. Ceux-ci doivent sans
@ -54,15 +54,14 @@ contenu des fichiers :
Dans les noms de dossiers, `CHID` correspond à un identifiant permettant de référencer votre défi (pour déclarer une dépendance sur celui-ci par exemple). Dans les noms de dossiers, `CHID` correspond à un identifiant permettant de référencer votre défi (pour déclarer une dépendance sur celui-ci par exemple).
L'import s'effectuant selon l'ordre alphabétique, vous devriez utiliser le numéro d'ordre de l'exercice comme identifiant : L'import s'effectuant selon l'ordre alphabétique, vous devriez utiliser le numéro d'ordre de l'exercice comme identifiant :
<pre> ```
. .
├── 1-Titre du premier défi/ ├── 1-Titre du premier défi/
│ └── ... │ └── ...
├── 2-Titre du deuxième défi/ ├── 2-Titre du deuxième défi/
│ └── ... │ └── ...
└── ... └── ...
```
</pre>
Dans cet exemple, si l'ordre était déterminé uniquement par l'ordre alphabétique des noms de dossiers, le **d**euxième serait devant le **p**remier (`d<p`). Dans cet exemple, si l'ordre était déterminé uniquement par l'ordre alphabétique des noms de dossiers, le **d**euxième serait devant le **p**remier (`d<p`).
Ajouter le numéro d'ordre permet de contrôler plus facilement l'ordre des exercices, sans que cela soit affiché dans l'interface. Ajouter le numéro d'ordre permet de contrôler plus facilement l'ordre des exercices, sans que cela soit affiché dans l'interface.
@ -176,9 +175,7 @@ Voir la [page dédiée]({{<relref "resolution">}}).
### `statement.txt` ### `statement.txt`
contenant le scénario du challenge, tel qu'il sera affiché sur le site, à destination des participants L'énoncé du défi, tel qu'il sera affiché sur le site, à destination des participants.
Une présentation rapide du défi (~1-2 phrases), compréhensible par un décideur,
petit schéma à l'appui si besoin.
Le fichier **doit** comporter une phrase d'accroche (qui sera affichée plus Le fichier **doit** comporter une phrase d'accroche (qui sera affichée plus
grosse que les suivantes). Celle-ci correspond à la première ligne de votre grosse que les suivantes). Celle-ci correspond à la première ligne de votre
@ -197,10 +194,10 @@ Utilisez ce dossier pour y placer les fichiers que vous mettez à disposition
des participants. des participants.
Chaque fichier doit avoir une entrée correspondante dans le fichier Chaque fichier doit avoir une entrée correspondante dans le fichier
`DIGESTS.txt` ; plus d'infos sur la page [`DIGESTS.txt`]({{<relref `DIGESTS.txt` ; plus d'infos sur [la page `DIGESTS.txt`]({{<relref
"digests">}}). "digests">}}).
- Pas plus 4GB à télécharger **par challenge** (ie. tous les fichiers de ce challenge) - Pas plus 4GB à télécharger **par défi** (ie. tous les fichiers de ce défi) : 4GB, c'est 5 minutes 20 de téléchargement, c'est vraiment beaucoup lorsqu'on est impatient de faire le défi.
- Archives `.tar.bz2`, `.tar.gz`, `.tar.xz` ou `.zip` lorsque nécessaire. **PAS** de `.rar`, ... - Archives `.tar.bz2`, `.tar.gz`, `.tar.xz` ou `.zip` lorsque nécessaire. **PAS** de `.rar`, ...
- Compresser (sans tarball, juste via **gzip**[^gz]) les fichiers lorsque c'est utile (memory dump, images BMP, disques, fichiers textes, ...) - Compresser (sans tarball, juste via **gzip**[^gz]) les fichiers lorsque c'est utile (memory dump, images BMP, disques, fichiers textes, ...)
- Utiliser `$(split -b 240M -d BIG_FILE BIG_FILE.)` pour uploader les gros fichiers sur owncloud. - Utiliser `$(split -b 240M -d BIG_FILE BIG_FILE.)` pour uploader les gros fichiers sur owncloud.
@ -227,6 +224,6 @@ titre, ...
### `ressources/` ### `ressources/`
Rangez dans ce dossier toutes les ressources et scripts que vous avez réalisés Rangez dans ce dossier toutes les ressources et scripts que vous avez réalisés
pour le challenge : pour sa construction ou sa résolution, les schémas du SI au pour le défi : pour sa construction ou sa résolution, les schémas du SI au
premier challenge concerné, éventuellement un `README.txt` avec les liens des premier défi concerné, éventuellement un `README.txt` avec les liens des
outils externes. outils externes.

View File

@ -4,44 +4,47 @@ title: challenge.txt
weight: 20 weight: 20
--- ---
+ `challenge.txt` définitions des paramètres de votre challenge (au format [toml](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md)) : Le fichier `challenge.txt` définit les paramètres de votre défi (au format [toml](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md)) :
- `gain = 42` : nombre de points que rapporte cet exercice ;
- `tags = ["Android", "RAT", "ROM"]` : mots-clefs de l'exercice ; - `gain = 42` : nombre de points que rapporte ce défi ;
- `[[depend]]` : dépendance à un autre exercice : - `tags = ["Android", "RAT", "ROM"]` : mots-clefs du défi ;
* `id = CHID` : identifiant du challenge ; - `[[depend]]` : dépendance à un autre défi :
* `theme = "NomDuTheme"` : (facultatif) nom du thème dans lequel aller chercher l'identifiant (par défaut, on prend le thème courant) ; * `id = CHID` : identifiant du défi ;
- `[[flag]]` : chaîne de validation pour résoudre le challenge : * `theme = "NomDuTheme"` : (facultatif) nom du scénario/thème dans lequel aller chercher l'identifiant (par défaut, on prend le thème courant) ;
* `type = "key"` : (facultatif, par défaut "key") type de flag : - `[[flag]]` : chaîne de validation pour résoudre le défi :
+ `key` : [drapeau classique]({{< relref "/responses/simple.md" >}}), * `type = "key"` : (facultatif, par défaut "key") type de flag :
+ `vector` : [liste de drapeaux]({{< relref "/responses/vector.md" >}}), + `key` : [drapeau classique]({{< relref "/responses/simple.md" >}}),
+ `mcq` : [question à choix multiple]({{< relref "/responses/mcq.md" >}}) (cases à cocher) avec ou sans [justification]({{< relref "/responses/mcq_justified.md" >}}), + `vector` : [liste de drapeaux]({{< relref "/responses/vector.md" >}}),
+ `ucq` : [liste de choix]({{< relref "/responses/ucq.md" >}}) ; + `mcq` : [question à choix multiple]({{< relref "/responses/mcq.md" >}}) (cases à cocher) avec ou sans [justification]({{< relref "/responses/mcq_justified.md" >}}),
* `id = 42` : (facultatif) identifiant du flag au sein de l'exercice, pour définir des dépendances ; + `ucq` : [liste de choix]({{< relref "/responses/ucq.md" >}}) ;
* `label = "Intitulé"` : (facultatif, par défaut : `Flag`) intitulé du drapeau ; * `id = 42` : (facultatif) identifiant du flag au sein du défi, pour définir des dépendances ;
* `raw = 'MieH2athxuPhai6u'` ou `raw = ['part1', 'part2']` : drapeau(x) exact(s) à trouver ; sous forme de tableau, le participant n'aura pas connaissaance du nombre d'éléments ; * `label = "Intitulé"` : (facultatif, par défaut : `Flag`) intitulé du drapeau ;
* `ordered = false` : (facultatif, par défaut : `false`) ignore l'ordre dans lequels les éléments du tableau sont passés ; * `raw = 'MieH2athxuPhai6u'` ou `raw = ['part1', 'part2']` : drapeau(x) exact(s) à trouver ; sous forme de tableau, le participant n'aura pas connaissaance du nombre d'éléments (à moins de définir l'attribut `showlines`) ;
* `validator_regexp = "^(?:sudo +)?(.*)$"` : (facultatif) expression rationnelle dont les groupes capturés serviront comme chaîne à valider (notez que `?:` au début d'un groupe ne le capturera pas) ; * `showlines = false` : (facultatif, par défaut : `false`) lorsque le drapeau est un tableau et que `showlines` est vrai, le nombre d'éléments du tableau sera donné au participant, sinon il devra déterminer lui-même le nombre d'éléments à trouver (pour l'instant cette option est limitée à un tableau de 9 éléments maximum, c'est normal si ça bug au delà, demandez-moi si vous avez besoin de plus) ;
* `casesensitive = true` : (facultatif, par défaut : `false`) prend en compte la case de ce drapeau ; * `ordered = false` : (facultatif, par défaut : `false`) ignore l'ordre dans lequels les éléments du tableau sont passés ;
* `help = "Indication"` : (facultatif) chaîne de caractères placée sous le champ du formulaire, idéale pour donner une indication de format ; * `validator_regexp = "^(?:sudo +)?(.*)$"` : (facultatif) expression rationnelle dont les groupes capturés serviront comme chaîne à valider (notez que `?:` au début d'un groupe ne le capturera pas) ;
* `choices_cost = 42` : (facultatif) coût pour afficher les choix : avant l'affichage, se comporte comme un drapeau `key` classique (à 0, les choix sont affichés directement) * `casesensitive = true` : (facultatif, par défaut : `false`) prend en compte la case de ce drapeau ;
* `noshuffle = true` : (facultatif, par défaut `false`) conserve l'ordre des propositions, au lieu de les mélanger ; * `placeholder = "dd/mm/yyyy"` : (facultatif) chaîne de caractères initiale placée dans le champ du formulaire, idéale pour donner une indication de format ;
* `[[flag.unlock_file]]` : bloque l'accès à un fichier tant que le flag n'est pas obtenu : * `help = "Complément"` : (facultatif) petit paragrpahe placée sous le champ du formulaire, idéal pour donner une indication complémentaire ;
+ `filename = "toto.txt"` : nom du fichier tel qu'il apparaît dans le dossier `files` ; * `choices_cost = 42` : (facultatif) coût pour afficher les choix : avant l'affichage, se comporte comme un drapeau `key` classique (à 0, les choix sont affichés directement)
* `[[flag.need_flag]]` : liste des flags devant être validés avant de débloquer celui-ci : * `noshuffle = true` : (facultatif, par défaut `false`) conserve l'ordre des propositions, au lieu de les mélanger ;
+ `id = 23` : identifiant du flag tel qu'il a été défini plus tôt dans le fichier ; * `[[flag.unlock_file]]` : bloque l'accès à un fichier tant que le flag n'est pas obtenu :
* `[[flag.choice]]` : représente un choix, répétez autant de fois qu'il y a de choix (pour les `mcq` et `ucq`) : + `filename = "toto.txt"` : nom du fichier tel qu'il apparaît dans le dossier `files` ;
+ `label = "Intitulé de la réponse"`, * `[[flag.need_flag]]` : liste des flags devant être validés avant de débloquer celui-ci :
+ `value = true` (facultatif, par défaut `false`, sauf si `raw` est précisé) : valeur attendue pour ce choix, + `id = 23` : identifiant du flag tel qu'il a été défini plus tôt dans le fichier ;
+ `raw = "Justification"` (nécessaire pour un [QCM justifié]({{< relref "/responses/mcq_justified.md" >}})) : utilisez une chaîne de caractères (notez qu'il n'est pas possible de combiner des réponses vraies justifiées et non justifiées), * `[[flag.choice]]` : représente un choix, répétez autant de fois qu'il y a de choix (pour les `mcq` et `ucq`) :
+ `help = "Flag correspondant"` : (facultatif) indication affichée dans le champ de texte des QCM justifiés, + `label = "Intitulé de la réponse"` (facultatif, par défaut `raw`),
+ ... toutes les autres propriétés applicables à un flag simple peuvent être utilisées : `ordered`, `validator_regexp`, `casesensitive`, ... ; + `value = true` (facultatif, par défaut `false`, sauf si `raw` est précisé) : valeur attendue pour ce choix,
- `[[hint]]` : paramètres pour un indice : + `raw = "Justification"` (nécessaire pour un [QCM justifié]({{< relref "/responses/mcq_justified.md" >}})) : utilisez une chaîne de caractères (notez qu'il n'est pas possible de combiner des réponses vraies justifiées et non justifiées),
* `filename = "toto.txt"` : (mutuellement exclusif avec `content`) nom du fichier tel qu'il apparaît dans le dossier `hints` ; + `help = "Flag correspondant"` : (facultatif) indication affichée dans le champ de texte des QCM justifiés,
* `content = "Contenu de l'indice"` : (mutuellement exclusif avec `filename`) contenu de l'indice affiché, en markdown ; + ... toutes les autres propriétés applicables à un flag simple peuvent être utilisées : `ordered`, `validator_regexp`, `casesensitive`, ... ;
* `cost = 10` : (facultatif, par défaut 1/4 des gains du challenge) coût de l'indice ; - `[[hint]]` : paramètres pour un indice :
* `title = "Foo Bar"` : (facultatif, par défaut "Astuce $id") titre de l'astuce dans l'interface ; * `filename = "toto.txt"` : (mutuellement exclusif avec `content`) nom du fichier tel qu'il apparaît dans le dossier `hints` ;
* `[[hint.need_flag]]` : liste des flags devant être validés pour débloquer cet indice : * `content = "Contenu de l'indice"` : (mutuellement exclusif avec `filename`) contenu de l'indice affiché, en markdown ;
+ `id = 23` : identifiant du flag ; * `cost = 10` : (facultatif, par défaut 1/4 des gains du défi) coût de l'indice ;
* `title = "Foo Bar"` : (facultatif, par défaut "Astuce $id") titre de l'astuce dans l'interface ;
* `[[hint.need_flag]]` : liste des flags devant être validés pour débloquer cet indice :
+ `id = 23` : identifiant du flag ;
Voir aussi [la section sur les flags]({{< relref "/responses" >}}). Voir aussi [la section sur les flags]({{< relref "/responses" >}}).
@ -55,13 +58,12 @@ id = 2
[[flag]] [[flag]]
label = "Date d'exfiltration" label = "Date d'exfiltration"
help= "Format : yyyy-mm" help= "yyyy-mm"
raw = '2015-12' raw = '2015-12'
[[flag]] [[flag]]
label = "IPv6 d'exfiltration" label = "IPv6 d'exfiltration"
raw = 'fe80::319c:1002:7c60:68fa' raw = 'fe80::319c:1002:7c60:68fa'
casesensitive = false
[[flag]] [[flag]]
type = "mcq" type = "mcq"

View File

@ -8,7 +8,7 @@ Le fichier `DIGESTS.txt` se trouve dans le répertoire `files/` ou `hints/` d'un
défi. Il contient les condensats des fichiers se trouvant dans le dossier défi. Il contient les condensats des fichiers se trouvant dans le dossier
respectif. respectif.
Il génére avec la commande : On le génére avec la commande suivante :
```sh ```sh
b2sum * > DIGESTS.txt b2sum * > DIGESTS.txt

View File

@ -7,4 +7,4 @@ weight: 5
{{% notice note %}}Ébauche à compléter {{% notice note %}}Ébauche à compléter
{{% /notice %}} {{% /notice %}}
Revoir la [présentation](/fic/presentation.pdf). Revoir la [présentation](/fic/intro/presentation.pdf).

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

@ -1 +1 @@
Subproject commit 18212e67599813e4f97ecc66ebf3f8b32f54a0b5 Subproject commit b5c759a3c7ba7a7303a538f7d1982ec578812684