L'objectif de cette première mission est de retrouver l'identifiant du badge actuellement utilisé par la cible : Noel Laurent. Pour ce faire, vous devez interagir avec une base de données (généralement via une interface textuelle ou un prompt SQL après connexion au serveur) et lier les informations de plusieurs tables.
NB :
La base de données recense le personnel et les étudiants d'une école. Pour trouver le badge actuel d'une personne, la structure classique d'une telle base de données implique généralement trois concepts :
Une fois connecté au serveur via la commande sur le terminal.
nc challenge.404ctf.fr 10401
la première étape consiste à cartographier la base de données pour comprendre les tables à disposition.
Selon le SGBD utilisé (souvent SQLite ou MySQL dans ce genre de défi), on cherche à lister les tables :
.tables
Cette commande retourne les tables suivantes (noms typiques pour ce type de challenge) :
C'est de c'est tables don nous avons besoin afin de rassembler toutes les infos afin de résoudre le challenge.
Il faut ensuite comprendre comment elles se lient entre elles (les clés primaires et étrangères) :
PRAGMA table_info(Person); PRAGMA table_info(badge);
Il faut d'abord identifier comment est enregistré "Noel Laurent". Attention aux inversions nom/prénom dans la base de données.
SELECT * FROM Person WHERE last_name = 'Noel' AND first_name = 'Laurent';
Cette requête vous permet d'obtenir l'identifiant unique de la cible, par exemple : user_id = 38.
Une fois l'identifiant en main, il faut chercher dans la table des badges celui qui lui est associé et qui est marqué comme actif. Les bases de données de CTF utilisent souvent un booléen (actif = 1, valide = true) ou se basent sur la date d'expiration.
Si la table badges contient directement l'ID de l'utilisateur et un statut :
SELECT * FROM badge WHERE person_id = 38;
Voici la structure de la requête finale qui permet d'obtenir directement le badge actif de Laurent Noel, ainsi que la valeur à utiliser pour votre flag.
D'après les résultats de votre exploration :
Noel et le prénom est Laurent), son identifiant est person_id = 38.active (et non actif).Pour obtenir directement le bon résultat en une seule fois, vous pouvez exécuter la requête suivante :
SELECT badge_id FROM Badge WHERE person_id = 38 AND active = 1;
Le résultat affiché par votre dernière commande montre deux lignes pour cet utilisateur :
active = 0).active = 1).Le badge actuellement utilisé est donc le 165.
Le flag à soumettre est :
404CTF{165}