04 /Sécurité offensive & CTF

Cybersécurité & CTF.

Notes d'épreuves, résolutions de challenges et boîte à outils pour les compétitions CTF.

intro.txt Profil & Parcours
val74k@cyber:~$ cat intro.txt

Un espace pour documenter l'analyse, les essais et les solutions. Pratique des compétitions de cybersécurité depuis 2020 : automatisation, rétro-ingénierie, cryptanalyse, stéganographie et OSINT.

Pratique de la cybersécurité depuis 2020.
Root-Me · TryHackMe · FCSC 2023 · DGHACK 2022
Trois victoires consécutives au NoBracketsCTF, en équipe.
Création du NSI CTF au lycée en 2024.

Plateforme d'entraînement

Root-Me

Profil Root-Me

Pratique assidue des épreuves de cryptanalyse, web, stéganographie, forensic et reverse engineering.

Progression du profil val74k sur la plateforme Root-Me.
Compétitions & Classements

CTFtime & Palmarès

Profil CTFtime

Participation et résultats lors des challenges nationaux et internationaux en équipe.

NoBracketsCTF 3x Victoires (Top 1)
FCSC 2023 Top 11 Junior (ANSSI)
DGHACK 2022 Challenge DGA
NSI CTF 2024 ↗ 18 Challenges en ligne
Plateforme interactive 18 Challenges en ligne Autonome sans serveur

NSI CTF 2024 — Résolvez les épreuves en direct

Concours de sécurité offensive conçu pour les lycéens en 2024. L'environnement complet est disponible ici en édition autonome : 18 épreuves de cryptanalyse, forensic, stéganographie, OSINT et web avec validation des flags en temps réel.

Ressources & Mémos techniques

Boîte à Outils & Ressources CTF.

Une sélection structurée des outils, services en ligne, mémos et scripts indispensables pour auditer, analyser et résoudre des épreuves de sécurité offensive. Classés par vecteurs d'analyse avec explications concrètes de leur rôle.

01 Cryptographie & Cracking de Hashs

14 ressources

Identifier les méthodes de chiffrement inconnues, casser des empreintes par dictionnaire ou GPU, et automatiser la cryptanalyse.

CyberChef ↗ Online

Le « couteau suisse » universel du GCHQ. Permet de convertir (Base64, Hex), décrypter, manipuler des flux binaires et chaîner des opérations complexes.

dCode ↗ Online

Plateforme majeure de cryptanalyse. Décrypte automatiquement les chiffres historiques, stéganographies textuelles et chiffrements par substitution.

Identificateur d'empreintes précis (MD5, SHA, NTLM, bcrypt) avec vérification instantanée dans leur base mondiale de hashs déjà résolus.

Name-That-Hash ↗ CLI / Python

Outil CLI moderne (nth) qui identifie les hashs obscurs et renvoie directement le code de mode exact pour Hashcat et John the Ripper.

Le cracker de mots de passe le plus rapide au monde. Exploit la puissance hautement parallèle des cartes graphiques (CUDA/OpenCL/Metal).

Cracker de mots de passe polyvalent réputé pour ses utilitaires d'extraction de condensats : zip2john, ssh2john, pdf2john, keepass2john.

Bases de données précalculées en ligne pour retrouver instantanément la chaîne en clair d'un hash MD5, SHA-1 ou SHA-256 sans calcul GPU local.

Tables arc-en-ciel en ligne dédiées au cassage instantané des empreintes LAN Manager (LM/NTLM) fréquentes dans les environnements Windows historiques.

Ciphey ↗ IA / NLP

Déchiffreur entièrement automatisé par traitement du langage naturel : résout les encodages et chiffrements inconnus en quelques secondes sans clé fournie.

FactorDB recense les décompositions en facteurs premiers de grands entiers RSA. RsaCtfTool automatise les attaques Wiener, Hastad, Fermat et petits exposants e.

PlainSight Stéganophonie

Dissimule un texte chiffré au sein d'un texte rédigé en anglais d'apparence grammaticalement naturelle pour masquer l'existence même du message.

Les wordlists de référence en CTF : rockyou.txt (14 millions de mots) et les dictionnaires optimisés de weakpass.com et SecLists.

Mémo pratique : Déchiffrer un hash avec Hashcat

Méthodologie pas à pas pour attaquer une empreinte lors d'un challenge :

  1. Identifier le mode (-m) : Consultez la liste Hashcat Example Hashes ou lancez nth -t <hash>. Par exemple : MD5 = 0, SHA-1 = 100, SHA-256 = 1400, NTLM = 1000.
  2. Préparer la commande : Spécifiez le type d'attaque (-a 0 pour une attaque par dictionnaire), le numéro de mode (-m 0), le hash cible et le chemin de votre wordlist (ex: rockyou.txt).
  3. Option pilote (--force) : Ajoutez le paramètre --force si vous travaillez sur une machine virtuelle ou un pilote OpenCL sans certification officielle.
Bash · Exemple Hashcat (MD5)
# Attaque du hash MD5 eb61eead90e3b899c6bcbe27ac581660 avec la wordlist rockyou
hashcat -a 0 -m 0 eb61eead90e3b899c6bcbe27ac581660 wordlists/rockyou.txt --force

# Résultat retourné :
# eb61eead90e3b899c6bcbe27ac581660:HELLO

Script Python : Résolution automatisée de challenges TCP en direct

Dans les épreuves de rapidité réseau (type NoBracketsCTF), le serveur impose de résoudre un hash SHA-256 en moins d'une seconde. Ce script se connecte au socket TCP, extrait le condensat à la volée, calcule le SHA-256 des mots de la wordlist et valide l'épreuve.

Python 3 · Socket & Hashlib
import hashlib
import socket

HOST = "challenges.nobrackets.fr"
PORT = 10301

def load_wordlist(file_path: str) -> list[str]:
    """Charge les mots de passe d'une wordlist (ex: rockyou.txt ou liste ciblée)."""
    with open(file_path, "r", encoding="latin-1") as f:
        return [line.strip() for line in f]

def crack_sha256(target_hash: str, wordlist: list[str]) -> str | None:
    """Calcule le hash SHA-256 de chaque entrée jusqu'à trouver la correspondance."""
    for word in wordlist:
        if hashlib.sha256(word.encode("utf-8")).hexdigest() == target_hash:
            return word
    return None

def solve_challenge(wordlist: list[str]) -> None:
    """Ouvre le socket TCP, intercepte le challenge et envoie la solution."""
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((HOST, PORT))
        print(f"[*] Connecté à {HOST}:{PORT}")

        while True:
            response = s.recv(4096).decode(errors="replace")
            print(response, end="")

            if "Hash #" in response:
                # Format attendu du serveur : "Hash #1: "
                hash_value = response.split("Hash #")[1].split(":")[1].strip()
                cracked = crack_sha256(hash_value, wordlist)

                if cracked:
                    print(f"\n[+] Mot de passe identifié : {cracked}")
                    s.sendall(cracked.encode("utf-8") + b"\n")
                else:
                    print("\n[-] Mot de passe absent de la wordlist fournie.")
                    break

            if "Bravo" in response or "Flag" in response:
                print("\n[✓] Challenge validé avec succès !")
                break

if __name__ == "__main__":
    words = load_wordlist("wordlist.txt")
    solve_challenge(words)

02 Stéganographie & Analyse d'images

8 ressources

Détecter les informations dissimulées dans les pixels, les couches alpha, les métadonnées EXIF ou les structures de fichiers conteneurs.

Plateforme tout-en-un exécutant en parallèle zsteg, steghide, outguess, exiftool et binwalk sur n'importe quel fichier image soumis.

Laboratoire forensique d'image dans le navigateur : loupe d'inspection locale, analyse de niveau d'erreur (ELA) et détection de retouches ou clonages.

Outil de référence pour insérer ou extraire des charges utiles dans des images JPEG/BMP ou sons WAV protégés par mot de passe.

Stegseek ↗ Ultra-rapide

Le cracker de steghide le plus rapide au monde : capable de tester l'intégralité du dictionnaire rockyou.txt en moins de deux secondes.

Binwalk ↗ Carving

Scanner de signatures binaires capable de repérer et d'extraire des archives, exécutables ou payloads concaténés à l'intérieur d'un fichier hôte.

zsteg ↗ LSB / PNG

Détecteur de stéganographie spécialisé dans l'analyse des bits de poids faible (Least Significant Bit) pour les formats non compressés PNG et BMP.

Application Java pour examiner les plans de bits (Bit Planes Rouge, Vert, Bleu, Alpha) et faire ressortir les messages visuellement masqués.

La référence pour lire, éditer ou nettoyer toutes les métadonnées (EXIF, IPTC, XMP, géolocalisation GPS, appareil photo) d'un fichier média.

03 Reverse Engineering & Analyse Binaire

7 ressources

Désassembler, décompiler et déboguer des exécutables x86/x64, ARM ou .NET pour rétro-concevoir leur logique et neutraliser leurs contrôles.

Ghidra ↗ NSA / Décompilateur

Suite de rétro-ingénierie open-source conçue par la NSA. Décompilateur C remarquable, support de multiples architectures et analyse de graphes.

Le désassembleur interactif historique de référence mondiale pour l'analyse de malwares et l'examen chirurgical du flot d'exécution binaire.

x64dbg ↗ Windows Debug

Débogueur x32/x64 open-source pour Windows. Indispensable pour inspecter la mémoire à l'exécution, poser des breakpoints et patcher des instructions.

dnSpy ↗ .NET & C#

Décompilateur et débogueur interactif de binaires .NET et Unity. Permet d'éditer le code C# directement dans l'interface et de recompiler l'exécutable.

pwntools ↗ Python / Pwn

Bibliothèque Python incontournable pour prototyper des exploits binaire : gestion de shellcodes, chaînes ROP, calculs de payloads et canaux sockets.

GDB + GEF ↗ Linux Debug

Extension moderne pour GDB qui affiche visuellement registres, pile, protections mémoire (NX, ASLR, Canary, PIE) et déréférencements de pointeurs.

Cutter ↗ GUI / Rizin

Interface graphique moderne et intuitive basée sur le moteur de désassemblage Rizin / Radare2 avec décompilateur Ghidra nativement intégré.

04 Forensique Système, Disque & Mémoire

6 ressources

Analyser des images disques, disséquer des dumps de mémoire vive (RAM) et reconstituer la chronologie d'une compromission.

Autopsy ↗ Disque & FS

Plateforme d'investigation numérique open-source pour inspecter disques durs, systèmes de fichiers (NTFS, EXT4), historiques de navigation et journaux d'événements.

Volatility 3 ↗ Mémoire RAM

Le framework de référence pour l'analyse de dumps de mémoire vive : extrait les processus actifs, connexions réseau, clés injectées et mots de passe en mémoire.

TestDisk & PhotoRec ↗ Récupération

TestDisk répare les partitions corrompues ; PhotoRec récupère les fichiers effacés en sculptant directement les données brutes sur le disque (carving).

Boîte à outils pratique pour décoder les horodatages UNIX / Windows FileTime, conversions d'adresses et artefacts de caches web lors d'une analyse.

NetworkMiner ↗ PCAP Forensics

Analyseur forensique de trafic réseau passif capable d'extraire automatiquement fichiers transmis, certificats, images et identifiants sans filtrage manuel.

FTK Imager ↗ Acquisition

Outil d'acquisition forensique de disques physiques et de mémoire vive avec calcul d'empreintes de contrôle (MD5/SHA-1) garantissant l'intégrité probatoire.

05 OSINT & Enquête en Sources Ouvertes

19 ressources

Collecter, croiser et corréler des données publiques pour retrouver une cible, géolocaliser une image ou cartographier une infrastructure réseau.

OSINT Framework ↗ Arborescence

Carte mentale interactive recensant des centaines d'outils et de services classés par type de donnée cible (adresse, téléphone, IP, pseudo).

OSINT-FR ↗ Communauté FR

Annuaire complet d'outils, méthodologies et fiches pratiques d'investigation en sources ouvertes maintenu par la communauté francophone.

Yandex Images ↗ Vision IA

Le moteur de recherche inversée d'images le plus puissant pour la reconnaissance faciale, l'architecture spécifique et les paysages d'Europe et du monde.

Google Lens & Images ↗ Reconnaissance

Incontournable pour identifier objets, produits commerciaux, enseignes et monuments grâce à la base d'indexation mondiale de Google.

TinEye & Bing Visual ↗ Antériorité

Moteurs d'indexation d'images par empreinte pour déterminer la date et la page de première parution d'un cliché sur le web.

Extension de navigateur pour interroger simultanément plus de 30 moteurs de recherche d'images d'un simple clic droit.

Vérifie instantanément la présence d'un pseudonyme ou nom d'utilisateur sur plus de 600 plateformes, réseaux sociaux et forums.

Sherlock ↗ CLI / Python

Script Python en ligne de commande pour traquer l'existence d'un compte utilisateur à travers l'ensemble des réseaux sociaux majeurs.

Epieos ↗ Email OSINT

Enrichissement passif à partir d'une simple adresse e-mail : révèle les profils Google, avis Maps, albums Photos et Skype associés sans avertir la cible.

GHunt ↗ Google OSINT

Outil d'investigation sur les comptes Google : identifiant GAIA, albums publics Google Photos, coordonnées d'avis Google Maps, chaîne YouTube.

Shodan ↗ IoT & Serveurs

Moteur de recherche des équipements connectés à Internet : serveurs, webcams, routeurs, automates SCADA/ICS avec leurs ports ouverts et bannières.

urlscan.io ↗ Sandbox Web

Bac à sable d'analyse d'URL sans risque : capture d'écran, IP et ASN contactés, requêtes HTTP, scripts JavaScript exécutés et certificats SSL.

Maltego ↗ Graphes & Liens

Logiciel professionnel de cartographie visuelle permettant d'établir et corréler les liens entre individus, domaines, serveurs et adresses IP.

TheHarvester ↗ Recon / CLI

Collecte d'e-mails, sous-domaines, hôtes, noms d'employés et ports ouverts à partir de dizaines de sources ouvertes (moteurs de recherche, PGP, Shodan).

Pappers ↗ Légal / France

Consultation gratuite de toutes les données légales des entreprises françaises : statuts, bilans financiers, bénéficiaires effectifs et actes officiels.

Wayback Machine ↗ Archives Web

La mémoire du Web : indispensable pour consulter d'anciennes versions de sites, retrouver des pages disparues ou des informations caviardées.

Calcule la position du soleil, l'azimut et la longueur des ombres à une date et heure précises pour dater et orienter une prise de vue extérieure.

Outils Empreinte Réseau Réseau & DNS

Outils indispensables d'investigation d'infrastructure : énumération DNS (DNSenum, dig), tcptraceroute, whois, dmitry et serversniff.

Les deux plateformes francophones de référence pour pratiquer l'enquête en sources ouvertes, la géolocalisation et la recherche d'indices réels.

06 Sécurité Web & Exploitation

8 ressources

Intercepter le trafic applicatif, fuzzer les paramètres cachés, tester les API et auditer les vulnérabilités de l'OWASP Top 10.

Burp Suite ↗ Proxy HTTP/S

Le proxy d'interception HTTP/HTTPS de référence mondiale : analyse, modification, rejeu de requêtes (Repeater) et injection de paramètres (Intruder).

RevShells ↗ Payloads

Générateur interactif de reverse shells prêts à l'emploi (Bash, Python, PHP, PowerShell, Socat, Perl) avec encodages URL et Base64 à la volée.

ffuf ↗ Fuzzing / Go

Fuzzer web ultra-rapide en Go. Idéal pour découvrir des répertoires masqués, fichiers oubliés, sous-domaines et paramètres d'API non documentés.

de4js ↗ Online

Désobfuscateur JavaScript en ligne capable de nettoyer et déchiffrer des scripts obfusqués via eval, array packs ou javascript-obfuscator.

JWT Tool ↗ Python / JWT

Boîte à outils d'audit de JSON Web Tokens : attaques alg: none, falsification de signature HMAC/RSA et brute-force du secret de signature.

SQLMap ↗ Injection SQL

Outil automatisé de détection et d'exploitation de vulnérabilités d'injection SQL (blind, time-based, union-based) et d'extraction de bases de données.

Découvre et cartographie les sous-domaines d'un nom de domaine en agrégeant de multiples sources ouvertes et certificats SSL publics.

Les deux encyclopédies de référence recensant charges utiles, contournements de filtres et méthodologies d'exploitation pour chaque vulnérabilité web.

07 Réseau, Wi-Fi & Radio (SDR)

8 ressources

Capturer le trafic réseau et sans fil, auditer les clés Wi-Fi WPA2/WPA3 et rétro-concevoir des signaux radiofréquences.

Wireshark ↗ Trafic Réseau

L'analyseur de protocoles réseau le plus utilisé au monde pour capturer, filtrer et disséquer les trames Ethernet, 802.11 et flux applicatifs.

Nmap ↗ Scanner Réseau

Le scanner de ports et réseau par excellence pour cartographier les machines hôtes, découvrir les services exposés et tester des vulnérabilités (scripts NSE).

Aircrack-ng ↗ Wi-Fi Suite

Suite historique d'évaluation de sécurité sans fil : passage en mode moniteur (airmon-ng), capture (airodump-ng) et injection de paquets (aireplay-ng).

La méthode moderne de capture Wi-Fi : intercepte directement le PMKID des points d'accès sans attendre de connexion client ni générer d'attaques agressives.

cap2hashcat ↗ Convertisseur

Convertisseur officiel en ligne pour transformer une capture réseau (.pcap/.pcapng) au format .hc22000 directement exploitable par Hashcat.

GNU Radio ↗ SDR / Signal

Environnement de traitement du signal pour concevoir des récepteurs et transmetteurs radio logicielle (Software Defined Radio, RTL-SDR, HackRF).

Suite complète pour l'investigation sans fil de signaux RF inconnus : démodulation automatique, analyse de trames et rejeu de signaux radio.

Bettercap ↗ MITM & Réseau

Framework moderne d'audit réseau et d'attaques de l'homme du milieu (ARP/DNS spoofing), sniffing de paquets, sondes Wi-Fi et Bluetooth Low Energy (BLE).

Workflow pratique : Audit Wi-Fi moderne (PMKID & Hashcat 22000)

L'attaque par PMKID ne requiert aucun client connecté au réseau cible. Elle exploite la clé d'identification du cache RSN émise dès la première trame d'association du point d'accès.

  1. Vérifier le support de l'injection : Identifiez le nom de votre interface sans fil (ex: wlan0 avec iwconfig) et testez la capacité d'injection de la carte réseau :
    Bash · Test d'injection de paquets
    sudo hcxdumptool -i wlan0 --check_injection
  2. Capturer les paquets et intercepter le PMKID : Lancez l'écoute passive/active avec hcxdumptool pour enregistrer les trames d'association des points d'accès environnants :
    Bash · Capture PMKID
    sudo hcxdumptool -i wlan0 -o capture.pcapng --active_beacon --enable_status=1
  3. Convertir le fichier au format Hashcat : Utilisez l'utilitaire en ligne cap2hashcat ou en local hcxpcapngtool -o hash.hc22000 capture.pcapng pour générer le fichier .hc22000.
  4. Casser le hash WPA2 avec Hashcat (mode 22000) : Téléchargez un dictionnaire adapté (ex: listes WPA sur weakpass.com ou rockyou.txt) et exploitez l'accélération GPU :
    Bash · Cracking GPU mode 22000
    hashcat -a 0 -m 22000 hash.hc22000 wordlist.txt
Retours d'expérience

Write-ups Techniques & Exploitation.

Comptes-rendus détaillés de résolutions d'épreuves de compétitions CTF réelles. Démarche pas à pas, code reproductible et analyse des mécanismes sous-jacents.

DOSSIER 01 NoBracketsCTF — Sécurité Offensive

🏆 3x Victoires Consécutives (Top 1)
Document PDF · 535 Ko 🏆 3 Victoires Consécutives (Top 1) Pre-Challenge

Write-up du Pre-Challenge — NoBracketsCTF

Rapport personnel de résolution des épreuves préliminaires (pre-challenges) rédigé par val74k. Trois victoires consécutives au NoBracketsCTF remportées en équipe.

Retrouvez l'intégralité des démarches d'exploitation, des scripts de résolution et des explications théoriques dans le rapport PDF complet ci-dessous.

NoBracketsCTF Programmation · Selenium

Plus vite que ton ombre.

Le serveur affiche un calcul arithmétique dynamique à résoudre en une fraction de seconde avant expiration de la requête. Impossible à réaliser à la main : l'automatisation via le navigateur s'impose.

Python · Selenium WebDriver
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome(executable_path="chromedriver.exe")
driver.get("https://plusvitequetonombre.nobrackets.fr/")

while True:
    search_calcul = driver.find_element(By.XPATH, '//h3')
    calcul = search_calcul.text

    a = int(calcul[:2])
    b = int(calcul[-3:])
    result = a * b

    search_input = driver.find_element(By.CLASS_NAME, "selection")
    search_input.send_keys(str(result))
    search_input.send_keys(Keys.ENTER)

    if driver.find_element(By.XPATH, '//h3').text == "Faux ou trop lent !":
        print("Erreur de synchronisation, relance...")
        driver.back()

L'analyse du DOM permet d'extraire les deux opérandes via XPath, de calculer le produit instantanément et de renvoyer la réponse avec send_keys(Keys.ENTER) avant le seuil d'invalidation du serveur.

NoBracketsCTF OSINT · Géolocalisation

Agents doubles — Enquête & Street View.

Une énigme de renseignement en sources ouvertes : identifier l'année d'un rassemblement culturel breton traditionnel et retrouver l'enseigne d'un commerce spécifique à Rennes.

Méthodologie OSINT
# 1. Recherche d'événements :
# "Fest Deiz Farz" -> archive presse Le Télégramme (repas Kig-ha-Farz 2014 mentionnant l'édition 2008)

# 2. Traduction toponymique :
# "Breujoù-Breizh" = Parlement de Bretagne (Rennes)

# 3. Exploration cartographique historique :
# Coordonnées : 48.1124485, -1.6773561 (2 Rue Hoche, Rennes)
# Imagerie Google Street View historique de juin 2008
# Flag final : NBCTF{2008_rose-vert-bleu}

La clé réside dans l'utilisation des archives historiques de Street View : les façades des commerces et les stores changent au fil des ans. Remonter à la vue de 2008 permet de lire directement les couleurs et les détails demandés.

NoBracketsCTF Stéganographie · Cryptanalyse

De la Terre à la Lune — Stégano & Atbash.

Un challenge combinant dissimulation de données dans une image et chiffrement par substitution monoalphabétique inversée.

Analyse & déchiffrement
1. Extraction stéganographique de l'image source :
   Payload extrait : "Ov Uozt vhg ov mln wv oz kivnrviv uvnnv jfr vhg kzigrv wzmh o vhkzxv."

2. Reconnaissance du chiffrement :
   Inversion miroir de l'alphabet latin (chiffre Atbash, A <-> Z, B <-> Y...)
   Texte clair : "Le Flag est le nom de la premiere femme qui est partie dans l espace."

3. Résolution de l'énigme historique :
   Cosmonaute soviétique en vol le 16 juin 1963 -> Valentina Terechkova

L'analyse de fréquence et la répétition des voyelles permettent d'identifier immédiatement un chiffre par substitution sans clé complexe. Le chiffre Atbash remplace chaque lettre par son opposée dans l'alphabet.

NoBracketsCTF Cryptographie · Python

L'élève de Maryam — Dérivation de clé.

Déchiffrement d'un texte chiffré sérialisé selon le format de la bibliothèque Python cryptocode (AES-CBC avec HMAC).

Python · cryptocode
import cryptocode

payload = (
    "nSxN9JTC1uSrNsYN1i8Gho/JUmbYjBZHBxoRfIwW7CID*D25l8DUOBDrPx5MkVbyFmQ==*"
    "lEGDw6NwHuEnZ0fvpl1raA==*06lW1nqnMr5acQDb75zFIg=="
)
passphrase = "GCC"

decoded = cryptocode.decrypt(payload, passphrase)
print("Message déchiffré :", decoded)

Le format spécifique avec des séparateurs astérisques identifie la signature de la bibliothèque cryptocode. La passe-clé "GCC" permet de régénérer la clé AES et de restituer le message en clair.

NoBracketsCTF Stéganographie audio · Audacity

Message bizarre — Analyse spectrale.

Un fichier audio dont l'écoute ne révèle aucun indice intelligible, uniquement du souffle et des variations de fréquences inhabituelles.

Traitement du signal
1. Import du fichier .wav dans Audacity.
2. Changement de l'affichage de la piste : de 'Forme d'onde' vers 'Spectrogramme'.
3. Ajustement de la plage de fréquences : échelle logarithmique jusqu'à 22 kHz.
4. Les caractères typographiques du flag apparaissent dessinés dans les harmoniques.

L'encodage visuel dans un spectrogramme module l'intensité des fréquences au cours du temps pour composer des lettres lisibles à l'écran. Un classique de la stéganographie acoustique.

DOSSIER 02 FCSC 2023 — France Cybersecurity Challenge

🏆 Top 11 Junior · ANSSI
Compétition Officielle ANSSI 🏆 Top 11 Catégorie Junior (< 20 ans) Championnat de France

France Cybersecurity Challenge (FCSC 2023)

Organisé annuellement par l'ANSSI (Agence nationale de la sécurité des systèmes d'information), le FCSC réunit plus de 3 000 participants (étudiants, professionnels et passionnés) autour d'épreuves d'investigation et d'exploitation de haut niveau technique.

Résultat marquant : qualification et sélection dans le Top 11 national en catégorie Junior. Résolution d'épreuves variées de cryptanalyse, d'optimisation algorithmique poussée, de rétro-ingénierie binaire et d'attaques physiques par canaux auxiliaires (Side-Channel Analysis).

L'ensemble des énoncés officiels, codes sources, binaires et environnements de la compétition sont archivés et consultables en accès libre sur la plateforme nationale Hackropole.

FCSC 2023 Algorithmique · Tri Fusion · Pwntools

Tri très sélectif — Complexité bornée sur oracle distant.

Le serveur distant héberge un tableau inconnu de 32 entiers. Il autorise uniquement trois primitives : longueur, comparer x y et echanger x y, avec une contrainte absolue : ne pas dépasser 5 * N + 25 = 185 comparaisons, sous peine d'interruption immédiate.

Python · Pwntools & Tri Fusion
from pwn import *

HOST, PORT = "challenges.france-cybersecurity-challenge.fr", 2052
io = remote(HOST, PORT)

def comparer(x, y):
    io.sendlineafter(b">>> ", f"comparer {x} {y}".encode())
    return int(io.recvline().strip().decode())

def echanger(x, y):
    io.sendlineafter(b">>> ", f"echanger {x} {y}".encode())

def longueur():
    io.sendlineafter(b">>> ", b"longueur")
    return int(io.recvline().strip().decode())

def verifier():
    io.sendlineafter(b">>> ", b"verifier")
    print(io.recvline().strip().decode())

# Implémentation d'un tri fusion récursif : complexité garantie O(N log N)
def fusion(A, B):
    if len(A) == 0: return B
    if len(B) == 0: return A
    if comparer(A[0], B[0]):
        return [A[0]] + fusion(A[1:], B)
    return [B[0]] + fusion(A, B[1:])

def triFusion(L):
    if len(L) <= 1: return L
    mid = len(L) // 2
    return fusion(triFusion(L[:mid]), triFusion(L[mid:]))

def trier():
    L = longueur()
    indices_tries = triFusion(list(range(L)))

    # Réapplication physique des permutations sur le serveur
    actuel = list(range(L))
    for i in range(L):
        cible = indices_tries[i]
        idx_actuel = actuel.index(cible)
        if i != idx_actuel:
            echanger(i, idx_actuel)
            actuel[i], actuel[idx_actuel] = actuel[idx_actuel], actuel[i]

trier()
verifier()
io.close()

Un Quicksort classique risque dans le pire cas d'atteindre O(N²) comparaisons. Le tri fusion (Merge Sort) garantit mathématiquement moins de 130 comparaisons pour N = 32, restant systématiquement sous la barre critique des 185 requêtes imposée par l'épreuve.

FCSC 2023 Side-Channel · Timing Attack

Lapin blanc — Exploitation par canal auxiliaire temporel.

Une épreuve de cryptanalyse par canal auxiliaire. Le serveur évalue la chaîne soumise et renvoie les timestamps précis [T1] et [T2] entourant l'opération de vérification.

Python · Timing Attack Pwntools
from pwn import *

HOST, PORT = "challenges.france-cybersecurity-challenge.fr", 2350
io = remote(HOST, PORT)

# Alphabet des caractères testés
dic = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ '
flag = "FCSC{"

while not flag.endswith("}"):
    temps = [0] * len(dic)

    for i, char in enumerate(dic):
        io.sendline((flag + char).encode())
        rep = io.recvuntil(b"Answer: ").decode()

        # Extraction des deux horodatages renvoyés par l'oracle
        T1 = int(rep.split("]")[0].split("[")[1])
        T2 = int(rep.split("]")[1].split("[")[1])
        temps[i] = T2 - T1

    # Le bon caractère induit le temps de traitement le plus long
    best_char = dic[temps.index(max(temps))]
    flag += best_char
    print(f"Progression du flag : {flag}")

La fonction de comparaison côté serveur s'interrompt dès le premier octet divergent. Chaque caractère valide supplémentaire contraint la machine à poursuivre l'exécution plus longtemps : la détection du maximum de ΔT permet d'extraire la clé caractère par caractère.

FCSC 2023 Forensique · Rétro-ingénierie XOR

La gazette de Windows — Désobfuscation d'artefact.

Extraction d'un script PowerShell obfusqué sur une machine Windows compromise contenant un vecteur de 72 octets masqués.

Python · Démasquage XOR indexé
octets = [
    0x46, 0x42, 0x51, 0x40, 0x7F, 0x3C, 0x3E, 0x64, 0x31, 0x31, 0x6E, 0x32, 0x34, 0x68,
    0x3B, 0x6E, 0x25, 0x25, 0x24, 0x77, 0x77, 0x73, 0x20, 0x75, 0x29, 0x7C, 0x7B, 0x2D,
    0x79, 0x29, 0x29, 0x29, 0x10, 0x13, 0x1B, 0x14, 0x16, 0x40, 0x47, 0x16, 0x4B, 0x4C,
    0x13, 0x4A, 0x48, 0x1A, 0x1C, 0x19, 0x02, 0x05, 0x04, 0x07, 0x02, 0x05, 0x02, 0x00,
    0x0D, 0x0A, 0x59, 0x0F, 0x5A, 0x0A, 0x07, 0x5D, 0x73, 0x20, 0x20, 0x27, 0x77, 0x38,
    0x4B, 0x4D
]

# Désobfuscation : chaque octet est XORé avec son index dans la chaîne
flag = "".join(chr(byte ^ i) for i, byte in enumerate(octets))
print("Flag décodé :", flag)

# Flag extrait :
# FCSC{98c98d98e5a546dcf6b1ea6e47602972ea1ce9ad7262464604753c4f79b3abd3}

L'analyse statique des instructions assembleur révèle que l'algorithme d'encodage applique un masque dynamique dépendant de la position du pointeur de lecture. L'inversion par XOR direct résout l'épreuve sans exécuter le payload.

FCSC 2023 Web · PHP Magic Hash · Type Juggling

Salted Auth — Collision de hachage magique en PHP.

Une page d'authentification web salée utilisant l'algorithme de hachage 64 bits FNV-1a. L'évaluation de l'égalité en PHP repose sur l'opérateur non strict ==.

Python · Brute-force Magic Hash FNV1a
from fnvhash import fnv1_64
import random
import string

password = ""
hash_hex = ""

# Recherche d'un condensat commençant par "0e" suivi uniquement de chiffres
while not (hash_hex.startswith("0e") and hash_hex[2:].isnumeric()):
    password = "".join(random.choices(string.ascii_letters + string.digits + "_-", k=26))
    hash_hex = fnv1_64(password.encode()).to_bytes(8, "big").hex()

print(f"[+] Mot de passe collision trouvé : {password}")
print(f"[+] Hash généré : {hash_hex}")

En PHP, toute chaîne débutant par 0e suivie uniquement de chiffres est convertie en float lors d'une comparaison faible (==) et évaluée comme 0 × 10^x = 0. Deux hashs distincts répondant à ce format sont considérés identiques par le moteur, contournant ainsi le mot de passe réel.

FCSC 2023 Hardware · Simple Power Analysis

SPAnosaurus — Déduction d'exposant par analyse de consommation.

Une trace d'oscilloscope capturant le courant consommé lors de l'exécution d'une exponentiation modulaire rapide (Square-and-Multiply).

Python · Modélisation Square & Multiply
# Algorithme d'exponentiation binaire carré-et-multiplication
def exp_by_squaring(x, n):
    if n == 0:
        return 1
    elif n % 2 == 0:
        # Seul un calcul de carré est réalisé (faible pic d'énergie)
        return exp_by_squaring(x * x, n // 2)
    else:
        # Une multiplication supplémentaire est exécutée (double pic)
        return x * exp_by_squaring(x * x, (n - 1) // 2)

# Reconstruction de l'exposant secret à partir de la trace de puissance :
# Bit 0 -> motif Carré seul
# Bit 1 -> motif Carré suivi d'une Multiplication
exposant_reconstitue = 0b10100010100110010100110010100111
print("Clé secrète recouvrée :", hex(exposant_reconstitue))

Dans une Simple Power Analysis (SPA), la dissymétrie d'exécution entre le cas pair et le cas impair se traduit par des signatures énergétiques visibles. Relever la séquence des pics permet de lire directement la clé binaire bit par bit.