Backtrack 101-5-NetCat
La série Backtrack 101 a pour objectif de faire découvrir aux débutants plusieurs outils distribués avec Backtrack Linux. Ainsi, en suivant ces articles, un débutant peut participer aux jeux du hackfest et commencer son apprentissage des techniques de test de pénétration.
Dans ce quatrième article, nous allons parler d'un outil nommé NetCat.
Site officiel du projet NetCat: http://netcat.sourceforge.net/
Synopsie:
NetCat (nc) est un incontournable de la sécurité informatique. L'outil permet de créer rapidement des canaux de communication dans le but de tester différentes fonctionnalités et d'analyser les communications d'un hôte précis. Bien entendu, la facilité avec laquelle il est possible d'utiliser l'outil fait de nc l'outil parfait à utiliser lors de démonstrations. Heureusement (ou malheureusement, selon le point de vue...) nc est détecté comme malicieux par la majorité des antivirus car il a souvent été utilisé dans des scénarios de reverse shell et autres cas d'utilisation malveillante. Le présent article se concentrera sur l'utilisation de l'outil dans le cadre d'un test d'intrusion et dans un cadre d'analyse d'information.
Comment est-ce que ça fonctionne?
L'outil nc permet principalement d'établir des communications TCP et UDP. Il peut être utiliser autant comme serveur que client. Cette fonctionnalité fait de nc l'outil tout déterminé pour les cas où une communication doit être établie entre deux points et où le besoin de rapidité rend impossible le développement d'un outil personnalisé dans un délais convenable.
Les bases
L'utilisation de nc est simple. Le premier cas d'utilisation dont nous allons discuter est le client HTTP. En effet, comme il est possible de faire communiquer nc avec un serveur en lui indiquant les informations à utiliser, il est possible d'utiliser nc comme client HTTP. La ligne de code suivante montre comment ont pourrait communiquer avec un serveur web (www.perdu.com dans le cas actuel) à l'aide de nc:
# echo -e "GET http://www.perdu.com HTTP/1.0\n\n" | nc www.perdu.com 80
Avant de montrer le résultat de l'éxécution de cette commande, une petite explication s'impose. La première partie de la commande, echo -e "..." | permet d'envoyer le texte entre les guillemets à l'application nc. Le paramètre -e permet simplement d'interpréter \n non pas comme deux caractères mais plutôt comme un changement de ligne. La chaine de caractères entre les guillemets n'a pas été choisie à l'aveuglette. Elle représente en fait une requête GET du protocole HTTP. Il est tout à fait possible de faire d'autres types de requêtes, il suffit simplement de respecter le protocle utilisé et tout fonctionnera comme un charme! La deuxième partie de la ligne de commande, nc www.perdu.com 80 indique simplement d'utiliser l'application nc (netcat) et d'établir une connection au serveur www.perdu.com sur le port 80. Ainsi, l'éxécution de la commande donne le résultat:
Tel que le montre la figure précédente, il est ainsi possible d'observer la réponse complète du serveur dans le but d'en faire l'analyse. Il existe bien sur d'autres outils pouvant servir à faire de genre de requête à l'aide du protocle HTTP beaucoup plus aisément que l'utilisation de netcat. Cependant, qu'en est-il des situations où un protocole fait "maison" est utilisé? Dans le cas où il est requis de communiquer avec un service qui n'est pas connu car ce service est fait sur mesure par exemple? Et bien dans ces situations, netcat devient l'outil rêvé pour procéder aux communications. Dans ces situations, il pourrait arriver que le service réponde avec des caractères qu'il n'est pas possible d'afficher à la console. Pour ce genre de situation, nc offre un mode hexdump qui permet de voir le code hexadécimal obtenu du serveur. La ligne de commande suivante pourrait être utilisée pour activer le mode hexdump. Notez que pour des raisons de simplicité, le site www.perdu.com a encore été utilisé dans l'exemple.
# echo -e "GET http://www.perdu.com HTTP/1.0\n\n" | nc www.perdu.com 80 -o test
Comme vous pouvez le voir, la seule différence avec la première commande est l'utilisation de l'option -o qui permet la création d'un fichier test contenant un hexdump formaté de la réponse du serveur. La figure suivante montre le contenu du fichier test ainsi créé.
Ainsi, tel que vous pouvez le voir, il est simple et rapide d'utiliser nc dans le but d'envoyer des informations sur un réseau. Par contre, les possibilités ne s'arrêtent pas à l'envois d'informations. Il est aussi possible d'utiliser netcat dans le but de recevoir des informations.
Imaginons que nous voulons ouvrir un canal de communication sur le port 80 d'une station de travail dans le but de recevoir des informations. Il serait possible d'utiliser la commande suivante pour atteindre notre objectif:
#nc -l -p 80 -v
Cette commande permet de mettre nc en mode écoute (option -l) sur le port 80 (option -p). Notez, que les paramètres par défaut de nc ne sont pas très verbeux, l'option -v a ainsi été utilisée pour obtenir plus d'information sur l'état de l'exécution de l'application. Le résultat de la commande sera donc:
Tel qu'indiqué, l'outil nc tombe donc en mode écoute sur le port 80. Cependant, comme il n'y a aucune communication sur ce port, netcat ne peut rien faire d'autre que d'écouter. En utilisant la même machine, dans le but de tester le fonctionnement, nous pourrions, dans un autre terminal, faire la commande:
#nc localhost 80
Cette commande permet d'établir une communication avec l'outil netcat placé en écoute. Le résultat de l'exécution de cette commande (tant du côté serveur que du côté client) est montré à la figure suivante:
À partir de ce moment, tout texte écrit à la console sera envoyé dans le canal de communication tel que le montre la figure suivante:
Il est donc possible d'utiliser netcat pour recevoir des informations! Ceci devient autant plus intéressant pour faire la réception d'information dans les situations où un protocole maison est utilisé. Ainsi, si vous ne connaissez pas le protocole utilisé par un logiciel X qui communique avec une destination X et que vous aimeriez obtenir les informations envoyées par le logiciel, il est donc possible de recevoir les communications à l'aide de l'outil netcat positionné en écoute pour aider à analyser le logiciel.
Une utilisation populaire de netcat consiste à relier une application, bash par exemple, à netcat dans le but d'obtenir une session bash à distance. La nature de netcat rend cet outil tout désigné pour ce genre de tâches. Imaginons que nous voulons faire un "serveur bash", il serait possible d'utiliser la commande suivante pour relier bash à l'application netcat positionnée en écoute:
#nc -l -p 80 -v -e /bin/bash
Ainsi, le programme /bin/bash sera exécuté par netcat rendant ce dernier disponible par l'application netcat. Un utilisateur pourrait ainsi se brancher sur le "serveur bash" en utilisant la commande:
#nc localhost 80
Une fois branché, ce dernier aurait accès à l'application bash sur l'ordinateur cible et pourrait contrôler l'ordinateur cible. La figure suivante montre un exemple de l'exécution de ces commandes ainsi que la prise de contrôle du poste cible par un attaquant:
Dans les situations où il est impossible pour l'attaquant de se brancher au poste cible (nat, firewall, etc...), il est possible de faire un reverse shell à partir du poste cible pour que ce dernier se branche lui-même sur l'attaquant. Je vous laisse faire vous-même vos recherche pour ce cas précis ;)
Mot de la fin
Au final, comme nous avons pu l'observer, netcat est un outil très pratique qui peut être utilisé dans plusieurs situations. Personnellement, j'aime bien l'utiliser dans le but de faire la démonstration de différents concepts lorsque le temps ne permet pas la mise en place d'un scénario compliqué. À vous de voir les scénarios d'utilisation intéressants!
Vous avez aimez cet article?
Vous aimeriez lire un article sur un outil qui ne vous est pas famillier? Laissez simplement le nom de l'outil en commentaire, s'il est disponible dans Backtrack, un article sera écrit sur l'outil en question.