Astuce admin, Bindshell avec netcat

Publié le 13 septembre 2011 par Openwebtech @openwebtechfr

Ayant la nécéssité, en plus de services auto-hébergés, d’avoir un serveur dédié, il peut m’arriver de modifier la configuration du serveur ssh pour diverses raisons (configuration de mysecureshell, changement de port ssh, cipher etc….).

Seulement, un problème peut survenir lorsque l’on touche à l’accès SSH d’un serveur dédié “unmanaged” sans avoir la possibilité de demander un accès via kvm ip. Certains me diront “Va chez ovh (kimsufi) ils proposent ce service gratuitement en cas de pépin”. Oui mais voila….je n’y suis pas :p

Comment faire pour faire une intervention sur une machine et ne pas être tributaire de la perte de ssh en cas de non redémarrage de sshd par exemple ?

Eh bien c’est la qu’il peut être utile de savoir ce qu’est un “bindshell”. Un bindshell est un shell en écoute de connexion sur une machine distante sur un port tcp ou udp en supposant que le serveur ait l’ouverture firewall adéquate. Lorsque le client solicite une connexion au serveur une socket tcp (par défaut) est établie et la s’offre à vous un certain nombre de possibilités car un tuyau est grand ouvert entre les deux noeuds.

Tout le monde a du entendre parler au moins une fois de netcat ? netcat est l’homologue de telnet en plus puissant. Il a cependant le même inconvéniant de ne pas être du tout sécurisé car netcat n’offre aucune encryption des données. Nous ne verrons pas d’autre application que le binshell dans ce billet mais les applications sont multiples (transfert de données, chat, reverse shell, scan de ports etc…).

Ce que je propose ici c’est un moyen de garder la main sur sa machine lors d’une intervention en cas de perte de ssh avec une authentification basique.

Mise en place

Coté client et serveur

Il faut bien évidemment installer netcat sur les deux machines. Attention cependant, nous supposons ici que les deux machines ont à leur disposition un version similaire de netcat, car il en existe de multiple avec plus ou moins de fonctionnalités.

apt-get install netcat

Coté serveur

On crée un petit fichier, par exemple shell.sh :

#!/bin/bash

#############################################

# This is a tiny remote shell which require authentification,

# considering that is totaly unsecure method.

# enjoy the practical aspect!

# Author: Openwebtechfr

# Date: 10/09/2011

# HowTo:

# server side: nc -l -p <port> -e shell.sh &

# client side: nc <serverip> <port>

############################################

password="p4ssw0rd"

count=1

shell=0

while [ $shell -eq 0 ]

do

echo -e "Enter password: "

read pass

if [ "$pass" == "$password" ]

then

echo "U've got the shell!!!!"

shell=1

/bin/bash

elif [ $count -lt 3 ]

then

echo "Wrong password!"

count=$(($count + 1))

echo "$((3 - $count + 1)) attempts before closing!"

else

exit 1

fi

done

nc -l -p 44 -e shell.sh &

Saisissez le password et le port. Par défaut p4ssw0rd et 44 pour le port.

Lancer le bindshell en arrière plan:

nc -l -p <port> -e shell.sh &

Vous aurez alors la possibilité de saisir votre mot de passe trois fois après quoi le binshell tombera. Si vous vous êtes loggué et que vous quittez le shell via ctrl+c par exemple, le bindshell sera relancé à la sortie en arrière plan.

N’oubliez pas de tuez le processus une fois votre intervention terminée et votre serveur ssh rétabli!

Pour aller plus loin

Pour plus de confort il peut etre interessant de se creer un alias pour la création et la fermeture du binshell Dans un premier temps vérifier que votre .bashrc inclut bien .bash_aliases:

if [ -f ~/.bash_aliases ]

then

. ~/.bash_aliases

fi

Editez ensuite .bash_aliases :

vi .bash_aliases

Alias de création du binshell:

alias open_shell='nc -l -p 44 -e shell.sh &'

Alias de fermeture du bindshell :

alias close_shell='killall nc'