Netcat : connexions réseaux en shell !

screenshot

 Netcat est un outil en ligne de commande permettant de créer des connections réseaux tcp ou udp.

Le nom « netcat » s’inspire de la commande cat qui permet de lire un fichier. Nc, pour les intimes, va donc permettre de lire des sockets, c’est à dire une connexion réseau entre 2 ordinateurs.

Nous allons commencer par les fonctions de base : établissement d’une connexion réseau en tant que client ou serveur, puis nous verrons des fonctions plus particulières comme effectuer un scan de ports, dumper des connexions réseaux, …etc

Il est bon de se rappeler qu’à tout moment, un « nc -h » nous rappel brièvement les options et leur fonctions :
[v1.10-38]
connect to somewhere:    nc [-options] hostname port[s] [ports] …
listen for inbound:    nc -l -p port [-options] [hostname] [port]
options:
    -c shell commands    as `-e’; use /bin/sh to exec [dangerous!!]
    -e filename                 program to exec after connect [dangerous!!]
    -b                                 allow broadcasts
    -g gateway                 source-routing hop point[s], up to 8
    -G num                       source-routing pointer: 4, 8, 12, …
    -h                                 this cruft
    -i secs                         delay interval for lines sent, ports scanned
    -k                                 set keepalive option on socket
    -l                                  listen mode, for inbound connects
    -n                                 numeric-only IP addresses, no DNS
    -o file                          hex dump of traffic
    -p port                        local port number
    -r                                 randomize local and remote ports
    -q secs                       quit after EOF on stdin and delay of secs
    -s addr                       local source address
    -T tos                          set Type Of Service
    -t                                 answer TELNET negotiation
    -u                               UDP mode
    -v                               verbose [use twice to be more verbose]
    -w secs                     timeout for connects and final net reads
    -z                               zero-I/O mode [used for scanning]
port numbers can be individual or ranges: lo-hi [inclusive];
hyphens in port names must be backslash escaped (e.g. ‘ftp-data’).

1°) Client/serveur simple

Principe d’utilisation:
Netcat permet d’établir des connexions tcp ou udp depuis un script shell. Les échanges se font par stdin et stdout.
Nc peut établir deux types de connexions :
-client (il se connecte à un serveur),
-serveur (il se met en attente de connexions clientes).

Utilisation de nc en mode serveur :
$ nc -l -p 1234
permet de créer un serveur en attente de connexion sur le port 1234.
Les options sont faciles à retenir :
-l :  listen, à l’écoute de clients
-p : le port sur lequel le serveur s’établit
(Attention : il faut être root pour pouvoir établir un serveur sur les ports compris entre [1 et 1023])

Utiliser Nc en mode client est très simple :
$ nc -v localhost 1234
Ceci permet de se connecter sur le port 1234 en local. Il faut évidemment qu’un serveur soit attente de connexion sur ce port.
Le mode verbeux (-v) permet d’avoir des informations sur le déroulement de la commande. Vous pouvez par exemple obtenir :
-« localhost [127.0.0.1] 1234: Connexion refusée » si aucun serveur n’était en attente de client sur le port 1234.
-« localhost [127.0.0.1] 1234 open » si la connexion s’est bien passée.


exemple n°1 : client/serveur simple

Dans un permier shell, lancez un serveur :
$ nc -l -p 1234 -v
Dans un second, lancez un client :
$ nc -v localhost 1234
Voila, vous avez réalisé une connexion tcp entre les deux shell. Si vous tapez un message dans un des deux shell, il apparaitra dans l’autre !

screenshot

Simple non ?

L’utilitaire netstat permet d’apprendre beaucoup sur les connexions réseaux de son ordinateur :
$ netstat -t
affiche par exemple la liste des connexions tcp actives. On pourra alors visualiser la connexion qu’on a ouverte grâce à netcat :
tcp        0      0 localhost:1234          localhost:34994         ESTABLISHED
tcp        0      0 localhost:34994         localhost:1234          ESTABLISHED

On peut cependant aussi demander à consulter la liste des serveurs tcp :
$ netstat -lt      (l pour listening serveur)
Proto Recv-Q Send-Q Adresse locale          Adresse distante        Etat         
tcp        0      0 *:4014                   *:*                     LISTEN     
tcp        0      0 *:sunrpc                *:*                     LISTEN     
tcp        0      0 *:www                   *:*                     LISTEN     
tcp        0      0 *:54484                 *:*                     LISTEN     
tcp        0      0 *:ssh                      *:*                     LISTEN     
tcp        0      0 localhost:ipp        *:*                     LISTEN     

exemple n°2 : Utiliser Netcat pour récupérer le code source d’une page web :

Nous allons voir içi que netcat peut faire mieux que telnet…
Si nous voulons récupérer le code source de la page d’acceuil de Nunix, il suffit de se faire passer pour un navigateur internet : établir une connexion avec www.nunix.fr sur le port 80 et envoyer une requête HTTP demandant la page d’acceuil.

Essayons avec telnet :
$ echo -e «  »GET / HTTP/1.0rnHost: www.nunix.frnn »  | telnet www.nunix.fr 80
Trying 74.125.39.106…
Connected to 74.125.39.106.
Escape character is ‘^]’.
Connection closed by foreign host.

Telnet n’attend pas la réponse de Nunix, et nous dit que le serveur distant a fermé la connexion….
Pas très concluant…

Essayons maintenant avec netcat :
$ echo -e «  »GET / HTTP/1.0rnHost: www.nunix.frnn »  | nc -w 10 www.nunix.fr 80
HTTP/1.1 200 OK
Date: Wed, 29 Apr 2009 16:33:48 GMT
Server: Apache/2.2.9 (Ubuntu) PHP/5.2.6-2ubuntu4.1 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g
X-Powered-By: PHP/5.2.6-2ubuntu4.1
P3P: CP= »NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM »
Expires: Mon, 01 Jan 2001 00:00:00 GMT
Last-Modified: Wed, 29 Apr 2009 16:33:49 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8
Set-Cookie: a03ae0785f896af464903dee08e9ef42=955ce2b01a7ff2e2e638682793dc5c02; path=/
Set-Cookie: ja_purity_tpl=ja_purity; expires=Mon, 19-Apr-2010 16:33:49 GMT; path=/
Via: 1.0 nunix.fr
Connection: close

[……Code source de la page d’accueil……]

Netcat dipose de l’option -w, qui permet de mettre en place un timeout.
Le timeout permet d’attendre 10 secondes que le serveur réponde.
Par contre s’il n’a pas répondu au bout de ces 10 secondes, netcat coupe automatiquement la connection.
Dans notre cas, Nunix répond en moins de 10 secondes (pfiouu, heureusement…) puis coupe la connection.

exemple n°3 : Transmission d’un fichier

Netcat permet donc d’échanger des données, qu’il lit sur son entrée standard et écrit sur sa sortie standard.

Avec les mécanismes de redirection du shell, il est donc très simple d’échanger des fichiers :
Le serveur envoit un fichier sur la socket :
$ cat ~/.bashrc | nc -q 0 -l -p 1234
ou :
$ nc -q 0 -l -p 1234 < ~/.bashrc
(Ici il a fallut rajouter l’option -q 0 qui permet d’arreter la transmission dès que le serveur rencontre EOF sur son entrée standard)
et le client le reçoit :
$ nc localhost 1234 > fichier_recu.txt
Vous pouvez vérifier le contenu de fichier_recu.txt, c’est identique !

2°) Scanner des ports avec netcat

Nc peut être utilisé pour scanner des ports. Il suffit de le lancer en mode verbeux (-v) avec l’option -z, et de lui indiquer un (ou plusieurs) intervals de port à scanner.
Par exemple pour scanner du port 1 à 1024 :
$ nc -vz localhost 1-1024
Ce qui me donne :
localhost [127.0.0.1] 22 (ssh) open
localhost [127.0.0.1] 80 (www) open
localhost [127.0.0.1] 111 (sunrpc) open
localhost [127.0.0.1] 631 (ipp) open

Le mode verbeux (-v) indique à netcat d’afficher les ports ouverts.
On peut le lancer en mode très verbeux (-vv) pour obtenir le détail de chaque port testé : ouvert ou fermé.
L’option -z, elle, permet d’indiquer à netcat qu’on s’intéresse uniquement à l’état du port (fermé ou ouvert). Avec cette option, s’il tombe sur un port ouvert il passe directement au suivant, sans s’attarder.
Si on le lance sans cette option, nc s’arrête dès qu’il a pu ouvrire une connexion, c’est-à-dire sur le premier port ouvert qu’il trouve.

Allé, encore deux petites options :
$ nc -v -r localhost 1-100 2000-4000
L’option -r indique à netcat de scanner les ports dans le désordre.  (Certains systèmes de détection de scan sont basés sur un scan consécutif des ports).
L’option -i permet d’inserer un delai pour le scannage de ports, ce qui permet d’être moins repérable.

3°) Une option intéressante

Netcat permet également de rediriger les entrées et sorties d’un prog vers une socket : c’est l’option -c.
On peut par exemple dire à netcat d’exécuter un shell lors de la connexion d’un client :
$ nc -l -p 1234 -c « /bin/bash »

$ nc localhost 1234
pwd
/home/apesle
echo $SHELL
/bin/bash

(Vous pouvez remarquez que le prompt ne s’affiche pas, et qu’on perd les couleurs… si vous savez pourquoi…laissez un commentaire !)

On dispose ainsi d’un shell sur une simple connexion tcp/ip. Évidemment cette exemple est une trrrrrès mauvaise idée au point de vue sécurité, mais il est là pour expliquer le fonctionnement de l’option.
 
Cette option permet donc de s’affranchir de la programmation des sockets : il suffit de faire un prog qui manie stdin/stdout. En plus le programme peut être réalisé dans n’importe quel language, C, C++, script shell, du moment qu’il dispose de l’entrée et de la sortie standard.

 

4°) Netcat peut aussi utiliser l’udp

Pour le moment, toute les connections crées utilisaient le protocole TCP, mais netcat sait aussi utiliser les sockets UDP… et donc tout les exemples vu précédemment peuvent s’appliquer à l’udp avec l’option -u…

  • scann de port udp…
  •  redirections de port en udp, …
  • ….

5°) Dumper des connexions réseau avec netcat :

Idéal pour débuguer ses programmes, l’option -o permet de faire un dump de tous les octets échangés par la socket :

$ nc -l -p 8000
youhou
tagada
tsoin

$ nc -o dump.txt localhost 8000
youhou
tagada
tsoin

[ctrl+C]

$ cat dump.txt
Received 7 bytes from the socket
00000000  79 6F 75 68  6F 75 0A                               youhou.         
Received 7 bytes from the socket
00000000  74 61 67 61  64 61 0A                               tagada.         
Sent 6 bytes to the socket
00000000  74 73 6F 69  6E 0A                                  tsoin.

Le sens de chaque échange est aussi consigné.

6°) Conclusion :

Voila, c’est la fin de cet article, j’espère qu’il vous à plu et qu’il vous sera utile.
Sachez cependant que netcat a encore quelques options supplémentaires que je n’ai pas testé, comme la redirection de ports…
En tout cas, merci pour votre lecture et n’hésitez pas à laisser un commentaire si une erreur s’est glissée, ou si vous voulez partager une astuce ou deux…

La prochaine étape sera la réalisation d’un script bash utilisant netcat pour réaliser un serveur tcp/ip multi-client…. c’est içi !

{jcomments on}

Laisser un commentaire

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