Préambule
Les 'write ups' avec une π ont un article dédié (détaillé), les autres n'ont qu'un TL;DR vous donnant la piste de résolution.
Vous trouverez les 'sources' originale du challenge ansi que mes 'screens' de résolution et mes éventuelles notes/scripts de solution en cliquant sur le symbole πΎ du challenge.
Le flag
est aussi donné (quand je l'ai trouvé), pour indication (et puis, cela pourrait aider au référencement pour l'année suivante π)
Pour ce CTF…
Pas de 'try hard' cette fois-ci, contrairement à 2022, mais j'ai quand même eu le temps d'y consacrer quelques jours sur les 4 semaines π
Mon parti-pris dans mon appréciation de l'écosystème Python dans tout le CTF est évidemment parfaitement objectif et fondé π
Dans les CTF, il est intéressant de toujours chercher le préfixe du flag en base64, non seulement NDA0Q1RGew
(le base64 de 404CTF{
directement) mais aussi NENURns
(base64 de la partie 4CTF{
dans x404CTF{
) et MDRDVEZ7
(base64 de la partie 04CTF{
dans xx404CTF{
).
Ces deux dernières variantes permettent de retrouver le flag même s'il démarre à la position n+1
ou n+2
d'une string.
Challenges
Divers
773 / 1763 points-
π© Bienvenue
100 points
πΎ
404CTF{ViveLe404CTF}
Savoir lire les CGU
-
π© Pix2Num
100 points
πΎ
404CTF{4n_A11eN_hA9_b33n_70UnD}
Supposer que le challenge fait un chiffrement par
XOR
, et qu'une des valeurs chiffrée a pour clair0
, ce qui signfie que cette valeur chiffrée est le masqueXOR
(car00…00 xor <key> = <key>
). Utiliser cette clef pour déchiffrer chaque pixel d'une image dans laquelle le flag est écrit -
π© Politique de confidentialité
100 points
πΎ
404CTF{J'AccepteLaPrésentePolitique}
Savoir lire une politique de confidentialité contenant directement le flag
-
π© Space Traveller
473 points
πΎ
404CTF{TR1CH3R_C'4ST_B13N_1_B0N_G4M3_D3S1GN_C'4ST_M13UX}
Utiliser Chromium pour modifier le script JS d'un jeu en ligne et le stocker (Firefox ne sait pas faire ce "remplacement" du fichier JS issu du serveur par un fichier custom) afin de créer un bot qui joue tout seul et gagne à un jeu.
De plus, ce jeu fonctionne par vague (d'astéroïdes) mais le serveur traite les vagues indépendamment, et il suffit donc de survivre aux vagues une à une (et non pas à l'ensemble des vagues en même temps, ce qui est d'ailleurs impossible).
Une solution Python est sûrement possible, mais il est plus facile (et visuellement plus sympa) de faire un bot directement dans le jeu π -
π« Satellisation
490 points
-
π« Étoile binaire [2/2]
500 points
Cryptanalyse
2140 / 5371 points-
π©
Entretien Galactique π
100 points
πΎ
404CTF{Th3_b3st_RH_4_sur3}
Utiliser sympy pour résoudre des équations non-linéaires
-
π©
Lunette Cosmico-Galactique (1/2) π
433 points
πΎ
404CTF{On_p3ut_v0ir3_tr3s_l01n_4v3c...}
Retrouver la seed et les paramètres d'un générateur pseudo-aléatoire en brute forçant les incrément possibles issus d'une étape intermédiaire, puis déchiffrer le flag (RSA)
-
π©
Message Lointain π
100 points
πΎ
404CTF{C0nstEllAt!0n}
Un simple chiffrement par substitution à inverser, en connaissant complètement la grille de chiffrement
-
π© Planètes anormales
331 points
πΎ
404CTF{CuRv3S_0N_Th4t_Pl4N3TeS_4rE_aN0mAl0uS}
Identifier qu'une courbe elliptique custom
EllipticCurve(GF(p),[A,B])
a uneE.trace_of_frobenius
de 1 grâce à SageMath Online, la rendant vulnérable à une "Smart Attack" qui permet de résoudre le problème du Logarithme Discret et de retrouver le secretk
à partir deP=k*G
. Décoder ensuite le flag en AES grâce àk
. -
π© R1R2
494 points
πΎ
404CTF{B1p_bOuP_B6M!aU70d35crUt1oN_pR0g6aM_aC7Iv8t3d!321-B0om!}
Poser et résoudre (avec
sympy
) un système d'équations pour déchiffrer les deux moitiés du flag, puis ré-assemmbler ces deux moitiés -
π© Saturn Cipher
356 points
πΎ
404CTF{S4turn3d_d1fus10n_1s_1mp0rt4nt}
Identifier qu'un chiffrement du
n-eme
caractère en clair n'influe que sur lek-eme
du chiffré, et construire un dictionnaire en se servant du challenge comme oracle pour pouvoir déchiffrer chaque caractère du flag -
π© Spacemark
326 points
πΎ
404CTF{LGC_4r3_no_G0od}
Trouver qu'un algorithme de chiffrement (basé sur un
LCG
) génère un déséquilibre statistique entre les bits0
et1
en fonction de sa seed, et itérer plusieurs fois pour obtenir le flag de la part du serveur -
π« Courbe de Lancement
495 points
-
π« Dérive dans l'espace
477 points
-
π« Entretien Galactique 2
471 points
-
π« Jupiter Cipher
496 points
-
π« Lunette cosmico galactique revanche
494 points
-
π« More Space
499 points
-
π« You spin me round
299 points
Exp. Binaires
0 / 3911 points-
π« 22 bytes pour sauver l'univers
366 points
-
π« Bokit
497 points
-
π« Bounty Machine
473 points
-
π« Cosmic-Base
495 points
-
π« Gorfou en danger [1/3]
100 points
-
π« Gorfou en danger [2/3]
100 points
-
π« Gorfou en danger [3/3]
100 points
-
π« Kalaxy
495 points
-
π« KerberINT Space Program
205 points
-
π« Solaris
491 points
-
π« Spaaaaaaace
100 points
-
π« Space Odyssey
489 points
Forensics
600 / 1056 points-
π©
Carver 1/2 π
100 points
πΎ
404CTF{hyp3rv1s0r_f0r_l1f3}
Décompresser une image disque VMWare et chercher le flag (textuel) dedans
-
π©
Carver 2/2 π
100 points
πΎ
404CTF{n1c3_c@rv1ng}
Parcourir l'image disque (photorec) pour en récupérer les fichiers (y compris ceux supprimés) et trouver le flag dans l'une des photos (bonus automatisation)
-
π©
Dockerflag π
100 points
πΎ
404CTF{492f3f38d6b5d3ca859514e250e25ba65935bcdd9f4f40c124b773fe536fee7d}
Retrouver, dans les "étages" d'une image Docker, un repo Git (endommagé) et trouver le flag dans un des objets git
-
π©
Forensic et Mat 1/2 π
100 points
πΎ
404CTF{Sch3dul3d_T4sk_3v3nts_4r3_N0t_S4f3!}
Grep un fichier UTF16LE
-
π©
Forensic et Mat 2/2 π
100 points
πΎ
404CTF{10.66.77.88-4444-svc-x-WinUpdate_Check_75312-1747245628-Administrateurs}
Recherche, dans les events Windows, la connexion, l'élevation de privilèges, la persistence et la phase d'exécution d'une machine compromise
-
π©
USB 51 π
100 points
πΎ
404CTF{W3_c0ME_IN_p3aC3}
Trouver, dans un pcap, le paquet d'exfiltration d'un document (PDF) et décoder le binaire (ASCII) qu'il contient
-
π« Toortik Triflexation [1/2]
356 points
-
π« Tape ton MDP
100 points
Hardware
1829 / 1829 points-
π© Code Radiospatial n°1
347 points
πΎ
404CTF{fb31e1acc2e6eae8be01182d3029ffcb958e3368ca991ceb53895b8c97f2f275}
Lire du POCSAG (j'ai bricolé!): avec GnuRadio, convertir l'IQ en données binaires brutes, qu'on décime pour avoir le message binaire, puis utiliser un
galois.BCH
pour corriger les erreurs du message avant de lire ces données binaires comme unASCII7
à l'envers (de droite à gauche) -
π© Comment est votre température
100 points
πΎ
404CTF{0FA8B84A|19|76}
Décoder le flux binaire du
csv
eni2c
avecsigrok
et en comprendre le sens grâce à la datasheet du composant -
π© R16D4
423 points
πΎ
404CTF{111000111000010001111001}
Identifier (avec ChatGPT par exemple) un montage d'amplis op' en comparateur, puis en déduire manuellement les tensions sur les entrées d'un arduino afin de savoir comment réagit le code (dont on a les sources) sur ce arduino.
Attention à bien lire ce code car la valeur initiale du compteur qui s'y trouve n'est pas0
mais-1
! -
π© Space Radio
100 points
πΎ
404CTF{3278e8739f83}
Faire le "Hello World" du traitement de signal, c'est à dire une démodulation FM avec GnuRadio pour entendre le flag.
π‘ Je lance GnuRadio avec QT car l'affichage par défaut me donne des textes illisibiles tellement ils sont pixelisés -
π© Trop d'IQ
100 points
πΎ
404CTF{45d05a8e7}
Lire un fichier IQ avec
numpy
et le décomposer enraw
pour pouvoir entendre le flag dans Audacity, après une "amplification négative" pour réduire la saturation audio (celle-ci pourrait certainement se faire aussi avecnumpy
directement). -
π© Unidentified Serial Bus 1/2
384 points
πΎ
404CTF{81e71a3f9c}
Implémenter la norme USB1.1:
- Lire la paire différentielle analogique pour obtenir un signal numérique (binaire)
- Déterminer "l'échantillonage" de ce signal pour le décimer (20
bits du singal original =1
bit de signal réel)
- Appliquer leNRZI
pour obtenir les données binaires réelles: un changement (0->1
ou1->0
) du signal réel = bit de data à1
, pas de changement = bit de data à0
- Scinder ces data en blocks à partir du header donné par le challenge (00…001
)
- Lire chaque bloc en se référant à la norme USB pour identifier les blocs de données (DATA0/DATA1
)
- Ne pas oublier d'appliquer le "bit stuffing": après six1
d'affilés, ignorer le0
qui suit
- Récupérer le flag dans les données de la trame décrivant le device USB, en prenant garde (ou pas!) que les bits sont dans l'ordre inverse (c'est duLSB
) -
π© Unidentified Serial Bus 2/2
375 points
πΎ
404CTF{9f993d54e688927dbfad50d6980c4b3dbf61991ba06fbe707409d699c724116b}
Reprendre le challenge précédent, mais cette fois, il suffit de lire les trames de
DATA0/1
échangées entre les appareils USB pour trouver le flag dans ces données.
Ce challenge me semble plus simple que le 1er, car il n'y avait pas de bit stuffing et que sans même connaitre le standard USB1.1, on pouvait retrouver les caractères du flag dans le flux binaire en ASCII
À noter que tous lesCRC5
étaient bons (j'ai perdu du temps là dessus pour rien π)
Machine Learning
1244 / 1244 points-
π©
Du tatouage π
496 points
πΎ
404CTF{436333370349117}
Brute-forcer les clefs de tatouage possible pour chaque entrée d'un journal, pour trouver quelle clef a permi de tatouer certaines entrées
-
π©
Gorfoustral 1/3 π
100 points
πΎ
404CTF{ce_magnifique_model_tiendrait_dans_votre_poche!}
Trouver le bon prompt pour qu'un réseau de neurones entrainé spécifiquement le complète avec le flag
-
π©
Gorfoustral 2/3 π
287 points
πΎ
404CTF{superbe_methode_avancee_de_desapprentisage}
Remplacer la partie altérée du modèle par la partie saine du 1er challenge (pas sûr que ce soit la méthode attendue!)
-
π©
Gorfoustral 3/3 π
361 points
πΎ
404CTF{gorfoustral_un_jour_gorfoustral_presque_toujours}
Remplacer la partie altérée du modèle par la partie saine du 1er challenge (pas sûr que ce soit la méthode attendue!)
Misc
200 / 600 points-
π© Named Resolve
100 points
πΎ
404CTF{DNS_Z0n3_W4lk1ng_Byp4ss3s_Tr4nsf3r_R3str1ct10ns!}
Se connecter à un LDAP, l'explorer, trouver un
dnsRecord
à l'intérieur, qui est le flag encodé enbase64
-
π© The LDAP Chronicles
100 points
πΎ
404CTF{Ld4P_4n0nym0us_1s_4_B4d_Pr4ct1c3!}
Se connecter à un AD et l'explorer, pour trouver directement le flag dans la description d'un des objets
-
π« Ghost Membership
100 points
-
π« Houston, we have a problem
100 points
-
π« The AD Guardians
100 points
-
π« The GPO Mission
100 points
OSINT
562 / 2071 points-
π© Earth Attack 0/2
100 points
πΎ
404CTF{9H-MDJ}
Éplucher les rapports d'enquête du BEA (avec l'aide de ChatGPT et du site du BEA) pour trouver un rapport correspondant à certains critères. Et aussi, rager que les challenges d'OSINT ont parfois plusieurs solutions, mais qu'une seule est le flag π
-
π© La ville en rose
162 points
πΎ
404CTF{03_06_2022_18h40}
Trouver une photo correspondant à certains critères (ce que ChatGPT sait parfaitement bien faire) pour en déduire un lieu et un évènement, et inférer la date du cliché (à l'heure près) à partir de ces indices.
L'heure n'est jamais directement donnée, il y a donc un peu de "pif" -
π© Un peu de vacances
100 points
πΎ
404CTF{Lamprospiza melanoleuca}
À partir d'un enregistrement audio, isoler le cri d'un zozio (endémique de la Guyane), l'identifier grâce à Birdnet et choisir (au hasard) son nom vernaculaire comme flag.
-
π© Un satellite qui vaut de l'or
100 points
πΎ
404CTF{diapason}
Retrouver, grâce à Google Images, le nom d'un lanceur et sa date de lancement. Tricky car le lanceur a fait plusieurs mises en orbite de différents satellites avec différents noms, et le nombre d'essais sur ce challenge était très limité!
-
π© Une mission inconnue
100 points
πΎ
404CTF{thomas-pesquet_oeil-de-lynx_columbus}
À partir de l'énoncé, deviner les mots clefs à chercher via la recherche avancée sur X pour retrouver une photo et le tweet correspondant, dans lequel se trouvent les informations nécessaires au flag.
-
π« DPOsint
498 points
-
π« Earth Attack (1/2)
100 points
-
π« En eaux sombres
464 points
-
π« L'addition est salée
100 points
-
π« La tête dans les étoiles
347 points
Quantique
937 / 937 points-
π©
Grover 1/2 π
342 points
πΎ
404CTF{z0r_oU_XoR?_j3_N3_m_En_sOr_pLU5}
Comprendre l'ordre des portes et des qbits pour préparer trois fonctions quantiques
-
π©
Grover 2/2 π
495 points
πΎ
404CTF{011001010000000100011011}
Retrouver le flag quantique avec un Grover partiel
-
π©
Machinerie Quantique π
100 points
πΎ
404CTF{uN3_SUp3rp0s1tIon_d3_dr4pE4ux_PoUr_1_m3l4nGE_ExPl0S1f}
Installer l'environnement et découvrir le monde quantique via Python
Reverse
637 / 1714 points-
π© 3x3cut3_m3
100 points
πΎ
404CTF{L@Fus33D3c0ll3!!}
Décoder, plusieurs fois de suite, un script Powershell "obfusqué" par du base64 lu à l'envers, puis brute-forcer un mot de passe qui est un
XOR
avec un offset -
π© Cbizarre (1/2)
100 points
πΎ
404CTF{PAst3_mY_FL2g}
Retrouver un lien Pastebin dans les
strings
d'un binaire et récupérer le flag directement en accédant à ce lien.
On peut aussi repérer ce lien avec un Wireshark ou tout autre loggeur réseau. -
π© Cbizarre (2/2)
100 points
πΎ
404CTF{Cg00d&slmpL3}
Ouvrir le binaire dans Ghidra pour récupérer les conditions de longueur d'un mot de passe et de valeur de chacun de ses caractères. En déduire le mot de passe. L'envoyer au binaire pour récupérer le flag (qui est
XOR
avec ce mot de passe? peut-être…).
J'avais, dans un premier temps, mal noté/inversé les conditions en question, donnant un garbage au 1er essai. -
π© Inscription
337 points
πΎ
404CTF{Fr13nd5H1p-3ndeD-w1TH-L4t3x-N0w-tYP5T-iS-my-B3sT-Fr1End}
Récupérer le
bytestream
d'un plugintypst
, donnant un fichier WebAssembly.
Ouvrir ensuite ce WebAssembly (wasm
) dans Ghidra à l'aide d'un plugin.
Patcher directement ce fichierwasm
en hexadécimal (car mon Ghidra plante si je le fais dedans) en forgeant un appel àwasm_minimal_protocol_send_result_to_host
afin de dumper (dans la sortie detypst
) le flag chiffré qui s'y trouve.
Envoyer comme input auwasm
tout l'alphabet (tous les caractères possibles) du flag et re-patcher cewasm
pour dumper la version chiffrée de cet input.
Se servir de cet alphabet chiffré comme dictionnaire pour déchiffrer le flag (chiffrement par substitution). -
π« RFC 9452 bis: IP over Rockets with Quality of Service
488 points
-
π« Reversconstrictor
100 points
-
π« Étoile binaire [1/2]
489 points
Web
300 / 1272 points-
π© Cheese Chess
100 points
πΎ
404CTF{l3_nOuveAU_c4RlseN}
Jouer aux échecs contre un singe (le bot joue au pif) parce que c'est rigolo, puis chercher dans le code du site, au pif et à la chance, pour tomber sur une référence à une variable d'environment
react
contenant le flag. Mettre un point d'arrêt sur cette variable pour en lire le contenu, qui est le flag en clair. -
π© Fire Server
100 points
πΎ
404CTF{m0oN_S3cRe7s_4r3_bUr1eD_d33p}
Identifier une vulnérabilité de type " File Inclusion\, l'exploiter en ayant les sources du site pour trouver comment contourner les mitigations qu'il contient (censées empêcher d'utiliser
../
mais c'est très mal fait π) et s'en servir pour lire le flag se trouvant dans un des fichiers du serveur -
π©
Rainbow Rocket π
100 points
πΎ
404CTF{decod3diSNOtVeRiFiED}
Forger un JWT pour se faire passer pour l'admin car le site autorise l'algorithme `none`, ce qui est en soi une vulnérabilité critique!
-
π« Sideral Noise
499 points
-
π« Space Fleet Command
473 points
Résultats
Mon classement: 37e/2893 (avec 7035 points)
2159 challengers avaient scoré au moins 1 flag utile (c'est à dire en ignorant le Bienvenue et Discord)
Pour cette édition, je m'étais fixé un objectif assez pépère du top 100, voire top 50.
Pour cette raison, je n'ai même pas regardé les challenges 'Exploitation Binaire',
qui, je l'avoue, ne m'intéressent pas des masses (faute d'application pratique qui me soit utile)… π
Mon scoreboard


Top Classement
