|
Some checks failed
continuous-integration/drone/tag Build is failing
|
||
|---|---|---|
| .. | ||
| challengeinfo.go | ||
| doc.go | ||
| errors.go | ||
| exceptions.go | ||
| exceptions_test.go | ||
| exercice_defines.go | ||
| exercice_files.go | ||
| exercice_hints.go | ||
| exercice_keys.go | ||
| exercices.go | ||
| file.go | ||
| full.go | ||
| hooks.go | ||
| importer_cloud.go | ||
| importer_git.go | ||
| importer_git_common.go | ||
| importer_gitbin.go | ||
| importer_localfs.go | ||
| markdown.go | ||
| README.md | ||
| themes.go | ||
Détails de l'aborescence attendue
Tous les textes doivent utiliser l'encodage UTF8.
- Un dossier par thème
IDTEAM-Nom du thème(IDTEAMpeut être un mot, sans tiret-; le nom du thème est celui qui sera affiché dans l'interface, soyez créatifs !), contenant :AUTHORS.txtavec vos noms, tels qu'ils apparraîtront sur le site (voir exemple plus bas)overview.txtune présentation rapide du scenario (~2-3 phrases d'accroche pour lecture rapide), compréhensible par un décideur, petit schéma à l'appuiheading.jpgune photographie libre de tout droit (également celui de référence) représentant le thème- Un dossier par challenge :
CHID-Titre du challenge(avecCHIDl'identifiant numérique du challenge, typiquement son numéro d'ordre), contenant :overview.txtune présentation rapide du challenge (~1-2 phrases d'accroche), compréhensible par un décideur, petit schéma à l'appui si besoinstatement.txtcontenant le scénario du challenge, tel qu'il sera affiché sur le site, à destination des participantsfinished.txt(facultatif) contenant un texte affiché au participant ayant validé l'exercice : par exemple pour donner plus d'informations sur les vulnérabilités rencontréeschallenge.txtdéfinitions des paramètres de votre challenge (au format toml) :gain = 42: nombre de points que rapporte cet exercice ;tags = ["Android", "RAT", "ROM"]: mots-clefs de l'exercice ;[[depend]]: dépendance à un autre exercice :id = CHID: identifiant du challenge ;theme = "NomDuTheme": (facultatif) nom du thème dans lequel aller chercher l'identifiant (par défaut, on prend le thème courant) ;
[[flag]]: drapeau classique à valider pour résoudre le challenge :id = 42: (facultatif) identifiant du flag au sein de l'exercice, pour définir des dépendances ;label = "Intitulé": (facultatif, par défaut :Flag) intitulé du drapeau ;raw = 'MieH2athxuPhai6u'ouraw = ['part1', 'part2']: drapeau exact à trouver ; sous forme de tableau, le participant n'aura pas connaissaance du nombre d'éléments ;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) ;ordered = false: (facultatif, par défaut :false) ignore l'ordre dans lequels les éléments du tableau sont passés ;ignorecase = true: (facultatif, par défaut :false) ignore la case de ce drapeau ;placeholder = "Indication": (facultatif) chaîne de caractères placée sous 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 :filename = "toto.txt": nom du fichier tel qu'il apparaît dans le dossierfiles;
[[flag.need_flag]]: liste des flags devant être validés avant de débloquer celui-ci :id = 23: identifiant du flag tel qu'il a été défini plus tôt dans le fichier ;
[[flag_mcq]]: drapeau sous forme de question à choix multiple (cases à cocher) :label = "Intitulé du groupe": (facultatif) intitulé du groupe de choix ;[[flag_mcq.choice]]: représente un choix, répétez autant de fois qu'il y a de choix :label = "Intitulé de la réponse",value = true: (facultatif, par défautfalse) valeur attendue pour ce choix ; pour un QCM justifié, utilisez une chaîne de caractères (notez qu'il n'est pas possible de combiner des réponses vraies justifiées et justifiées),placeholder = "Flag correspondant": (facultatif) indication affichée dans le champ de texte des QCM justifiés ;
[[flag_ucq]]: drapeau sous forme de question à choix unique :id = 42: (facultatif) identifiant du flag au sein de l'exercice, pour définir des dépendances ;label = "Intitulé du groupe": (facultatif) intitulé du groupe de choix ;raw = 'MieH2athxuPhai6u': drapeau attendu parmi les propositions ;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) ;placeholder = "Indication": (facultatif, uniquement sidisplayAs = select) chaîne de caractères placée sous le champ du formulaire ;displayAs = "select|radio": (facultatif, par défautradio) manière dont est affichée le choix :selectpour une liste de choix,radiopour des boutons radios ;choices_cost = 20: (facultatif, par défaut0) coût pour afficher les choix, avant l'affichage, se comporte comme unflagclassique (à 0, les choix sont affichés directement) ;[[flag_ucq.choice]]: représente un choix, répétez autant de fois qu'il y a de choix :value = "response": valeur qui sera retournée pour comparaison avec la valeurrawdu ucq,label = "Intitulé de la réponse": (facultatif, par défaut identique àvalue) ;
[[flag_ucq.unlock_file]]: bloque l'accès à un fichier tant que le flag n'est pas obtenu :filename = "toto.txt": nom du fichier tel qu'il apparaît dans le dossierfiles;
[[flag_ucq.need_flag]]: liste des flags devant être validés avant de débloquer celui-ci :id = 23: identifiant du flag tel qu'il a été défini plus tôt dans le fichier ;
[[hint]]: paramètres pour un indice :filename = "toto.txt": (mutuellement exclusif aveccontent) nom du fichier tel qu'il apparaît dans le dossierhints;content = "Contenu de l'indice": (mutuellement exclusif avecfilename) contenu de l'indice affiché, en markdown ;cost = 10: (facultatif, par défaut 1/4 des gains du challenge) coût de l'indice ;title = "Foo Bar": (facultatif, par défaut "Astuce $id") titre de l'astuce dans l'interface ;
links.txt: webographie publiée avec les solutions- un lien par ligne
- format d'une ligne :
https://lien Descriptionle premier ' ' est utilisé comme séparateur entre le lien et sa description - liens vers les CVE concernées, metasploit/exploitDB, article qui vous a aidé, extrait/dépôt de code, ...
hints/: dossier contenant des indices pour orienter le participant (qu'il débloquera en échange d'un certain nombre de points)DIGESTS.txt: contenant les condensats des fichiers :$(b2sum * > DIGESTS.txt)à générer avant l'upload !- les fichiers textes de moins de 25 lignes sont affichés directement, les autres (autres types ou textes plus longs) sont proposés au téléchargement.
files/: fichiers à distribuer aux participantsDIGESTS.txt: contenant les condensats des fichiers :$(b2sum * > DIGESTS.txt)à générer avant l'upload !- Pas plus 4GB à télécharger par challenge (ie. tous les fichiers de ce challenge)
- Archives
.tar.bz2,.tar.gz,.tar.xzou.ziplorsque nécessaire. PAS de.rar, ... - Compresser (sans tarball, juste via gzip) 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. Ces fichiers seront concaténés au moment de leur import sur l'interface. Seul le hash du fichier entier est requis dans le fichierDIGESTS.txt.
resolution.mp4: la vidéo de résolution, montée :- format MP4 (H.264 + AAC + 3GPP Timed Text)
- utiliser les sous-titres pour commenter les étapes ; pas de commentaires audio
- environ 2' par vidéo : maxi 1'30" pour les challenges simples, 3-4' maxi
ffmpeg -video_size 1920x1080 -framerate 25 -f x11grab -i :0.0 -f alsa -ac 2 -i hw:0 -strict experimental resolution.mp4- recordMyDesktop sous Linux
- Screencast Capture Lite pour Windows (pas de logiciel de « démonstration » => il faut payer la licence pour publier une vidéo)
- Aegisub, Gnome Subtitle, emacs/vim, ... pour les sous-titres
ressources/:- ressources et scripts que vous avez réalisés pour le challenge : pour sa construction ou sa résolution
- schéma du SI au premier challenge concerné
- éventuellement un
README.txtavec les liens des outils externes
Exemple d'arborescence
SATURN-Active Directory/
...
SATURN-Virtualisation légère/
...
JUPITER-PDF/
AUTHORS.txt
overview.txt
1-Cible cachée/
...
2-Black&White/
...
3-Ligne rouge/
files/
DIGESTS.txt
clue.pdf
big_clue.pdf.00
big_clue.pdf.01
big_clue.pdf.02
ressources/
generator.pl
PDFextractor.exe
solver.py
pdf_index_schema.svg
challenge.txt
links.txt
overview.txt
resolution.mp4
scenario.txt
...
Exemple AUTHORS.txt
Courtois J. <mailto:courto_j@epita.fr>
Bombal S.
Mercier P-O. <https://nemunai.re/>
Vous pouvez indiquer entre chevrons, un lien qui sera associé à votre nom.
Vous pouvez utiliser un pseudo si vous n'êtes pas fier de vos réalisations.
Exemple challenge.txt
gain = 42
[[depend]]
id = 2
[[flag]]
label = "Date d'exfiltration"
placeholder = "Format : yyyy-mm"
raw = '2015-12'
[[flag]]
label = "IPv6 d'exfiltration"
raw = 'fe80::319c:1002:7c60:68fa'
ignorecase = true
[[flag_ucq]]
label = "Conditions générales de validation de challenge"
raw = 'conscent'
[[flag_ucq.choice]]
label = "J'accepte les conditions"
value = 'conscent'
[[flag_ucq]]
label = "Quelle est la couleur du cheval blanc d'Henri IV ?"
raw = 'blanc'
ignorecase = true
displayAs = "select"
[[flag_ucq.choice]]
value = 'Noir'
[[flag_ucq.choice]]
label = 'Roux'
value = 'Alezan'
[[flag_ucq.choice]]
label = 'Brun'
value = 'Alezan'
[[flag_ucq.choice]]
label = "Crème"
value = 'Blanc'
[[flag_mcq]]
label = "Quels sont les films réalisés par C. Nolan ?"
[[flag_mcq.choice]]
label = "Memento"
value = true
[[flag_mcq.choice]]
label = "Inception"
value = true
[[flag_mcq.choice]]
label = "Transcendance"
[[hint]]
filename = 'enocean-specs.pdf'
title = "Spécifications du protocole utilisé"
[[hint]]
content = """
Le TOML c'est magique.
Je peux avoir des chaînes de caractères sur plusieurs lignes !
"""
title = "L'astuce du siècle"
cost = 30
Exemple links.txt
https://media.ccc.de/... Vidéo d'inspiration
https://metasplo.it/ Exploit utilisé
https://nist.gov/ CVE-2016-4242
Exemple DIGESTS.txt
3222734c6c8782682a9c36135a3518e8f4d1facabf76e702cf50da0037a4ed0a425e51266c2914fb83828573e397f96c2a95d419bd85919055479d028f51dba5 fic2016.jpg
023939b0c52b0dfce66954318ab82f7a8c10af4c79c8d5781612b58c74f3ace056067d7b15967e612b176a186b46d3d900c4db8881ba47202521eec33e5bb87b fic.org
7c91450239cf9b0717642c55c3429dd7326db26e87d4ca198758053333f0640ee89d2dd9b2f1919598f89644b06aa8fc2085648e3d1e542a6db324c9b16a0bdf header.tex