// NSI — Terminale — TP Linux  ·  github.com/babash/TP-commandes-hacker

Opération MIRAGE PROF v10.0

15 missions · 5 phases · Daemon auto · Indices progressifs · JSLinux Alpine
00 — Présentation

TP de terminal Linux pour Terminale NSI sur JSLinux Alpine. 15 missions indépendantes en 5 phases progressives. Les notions avancées (options, pipe) sont placées en fin de parcours — l'élève est d'abord à l'aise avec la navigation et la manipulation de fichiers avant de les aborder.

CritèreDétail
NiveauTerminale NSI
Durée1h30 – 2h
EnvironnementJSLinux Alpine x86 — bellard.org/jslinux
Commandes élèveMISSION · Q1..Q15 · STATUT
Validation autoQ5–Q10 via daemon filesystem (toutes les 3s)
Validation questionQ2, Q3, Q4, Q11–Q15 via input interactif
PersistanceProgression sauvegardée dans ~/.mirage_save/
01 — Installation

1. Ouvrir bellard.org/jslinux/vm.html?url=alpine-x86.cfg&mem=192

2. Télécharger tp_infiltration.sh depuis GitHub sur la machine locale

3. Cliquer sur sous le terminal JSLinux pour importer

4. Lancer : . ~/tp_infiltration.sh (point, pas source)

⚠ Ctrl+V inopérant dans JSLinux — coller via clic droit → Paste.

⚙ Avant la séance
  • Tester le lancement complet sur un poste élève
  • Le setup affiche "Daemon actif (PID: …)" — vérifier que ce PID est non vide
  • La progression est conservée entre les relances dans ~/.mirage_save/
02 — Architecture de validation
Trois mécanismes
  • History (Q1) — pattern grep sur les 60 dernières commandes. Utilisé uniquement quand la détection est fiable et non ambiguë.
  • Question interactive (Q2–Q4, Q11–Q15) — read demande à l'élève de saisir le résultat observé. Valide que la commande a réellement été exécutée et lue.
  • Daemon filesystem (Q5–Q10) — script /tmp/mirage_daemon.sh indépendant, surveille toutes les 3s. Écrit dans .notifs, affiché à la prochaine commande.
Daemon — pourquoi ça fonctionne maintenant

Problème historique : les sous-shells lancés avec & depuis un script sourcé reçoivent SIGHUP à la fin du sourcing. Solutions appliquées :

  • trap '' HUP dans le daemon — ignore SIGHUP
  • (sh "$DAEMON_SH" </dev/null >>"$NOTIFS" 2>&1 &) — sous-shell + redirections créent un nouveau groupe de processus
  • Le daemon écrit lui-même son PID via echo $$ — évite la race condition avec $!
  • Heredoc << 'DAEMONEOF' avec quotes — empêche l'interpolation qui corrompait les fonctions awk
Persistance de la progression

~/.mirage_save/.prog est mis à jour à chaque validation (manuelle ou daemon). Avant chaque rm -rf $TP_DIR, la progression est sauvegardée ; après le mkdir, elle est restaurée. L'élève peut relancer le TP sans perdre son score.

rm -rf ~/.mirage_save && . ~/tp_infiltration.sh   # repartir de zéro
03 — Corrigé des 15 missions
Phase 1 — Reconnaissance (Q1–Q4)
Q1

pwd

history

Afficher le répertoire courant. Validation : pattern pwd dans les 60 dernières lignes d'historique.

pwd
Q2

ls — question : quel fichier .txt ?

question interactive

Lister serveur/. L'élève répond le nom du fichier visible. Réponse attendue : acces.txt ou acces.

ls ~/infiltration_mirage/serveur/   # ou ls depuis serveur/

ls accepte trop de formes pour être détecté dans l'history → question sur le résultat.

Q3

cd — validation par $PWD

$PWD

Se déplacer dans serveur/. Validation : $PWD = $TP_DIR/serveur.

cd ~/infiltration_mirage/serveur/   # puis Q3
Q4

cat — question : mot de passe

question interactive

Lire message_secret.txt. Réponse attendue : M1r4g3_2024.

cat ~/infiltration_mirage/message_secret.txt
Phase 2 — Manipulation de fichiers (Q5–Q8) — [auto]
Q5

touch — créer un fichier vide

daemon auto
touch ~/infiltration_mirage/serveur/agent.log

Daemon valide dès que serveur/agent.log existe.

Q6

cp — copier un fichier

daemon auto

Il faut d'abord créer exfiltration/ avec mkdir.

mkdir ~/infiltration_mirage/serveur/exfiltration
cp ~/infiltration_mirage/serveur/confidentiel/rapport.txt \
   ~/infiltration_mirage/serveur/exfiltration/

Daemon valide dès que exfiltration/rapport.txt existe.

Q7

mv — renommer un fichier

daemon auto
mv ~/infiltration_mirage/serveur/exfiltration/rapport.txt \
   ~/infiltration_mirage/serveur/exfiltration/rapport_cache.txt

Daemon valide dès que rapport_cache.txt existe dans exfiltration/.

Q8

mkdir — créer un dossier

daemon auto
mkdir ~/infiltration_mirage/serveur/archive

Daemon valide dès que serveur/archive/ existe.

Phase 3 — Droits (Q9–Q10) — [auto]
Q9

chmod 600 — droits restrictifs

daemon autodroits
chmod 600 ~/infiltration_mirage/serveur/exfiltration/rapport_cache.txt
# 600 = rw------- : User(6=rw) Group(0) Others(0)

Daemon vérifie via stat -c "%a". Nécessite Q7 accomplie.

Q10

chmod u+x — rendre exécutable

daemon autodroits
chmod u+x ~/infiltration_mirage/serveur/effacer_traces.sh
# u=user  +=ajouter  x=execution

Daemon vérifie via [ -x fichier ].

Phase 4 — Processus (Q11)
Q11

ps + kill — identifier et neutraliser

question interactiveprocessus

Q11 demande d'abord le PID affiché par ps. Si correct, invite à lancer kill. Retaper Q11 après le kill pour valider.

ps                         # repérer espion_mirage et son PID
kill <PID>                 # kill -9 si résistance
Q11                        # retaper pour valider

Le daemon (Q11 auto) valide aussi si l'espion est mort — le badge apparaît à la prochaine commande.

Phase 5 — Options et pipe | (Q12–Q15)
Q12

ls --help — trouver l'option -a

question interactive

Q12 demande quelle option affiche les fichiers cachés. Réponse : -a ou a ou --all.

ls --help

Sur JSLinux, man n'est pas installé — --help est l'alternative.

Q13

ls -la — voir les fichiers cachés

question interactive

Q13 demande quel fichier caché l'élève trouve. Réponse : .fichier_cache.

ls -la ~/infiltration_mirage/serveur/
Q14

cat | grep — filtrer un journal

question interactivepipe |

Q14 explique le principe du pipe puis demande combien de lignes contenant "Transfert" s'affichent. Réponse : 2.

cat ~/infiltration_mirage/serveur/logs/access.log | grep Transfert

Point pédagogique central : le pipe | chaîne deux commandes. L'élève l'a déjà utilisé sans le savoir en Q15 (history | grep).

Q15

history | grep — réutiliser le pipe

question interactivepipe |

Q15 demande ce qu'on voit dans les résultats de history | grep Q. Réponse : toute chaîne commençant par Q suivi d'un chiffre (Q1, Q14…).

history | grep Q
04 — Conseils pédagogiques
Déroulement recommandé
  • 5 min — introduction + rappel légal + distribution fiche élève
  • 10 min — import JSLinux + lancement (Q1–Q4 se valident en quelques minutes)
  • 65–75 min — travail autonome. Les badges Q5–Q10 s'affichent automatiquement
  • 15 min — correction collective sur chmod (Q9), pipe (Q14), kill (Q11)
Points d'attention
  • Q6 cp : l'élève doit d'abord créer exfiltration/ avec mkdir. L'indice niveau 2 le guide.
  • Q7 mv : erreur classique — utiliser cp au lieu de mv. Le daemon attend rapport_cache.txt.
  • Q9 chmod : décomposer 600 = r(4)+w(2) | 0 | 0 si nécessaire.
  • Q11 ps : la colonne PID est la première. Rappeler de lire la ligne espion_mirage.
  • Q12 ls --help : man n'existe pas sur Alpine. --help est universel.
  • Q14 pipe : expliquer la métaphore du tuyau — la sortie de gauche entre dans la droite.
Réinitialiser sans perdre la progression
. ~/tp_infiltration.sh
Repartir de zéro
rm -rf ~/.mirage_save && . ~/tp_infiltration.sh
05 — Structure générée
~/infiltration_mirage/
├── message_secret.txt       # Q4 · cat  (mot de passe : M1r4g3_2024)
├── .prog / .hints / .notifs # état interne (cachés)
└── serveur/
    ├── acces.txt            # Q2 · ls  (réponse : acces.txt)
    ├── effacer_traces.sh    # Q10 · chmod u+x
    ├── .fichier_cache       # Q13 · ls -la  (réponse : .fichier_cache)
    ├── confidentiel/
    │   └── rapport.txt      # Q6 · cp (source)
    ├── public/index.html
    ├── logs/access.log      # Q14 · cat | grep Transfert (2 lignes)
    ├── exfiltration/        # créé par l'élève (Q6)
    │   ├── rapport.txt      # Q6 · cp
    │   └── rapport_cache.txt # Q7 · mv · Q9 · chmod 600
    └── archive/             # Q8 · mkdir

~/.mirage_save/              # progression persistante
/tmp/espion_mirage.sh        # Q11 · ps + kill
/tmp/mirage_daemon.sh        # daemon auto