Aller au contenu principal

CTF « Le code à usage unique »

Vendredi 18 septembre, 10 h 17. Le compte « voyageur » de l'agence de voyages a été utilisé depuis un poste inconnu, alors que la double authentification était active. Un journal de débogage oublié sur un serveur de relais permet de comprendre ce qui s'est passé.

info

Ce défi est un CTF (Capture The Flag) : il n'y a pas d'étapes guidées. Vous cherchez, vous trouvez un flag (un mot caché), puis vous le saisissez dans l'application Joligo, dans l'activité « Le code à usage unique ». L'agence, ses comptes, son serveur et le journal sont fictifs.

attention

Ce défi se pratique uniquement sur le journal fourni, dans votre propre VM. Se connecter au compte d'une autre personne, même avec un code que l'on sait calculer, est interdit par la loi.

Petite vérification​

Avant de commencer, vérifiez si vous savez encore réaliser ces 3 actions très simples, sur la séance précédente consacrée à la double authentification :

  1. dans python3, calculer int(59 // 30) puis int(60 // 30)
  2. expliquer pourquoi le code à 6 chiffres change toutes les 30 secondes
  3. citer ce que le serveur et l'application d'authentification partagent à l'avance
📌 Réponse attendue

Votre mission​

Vous êtes l'administrateur de l'agence. Le fichier journal_relais.log est le journal d'un petit serveur de relais, resté en mode débogage. Il enregistre trois tentatives de connexion au compte « voyageur », avec l'instant de chacune et le code saisi.

Une seule de ces tentatives a utilisé un code valide au moment où il a été saisi : c'est celle qui a réussi. Retrouvez laquelle, et relevez l'identifiant de session qu'elle a ouvert.

Le matériel​

Chaque participant reçoit un flag personnel : inutile de comparer avec vos voisins, le vôtre ne marcherait pas chez eux. Dans l'application Joligo, ouvrez l'onglet Profil et relevez votre code personnel (8 caractères, carte « Mon code personnel (défis CTF) »).

Dans votre VM Debian (remplacez a1b2c3d4 par votre code) :

sudo apt install openssl
mkdir -p ~/ctf-code-unique
cd ~/ctf-code-unique
CODE=a1b2c3d4
attention

Le script ci-dessous fabrique le journal du relais (c'est le travail du « méchant » de l'histoire). Ne le décodez pas pour le lire : ce serait lire la solution avant d'avoir cherché. Analysez le fichier produit.

base64 -d <<'EOF' | bash -s -- "$CODE"
Q09ERT0iJDEiCmlmIFsgLXogIiRDT0RFIiBdOyB0aGVuIGVjaG8gIlVzYWdlIDogYmFzaCAtcyAt
LSBWT1RSRV9DT0RFIiA+JjI7IGV4aXQgMTsgZmkKS0VZPSJiM2YwNjliMzM5MWY1ZWMzYWEyMyIK
RkxBRz0kKHByaW50ZiAlcyAiJENPREUiIHwgb3BlbnNzbCBkZ3N0IC1zaGEyNTYgLWhtYWMgIiRL
RVkiIC1yIHwgY3V0IC1jMS0xMikKcHl0aG9uMyAtICIkRkxBRyIgPiBqb3VybmFsX3JlbGFpcy5s
b2cgPDwnUFknCmltcG9ydCBiYXNlNjQsIGhhc2hsaWIsIGhtYWMsIHN0cnVjdCwgc3lzCkZMQUcg
PSBzeXMuYXJndlsxXQpTRUNSRVQgPSAiS1JTWEc1Q1RNVlJYRVpMVUtOMlhBWkxTS05TV0c0VEYi
CgpkZWYgdG90cChzZWNyZXQsIGluc3RhbnQsIHBhcz0zMCk6CiAgICBjbGUgPSBiYXNlNjQuYjMy
ZGVjb2RlKHNlY3JldCkKICAgIG1lc3NhZ2UgPSBzdHJ1Y3QucGFjaygiPlEiLCBpbnQoaW5zdGFu
dCAvLyBwYXMpKQogICAgZW1wcmVpbnRlID0gaG1hYy5uZXcoY2xlLCBtZXNzYWdlLCBoYXNobGli
LnNoYTEpLmRpZ2VzdCgpCiAgICBkZWNhbGFnZSA9IGVtcHJlaW50ZVstMV0gJiAweDBGCiAgICBu
b21icmUgPSBzdHJ1Y3QudW5wYWNrKCI+SSIsIGVtcHJlaW50ZVtkZWNhbGFnZTpkZWNhbGFnZSAr
IDRdKVswXSAmIDB4N0ZGRkZGRkYKICAgIHJldHVybiBzdHIobm9tYnJlICUgMTAgKiogNikuemZp
bGwoNikKClQgPSBbMTc4OTcyNjUwMiwgMTc4OTcyNjU1OSwgMTc4OTcyNjYzMV0KdmFsaWRlID0g
dG90cChTRUNSRVQsIFRbMV0pCmZhdXhfMSA9IHN0cigoaW50KHRvdHAoU0VDUkVULCBUWzBdKSkg
KyAxKSAlIDEwICoqIDYpLnpmaWxsKDYpCmZhdXhfMyA9IHN0cigoaW50KHRvdHAoU0VDUkVULCBU
WzJdKSkgKyA3KSAlIDEwICoqIDYpLnpmaWxsKDYpCnByaW50KCIyMDI2LTA5LTE4IDEwOjE1OjAy
IHJlbGFpcy1hdXRoIElORk8gIGRlbWFycmFnZSBkdSByZWxhaXMgKG1vZGUgZGVidWcpIikKcHJp
bnQoIjIwMjYtMDktMTggMTA6MTU6MDIgcmVsYWlzLWF1dGggREVCVUcgY29uZmlndXJhdGlvbiBj
aGFyZ2VlIDogdG90cF9zZWNyZXRfYmFzZTMyPSIgKyBTRUNSRVQpCnByaW50KCIyMDI2LTA5LTE4
IDEwOjE1OjAyIHJlbGFpcy1hdXRoIElORk8gIHRlbnRhdGl2ZSBsb2dpbj12b3lhZ2V1ciBpbnN0
YW50PSVkIGNvZGU9JXMgc2Vzc2lvbj05YzQxZTA3YWIzNWQiICUgKFRbMF0sIGZhdXhfMSkpCnBy
aW50KCIyMDI2LTA5LTE4IDEwOjE1OjU5IHJlbGFpcy1hdXRoIElORk8gIHRlbnRhdGl2ZSBsb2dp
bj12b3lhZ2V1ciBpbnN0YW50PSVkIGNvZGU9JXMgc2Vzc2lvbj0lcyIgJSAoVFsxXSwgdmFsaWRl
LCBGTEFHKSkKcHJpbnQoIjIwMjYtMDktMTggMTA6MTc6MTEgcmVsYWlzLWF1dGggSU5GTyAgdGVu
dGF0aXZlIGxvZ2luPXZveWFnZXVyIGluc3RhbnQ9JWQgY29kZT0lcyBzZXNzaW9uPWUyZDg2ZjEz
YzdhMCIgJSAoVFsyXSwgZmF1eF8zKSkKcHJpbnQoIjIwMjYtMDktMTggMTA6MTc6MTIgcmVsYWlz
LWF1dGggSU5GTyAgYXJyZXQgZHUgcmVsYWlzIikKUFkKZWNobyAiRmljaGllciBjcsOpw6kgOiBq
b3VybmFsX3JlbGFpcy5sb2ciCg==
EOF

Vous obtenez le fichier journal_relais.log.

Comment jouer​

  1. Lisez le journal avec cat ou less. Réutilisez la fonction totp() que vous avez écrite à la séance précédente : elle prend un secret et un instant (en secondes depuis 1970), et renvoie le code à 6 chiffres.
  2. Répondez aux questions de l'activité Joligo « Le code à usage unique » : certaines portent sur le flag, d'autres sur la démarche et les bons réflexes.
  3. Le flag est l'identifiant de session (session=) de la tentative dont le code est valide : il contient 12 caractères (lettres a à f et chiffres). Dans Joligo, vous saisirez seulement ces 12 caractères.
Besoin d'un coup de pouce ?

Cette démarche a été vue dans la séance La double authentification. Le contexte vient de la séance L'homme du milieu. Pour chaque tentative, calculez totp(SECRET, instant) avec le secret du journal et l'instant noté sur la même ligne, puis comparez au code. Un mauvais flag fait perdre une vie dans Joligo : réfléchissez avant de tenter au hasard, comme pour un vrai mot de passe.