Anatomy of a Shell

🖥️ Qu'est-ce qu'un shell ?

Chaque système d'exploitation moderne possède un shell, qui est une interface permettant à l'utilisateur d'interagir avec le système via des instructions en ligne de commande. Pour accéder à ce shell, on utilise généralement un émulateur de terminal.

Voici quelques exemples d'émulateurs de terminaux populaires :

Émulateur de terminal
Système d'exploitation

Windows

Windows

Windows, Linux, macOS

Windows, Linux, macOS

Linux

Linux

macOS

Cette liste n'est pas exhaustive. De nombreux émulateurs sont open-source et peuvent être installés sur des systèmes différents de ceux pour lesquels ils ont été initialement conçus. Le choix d’un émulateur dépend avant tout des préférences personnelles et des habitudes de travail. Lors d’un test d’intrusion, l’émulateur auquel nous aurons accès sur la machine cible dépendra de ce qui est disponible nativement sur celle-ci.


🧠 Interpréteurs de commandes (Command Language Interpreters)

Un interpréteur de commande est un programme qui lit et exécute les instructions de l’utilisateur. Lorsqu'on parle d’un CLI (Command Line Interface), il s’agit en fait d’une combinaison de :

  • l'émulateur de terminal,

  • l’interpréteur de commandes,

  • et le système d’exploitation sous-jacent.

Les interpréteurs de commandes sont parfois appelés langages de script shell ou encore Command and Scripting Interpreters, un terme utilisé notamment dans le framework MITRE ATT&CK.

Comprendre quel interpréteur est utilisé sur un système donné nous permet d’adapter les commandes et les scripts que nous utilisons. Par exemple :

  • Bash, Ksh, Zsh sur Linux/Unix

  • cmd, PowerShell sur Windows


🔎 Exploration pratique avec Pwnbox

Sur la plateforme Parrot OS Pwnbox, on peut explorer visuellement et pratiquement la structure d’un shell.

🟩 Ouverture d’un terminal MATE

  • Cliquez sur l’icône verte pour ouvrir MATE Terminal.

  • Tapez une commande aléatoire comme wasdf ou meep puis appuyez sur Entrée.

Cela génère une erreur de type :

bash: wasdf: command not found

Ce message indique que nous utilisons ici Bash comme interpréteur de commande. Le caractère $ en début de ligne de commande est aussi un indicateur classique de Bash ou d’interpréteurs similaires.

🔍 Identifier le shell actif

Deux méthodes courantes :

✅ Avec la commande ps

ps

Exemple de sortie :

    PID TTY          TIME CMD
   4232 pts/1    00:00:00 bash
  11435 pts/1    00:00:00 ps

✅ Avec la commande env

env

Extrait de sortie :

SHELL=/bin/bash

🟦 Passage à PowerShell

  • Cliquez sur l’icône bleue dans Pwnbox.

  • Cela ouvre aussi MATE Terminal, mais cette fois avec un interpréteur PowerShell.

Exemple de sortie :

PowerShell 7.1.3
A new stable release is available: v7.2.0

🆚 Comparaison PowerShell vs Bash

Les deux terminaux ouverts utilisent le même émulateur, mais des interpréteurs différents. Voici quelques différences à explorer :

  • Les commandes reconnues peuvent varier.

  • Les options de script ne sont pas identiques.

  • La syntaxe change (par exemple, $env:PATH en PowerShell vs echo $PATH en Bash).

Il est important de noter qu’un émulateur de terminal n’est pas lié à un interpréteur en particulier. Il peut exécuter n’importe quel shell, selon la configuration de l’utilisateur ou de l’administrateur système.


🧠 À retenir

  • Un shell est l’interface textuelle d’un système, accessible via un terminal.

  • L’interpréteur de commande détermine les commandes reconnues.

  • L’environnement CLI = système + terminal + interpréteur.

  • On peut utiliser plusieurs interpréteurs sur une même machine.

  • La reconnaissance du shell en cours peut se faire via ps ou env.


📚 Ressources utiles


Which two shell languages did we experiment with in this section? (Format: shellname&shellname)

Nous avons expérimentés ici les shells bash et powershell.


In Pwnbox issue the $PSversiontable variable using PowerShell. Submit the edition of PowerShell that is running as the answer.

Sur la Pwnbox mise à disposition par HTB, nous utilisons la commande $PSversiontable :

PS [10.10.14.171] /home/htb-ac-1811357 > $PSversiontable

Name                           Value
----                           -----
PSVersion                      7.5.0
PSEdition                      Core
GitCommitId                    7.5.0
OS                             Parrot Security 6.3 (lorikeet)
Platform                       Unix
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

Nous pouvons alors observer que l'édition de PowerShell est core.


Mis à jour