Travail
de Longue Préparation:

La Sécurité des Réseaux Informatiques
Copyright © 2002 GRIm@ (thegrima at altern dot org)1
L’adoption de la sécurité est essentiellement une question de culture d’entreprise. Les milieux financiers, l’industrie pharmaceutique ou aérienne n’ont pas attendu l’ère «e-commerce» pour se doter des protections adéquates, sans pour autant disposer de la pléthore d’outils aujourd’hui disponibles. Et bien que la sécurité soit plus que jamais nécessaire dans un monde où l’interconnection des systèmes devient de plus en plus importante, elle reste aujourd’hui une affaire de spécialistes. Sa mise en œuvre rprèssente un coût non négligeable encore perçu comme une dépense importante dans beaucoup de milieux, surtout celui des PME. Le défi des années à venir est donc entre les mains de «l’industrie de la sécurité» qui doit démocratiser son coût et faciliter son déploiement pour favoriser son adoption. La technologie «Internet» atteint aujourd’hui un plus grand niveau de maturité et aussi une plus grande complexité. Ceci s’applique aussi bien à l’infrastructure qu’au framework applicatif. La stratégie de la sécurité doit venir s’intégrer à ces deux niveaux. Maîtriser valablement ces domaines d’expertise requiert une spécialisation suffisante et pour qu’une entreprise puisse s’en doter, il faut atteindre une masse critique importante et compter un nombre d’experts suffisants. Il va de soi qu’il est important d’affecter à la réalisation de ces missions des personnes dont l’état d’esprit soit compatible avec des missions de sécurité, c’est-à-dire qui en perçoivent l’enjeu et les réalisent avec rigueur.

- Uniway2 Belgique
Table des matières
Préface 3
Table des matières 4
2. A qui s'adresse ce document ? 6
3.ARP (Address Resolution Protocol) 10
Adresse IP 12
Routage IP 13
5.TCP (Transfert Control Protocol) 15
6.UDP (User Datagram Protocol) 17
7.ICMP (Internet Control Message Protocol) 18
2) Principes fondamentaux de sécurité 20
Services à assurer 20
Notions à protéger 20
Types d'agressions 20
Types d'agresseurs 20
Trois notions fondamentales 21
3)Atteinte à la sécurité du réseau 22
1.Méthode générale d'un piratage 22
B)Exemple d'un DoS: le Smurf 32
3.Virus 33
2.Architecture de Sécurité, la DMZ 36
3.Mesure de sécurité préventive 38
D)L'administration du réseau 39
4.Intervention d'une société de service 41
Conclusion 43
1.Liens 44
2.Livres 44
Annexes 46
Annexe I GNU Free Documentation Licence 47
Annexe II Détail des différentes catégories de messages ICMP 51
Annexe III Lise des ports et leurs attributions courantes 52
Annexe IV The Art of Port Scanning 54
Annexe V Détection d'OS distante par prise d'empreinte de la pile TCP/IP 57
Annexe VI Introduction aux débordements de tampon 59
Annexe VII IP Spoofing Appliqué 63
Lexique 67
Aujourd'hui, l'élèctronique, permettant la collecte de l'information, et l'informatique, permettant son traitement ont bel et bien envahit chaque composante de la société humaine. Il n'est pas un domaine scientifique, technique ou industriel qui n'ait pas profité des progrès réalisés dans ces domaines au cours de la seconde moité du 20ème siécle. En ce début de 21ème siécle, chacun de ces pôles d'information, à l'image de ce qui existe déjà dans les grand réseaux universitaires ou sur Internet, vont se retrouver interconnectés par différentes technologies. Cela passe du frigo intelligent qui fait automatiquement les courses sur Internet, jusqu'à la voiture automatique, capable de se diriger sans danger dans n'importe quel endroit tout en évitant les embouteillages. Chaque objet de la vie courante, depuis la moindre cafetière vas se retrouver connecté avec d'autres pour former un immense réseau. Si les promesses de la technologie provoquent de grands espoirs, elles amènent aussi leus lot de questions. Les machines sont-elles fiables ? Peuvent-elles vraiment remplacer un opérateur humain ? Est-il possible qu'elle ne remplisse pas leur rôle ? Ou qu'on ne les détourne de ce rôle ? Ces questions sont légitimes, et la motivation de ce document sera de répondre à quelques unes des questions concernant justement ces interconnexions que sont les réseaux informatiques.
Un réseau informatique se forme dès que deux ou plusieurs ordinateurs communiquent entre eux à distance. De par le monde il existe une multitude de type de réseaux informatiques, autant que de réseaux pourrait t'on même dire. Il n'est bien évidemment pas possible de s'intéresser a tous les types de résaux, c'est pour cela que ce document va essentiellement se focaliser sur la sécurité des réseaux utilisant le protocole IP et les protocoles reposant sur lui, TCP et UDP. Ce choix est motivé par le fait que TCP/IP s'érige aujourd'hui en standard par son utilisation généralisée sur l'Internet, et son support quasi généralisé sur toutes les plateformes informatiques existantes. Bien sûr considérer la question de la sécurité uniquement depuis ce point de vue est (volontairement) réducteur, et le lecteur devra garder a l'esprit que pour une vue d'ensemble plus correcte il devra prendre en compte de nombreux autres aspects (comme les protocoles de configuration des routeurs, etc.) qui malheureusement sortent du cadre de ce document. Notons également que ce document se bornera aux réseaux de types Ethernet, qui non seulement, encore une fois, représente un standard de facto, mais de plus est le seul type de réseau qui m'est accessible (tant à l'école qu'à la maison).
Ce document se veut à la fois technique et assez généraliste que pour être compris par une personne ayant des connaissances de base en informatique. Pour ce faire, le corps du document commence par un résumé des principales notions essentielles concernant les réseaux et leur organisation. Vous trouverez également un lexique à la fin de ce document vous permettant d'aborder facilement ces notions qui par leur extréme technicité sont, il faut l'avouer, assez ardues. Au delà de l'aspect purement pratique, les personnes visées par ce document peuvent aller du simple étudiant en informatique, à l'administrateur réseau (ou toute autre personne) désirant acquérir des notions de base concernant la sécurité des réseaux. Mais bien plus qu'une simple connaissance technique, la sécurité informatique est une façon de penser, une manière de concevoir applications et infrastructures matérielles qui ne devrait jamais quitter l'esprit de toute personne développant un système informatique. Ce document peut donc s'adresser en général a toute personne touchant de près ou de loin à l'informatique (et même en temps qu'utilisateur).
Ce document dans son entier et sous quelque forme que ce soit est distribué sous la GNU Free Documentation licence (GNU FDL) v1.1 telle qu'elle a été définie par la Free Software Fundation3. Vous pourez trouver un exemplaire de cette licence en annexe n°I. Ce document a entiérement été composé avec l'aide d'outils Libres et Open Source. Ce document a été composé a l'aide de OpenOffice sous unsystèmee GNU/Linux, dans le but de promouvoir l'utilisation à grande échelle des outils libres.
Nous ne reprendrons ici que les notions de base de l'architecture d'un réseau indispensables pour la suite. Si nécessaire, de bien plus amples informations vous seront fournies au travers des différents liens notés dans la bibliographie.
Le modèle OSI (pour Open System Interconnection) a été défini par l'International Standardization Organisation (ISO). Ce modèle se décompose en 7 couches. Les services de chaque couche peuvent interagir uniquement avec les services des couches contigües. Chaque couche définit un protocole et échange des unités de donnée spécifiques à ce niveau. Chaque unité de donnée d'une couche est encapsulée dans une unité de donnée du niveau inéfieur.
|
|
Nom des couches |
Nom des Unité de donnée |
|---|---|---|
|
1 |
Application |
/ |
|
2 |
Préprès |
/ |
|
3 |
Session |
/ |
|
4 |
Transport |
Datagrame |
|
5 |
Réseau |
Paquet |
|
6 |
Liaison de Données |
Trame |
|
7 |
Physique |
Bit |
Description des couches
Physique -> Brochage, Tensions...
Liaison de Données -> Structuration, Correction, Accès au medium... -> Ethernet
Réseau -> Routage, Fragmentation. Communication entre systèmes -> IP
Transport -> Communication entre processus -> TCP/UDP
Session -> Connexion, Déconnexion. |
Préprès
Application -> Communication entre "utilisateurs " |
Communication avec OSI
Quand deux hôtes veulent communiquer, les données du premier passent par les couches sucessives de sa pile réseau où elles seront au fur et à mesure encapsulées. Ensuite, la transmission effective se fera sur la dernière couche (la liaison physique). Le deuxiéme hôte recevra les données et les fera repasser par les différentes couches de sa pile réseau dans l'ordre inverse pour au final récupérer les données de départ. Ainsi chaque couche du modèle a l'impression de ne parler qu'avec la couche équivalente sur l'hôte distant, et ignore tout du type de données présentes tant au niveau supérieur qu inférieur (voir illustration).

Illustration
du modèle OSI
Ethernet est une technologie destinée aux réseaux à commutation par paquets, inventée par Xerox PARC (1970). Normalisée en 1978 par Xerox, Intel et Digital Equipment.
Tous les équipements Ethernet disposent d'une adresse unique et universelle, représentée sur 48 bits. L'adresse se compose d'un numéro constructeur, de 24 bits, et d'un numéro attribué par le constructeur, de 24 bits également. La notation d'une adresse Ethernet consiste en 6 octets, en notation hexadécimale, séparés par le caractère ":". (exemple 08:00:20:0C:F3:4C caractérise un matériel de la firme Sun).
L'adresse notée FF:FF:FF:FF:FF:FF est l'adresse de diffusion (broadcast). Elle permet d'envoyer un message à toutes les machines du réseau. L'adresse 0:0:0:0:0:0 est réservée.
Format d'une trame ethernet:
|
Bytes: 4 |
8 |
12 |
16 |
|||||||
|
A |
A |
A |
A |
A |
A |
A |
B |
|
||
|
Adresse de Destination (6 bytes) |
Adresse Source (6 bytes) |
Protocole |
Données... |
|||||||
|
Données... |
||||||||||
|
CRC (32 bits) |
|
|||||||||
Description: La trame Ethernet débute par sept octets contenant la valeur 0xAA et un octet contenant la valeur 0xAB. Cet en-tête permet au matériel de se resynchroniser. La synchronisation est réalisée si les deux derniers octets sont décodés correctement. La taille de la trame (moins les 8 octets de préambule) doit être comprise entre 64 et 1518 octets, ce qui laisse de 46 à 1500 octets "utiles". Un contenu plus court que 46 octets est complété par des caractères aléatoires de remplissage. Le CRC est calculé à la volée, il permet de garantir que les informations ont bien été transmises correctement.
Le Champ Protocole reçoit 8 bits identifiant de manière unique le protocole utilisé au niveau supérieur. Ce numéro d'identification est attribué par l'ISO. Il vaut 0x0800 (notation hexadécimale) pour IP et 0x0806 pour ARP (il en existe de nombreux autres mais qui sortent du cadre de ce document).
Remarque: Lorsque nous utilisons Ethernet à l'échelle logicielle, l'en tête et le CRC (en bleu dans le schéma) ne seront jamais utilisés, il sont automatiquement ajoutés et vérifiés par la carte réseau et dépendent donc uniquement de l'interface physique (nous les ignorerons donc dans le futur).
Le but de l'ARP4 est de trouver l'adresse ethernet (couche transport) d'une machine distante dont on ne connait que l'adresse de la couche réseau (ex: l'adresse IP).
Format d'un paquet ARP (avec une en tête Ethernet en gris):
|
Bytes: 4 |
8 |
12 |
16 |
|||||
|
|
|
|
Hardware |
|||||
|
Protocole |
T1 |
T2 |
Code |
Adr. physique source |
Adr. logicelle source |
|||
|
Adr. physique destination |
Adr. logicielle dest. |
<Remplissage éventuel> |
||||||
Description: Le champ Hardware reçoit un identificateur unique définisant le type d'adresse physique que nous voulons résoudre (pour Ethernet il s'agit de 0x0001). Le Champ protocole reçoit un identificateur unique identifiant le protocole des adresses logicielles utilisées pour la résolution (pour IP 0x0800). Le Champ T1 reçoit la valeur de la longueur en octet des adresses physiques (6 octets pour Ethernet) et T2 reçoit la valeur de la longueur en octet des adresses logicielles (4 octets pour IP). Le champ code, quant à lui, reçoit une valeur identifiant l'opération que le paquet accompli. Il peut prendre la valeur 0x0001 pour une requête ARP ou 0x0002 s'il s'agit d'une réponse à une requête. Les quatres derniers champs contiennent les adresses connues de l'hôte qui envoie le paquet, donc dans une requête le champ Adresse Physique Destination reste vide et dans une réponses les 4 champs sont remplis.
Fonctionnement: La machine qui veut contacter un hôte mais qui ne connaît pas son adresse ethernet va envoyer une requête ARP avec l'adresse IP de la machine à contacter et l'adresse de Broadcast comme adresse de destination du packet Ethernet. Toute machine qui reçoit une requête ARP va comparer l'adresse IP du paquet avec sa propre adresse IP et si elle correspondent, va envoyer une réponse ARP à la première machine contenant l'adresse physique demandée. La première machine, recevant cette réponse la stockera dans une mémoire cache interne et connaîtra dorénavant l'adresse matérielle de l'hôte correspondant.
IP5 est la base de presque tous les réseaux actuels, c'est lui qui permet à différents ordinateurs de communiquer sur de grandes distances, en passant par de multiples sous-réseaux. IP est la base de l'Internet actuel. Il assure sans connexion un service non fiable de délivrance de paquets IP. Le service est dit non fiable car il n'existe aucune garantie pour que les paquets IP arrivent à destination. Certains peuvent être perdus, dupliqués, retardés, altérés ou remis dans le désordre. Ni l'émetteur ni le récepteur ne sont informés directement par IP des problèmes rencontrés. La transmission est dite non connectée car IP traite chaque paquet indépendament de ceux qui le précèdent et le suivent. Ainsi deux pacquets IP issus de la même machine et ayant la même destination peuvent ne pas suivre obligatoirement le même chemin. Chaque interface connectée au réseau possède une adresse IP unique, cette adresse est représentée par un entier de 32 bits6.
|
Bits: 8 |
16 |
24 |
32 |
||
|
Version |
Longueur |
Type de Service (TOS) |
Longueur totale |
||
|
Identification |
Flags |
Offset |
|||
|
Time to Live (TTL) |
Protocole |
Checksum |
|||
|
Adresse IP Source |
|||||
|
Adresse IP Destination |
|||||
|
Options (éventuelles) |
Remplissage |
||||
|
c-Données... |
|||||
Description: Un paquet IP comporte un en-tête, qui décrit ses caractéristiques et permet son acheminement, et un corps, qui contient les données à transmettre. Le champ version (4 bits) contient le numéro de version du protocole IP utilisé (la version courante est la 4, d'où son nom d'IPv4). Le champ longueur (4 bits) contient la taille de l'en-tête du paquet (donc sans les données), en nombre de mots de 32 bits. Ce champ est nécessaire car une en-tête peut avoir une taille supérieure à 20 octets (taille de l'en-tête classique) à cause des options que l'on peut y ajouter. Le TOS (8 bits), indique la manière dont doit être géré le paquet et se décompose en six sous-champs comme suit:
|
bits |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
champs |
priorité |
D |
T |
R |
C |
/ |
||
Le champ priorité varie de 0 (priorité normale, valeur par défaut) à 7 (priorité maximale pour la supervision du réseau) et permet d'indiquer l'importance de chaque paquet. Les 4 bits D, T, R et C permettent de spécifier ce que l'on veut privilégier pour la transmission de ce paquet. D est mis à 1 pour essayer de minimiser le délai d'acheminement (par exemple choisir un câble sous-marin plutôt qu'une liaison satellite), T est mis à 1 pour maximiser le débit de transmission, R est mis à 1 pour assurer une plus grande fiabilité et C est mis à 1 pour minimiser les coûts de transmission. Si les quatre bits sont à 1, alors c'est la sécurité de la transmission qui doit être maximisée. Ces 4 bits servent à améliorer la qualité du routage et ne sont pas obligatoires. Simplement, si un routeur connaît plusieurs voies de sortie pour une même destination il pourra choisir celle qui correspond le mieux à la demande. Le champ longueur totale (16 bits) contient la taille totale en octets du paquet (données comprises), et comme ce champ est de 2 octets on en déduit que la taille complète d'un paquet ne peut dépasser 65535 octets (valeur maximale stockée sur 2 octets, 0xFFFF). Utilisée avec la longueur de l'en-tête elle permet de déterminer où commencent exactement les données transportées. Les champs identification, flags et Offset interviennent dans le processus de fragmentation des paquets IP qui sera décrit plus loin dans ce point. Le champ TTL indique le nombre maximal de routeurs que peut traverser le paquet. Elle est initialisée à N (souvent 32 ou 64) par l'émetteur et décrémenté de 1 par chaque routeur qui le reçoit et le réexpédie. Lorsqu'un routeur reçoit un paquet dont la durée de vie est nulle, il le détruit et envoie à l'expéditeur un message ICMP (voir 1.7). Ainsi, il est impossible qu'un datagramme «tourne» indéfiniment dans Internet. Le champ protocole permet d'identifier quel protocole de plus haut niveau est acheminé par le paquet IP (exemple: 6 pour TCP). Le champ checksum est calculé par un algorythme simple à partir de l'en-tête du paquet pour en assurer l'intégrité. L'intégrité des données transportées est elle assurée par les protocoles supérieur (ex: ICMP, IGMP, TCP, UDP). Les champs adresses IP source et adresse IP destination contiennent (32 bits chacun) les adresses de la machine émettrice et destinataire du paquet. Le champ options est une liste de longueur variable, mais toujours complétée par des bits de remplissage pour atteindre une taille multiple de 32 bits pour être en conformité avec le champ longueur. Ces options sont très peu utilisées car peu de machines sont aptes à les gérer. Parmi elles, on trouve des options de sécurité et de gestion, d'enregistrement de la route, d'estampille horaire, routage strict, etc...
Chaque "machine" (carte réseau) du réseau Internet a une adresse unique. Cette adresse est codée sur 4 octets (32 bits). Elle est représentée, en général, par 4 entiers séparés par des '.'. Exemple : « 193.55.44.84 ». Cette adresse contient en fait 2 adresses, les bits de poidd les plus forts (le nombre dépend de la classe, voir plus loin) représentent l'adresse du réseau et le reste l'adresse de la machine dans le réseau. Les adresses réseau se séparent en trois classes : A , B et C. Le nombre d'adresses disponibles dans le réseau diminue de la classe A vers la classe C. Il existe une classe D dédiée au multicast (nous n'en parlerons pas) et une classe E pour les expérimentations. Les 4 premiers bits d'une adresse permettent de trouver la classe du réseau.
Oxxx -> A
10xx -> B
110x -> C
1110 -> D
1111 -> E
Dans notre exemple précédent, 193 = 11000001=128+64+1, l'adresse fait partie d'un réseau de classe C. A chaque classe de réseau correspond un certain nombre de bits pour coder l'adresse du réseau. Les bits restants servent à coder l'adresse de la machine dans le réseau.
A -> premier octet -1 bit, adresses de réseau de 0.1.0.0 à 126.0.0.0
B -> 2 premiers octets -2 bits, adresses de réseau de 128.0.0.0 à 191.255.0.0
C -> 3 premiers octets -3 bits, adresses de réseau de 192.0.1.0 à 223.255.255.0
Exemple : Dans un réseau de classe C, 255 adresses sont disponibles. Certaines adresses IP sont dites reservées il est interdit de s'en servir pour un usage courant. L'adresse du réseau : adresse réseau + 0 partout ailleurs. Cette adresse sert uniquement pour le routage, elle ne peut pas être utilisée en adressage direct. L'adresse de broadcast pour le réseau local est 255.255.255.255. L'adresse de broadcast dirigé pour un réseau est : adresse réseau + 255 partout ailleurs. Ce type de broadcast est souvent interdit. L'adresse 0.0.0.0 représente la machine locale. Cette adresse est uniquement utilisée au boot de machine sans disque. L'adresse réseau 0, suivie d'une adresse machine, représente la machine du réseau local qui a ce numéro. L'adresse de loopback fait référence à la machine locale, mais elle n'est jamais propagée sur le réseau. L'adresse réseau 127.0.0.0 est réservée à cet usage. En général, l'adresse de loopback utilisée est 127.0.0.1.
La notion de classe n'est plus adaptée aux demandes actuelles en matière de réseau. En effet, il n'existe plus de réseau de classe C disponible. Deux notions ont été introduites, le subnetting qui permet de décomposer un grand réseau en plusieurs sous-réseaux et le supernetting qui permet d'agglomérer plusieurs petits réseaux en un grand réseau. Ces deux techniques s'appuyent sur la notion de masque. Un masque permet de déterminer les parties réseau et machine d'une adresse sans s'appuyer sur la notion de classe. Il existe deux façons de représenter les masques. La première consiste à donner le nombre de bits de poids fort (dans les faits) qui constituent l'adresse réseau. La seconde consiste à représenter cette information sous forme de 4 entiers, où les bits à 1 représentent les bits de l'adresse qui participe à l'adresse réseau. Exemple : masque 23 ou 255.255.254.0: adresse sous-réseau codée sur 23 bits.
L'affectation des adresses réseau est géree de façon centrale par l'Internet Assigned Number Authority (IANA)7 afin d'assurer l'unicitée de celles-ci. Elle délègue, au niveau régional, ses fonctions à un organisme d'enregistrement qui gère une certaine plage d'adresses. Pour l'europe, l'afrique et une partie de l'europe de l'est, cet organisme a pour nom Réseau IP Européens (RIPE NCC)8. Ces organismes s'assurent également que certaines plages d'adresses ne sont jamais affectées:
Classe A : 10.0.0.0
Classe B : 172.16.0.0 à 172.31.0.0
Classe C : 192.168.0.0 à 192.168.255.0
Ces adresses pourront ainsi toujours être utilisées pour une utilisation privée (par exemple dans un réseau local).
Le nombre maximal d'adresse IP pouvant exister sur 32 bits étant de 2^32 = 4.294.967.296 adresses, laisse penser qu'il y aura toujours un nombre suffisant d'adresses disponibles. Malheureusement, les grosses entreprises achetent des séries entiéres d'adresse (même si une partie ne sont pas utilisées), et l'IANA est d'ores et déjà en pénurie... C'est pour cela que l'IEETF (Internet Engeneering Task Force)9 a décidé d'introduire la version 6 d'IP qui note les adresses sur 128 bits soit plus de 3.4e38 adresses (plus que le nombre d'électrons dans l'univers) ce qui devrait résoudre définitivement ce problême de pénurie.
Au cours de sa route, un paquet peut traverser différents réseaux physiques dont les trames n'ont pas nécessairement la même taille maximale ou Maximum Transfert Unit (MTU) (pour ethernet 1500 octets). Il est donc parfois nécessaire de les découper en plusieurs fragments dont la taille est adaptée à la MTU du réseau traversé. L'en-tête du protocole IP contient trois champs réservés à la fragmentation, identificateur, flags et offset pour. Chaque fragment d'un paquet a pratiquement la même en-tête IP que le paquet original. En particulier, ils ont le même identificateur, un entier différent pour chaque paquet émis, ce qui permet de reconnaître les fragments. En outre de la taille totale et du checksum qui sont nécessairement recalculées, l'offset et les bits de flags sont différents. L'offset correspond à la position en multiple de 8 octets du début du fragment dans le paquet original (le premier fragment a l'offset 0). La taille maximale de l'en-tête étant de60 octets, ceci implique que tout routeur IP ne doit pas fragmenter au dessous de 68 octets. Le premier bit des flags est réservé et doit être positionné à 0. Le second, DF (Don't Fragment bit), indique s'il est à 1 que le paquet doit être éliminé plutôt que d'être fragmenté. Le dernier, MF (More Fragments bit), indique s'il est à 1 que le paquet est fragmenté et que les autres fragments suivent (seul le dernier fragment ou un paquet non fragmenté a le flag MF à 0). Le réassemblage10 des fragments se fait à l'arrivée sur la machine destinatrice. Pour connaître la taille du paquet original la machine destination doit recevoir le dernier fragment, celui dont le MF bit est à 0. Grâce à son offset et sa taille totale, il peut calculer la taille totale du paquet original.
Le routage est effectué de proche en proche en fonction de l'adresse IP du destinataire et des tables de routage des différentes machines rencontrées. Pour la machine source l'algorithme d'envoi dans les cas simples est le suivant :
|
Si l'adresse IP destination du paquet fait partie du réseau local Déterminer l'adresse physique de la machine destination Envoyer le paquet à la machine destination Terminer Sinon Déterminer l'adresse physique du routeur par défaut Envoyer le paquet au routeur par défaut |
Pour un routeur l'algorithme est le suivant :
|
Extraire l'adresse IP destination du paquet qui arrive Si l'adresse est l'adresse du routeur Traiter le paquets Terminer Si l'adresse fait partie d'un réseau directement attaché Déterminer l'adresse physique de la machine destination Envoyer le paquet à la machine destination Terminer Si la table de routage contient une route pour cette adresse Déterminer l'adresse physique du prochain routeur Envoyer le aquet au prochain routeur Terminer Si la table de routage contient une route pour le réseau de cette adresse Déterminer l'adresse physique du prochain routeur connecté Envoyer le paquet prochain routeur Terminer Si la table contient une route par défaut Déterminer l'adresse physique du routeur par défaut Envoyer le paquet au routeur par défaut Terminer Sinon Envoyer une erreur de routage Terminer |
Pour la machine destination l'algorithme de réception de base est le suivant :
|
Extraire l'adresse IP destination du paquet qui arrive Si l'adresse est l'adresse de la machine Traiter le paquet Terminer Détruire le paquet |
Schéma d'une communication routée à travers les couches OSI

TCP11 est l'autre protocole associé avec IP sur qui l'architecture actuelle d'Internet repose. Si IP permet l'envoi et la réception de données entre deux machines, c'est gràce à TCP qu'un dialogue peut se créer entre elle.
Connecté : une communication entre deux machines doit s'établir préalablement par un échange de message pour mettre en place la connexion qui sera abandonnée à la fin de l'échange (donc les datagrammes seront liés les un aux autres).
Sécurité : TCP assure que tous les datagrammes sont transmis et correctement recus par le récepteur grâce au processus d'acquittement.
Flot de données : le récepteur reçoit exactement la séquence d'octets envoyée par l'émetteur.
Temporisation : les données envoyées et reçues sont temporairement mises en mémoire afin d'améliorer la communication.
Full-Duplex : communication dans les deux sens des informations de contrôle et des données
|
Bits: 8 |
16 |
24 |
32 |
|
|
Port Source |
Port Destination |
|||
|
Numéro de séquence (SEQ) |
||||
|
Numéro d'acquittement (ACK) |
||||
|
Longueur |
Reservé |
Flags |
Window |
|
|
Checksum |
Pointeur Urgent |
|||
|
Options |
Remplissage |
|||
|
Données... |
||||
L'en-tête, sans option, d'un segment TCP a une taille totale de 20 octets et se compose des champs suivants: Le port source et le port destination identifient les applications émettrice et réceptrice. Le numéro de séquence donne la position du datagramme dans le flux de données envoyées par l'émetteur. Ce numéro est incrémenté de 1 à chaque datagramme envoyé. Le numéro d'acquittement contient en fait le numéro de séquence suivant que le récepteur s'attend à recevoir; c'est-à-dire le numéro de séquence du dernier datagramme reçu plus 1. Le champ Longueur (4 bits) contient la taille de l'en-tête TCP, y compris les options présentes, codées en multiple de 4 octets. Ainsi une en-tête peut avoir une taille variant de 20 octets (aucune option) à 60 octets (maximum d'options). Le champ Réservé (6 bits) est réservé à un usage ultérieur du protocole, il n'est donc pas utilisé. Le champ Flag est décomposé en 6 bits de code qui permettent de spécifier le rôle et le contenu du datagramme TCP.
|
Bits |
0 |
1 |
2 |
3 |
4 |
5 |
|
champ |
URG |
ACK |
PSH |
RST |
SYN |
FIN |
La signification de chaque bit, quand il est fixé à 1 est la suivante.
URG, le pointeur de données urgentes est valide.
ACK, le champ d'accusé de réception est valide.
PSH, ce segment requiert un push.
RST, réinitialiser la connexion.
SYN, synchroniser les numéros de séquence pour initialiser une connexion.
FIN, l'émetteur a atteint la fin de son flot de données.
Le champ window (16 bits) sert au contrôle de flux. Il indique le nombre d'octets (moins de 65535) que le récepteur est prêt à accepter. Ainsi l'émetteur augmente ou diminue son flux de données en fonction de la valeur de cette fenêtre qu'il reçoit. Le checksum est une somme de contrôle sur 16 bits utilisée pour vérifier la validité de l'en-tête et des données transmises. Il est obligatoirement calculé par l'émetteur et vérifié par le récepteur. Le pointeur d'urgence est un offset qui, ajouté au numéro de séquence du datagramme, indique le numéro du dernier octet de donnée urgente. Il faut également que le bit URG soit positionné à 1 pour indiquer des données urgentes que le récepteur TCP doit passer le plus rapidement possible à l'application associée à la connexion (nous ne parlerons pas plus de données urgentes). Le champ options (bien que facultatif) permet, entre autre, de négocier la taille des segments envoyés, en fonction de la capacité mémoire de la machine réceptrice et éventuellement de la MTU des réseaux traversés. Le champ remplissage comme pour IP sera rempli en fonction des options de telle façon que le header soit un multiple de 32 bits.
Pour assurer la sécurité des données, quand une machine reçoit un datagramme TCP, elle renvoie à l'émetteur un datagramme d'acquittement, avec le flag ACK mis à 1. L'émetteur sait ainsi que les données on bien été reçues et peut continuer la transmission ou si après un laps de temps il ne reçoit pas de ACK il peut réemettre le datagramme. La machine réceptrice qui va émettre le ACK va aussi pouvoir remplir le champ window avec la taille disponible dans son tampon, ainsi l'émetteur n'enverra pas plus que ce que le récepteur peut recevoir et ne devra pas réemettre les données.

Illustration
du three-way handshake
Avant tout échange de données,
deux machines doivent se connecter et pour cela elles utiliseront la
méthode dite du «three-way handshake». A
l'origine, une des deux machines (apellons-la B) dois être
prête à recevoir une connexion sur un port (on dit que
ce port est ouvert). La première étape de la connexion
consiste en l'envoi d'un datagramme par A avec le flag SYN activé.
Ce datagramme contiendra le premier SEQ qui sera mis à une
valeur aléatoire (exemple: 700) et le numéro
d'acquittement restera à 0. La deuxiéme étape se
déroule quand B ayant recu le datagramme SYN de A renvoie un
datagramme toujours avec SYN activé mais également le
flag ACK. Le SEQ sera mis à une valeur aléatoire par B,
par exemple 400. Le numéro d'acquittement sera ici mis a 701
(le SEQ initial de A + 1). Enfin dernière et troisiéme
étape, A ayant recu le SYN/ACK de B renverra un datagramme
avec seulement le flag ACK activé et comme numéro
d'acquittement 401 (Bien entendu le numéro de séquence
sera mis à 701). après ces trois étapes, les
deux machines sont dites conectées et peuvent s'envoyer
des informations.
Pour couper la connection, on procéde exactement de la même manière sauf que le flag SYN est remplacé par un FIN et que l'on prendra les valeurs de SEQ/ACK en cours de la connection.
Le protocole UDP12 n'ajoute pas de service particulier par rapport à IP, il permet seulement le multiplexage/démultiplexage des communications entre applications grâce à la notion de port.
Schéma d'un datagramme UDP:
|
Bits: 8 |
16 |
24 |
32 |
|
Port Source |
Port Destination |
||
|
Taille |
Checksum |
||
|
Données... |
|||
Description: Les numéros de port (chacun sur 16 bits) identifient les processus émetteur et récepteur. Le champ longueur contient sur 2 octets la taille de l'en-tête et des données transmises. Puisqu'un datagramme UDP peut ne transmettre aucune donnée la valeur minimale de la longueur est 8. Le checksum est une somme de contrôle qui n'est pas indispensable lorsque UDP est utilisé sur un réseau très fiable. S'il est fixé à 0 c'est qu'en fait il n'a pas été calculé.
Le protocole UDP utilise IP pour acheminer, d'un ordinateur à un autre, en mode non fiable des datagrammes qui lui sont transmis par une application. UDP n'utilise pas d'accusé de réception et ne peut donc pas garantir que les données ont bien été reçues. Il ne réordonne pas les messages si ceux-ci n'arrivent pas dans l'ordre dans lequel ils ont été émis et il n'assure pas non plus de contrôle de flux. Il se peut donc que le récepteur ne soit pas apte à faire face au flux de datagrammes qui arrivent. C'est donc à l'application qui utilise UDP de gérer les problèmes de perte de messages, duplications, retards,déséquencement, ... Si une erreur de transmission est détectée, le datagramme UDP est détruit «en silence» (sans message d'erreur, voir 1.7). Sinon, UDP oriente les données du datagramme vers la file d'attente associée au numéro de port destination pour que l'application associée puisse les y lire.
Le protocole ICMP13 permet aux routeurs d'envoyer des messages d'erreur à d'autres ordinateurs ou routeurs. Le but d'ICMP n'est pas de fiabiliser le protocole IP, mais de fournir à une autre couche IP, ou à une couche supérieure de protocole (TCP ou UDP), le compte-rendu d'une erreur détectée dans un routeur. Un message ICMP étant acheminé à l'intérieur d'un datagramme IP, il est susceptible, lui aussi, de souffrir d'erreurs de transmission. Mais la règle est qu'aucun message ICMP ne doit être délivré pour signaler une erreur relative à un autre message ICMP. On évite ainsi une avalanche de messages d'erreur quand le fonctionnement d'un réseau se détériore.
Schéma d'un datagramme ICMP:
|
Bits: 8 |
16 |
24 |
32 |
|
Type |
Code |
Checksum |
|
|
Contenu variable en fonction du type |
|||
Description: Le champ type peut prendre 15 valeurs différentes spécifiant de quelle nature est le message envoyé. Pour certains types, le champ code sert à préciser encore plus le contexte d'émission du message. Le checksum est une somme de contrôle de tout le message ICMP calculée comme dans le cas de l'en-tête d'un paquet IP. Le détail des différentes catégories de messages est donné en Annexe II pour éviter d'encombrer de détails techniques ce document. Nous encouragons vivement, malgré tout, le lecteur à aller la consulter.
De nombreuses applications fonctionnent selon un environnement client/serveur, cela signifie que des machines clientes (des machines faisant partie du réseau) contactent un serveur, une machine généralement plus puissante en terme de capacité d'entrée-sortie, qui leur fournit des services. Ces services sont des programmes fournissant des données telles que des fichiers, une connexion, ...
Les services sont exploités par des programmes, appelés programmes clients, s'exécutant sur les machines clientes. On parle ainsi de client FTP, client de messagerie, ..., lorsque l'on désigne un programme, tournant sur une machine cliente, capable de traiter des informations qu'il récupère auprès du serveur (dans le cas du client FTP il s'agit de fichiers, tandis que pour le client messagerie il s'agit de courrier électronique).
Dans un environnement purement Client/serveur, les ordinateurs du réseau (les clients) ne peuvent voir que le serveur, c'est un des principaux atouts de ce modèle.

Un
système client/serveur fonctionne selon ce schéma
Le client émet une requête vers le serveur grâce à son adresse et le port, qui désigne un service particulier du serveur
Le serveur reçoit la demande et répond à l'aide de l'adresse de la machine client et son port
Comme nous venons de le voir dans le point 1, les différents protocoles qui assurent le fonctionnement d'un réseau utilisent des systèmes automatisants la sécurité de transmission et l'intégrité des données qui traverse le réseau. Les dangers potentiels pour la sécurité ne se trouveront donc pas dans la transmission physique des données, ni dans leur traitement par les systèmes informatiques. La sécurité de l'information et des systèmes chargés de la traiter ne pourra dont être compromise que par une utilisation abusive, qu'elle soit volontaire ou non, externe ou interne.
Pour pouvoir assurer la sécurité d'un réseaux, il importe donc de définir avant tout l'ensemble de ce que la sécurité devra prendre en charge et protéger. Tout d'abord, nous pouvons définir les trois services de base que la sécurité devra assurer:
Disponibilité : garantie de la continuité du service.
Intégrité : garantie que l'information n'est pas altérée.
Confidentialité : garantie que de l'information n'est pas divulguée à des tiers non autorisés (frauduleusement ou non)
De la même manière, nous pouvons définir les trois notions fondamentales que les dispositifs de sécurité d'un réseau devront protéger:
Vos données : les informations (fichiers , traitements) qui sont sur les ordinateurs, pour qu'elles ne soient pas :
rendues indisponibles.
détruites ou altérées.
accédées si elles sont confidentielles.
Vos ressources : le temps CPU, l'espace disque, le réseau (la bande passante, le volume).
Votre réputation (institutionnelle, professionnelle ou personnelle), votre responsabilité.
Avec ces notions en tête, nous pouvons définir facilement les trois types d'intrusions auxquelles la sécurité devra faire face:
L'intrusion, d'où qu'elle vienne (par le réseau, via un terminal local, via un programme).
Le déni de service (Denial of Service ou DoS) : atteinte à la disponibilité (conséquence très connue des virus).
Le vol d'informations. Il n'est pas nécessaire de pénétrer un système pour obtenir de l'information (écoute du réseau par exemple).
Il est évident qu'il existe de nombreuses formes d'agressions pouvant se classer dans ces catégories (nous parlerons d'ailleurs en détail de plusieurs d'entre elles dans les points suivants), mais la technique étant une chose, il importe aussi de se préoccuper des personnes qui compromettent la sécurité du réseau, les agresseurs. Il y a plusieurs types d'agresseurs. Il est très important d'estimer le type d'agresseur en cas d'incident pour évaluer la gravité potentielle du sinistre et surtout prendre les mesures qui conviennent. Parmi eux, on peut citer notemment:
Les plaisantins, le piratage ludique:
Le plus souvent il s'agit de jeunes doués en informatique mais inconscients des conséquences que leurs actes entrainent. Leur véritable motivation est la reconnaissance (par leurs pairs et par les médias), et il feront parler d'eux bien plus que de détruire ou de voler des informations. Il comprommettent donc surtout votre image.
Les vandales:
Il sagit souvent de personne agissant par idéologie ou par vengeance (ex employé par exemple). Ceux-ci sont plus dangereux car leur motivation sera de détuire et/ou de voler l'information de vos systèmes informatiques.
Les compétiteurs
Des informations volées chez un concurrent donnent souvent un avantage stratégique sur le marché. Vos concurrents n'hésiteront pas à acheter (ou plus rarement à se fournir eux-même) des informations provenant de vos bases de données.
La stupidité, les accidents:
Dans la très grande majorité des cas, la sécurité sera compromise par une manipulation accidentelle et/ou un sinistre (inondation, feux, ...).
Les services de renseignements:
Depuis une dizaines d'années, on observe une véritable guerre de l'information entres les services de renseignements qu'il soient:
Gouvernementaux ou non (espionnage industriel)
Étrangers ou non
Ennemis ou « amis »
Prétextant l'insécurité (notamment après le 11 Septembre), les gouvernements imposent des normes qui leur sont facilement acessibles14 tout cela sur un fond de guerre économique.
Les agressions à but lucratif:
Vos informations peuvent valoir beaucoup, que ce soit pour un concurrent, ou que l'agresseur cherche a exercer un chantage ou a faire des détournement de fonds.
Finalement, lorsque vous devez concevoir et mettre en place des procédures de sécurité pour votre réseau, il existe trois principes à toujours garder à l'esprit:
Un agresseur (pirate) informatique est plus compétent que vous et à plus de temps à y consacrer que vous (il est doué et ne dors jamais).
Dans une proportion importante, les agressions volontaires ont une cause interne.
Raisonnez comme les agresseurs !
C'est en partant de ce constat et de ces régles que nous allons aborder le point suivant, qui visera à expliquer quelles sont les techniques utilisées par un pirate. Nous pourrons ainsi prévoir et installer des procédures de sécurité sur le réseau qui feront échouer la plupart des attaques.
Dans ce chapitre nous allons décrire les quelques étapes générales qui vont permettre à un pirate de compromettre l'intégrité et la confidentialité des données qui traversent votre réseau. Il pourra par la même occasion mettre en danger votre réputation, puisqu'il pourra altérer des données dont vous êtes la source authentifiée. Comme nous l'avons vu dans le point précédent, nous allons raisonner comme un pirate et analyser les techniques qu'il employera pour pouvoir, par après, mettre en place des procédures de sécurité fiable.
Généralement, une attaque va se faire en trois étapes principales. La première va être la prise d'informations : le pirate va essayer d'obtenir un maximum d'informations sur sa cible. La deuxiéme sera l'attaque proprement dite, c'est à dire la pénétration du réseau et du système. La troisiéme quant à elle consistera en une infiltration discrète, soit pour attaquer d'autres réseaux/systèmes, soit pour camoufler les traces du pirate sur le système compromis et lui garantir un accèss illégitime futur. Nous allons détailler les techniques relatives aux réseaux qui permettent de remplir ces trois étapes.
Informations concernant l'identité.
Il existe deux types d'informations qui vont principalement intéresser nos pirates, les premières sont de types identitaires, c'est à dire les noms, adresses, noms/prénoms des femmes et enfants des responsables de la sécurité informatique, du patron et/ou des employés qui sont en contact direct avec la cible (souvent le réseau d'une entreprise). Ces informations peuvent facilement être obtenues anonymement sur Internet en utilisant des moteurs de recherches, les pages blanches, etc. Citons tout de même l'outils WHOIS qui permet d'afficher de nombreuses informations souvent privées sur un nom de domaine. Voici un exemple de l'utilisation de cet outil sur le nom de domaine du site du gouvernement belge, http://www.fgov.be:
$ whois fgov.be
% .be Whois Server 3.0a
%
% (c) dns.be 2001 (http://www.dns.be)
%
% (...)
%
% WHOIS fgov
Domain: fgov
Status: Registered
Registered: Tue Jan 2 1996
Licensee:
Name: Bart Van Herreweghe
Company: Federale Voorlichtingsdienst
Language: N
Address: Residence Palace
Wetstraat 155
B-1040 Brussel
Belgium
Phone: +32-2-287 41 11
Fax: +32-2-287 41 00
Email: fvd@belgium.fgov.be
Onsite Contacts:
Agent Technical Contacts:
Name: Bart Van Herreweghe
Company: Federale Voorlichtingsdienst
Address: Residence Palace
Wetstraat 155
B-1040 Brussel
Belgium
Phone: +32-2-287 41 11
Fax: +32-2-287 41 00
Email: fvd@belgium.fgov.be
Agent:
Name: Federale Voorlichtingsdienst
WebSite: belgium.fgov.be
Nameservers:
Name: ns.belnet.be
Name: ns2.nic.fr
Name: aun.uninett.no
Name: ns.dns.be
Name: ns2.belnet.be
Name: vnet3.vub.ac.be
Comme on peut le voir l'outil WHOIS peut renvoyer très facilement un nombre non négligeable d'informations utiles pour un pirate. Toutes ces informations identitaires seront principalement utilisées dans une attaque de type Social Engeenering (SE ou «manipulation sociale») (voir le point B du présent chapître).
L'autre type d'informations recherchées par un pirate va principalement être des détails techniques concernant l'architecture et les services ouverts de la cible. Pour ce faire, il existe de nombreuses techniques mais la plus connue et universellement utilisée aussi bien par les pirates que par les administrateurs réseaux est celle du Scan TCP.
Le scan TCP est très simple, on utilise un programme qui va tenter de se connecter sur tous les ports de la machine distante (rappel: un port dans le protocole TCP est noté sur 16 bits, soit 65536 ports possibles) n'affichant que ceux qui sont ouverts, donc ceux pour lesquels la machine attend une connection eventuelle, soit ceux pour lesquells il existe un service associé (80 pour le serveur http, 21 pour le ftp etc.) (Une liste des ports courants associés avec leurs services peut être trouvé en annexe III).
Bien entendu ce scan ne passera pas inaperçu auprès de l'administrateur réseau un tant soit peu attentif, c'est pour cela qu'il existe de nombreuses variantes techniquements plus poussées permettant de camoufler le scan15. Le plus connu et le plus abouti des programmes implémentant ces techniques se nomme nmap (http://www.insecure.org/nmap), chaque administrateur réseau devrait l'utiliser de temps en temps, pour se rendre compte de ce que son réseau laisse transparaître comme informations.
Citons parmi ces techniques celle dites du SYN Scan qui va commencer une connection TCP en envoyant un datagramme avec le flag SYN, et qui renverra un paquet RST en réponse à un SYN/ACK du serveur (si le port n'est pas ouvert le serveur renvoie un RST, il est donc inutile de répondre) (cfr pt 3.1.e tiret 4, le protocle TCP, méthode de connection). Ainsi on ne crée jamais de connection complète tout en sachant quels sont les ports ouverts sur la machine. Cette méthode présente le double avantage immédiat qu'elle est plus rapide (envoi d'un paquet au lieu d'un three way handshake classique), et beaucoup plus discrète (le serveur n'enregistrant pas les tentatives de connection abortées).
Une fois que le pirate sera informé des services tournant sur la machine, il va tenter de se connecter à ceux-ci pour déterminer le logiciel et la version de celui-ci sur la machine. Ensuite il pourra utiliser des bases de données tel que celle de http://www.securityfocus.com (qui héberge le fameux bugtraq) et http://www.packetstormsecurity.com pour vérifier si la version installée présente une faille connue qu'il pourra exploiter.
Mais il existe une autre information capitale que voudra absolument récupérer tout agresseur, il s'agit de l'OS sur lequel fonctionne le système ciblé. En effet, l'OS va conditionner toute la stratégie qu'un pirate adoptera. De plus une faille sur un Microsoft Windows NT® ne fonctionnera pas de la même façon que sur Sun Solaris® ou sur un système GNU/Linux. Il existe pour cela une méthode très efficace, nommée IP Stack Fingerpting (Prise d'empreinte de la pile TCP/IP). Elle se base sur le fait que les différents OS n'implémentent pas de la même manière les protocoles IP et TCP. La plupart des OS répondront différement si on leur envoie des paquets anormaux ou bizzares (par exemple avec tous les flags mis à 1, ou les flag SYN et FIN ensembles), il est donc facile de construire une base de données des réponses de la pile TSP/IP en fonction de l'OS et de deviner quel OS est installé sur une machine cible (Voir l'Annexe V pour le document de référence concernant cette technique).
Démonstration sur mon résau local d'une prise d'empreinte de pile doublé d'un SYN Scan TCP avec le logiciel nmap:
# nmap -sS -O 169.59.27.6/24
Starting nmap V. 2.54BETA34 ( www.insecure.org/nmap/ )
Interesting ports on ED.FAMILY (169.59.27.6):
(The 1552 ports scanned but not shown below are in state: closed)
Port State Service
21/tcp open ftp
515/tcp open printer
631/tcp open ipp
6000/tcp open X11
Remote operating system guess: Linux Kernel 2.4.0 - 2.4.18 (X86)
Uptime 0.361 days (since Tue May 14 15:05:36 2002)
Interesting ports on ROUTER.FAMILY (169.59.27.7):
(The 1555 ports scanned but not shown below are in state: closed)
Port State Service
22/tcp open ssh
Remote operating system guess: Linux 2.1.19 - 2.2.19
Uptime 6.298 days (since Wed May 8 16:36:28 2002)
On voit clairement que nmap a correctement identifié les ordinateurs du réseau local (ED: Linux 2.4.16 et ROUTEUR: Linux 2.2.19) ainsi que les ports ouverts avec leurs services associés. Il existe des techniques permettant de tromper les outils comme Nmap, par exemple en modifiant manuellement la pile réseau de la machine (souvent utilisé par les IDS).
Une fois la cible étudiée sous toutes ses coutures, notre pirate potentiel passera à l'attaque proprement dite, c'est à dire la pénétration du réseau et d'un ou des systèmes qui le composent. On ne peut malheureusement pas généraliser cette étape car elle ne se produit jamais deux fois de la même façon. Mais, assez souvent, on peut déduire deux tendances:
Si le pirate tente une attaque de l'extérieur, peu de choix s'offrent à lui. A moins d'une politique de sécurité à ce point excécrable qu'elle mettrait en danger la survie même d'un service informatique quelconque, un agresseur ne pourra compter que sur ce que nous décidons de lui fournir, c'est à dire les services que nous laissons accessibles à l'extérieur du réseau (souvent des services que nous laissons accessibles pour Internet, ex: un serveur Web, un serveur FTP, un serveur de messagerie, etc.).
Malheureusement, la plupart des programmes que nous utiliserons légitimement pour assurer un service sur un système peuvent facilement se retourner contre nous. En effet, ces logiciels, même s'il sont utilisés à grande échelle, ne sont pas exempts de bogues. Et ces bogues, peuvent parfois permettre à l'attaquant de compromettre le système visé dans son entier.
Nous allons voir deux exemples de techniques qui permettent de rentrer sur un système informatique illégitimement, en abusant des services que celui-ci fournit. Rapellons tout de même qu'il ne s'agit ici que de 'proof of concept' (littéralement, preuve de concept, voir lexique), et qu'il est bien entendu illégal de faire ce qui suit sur un système qui ne dépendrait pas de vous (il peut même s'agir d'une motivation de renvoi si vous testez ceci dans votre entreprise sans la permission expresse de l'administrateur).
Dans tout système informatisé, la première faille est toujours la composante humaine. Il est tellement plus facile de tromper un homme qu'une machine correctement sécurisée que c'est même la faille la plus dangereuse pour votre réseau. Un simple coup de fil ou email provenant d'une personne réputée sûre (l'administrateur réseau, le patron de la société, le technicien en charge de la maintenance) permet souvent de récupérer des passwords vitaux pour le réseau.
Cette méthode s'apparente à de la manipulation, un pirate se faisant passer pour quelqu'un d'autre prendra un ton généralement ascendant sur son correspondant, l'inondant de termes techniques et lui promettant les pires problêmes s'il n'accède pas à sa requête.
Au delà de l'anectode, cette méthode a fait ses preuves de nombreuses fois, il est donc indispensable de sensibiliser les gens qui accédent à un système informatique dont vous êtes responsable afin qu'il ne fasse pas confiance à n'importe quel quidam même s'il se présente comme étant quelqu'un d'important, et vous même devez être très attentif quand quelqu'un demande des informations qui ont un caractère confidentiel.
On comprend ici tout l'intérêt que peuvent prendre les informations de type identitaires qu'un pirate aurait récolté au point 3.1.A tiret 1.
L'exemple le plus connu de ce genre de problême est le débordement de tampon (Buffer Overflow ou BO). Ce bugs se présente lorsqu'un programme n'alloue pas assez de mémoire pour stocker une donnée en mémoire, et lorsqu'il écrit trop de données sur cet emplacement trop petit. Il va alors écrire sur des zones de la mémoire occupées par d'autres données. Jusque là rien de bien dramatique du point de vue de la sécurité, juste un beau plantage en prévision. Seulement voilà, si les données que le programme écrit sur les zones mémoires non allouées à cet effet sont envoyées par un pirate, il peut inclure dans celle-ci un code malicieux, qui, dans certaines conditions, sera exécuté par la machine. Ainsi donc, notre pirate pourra exécuter n'importe quel code sur la machine (le plus souvent ce code lui donnera accès à un terminal, ou shell). Vous pouvez trouver en Annexe VI un document plus complet et relatif au BO.
Pratiquement, il suffira à notre pirate, qui aura identifié dans la phase A du présent chapître un programme vulnérable à un tel problême, de trouver et d'exécuter un bout de code lui donnant l'accès complet au système. Cette technique est assez simple à mettre en oeuvre, et n'importe quel débutant pourra utiliser les codes faits par d'autres, trouvés sur des sites de sécurité.
La plupart du temps, le point vulnérable d'un réseau est le serveur Web lui même, car:
Il est accessible depuis l'extérieur légitimement (sinon pourquoi mettre un serveur Web), ce qui n'est pas toujours le cas du reste du réseau (comme nous le verrons plus loin).
L'essor des technologies basé sur le World Wide Web de ses dernières années a fait gagner les serveurs Web tel qu'Apache et Microsoft IIS en une complexité jamais égalée jusqu'à présent. Or la complexité d'un logiciel implique forcément des risques plus grands pour la sécurité.
De nombreux serveurs Web sont configurés par défaut avec toute une panoplie d'outils non-indispensables, tel que les CGI, qui comportent bien souvent des failles de sécurité importantes, laissant un agresseur accéder à un terminal sur le système, et donc méne au piratage de celui-ci.
Il existe des outils simples, gratuits et légaux, utilisables par le premier quidam venu pour scanner un serveur Web à la recherche de CGI vulnérable à des bogues connus. Voici la démonstration d'un de ces scanner de CGI sur un site (exemple réel):
$ ./cgiscan www.bhz.be
CgiScan 2
Cree par SpaceWalker pour le clan BHZ (www.thebhz.org)
d'apres CGIScan de Asmodeus en Perl
Version 1.92-linux
server on www.bhz.be:80... Apache/1.3.20 (Unix) PHP/4.0.5
/cgi-bin/... Access denied
/cgi-bin/Count.cgi... FAILLE
/cgi-bin/test-cgi... FAILLE
/_vti_pvt/... Access denied
/_vti_pvt/administrators.pwd... Access denied
/_vti_pvt/authors.pwd... Access denied
/_vti_pvt/service.pwd... FAILLE
/_vti_pvt/users.pwd... Access denied
/../../autoexec.bat... erreur : 400
On peut voir directement les fichiers préssents, connus pour présenter des failles. Prenons par exemple le cas du fichier «/_vti_pvt/service.pwd», il s'agit en fait des passwords (cryptés) des utilisateurs frontpage16 du site. Il suffit de passer ce fichier dans un décrypteur de password (tel que John The Ripper17) pour assez rapidement se retrouver avec les passwords qui permettront à n'importe quel pirate d'accéder au système illégitimement:
$ ./john -show service.pwd
bhz:belgian
hackers:hackers
ftp:say
guest:fuck
root:to
mysql:lamers
Bien évidemment l'exemple donné ici relève de la blague, ce serveur, bien que réel, a été configuré exprès pour laisser apparaître de soi-disant failles. Mais il existe encore beaucoup de serveurs prèsentant des failles similaires, bien réelles celles-là.
Comme nous venons de le voir, il existe de nombreuse failles que peut exploiter un pirate pour s'immiscer dans un réseau externe. Mais il arrive fréquement que l'agresseur vienne du réseau interne lui même, qu'il s'agisse d'un pirate infiltré sur une des machines, d'un veilleur de nuit un rien trop conscencieux, ou d'un employé désirant se venger de son patron. Tout cela nous oblige à considérer les faits d'un autre oeil, car les possibilités qui s'ouvrent alors deviennent beaucoup plus importantes.
Si nous considérons que l'agresseur à un accès physique au réseau (que ce soit les cables ou les machines), les possibilités qui s'ouvrent à lui sont bien plus importantes. En effet, il ne devra plus se contenter d'essayer de trouver un service exploitable sur la machine mais pourra prendre l'initiative, qu'il agisse de manière active ou passive.
Si notre pirate a un accès physique à un système présent sur le réseau, ou même s'il peut se connecter sur les cables de celui-ci, il pourra assez facilement pratiquer le Sniffing, c'est à dire l'interception systèmatique des paquets Ethernet passant a sa portée.
En effet, sur un réseau local de type Ethernet, comme nous l'avons vu, chaque paquet possède l'adresse MAC de la machine destinataire. Les interfaces réseaux recevront tous les paquets, mais ne passeront que ceux qui les concernent à la couche supérieure de la pile réseau (la plupart du temps la pile IP du système d'exploitation). Oui, mais seulement voilà, ce comportement peut facilement être changé. Il est très facile de configurer sa carte réseau pour qu'elle passe TOUS les paquets à la couche supérieure de la pile, même si ceux-ci ne lui sont pas du tout destinés.
On voit tout de suite le problème de sécurité que cela pose, en effet une machine réseau peut intercepter tout le trafic passant sur celui-ci (données, mot de passe, etc.) sans que cela ne soit remarquable pour les autres machines du résau. C'est pour cela que cette méthode est dite passive.
Il existe de nombreux outils permettant de sniffer son réseau, et en coder un soi même n'est pas très dur. Voici un exemple d'utilisation avec un programme que j'ai fais moi même, très simple d'utilisation (mais sans aucune option intéressante je le crains), il se contente d'afficher les paquets traversant le réseau en forme hexadécimal et sous forme de chaîne de caractères:
# ./snif
Simple Network Sniffer v0.1
Coded by GRIm@ (thegrima@altern.org)
(...)
00 04 00 01 00 06 00 50 ba bb 32 16 00 00 08 00 | .......P..2.....
45 00 00 a7 89 d5 40 00 40 06 ed bd a9 3b 1b 06 | E.....@.@....;..
50 43 ae 39 a3 f2 00 50 d2 1c 81 4c d6 d5 63 60 | PC.9...P...L..c`
80 18 16 d0 a0 0b 00 00 01 01 08 0a 00 dd f6 f1 | ................
02 a9 37 91 43 6f 6e 74 65 6e 74 2d 74 79 70 65 | ..7.Content-type
3a 20 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d | : application/x-
77 77 77 2d 66 6f 72 6d 2d 75 72 6c 65 6e 63 6f | www-form-urlenco
64 65 64 0d 0a 43 6f 6e 74 65 6e 74 2d 4c 65 6e | ded..Content-Len
67 74 68 3a 20 34 34 0d 0a 0d 0a 65 6e 74 72 65 | gth: 44....entre
65 5f 75 73 65 72 3d 74 68 65 67 72 69 6d 61 26 | e_user=thegrima&
65 6e 74 72 65 65 5f 70 61 73 73 3d 89 7c 21 58 | entree_pass=mon-
7c 35 7d 51 | pass
Le paquet ici affiché est celui que mon sniffer à intercepté quand j'ai tenté d'aller lire ma boîte e-mail (j'ai, bien entendu, modifié manuellement le password ici, mais le reste du paquet est authentique). Comme on peut le voir, le password transite en clair sur le réseau, et n'importe qui peut l'intercepter pour autant qu'il sache quoi chercher.
Les passwords email ne sont pas les seules données importantes qui transitent sur le réseau, on peut aussi citer tous les password d'administration a distance, de compte FTP, etc. Et bien entendu les données brutes comme par exemple les emails eux-même...
Nous venons de voir les dangers que pouvait présenter une agression passive du réseau local, mais bien souvent le but d'un agresseur quel qu'il soit sera de mener une action bien concrète, après avoir compromis la sécurité du réseau, il va sûrement tenter une attaque active, en devenant lui même un acteur, c'est ce dont nous allons parler maintenant.
La technique dite du détournement de session (ou Spoofing) va permettre à un agresseur de se faire passer pour quelqu'un d'autre sur le réseau dans le but de gagner des priviléges auxquels le système informatique ne lui donnerait pas accès autrement.
Comment cela fonctionne t'il ? De la même manière que nous pouvons facilement faire passer notre interface réseau dans un mode de réception des paquets qui ne lui sont pas destinés (voir le point précédent), nous pouvons faire envoyer des paquets à notre interface réseau qui ne proviennent pas de nous.
Rappellez-vous que ce qui identifie l'émetteur d'un paquet c'est l'adresse IP contenue dans le champ Source (et aussi l'adresse MAC du paquet ethernet mais nous ne parlerons ici que de spoofing IP, pour un exemple de spoofing Ethernet, reportez vous au point suivant) de ce paquet. Or, il est très facile de créer soi-même des paquets et de changer l'adresse IP source, ainsi toutes les autres machines du réseau croiront à un paquet légitime venant de la personne dont nous volons l'identité.
Notons au passage qu'il n'est pas obligatoire que l'identité que nous volions soit réelle, ou que le système qui la possède soit actuellement opérationel. Au contraire, il est préférable (toujours du point de vue de notre pirate bien sûr) que la machine à qui il vole son adresse IP ne soit pas active, sinon elle risquerait d'annuler les transmissions avec des paquets TCP/RST intempestifs, voire même cela pourrait mettre la puce à l'oreille de l'administrateur réseau. Il existe des techniques qui permettent de désactiver temporairement un hôte sur le réseaux, nous en parlerons dans le point 3.2.
Les avantages que pourrait en retirer un pirate sont de deux ordres. Premièrement il pourra sans doute passer sans trop de difficulté certaines des protections mises en place par l'administrateur réseau; deuxièmement, il pourra accéder à un terminal à distance sur une des machines grâce au protocole rlogin18.
Pratiquement, cette technique devra être combinée avec celle du sniffing, puisque, rappelez-vous le principe du TCP une connection ne pourra se faire que si l'agresseur recoit la réponse du serveur puisque celle-ci contiendra les numéros SEQ (l'ISN) nécessaires pour renvoyer le prochain paquet. Si on envoie une fausse adresse IP, nous ne recevrons bien entendu pas la réponse, puisqu'elle ne nous sera pas destinée. Par contre en sniffant le réseau, il sera possible d'intercepter la réponse et d'envoyer le paquet suivant, toujours en modifiant l'adresse IP source, comme si de rien n'était.
Notons également que cette technique est utilisable même quand on ne se trouve pas dans le réseau local, mais par exemple sur l'Internet. Mais elle se décline sous une forme différente. En effet sur Internet, nous ne pourrons récupérer les paquets réponses du serveur qui ne nous sont pas destinés en les sniffant, vu qu'ils seront automatiquement routés par le protocole IP vers leur destination normale. Le principe, nommé Blind Spoofing (détournement de session en aveugle), se base sur le fait qu'il est (parfois) possible de deviner les numéro d'ISN que va générer le serveur que nous essayons de tromper. Ainsi si on devine ce numéro, on peut quand même assurer une connection et envoyer des commandes à un terminal même si nous ne recevons jamais les réponses. Noter qu'en Annexe VII se trouve un excellent document sur le sujet, faisant une analyse statistique et résumant très clairement cette technique.
Un problème évident apparait avec les méthodes précédentes dès qu'on essaye de l'appliquer dans le cadre d'un réseau switché (et la plupart des réseaux de taille moyenne le sont). En effet, le switch ne va pas renvoyer les paquets qui ne nous sont pas destinés puisqu'il pensera qu'ils sont destinés à quelqu'un d'autre. Nous ne pouront donc pas les sniffer puisqu'ils ne passeront pas sur notre branche du réseau local.
Il existe une technique permettant de résoudre ce problème (toujours du point de vue de l'agresseur bien entendu), il s'agit de l'ARP Cache Poisoning (infiltration du cache ARP). Cette technique se base sur le fait que les switchs pour décider de la route que doit emprunter un paquet vont consulter une table de routage, régulièrement mise à jour, située dans leur mémoire interne. L'idée de l'attaque est donc d'inscrire de fausses informations pour que le switch pense que l'adresse IP que nous tentons de spoofer se trouve bel et bien sur le même brin local que la machine attaquante.
Pour ce faire, le pirate va envoyer des requêtes ARP complètement spoofées, aussi bien au niveau des adresses MAC sources, que des adresses IP. Le switch, transférant ces requêtes ne manquera pas de mettre à jour sa table de routage avec ces nouvelles (mais fausses) informations. Ainsi lorsque notre pirate tentera son détournement de session IP, le switch lui renverra les paquets qu'il pourra tranquillement intercepter.
Cette technique en amène une autre, l'attaque du Man In the Middle (MiM). Celle-ci à lieu, lorsque, combinant toutes les techniques que nous venons de voir (interception de paquet, détournement de session et ARP Cache Poisoning), un attaquant va s'infiltrer entre un client et un serveur.
Imaginons un client A, un serveur B, et un pirate X. Lorsque A va vouloir communiquer avec B (par exemple pour récupérer ses emails ou une page web), X va intercepter la connection, et s'assurer que B ne recoive jamais la demande. X va alors engager une connection avec B et une fois celle-ci établie, renvoyer à A une fausse connection (en la spoofant). Dès que A ou B veulent s'envoyer des informations, X les intercepte, les analyse (et en garde ce que bon lui semble), les modifie éventuellement, puis les renvoie à l'autre qui n'y voit que du feu. A et B sont persuadés de communiquer directement l'un avec l'autre, pourtant toutes les données transitent par X, qui peut les modifier à loisir !
Toutes ces techniques internes à un réseau (puisque reposant sur Ethernet) combinées avec les techniques externes (qui restent bien entendu exploitables depuis l'intérieur d'un réseau) vont assez facilement permettre à un agresseur quelconque de récupérer des accès non autorisés sur des systèmes importants du réseau (souvent les serveurs web, mail, ftp, etc.).
Une fois son forfait accompli, le pirate va bien entendu tenter de se camoufler et de garder ces accès privilégiés (sauf si son action n'est que purement destructive, et dans ce cas il ne prendra aucune peine à se cacher). Ce sont d'ailleurs les techniques les plus vicieuses, car elle ne ménent pas au changement pendant quelques heures d'une page web, ou au vol de quelques informations, mais en s'infiltrant, le pirate va compromettre systématiquement toutes les données de votre réseau (et donc toute l'utilité que vous pouvez en avoir). C'est le sujet dont nous traiterons dans le point suivant.
Autant le dire tout de suite, ces techniques sont généralement de très haut niveau technique, je m'abstiendrai donc d'en montrer les détails de fonctionnement, préférant les exemples et en satisfaisant à une explication toute théorique (mais malheureusement surfaite). Le fait est que si un pirate est réellement infiltré sur votre réseau, vous ne pourrez plus croire quoi que ce soit sur vos systèmes. Les données sur le réseau peuvent être modifiées à la volée, votre système peut vous cacher des informations et vous mentir délibérement. En fait il n'existe pas vraiment de limite à ce qu'un pirate est capable de modifier, sinon le temps qu'il y consacrera.
Les chevaux de Troies (ou backdoor) sont simples. Il s'agit de programmes piégés (d'ou la référence au fameux piège de l'antiquité qui fit tomber la fière ville de Troie) laissés par l'agresseur après son départ. Leur exécution à distance va garantir au pirate de pouvoir réaccéder au système, ou de pouvoir le contrôler à distance. Souvent ces programmes sont identifiés comme des virus par les logiciels d'Anti-Virus, il s'agit d'une erreur commune. Certains de ces programmes sont devenus très connus, et sont passé dans le domaine commercial pour devenir de grands programmes d'administration à distance.

Le
très fameux Netbus, qui permet de controler un Windows à
distance
Notons tout de même que ces programmes sont très peu discrets, facilement détectables et il est facile de s'en débarrasser. Il n'empèche qu'ils restent très utilisés, sûrement pour le coté ludique de la chose (plop j'ouvre ton lecteur cd-rom...).
Un véritable hackers qui pénêtrerait votre réseau et votre système emploierait des méthodes beaucoup plus discrètes, il modifierait directement votre système d'exploitation. Il est en effet possible (bien que techniquement difficile) de modifier les fichiers qui font la base du système d'exploitation, et cela aussi bien sous des systèmes propriétaires (Microsoft Windows toutes version, Sun Solaris, Unix System V, ...) qu'Open Source (GNU\Linux, *BSD, ...), que vous fonctionniez en plateforme IBM PC Compatible (architecture Intel) ou sous des architectures comme Sparc.
La diversité des systèmes d'exploitation et des architectures qui existent interdisent toute tentative de généralisation en la matière. Pourtant nous pouvons quand même dire qu'il s'agit généralement d'un module chargé dans le noyau du système d'exploitation, laissant au hacker toute liberté, il peut au choix cacher des programmes, des fichiers, des ressources de son choix au regard de l'administrateur. De la même manière il peut s'assurer un accès total et complet au système depuis l'extérieur en implémentant des backdoors directement dans la couche réseau du système. En fait il n'existe que la limite de ce qui est possible avec un ordinateur.
Notons également l'arrivée récente de pack complet permettant au premier venu d'installer ce genre de modification. Ces packs, dénommés rootkits permettent d'installer très facilement des backdoors hier encore réservés à une certaine élite de pirate. Heureusment pour nous, ces rootkits sont facilement identifiables, et la plupart des gens les utilisant n'ont pas les compétences requises pour les modifier, vous n'aurez donc pas trop de mal en temps qu'administrateur à les repérer et les éliminer.
Si vous désirez approfondir le sujet, voici une liste de liens que vous pourrez consulter à toutes fins utiles:
Une compilation des meilleurs textes Anglais: http://ouah.sysdoor.net/textes18.html
Modules du noyau linux indétectables: http://ouah.sysdoor.net/spacelkm.fr.txt
Root-kit et intégrité: http://ouah.sysdoor.net/rkths.html
Analyse du Root Kit KNARK: http://ouah.sysdoor.net/RootkitKNARKfr.htm
Détection du rootkit ADORE: http://www.hsc.fr/ressources/breves/adore.html
Analyse de la rootkit Ombra: http://ouah.sysdoor.net/Analyse_omnbra_txt.html
et de nombreux autres que vous trouverez sans mal sur Internet.
Le deni de service (ou Denial of Service soit DoS) est une attaque de type paralysante, elle va compromettre la disponibilité de votre réseau ainsi que mettre en danger les ressources de vos systèmes (temps CPU, utilisation de la bande passante, l'espace disque, etc.).
La technique du Denial of Service, apparue en 1987, consiste à envoyer des requêtes à un serveur afin de l'immobiliser et de le rendre inactif. L'attaque se faisant sur des services déterminés elle visera donc des ports précis.
Pour cela, l'attaquant va envoyer (via des logiciels appropriés) d'énormes flots de données, des requêtes (valides ou invalides) sur le port ciblé. Le serveur va tenter de traiter ou d'interpréter ce flux, ce qui va provoquer une forte consommation de ses ressources.
Le résultat peut aller d'une consommation importante des ressources CPU jusqu'à un blocage total du serveur. Il n'est plus alors en mesure de répondre à toutes les requêtes, et les services qu'il fournit normalement ne sont donc plus visibles par les clients. Il est en général nécessaire de relancer le serveur pour rétablir une utilisation normale.
Le résultat sera différent selon l'attaque utilisée. De nombreux types d'attaques DoS existent, cela va du simple flood (envoi massif de données) jusqu'à des techniques extrêmement pointues (modification des tables de routages, attaque via un IP spoofé, ...).
Un exemple de technique dévastatrice est l'envoi d'une requête ICMP Echo (un ping) à plusieurs serveurs Broadcast en spoofant l'adresse IP de la victime ciblée. Ces serveurs de broadcast ont la particularité de re-router la requête à tous les ordinateurs de leur classe réseau, qui eux-mêmes vont chacun répondre à la requête par un ICMP (mais vers l'adresse IP que nous avons spoofée, donc la cible).
Ainsi en envoyant quelques simples paquets aux serveurs de broadcast, la victime va recevoir plusieurs dizaines de milliers de réponses, les effets allant d'un ralentissement de la connexion jusqu'au blocage pur et simple. Cette attaque porte le nom de smurf.

Illustration
d'une attaque de type Smurf
Avec ce schéma (simpliste) on constate que pour 2 paquets envoyés par l'attaquant, la victime en recevra 15000. Ainsi, avec 1000 pings envoyés la cible en recevra 7.500.000. De quoi saturez trés facilement n'importe quel serveur.
Le déni de service distribué ou "Distributed Denial of Service" (DDoS) est un phénomène apparu à grande échelle en 1999. Cette technique est bien connue pour avoir été utilisée contre les sites d'Amazon.com, de Yahoo, de CNN, d'eBay et le site du Washington Post, les paralysant pendant plusieurs heures (ce qui pour un site commercial ne reprèsente pas un grand danger en lui même, mais imaginez que l'attaque se soit portée sur les serveurs des gestionnaires du trafic aérien ou d'un hopital...).
Le principe de l'attaque repose sur quatre acteurs (qui sont des programmes informatiques):
Le "commanditaire" qui émet une requête d'attaque,
le "chef de bande" qui reçoit la requête et ordonne son exécution,
ses "agents" qui vont réaliser l'attaque selon les ordres et retransmettre les résultats au maître, mais sans connaître le "commanditaire".
Finalement la "victime" qui est la cible de l'attaque.
Chaque agent réalise une partie de l'attaque, mais si un agent est "découvert" et bloqué par la victime, un autre peut prendre la rélève. Quant à la technique d'attaque finale, elle est configurable : smurf, flood, ...
Généralement les agents sont des backdoors sur des systèmes piratés au préalable et qui ne s'activeront que quand l'attaque aura été lancée.
Notons que cette attaque même si elle ne fait pas de dégât en elle même (paralyse juste l'infrastructure informatique) (bien qu'encore une fois cela dépend de la cible) est assez dangereuse, car elle ne peut être prévenue d'aucune façon. En fait il n'existe pas de réel moyen de s'en protéger, même une fois celle-ci commencée, excepté par des actions judiciaires19 qui sont évidemment d'une lenteur inimaginable par rapport à la réalité des réseaux informatiques.
La confidentialité, l'intégrité et la disponibilité, peuvent, comme nous venons de le voir, être compromis par une attaque délibérée d'une personne quelle qu'elle soit. Mais il existe un autre type de risque, autrement plus discret et perfide. Une attaque peut provenir d'une source non humaine, ou autrement dit d'un programme informatique. Nous arrivons sur le terrain surmédiatisé des virus informatiques.
La plupart d'entre nous sont familiers avec le terme virus informatique. Même ceux qui ne savent pas utiliser un ordinateur ont entendu parler de virus à travers les films hollywoodiens tels que Independence Day ou Hackers (bien que la description d'Hollywood soit généralement très inexacte). Des magazines et des journaux internationaux ont régulièrement parlé des menaces de virus à la Une. Il n'y a aucun doute que notre culture est fascinée par le danger potentiel de ces virus.
Malgré notre conscience des virus informatiques, combien d'entre nous peuvent définir ce qu'est un virus informatique ou comment il infecte les ordinateurs ? Commencons donc par quelques explications pour démystifier toute la démagogie qui a été faite sur le sujet.
Un virus est un petit programme situé dans le corps d'un autre, qui, lorsqu'on l'exécute, se charge en mémoire et exécute les instructions que son auteur a programmé. La définition d'un virus pourrait être la suivante: "tout programme d'ordinateur capable d'infecter un autre programme d'ordinateur en le modifiant de façon à ce qu'il puisse à son tour se reproduire".
Les virus vont de la simple balle de ping-pong qui traverse l'écran, au virus destructeur de données. Ce dernier étant la forme de virus la plus virulente. Ainsi, étant donné qu'il existe une vaste gamme de virus ayant des actions aussi diverses que variées, les virus ne sont pas classés selon leurs dégâts mais selon leur mode de propagation et d'infection (et certains virus appartiennent donc à plusieurs catégories).
On distingue ainsi plusieurs types de virus :
les vers qui sont des virus capables de se propager à travers un réseau (ex: Nimbda, Code-Red)
les bombes logiques qui sont des virus capables de se déclencher suite à un événement particulier (date système, activation distante, ...). Ceux ci se distinguent eux-même en trois catégories:
les virus parasites:
Ils s'attachent à des programmes. Lorsqu'un utilisateur lance un programme qui a un virus parasite, le virus est discrètement exécuté en premier. Pour masquer sa présence à l'utilisateur, le virus déclenche alors l'ouverture du programme original (ex: CIH, Anthrax).
les macro-virus:
Ce sont des macros qui se répliquent toutes seules. Si l'utilisateur accède à un document contenant une macro virale et qu'il l'exécute inconsciemment, le virus peut alors se copier tout seul dans les fichiers de démarrage de l'application. N'importe quel document sur cette machine utilisant la même application pourra alors devenir infecté. Si l'ordinateur infecté est sur un réseau, l'infection est susceptible de se propager rapidement sur les autres machines du réseau.
Le virus macro est le type le plus courant de virus. La plupart des applications modernes permettent d'écrire des macros donc des virus, même avec peu de connaissances spécialisées. La raison principale de leur 'succès' est l'échange beaucoup plus fréquent des documents que celui des exécutables, un résultat direct de la popularité du courrier électronique et de l'utilisation du Web. Notons que les fameux virus « I Love You » et « Melissa » sont des macro virus utilisant les applications de Microsoft (Outlook particulièrement), et que malgré la publicité qui en a été faite ils étaient assez innofensifs (du moins les premières versions).
les virus de démarrage:
Un virus de secteur de démarrage infecte les ordinateurs en modifiant le contenu du programme du secteur de démarrage. Il remplace le contenu légitime par sa propre version infectée. Un virus de secteur de démarrage peut uniquement infecter une machine s'il est utilisé pour démarrer la machine, exemple : si vous démarrez votre ordinateur en utilisant une disquette avec un secteur de démarrage infecté, votre ordinateur est susceptible d'être infecté.
Les virus polymorphes, étant donné que les antivirus détectent (entre autres) les virus grâce à leur apparence (la succession de bits qu'ils représentent), certains créateurs de virus ont pensé à leur donner la possibilité de modifier automatiquement leur apparence, tel un caméléon. Ce type de virus est appelé virus polymorphe.
D'après les éditeurs d'antivirus il existerait environ 15000 à 20000 virus, dont à peine une centaine seraient réellement actifs
Depuis quelques années un autre phénomène est apparu, il s'agit des canulars (en anglais hoax), c'est-à-dire des annonces reçues par mail (par exemple l'annonce de l'apparition d'un nouveau virus destructeur) accompagnées d'une note précisant de faire suivre la nouvelle à tous ses proches. Ce procédé a pour but l'engorgement des réseaux ainsi que la dèsinformation (probablement orchestrée par les entreprises d'anti-virus qui tirent un grand profit de la panique que créent les virus).
Comme nous le voyons, il existe toute une panoplie de virus, mais ils sont loin de créer beaucoup de dégâts. Le risque principal des virus vient de l'utilisation massive par les entreprises et les particuliers d'outils bien connus et mal sécurisés (et nous ne citerons pas de nom).
Après avoir parlé de ce qui pouvait potentiellement mettre en danger un réseau, nous allons maintenant nous attacher à définir des procédures qui pourront garantir la sécurité d'un réseau.
Lorsque la question de sécuriser un réseau se pose, la meilleure façon de recourir est encore de prendre une feuille de papier et, avec les utilisateurs le réseau, définir ensemble une politique de sécurité. Cette politique est un ensemble de règles qui définissent ce qui est autorisé, selon les besoins, et ce qui est interdit (en principe tout le reste). Elle doit également définir qui est responsable de quoi et qui doit agir en cas de problèmes (technique ou administratif). Les outils mis en place par la suite respecteront cette politique de sécurité, et devront même la refléter.
Une politique de sécurité doit se faire avec les utilisateurs, ils doivent comprendre cette politique et respecter un certain nombre de règles en relation avec celle-ci. Par exemple, il paraît évident qu'ils ne doivent communiquer leur login et mot de passe à personne, pas même à leurs collègues. De même, il est bien connu qu'il ne faut pas ouvrir les fichiers attachés au email venant de personnes inconnues où dont le contenu est suspect. Des notes d'informations devront sensibiliser les utilisateurs. Ces règles doivent s'appliquer à tous, y compris à l'administrateur du réseau...
Par la sensibilisation et le respect des règles par tous, la majorité des problèmes seront évités et toutes les attaques de type Social Engeenering échoueront. C'est donc un point à ne jamais négliger.
Une autre donnée à garder en mémoire lors de la définition de la politique de sécurité, est que plus la politique sera restrictive et plus il sera difficile d'utiliser le réseau et les systèmes informatiques associés. Une bonne politique doit donc toujours être un compromis entre sûreté et facilité d'utilisation du réseau.
L'implentation des systèmes, la typologie du réseau et les connections vont fortement dépendre de la politique que nous aurons définie. Pour implémenter pratiquement cette politique, la meilleure solution consiste à adopter une architecture basée autour d'une zone tampon nommée Zone Démilitarisée ou DMZ.
Cette zone servira de tampon entre le réseau local et les réseaux externes (Extranet ou Internet). Elle contiendra également les serveurs (comme les serveurs web, de messagerie, etc.). Tous ce qui transitera comme information dans cette zone devra être considéré comme non sûr, ce qui explique comme vous pouvez le voir sur l'illustration, que l'entrée et la sortie sont bloquées par un firewall qui va filtrer les requêtes en accord avec la politique définie pour le réseau.

Schéma d'une DMZ
Imaginons que ce schéma représente l'architecture réseau d'une entreprise moyenne, une politique de sécurité acceptable pourrait être:
Le firewall en entrée (celui du haut) laisse passer les requêtes venant d'Internet pour les serveurs Web et de messagerie. Par contre il bloque toutes les autres tentatives de connection venant de l'Internet. De la même manière il bloque toute tentative de connection sortante, sauf évidemment celle du serveur Web, du serveur de mail et du proxy pour permettre à l'intranet d'accéder à Internet.
Le Firewall en sortie (celui du bas) va interdire toutes les connections de la DMZ vers l'intranet. Dans un même temps il va empêcher toutes les connections depuis l'intranet vers l'extérieur, sauf vers le serveur de mail et le proxy de la DMZ pour permettre aux systèmes de l'intranet de surfer et récupérer les -e-mails.
Le serveur de mail et le proxy sont équipé d'un puissant Anti-Virus régulièrement mis à jour.
Le serveur Web, Proxy et mail enregistrent toutes les connections pour garder des traces d'une éventuelle pénétration.
L'IDS correctement configuré et actif en permanence prévient l'administrateur réseau dès qu'une activité suspecte est détectée.
Avec une telle politique, Internet et l'Intranet sont complèteement isolés l'un de l'autre, aussi bien dans un sens que dans l'autre, gage d'une sécurité accrue. Tous les services passent par la DMZ, qui est filtrée et auditée en permanence. Avec une telle stratégie on peut éviter 95% des piratages. En effet, même si un hypothétique pirate parvenait à accéder à une machine de la DMZ, il ne pourrait accéder au réseau interne puisqu'il serait bloqué par le deuxiéme firewall. De plus son activité serait rapidement remarquée et identifiée par l'IDS ce qui permettrait de prendre les mesures adéquates.
On remarque tout de suite que la sécurisation du réseau va principalement dépendre de la configuration des firewalls. D'ou l'importance que l'administrateur doit accorder à cette tâche. Un firewall correctement configuré empêchera la majorité des attaques de type DoS, ainsi que les attaques directes contre vos serveurs.
Malgré une architecture très poussée, et une politique de sécurité sévère, le risque zéro n'existe pas. En effet l'utilisation même d'un service induit toujours un risque quant à son détournement.
Ce qui authentifie un utilisateur auprès d'un système informatique c'est la combinaison de son login (nom d'utilisateur) et de son password. Ces données sont des plus confidentielles, car si quelqu'un s'approprie le password d'un autre utilisateur, il devient cet utilisateur, il jouit des mêmes droits et accéde aux mêmes ressources.
C'est pour cela qu'il faut toujours sensibiliser les utilisateurs sur le choix d'un mot de passe. En fait, un bon mot de passe a deux caractéristiques contradictoires :
Il est facile à retenir par l'utilisateur: Le mot de passe lui rappelle quelque chose dont il se souvient sans peine.
Il est difficile à deviner par des tiers: En particulier, il est suffisamment long; il ne figure SURTOUT pas dans le dictionnaire. De plus, il n'a pas de rapport trop évident avec une caractéristique que les tiers connaissent (le nom du chien ou la plaque minéralogique, etc.).
Un utilisateur ne peut se créer que deux ou trois mots de passe qui conjuguent ces deux qualités. Au delà du troisième, ses mots de passe sont soit pas assez mnémoniques (la condition 1 n'est pas remplie), soit trop évidents (la condition 2 n'est pas remplie). Il vaut donc mieux ne pas imposer un changement de password trop régulier.
Ne pas imposer un changement de password impose que celui-ci soit particulièrementt bien choisi et difficile à trouver. Pour le vérifier, la meilleure méthode est encore d'utiliser John The Ripper20, un excellent programme qui va tenter de deviner les mots de passe. Si le programme découvre un de vos mots de passe, vous savez qu'il est grand temps d'en changer.
Pratiquement, un bon mot de passe ne fera jamais moins de 6 caractères (8 si possible) et comprendra des lettres en majuscules ET minuscules avec des caractères alphanumériques (des chiffres ou des symboles), ce qui le rendra pratiquement impossible à deviner.
Dans notre exemple précédent, un risque potentiel reste par exemple le serveur de mail. Comme nous l'avons déjà dit, les données transitant par la DMZ doivent être considérées comme non sûres, imaginons le cas où un pirate prendrait le contrôle d'une machine de la DMZ (par exemple le serveur web via une faille CGI), il pourra installer un sniffer sur cette machine et intercepter l'ensemble des données transitant sur celle-ci, et donc par exemple le contenu des emails (puisqu'il s'agit dans notre exemple du seul service que nous avons autorisé avec le proxy).
Il existe une méthode infaillible qui peut protéger vos données en général et vos email en particulier, la cryptographie. Aujourd'hui de nombreux logiciels intégrent des solutions pour faciliter l'envoi et la réception de messages chiffrés, il est donc tout à l'avantage de chacun de les utiliser. En effet un message crypté garanti que les informations ne peuvent ni être interceptées ni modifiées.
Le crypatge peut être appliqué a énormément de choses, par exemple pour l'administration distante d'un système, l'administrateur veillera à toujours utiliser un protocole tel que SSH, qui crypte les communications plutôt qu'un protocole tel que Telnet où les données (et particulièrement les passwords) passent en clair sur le réseau.
En utilisant de tels outils on empéche un pirate d'utiliser chacune des techniques que nous avons passé en revue, en effet il lui est impossible d'intercepter les données (ou du moins de les comprendre) ni de tenter une attaque Man in the Middle car il ne pourra répéter la signature cryptée unique du serveur qui permet de l'authentifier.

Avec
SSH, impossible d'être intercepté ou détourné
Une autre mesure de sécurité de base qui s'impose quels que soient vos choix en matière d'architecture pour votre réseau est de faire des sauvegardes ponctuelles et régulières de vos données. Cela peut sembler idiot de rappeler un principe aussi primaire, mais nombre d'administrateur réseau ne le font tout simplement pas (ou pas assez souvent) jusqu'au jour de la catastrophe...
Une sauvegarde régulière sur un support non volatil et réputé sûr (disque CD-Rom, archive ZIP, etc.) permettra sûrement de restaurer facilement les précieuses données en cas de sinistre (piratage, inondation, feu...). Elle s'avére INDISPENSABLE (et j'insiste) pour préserver un bien aussi précieux et volatil que des données informatiques.
L'administrateur d'un réseau est une personne avec beaucoup de responsabilité. Il est chargé d'assurer la fiabilité technique du réseau et de l'infrastructure qui tourne autour. En plus de cela, il est dans la très grande majorité des cas responsable de la sécurité du réseau, tâche qui pourtant (sur un réseau d'entreprise de taille moyenne) nécessite qu'une personne y soit entiérement dévouée.
L'administrateur va donc devoir, et ce quotidiennement, s'astreindre à certaines tâches ingrates mais qui garantiront la sécurité et la pérénité du réseau. Parmi ces tâches, on compte l'analyse régulière des logs (fichier ou un programme enregistre les évenements qui le concerne, dans ce cas-ci les connections, etc.) des serveurs, la mise à jour des anti-virus, etc...
Heureusement il existe des programmes qui se chargeront de ces tâches automatiquement, et qui fourniront un résumé journalier de leurs activités qu'il suffira de parcourir. Mais il existe encore d'autres tâches ou l'administrateurs devra toujours s'investir personellement, comme par exemple rester informé des dernières évolutions en matière de sécurité informatique (via des sites spécialisés comme le CERT21 et BugTraq22 ou par des newsgroups). Il devra également s'assurer que les logiciels utilisés par les systèmes qu'il administre sont à jour et ne possèdent pas de failles connues.
Un administrateur aura toujours besoin d'outils perfectionnés et puissants pour pouvoir surveiller son réseau. Un gros avantage est qu'il pourra toujours utiliser les même outils que les pirates pour vérifier sa propre sécurité (et donc ceux dont nous avons déjà parlé précédemment dans ce document). Voici ici une liste détaillée et non exhaustive d'outils qu'un administrateur réseau devrait souvent (voire toujours) utiliser:
Nmap : http://www.insecure.org/nmap
Nmap comme nous l'avons déjà vu est un outil permettant de scanner un réseau et d'afficher les services ouverts et les OS utilisés par les machines qui le composent. Il sera d'une grande utilité pour contrôler les système à administrer
tcpdump : http://www.tcpdump.org/
Tcpdump est assez unanimement considéré comme un des meilleurs programmes de sniff. Extrêmement configurable il sera utile non seulement pour réaliser un audit interne de sécurité mais aussi pour régler des problêmes techniques rencontrés lors de la maintenance du réseau.
Snort : http://www.snort.org
Snort est un IDS, un programme qui va analyser le trafic réseau et les statistiques du système sur lequel il est installé pour tenter de déceler une utilisation abusive et anormales. Un IDS est une pièce majeure dans la politique de sécurité, mais sa configuration reste toujours une phase compliquée.
Network Promiscuous Card Detector : http://public.grima.cjb.net/
Il existe plusieurs outils permettant de détecter si une machine de votre réseau intercepte les paquets illégitimement (malgré le fait que cette technique soit entiérement passive). L'outil proposé ici, dont je suis l'auteur, permet de tester tout un réseau ou une machine particulière. Voici un exemple d'utilisation (le mode promiscuous signfie qu'une interface est en train d'intercepter les paquets), et comme nous pouvons le voir, le programme permet de scanner un réseau entier et affiche les adresses IP et MAC des machines qu'il soupçonne d'intercepter les paquets (ici une machine de mon réseau délibérément placée dans cet état):

Network Promiscuous Card Detector à l'oeuvre
Un tel programme arrive à remplir sa tâche en envoyant des requêtes ARP incorrectes auxquelles seule une machine en train de sniffer répondra (il s'agit d'un bug dans l'implémentation d'ARP prèsent aussi bien sur des OS Microsoft Windows toutes versions que GNU/Linux et BSD).
Un outil tel que celui-ci permettra non seulement de voir si personne à l'intérieur du réseau ne tente de détourner un système de son utilisation, qu'il soit interne ou externe (un pirate qui se serait infiltré). Son exécution depuis une machine sûre permet de vérifier facilement si votre réseau n'a pas été infiltré.
Tous ces outils et leurs utilisations régulières, une configuration bien pensée et un suivi journalier permettront ainsi à un administrateur réseau (même s'il n'est pas expert en matière de sécurité) de garantir à 99% (le risque zéro n'existe jamais) l'intégrité et la sécurité de son architecture informatique.
Pourtant, dans les cas d'un service informatique vital (qu'il soit privé ou de service public), tel qu'un service bancaire, hospitalier, de gestion aérienne, etc. il est indispensable que des personnes correctement formées soient chargées à plein temps de la sécurité. Et même lorsque cela s'avise nécessaire et possible il est souvent utile de faire appel à une société externe, ce dont nous parlerons dans le point suivant.
L'intervention d'une entreprise externe (marché qui est d'ailleurs en pleine expansion) est souvent utilisée par des grosses et moyennes entreprises qui n'ont pas les moyens de former et entretenir une équipe complète d'experts en sécurité. L'appel à une telle société spécialisée permet de mettre en place ou de vérifier la fiabilité d'une politique de sécurité et du choix d'une architecture réseau. Pour cela, une telle entreprise va généralement procéder en trois étapes.
L'entreprise externe va procéder à une analyse technique (les points d'entrée sur le réseau, les équipements de sécurité, les protocoles mis en oeuvre, etc.) et organisationnelle (étude de la politique de sécurité, des procédures de définition, de mise en place et de suivi de la politique de sécurité), complèter des solutions que vous avez mises en places, et le cas échéant corriger des erreurs d'implémentation.
En réalisant des tests d'intrusion, une entreprise externe va mettre à l'épreuve l'infrastructure de sécurité en reproduisant tous les comportements malicieux employés par les pirates. Une liste de failles sera ainsi généralement dressée à partir d'une base de données de vulnérabilités. A l'issue de cette prestation, l'entreprise spécialisée pourra mettre en évidence les vulnérabilités spécifiques qui vont compromettre votre infrastructure réseau. Ainsi après un tel test vous pourrez apprendre des informations importantes pour la gestion futures de votre réseau tel que:
Un état des lieux détaillé de l'architecture comprenant les failles détectées et les attaques pouvant être menées,
Une liste de préconisations détaillées pour les éléments actifs déjà en place (mise à jour logiciel, configuration),
Des conseils sur l'architecture afin de renforcer son "niveau" de sécurité.

La
réalisation d'un audit par une entreprise externe peut rendre
bien des services
Si vous constatez une intrusion sur votre réseau, en plus d'entamer d'éventuelles poursuites judiciaires, l'appel à une société spécialisée permettra une analyse correcte de ce qui a été compromis et de ce qui a permis aux pirates de pénétrer votre système. Une telle analyse complémentaire, externe et objective est souvent nécessaire pour non seulement remettre en question la politique de sécurité actuelle qui n'a pas rempli son rôle mais aussi pour garantir la sécurité future de l'infrastructure informatique.
Dans la jungle d'informations (et de désinformations) qui circulent sur le sujet, ce document a pu (j'ose l'espérer) apporter un brin de dédramatisation à la quasi hystérie qui régne dès qu'on aborde des thêmes aussi sensibles que le piratage et la sécurité informatique en général.
Comme nous venons de le voir, la sécurité en matière de réseau informatique n'est pas seulement une affaire de spécialiste, elle nécesite la sensibilisation et la participation active aux politiques de sécurités de l'ensemble des utilisateurs. Leur faire comprendre que si la sécurité est parfois un obstacle (parce qu'elle impose des contraintes à leur utilisation), elle est là pour eux, pour les protéger et assurer la pérénité de l'utilisation. Un réseau sécurisé est donc avant tout un réseau où l'utilisateur est remis au centre des préocupations.
Mais si la sécurité est l'affaire de tous, elle est aussi, on ne peut le nier, affaire de spécialiste. C'est pour cela qu'un tel document, ou une des nombreuses autres documentations sérieuses circulant sur Internet, devrait toujours être consulté par un "apprenti" administrateur réseau, personne qui devrait (même s'il n'en est pas responsable) être au fait d'une base en matière de sécurisation d'un réseau. Si une spécialisation est bien nécessaire, il faut aussi savoir se méfier des personnes et entreprises qui s'érigent à grand renfort de publicité en spécialistes, qui la plupart du temps ne sont pas plus au fait de ces techniques que vous et moi (après lecture de ce document). Pourtant, l'avis d'un expert reconnu sera en général plus que bénéfique.
Malheureusement, beaucoup d'entreprises négligent, par manque de moyen, ou par simple inconscience, de penser à une sécurisation de leurs systèmes informatiques. D'autres encore préfèrent ne pas en parler et confier la tâche à des personnes internes trop souvent sous-qualifiées. La puissance d'outils comme Nmap, gratuit, libre et facilement accessible montre immédiatement la futilité de vouloir cacher sa politique de sécurité dans le cadre d'un réseau informatique. Au contraire, une politique claire et explicite permet de renforcer la sécurité au profit de tous.
Oui la menace existe et est constante sur un réseau informatique, et non, être paranoïaque n'implique pas que l'ennemi soit imaginaire. Mais loin des grandes annonces bien souvent trop émotionnelles, la sécurité informatique doit s'envisager sous un angle technique et au regard de ces quatre points : ouverture, spécialisation, sensibilisation et participation.
Entreprise belge de sécurité informatique :
Internet Engineering Task Force :
Introduction aux réseaux :
http://www-igm.univ-mlv.fr/~roussel/IR1/
Le modèle OSI :
http://www.hta-bi.bfh.ch/Resources/Computing/NetGroup/netcours/Le-modele-OSI.htm
Observatoire de la Sécurité des Systèmes d'Information et des Réseaux :
Vulgarisation informatique :
http://www.commentcamarche.net
Cours de réseaux; Maîtrise d'informatique; Université d'Angers :
http://www.info.univ-angers.fr/pub/pn/poly/poly.html
Intrusion de réseaux UNIX (nombreux documents techniques) :
Regroupement d'outils de sécurité et archive des failles :
http://www.packetstormsecurity.com
Différents outils :
Monde du logiciel libre :
Moteur de recherche :
Site personnel :
Micro Application, TCP/IP, collection PC Poche, 2001
BLAESS (Christophe), Programmation système en C sous Linux, édition Eyrolles, 2002
PARKER (Tim), LINUX Ressources d'Experts, édition Campus Press, 1999
GRENIER (Christophe), Netfilter: firewalling sous linux, dans GNU/Linux & Hurd Magazines numéro 39, mai 2002, page 59
Je tiens particulièrementt à remercier les personnes suivantes qui m'ont aidé et supporté lors de la réalisation de ce travail:
Un tout grand merci à ma mère pour la correction
orthographique et le point de vue extérieur apporté
sur le sujet.
Uniway pour leur aimable coopération
Spacewalker, Kadamyse, Ironik, blaskrin, redipdown ainsi que ptah et
Freya pour leur soutien moral ainsi que les personnes fréquentant
les channels IRC #fr (segfault) et #thebhz (openprojects)
L'ensemble des communautés Free Software et OpenSource pour
leurs travaux.
Les annexes sont organisées comme suit: sur cette page vous trouverez un index, puis sur chaque page suivante (ou le nombre de pages associées à chaque annexe) se trouveront les différentes annexes. Pour un index par page, reportez-vous à la table des matièrees.
La Free Documentation Licence (en anglais) telle qu'elle a été définie par la FSF.
Détail des différentes catégories de messages ICMP
Listes des ports et leurs attributions courantes
The Art of Port Scanning
Détection d'OS distante par prise d'empreinte de pile TCP/IP
Introduction au débordement de buffer
IP Spoofing Appliqué
Annexe I GNU Free Documentation Licence
Version 1.1, March 2000
Copyright
(C) 2000 Free Software Foundation, Inc. 59 Temple Place, Suite 330,
Boston, MA 02111-1307 USA
Everyone is permitted to copy and
distribute verbatim copies of this license document, but changing it
is not allowed.
0. PREAMBULE
The purpose of this
License is to make a manual, textbook, or other written document
"free" in the sense of freedom: to assure everyone the
effective freedom to copy and redistribute it, with or without
modifying it, either commercially or noncommercially. Secondarily,
this License preserves for the author and publisher a way to get
credit for their work, while not being considered responsible for
modifications made by others.
This License is a kind of
"copyleft", which means that derivative works of the
document must themselves be free in the same sense. It complements
the GNU General Public License, which is a copyleft license designed
for free software.
We have designed this License in order to
use it for manuals for free software, because free software needs
free documentation: a free program should come with manuals providing
the same freedoms that the software does. But this License is not
limited to software manuals; it can be used for any textual work,
regardless of subject matter or whether it is published as a printed
book. We recommend this licence principally for works whose purpose
is instruction or reference.
1. APPLICABILITY AND
DEFINITIONS
This License applies to any manual or other work
that contains a notice placed by the copyright holder saying it can
be distributed under the terms of this License. The "Document",
below, refers to any such manual or work. Any member of the public
is a licensee, and is addressed as "you".
A
"Modified Version" of the Document means any work
containing the Document or a portion of it, either copied verbatim,
or with modifications and/or translated into another language.
A
"Secondary Section" is a named appendix or a front-matter
section of the Document that deals exclusively with the relationship
of the publishers or authors of the Document to the Document's
overall subject (or to related matters) and contains nothing that
could fall directly within that overall subject. (For example, if
the Document is in part a textbook of mathematics, a Secondary
Section may not explain any mathematics.) The relationship could be
a matter of historical connection with the subject or with related
matters, or of legal, commercial, philosophical, ethical or political
position regarding them.
The "Invariant Sections"
are certain Secondary Sections whose titles are designated, as being
those of Invariant Sections, in the notice that says that the
Document is released under this License.
The "Cover
Texts" are certain short passages of text that are listed, as
Front-Cover Texts or Back-Cover Texts, in the notice that says that
the Document is released under this License.
A "Transparent"
copy of the Document means a machine-readable copy, represented in a
format whose specification is available to the general public, whose
contents can be viewed and edited directly and straightforwardly with
generic text editors or (for images composed of pixels) generic paint
programs or (for drawings) some widely available drawing editor, and
that is suitable for input to text formatters or for automatic
translation to a variety of formats suitable for input to text
formatters. A copy made in an otherwise Transparent file format
whose markup has been designed to thwart or discourage subsequent
modification by readers is not Transparent. A copy that is not
"Transparent" is called "Opaque".
Examples
of suitable formats for Transparent copies include plain ASCII
without markup, Texinfo input format, LaTeX input format, SGML or XML
using a publicly available DTD, and standard-conforming simple HTML
designed for human modification. Opaque formats include PostScript,
PDF, proprietary formats that can be read and edited only by
proprietary word processors, SGML or XML for which the DTD and/or
processing tools are not generally available, and the
machine-generated HTML produced by some word processors for output
purposes only.
The "Title Page" means, for a printed
book, the title page itself, plus such following pages as are needed
to hold, legibly, the material this License requires to appear in the
title page. For works in formats which do not have any title page as
such, "Title Page" means the text near the most prominent
appearance of the work's title, preceding the beginning of the body
of the text.
2. VERBATIM COPYING
You may copy and
distribute the Document in any medium, either commercially or
noncommercially, provided that this License, the copyright notices,
and the license notice saying this License applies to the Document
are reproduced in all copies, and that you add no other conditions
whatsoever to those of this License. You may not use technical
measures to obstruct or control the reading or further copying of the
copies you make or distribute. However, you may accept compensation
in exchange for copies. If you distribute a large enough number of
copies you must also follow the conditions in section 3.
You
may also lend copies, under the same conditions stated above, and you
may publicly display copies.
3. COPYING IN QUANTITY
If
you publish printed copies of the Document numbering more than 100,
and the Document's license notice requires Cover Texts, you must
enclose the copies in covers that carry, clearly and legibly, all
these Cover Texts: Front-Cover Texts on the front cover, and
Back-Cover Texts on the back cover. Both covers must also clearly
and legibly identify you as the publisher of these copies. The front
cover must present the full title with all words of the title equally
prominent and visible. You may add other material on the covers in
addition. Copying with changes limited to the covers, as long as they
preserve the title of the Document and satisfy these conditions, can
be treated as verbatim copying in other respects.
If the
required texts for either cover are too voluminous to fit legibly,
you should put the first ones listed (as many as fit reasonably) on
the actual cover, and continue the rest onto adjacent pages.
If
you publish or distribute Opaque copies of the Document numbering
more than 100, you must either include a machine-readable Transparent
copy along with each Opaque copy, or state in or with each Opaque
copy a publicly-accessible computer-network location containing a
complete Transparent copy of the Document, free of added material,
which the general network-using public has access to download
anonymously at no charge using public-standard network protocols. If
you use the latter option, you must take reasonably prudent steps,
when you begin distribution of Opaque copies in quantity, to ensure
that this Transparent copy will remain thus accessible at the stated
location until at least one year after the last time you distribute
an Opaque copy (directly or through your agents or retailers) of that
edition to the public.
It is requested, but not required, that
you contact the authors of the Document well before redistributing
any large number of copies, to give them a chance to provide you with
an updated version of the Document.
4. MODIFICATIONS
You
may copy and distribute a Modified Version of the Document under the
conditions of sections 2 and 3 above, provided that you release the
Modified Version under precisely this License, with the Modified
Version filling the role of the Document, thus licensing distribution
and modification of the Modified Version to whoever possesses a copy
of it. In addition, you must do these things in the Modified
Version:
A. Use in the Title Page (and on the covers, if any)
a title distinct from that of the Document, and from those of
previous versions (which should, if there were any, be listed in the
History section of the Document). You may use the same title as a
previous version if the original publisher of that version gives
permission.
B. List on the Title Page, as authors, one or more
persons or entities responsible for authorship of the modifications
in the Modified Version, together with at least five of the principal
authors of the Document (all of its principal authors, if it has less
than five).
C. State on
the Title page the name of the publisher of the Modified Version, as
the publisher.
D. Preserve all the copyright notices of the
Document.
E. Add an appropriate copyright notice for your
modifications adjacent to the other copyright notices.
F. Include,
immediately after the copyright notices, a license notice giving the
public permission to use the Modified Version under the terms of this
License, in the form shown in the Addendum below.
G. Preserve in
that license notice the full lists of Invariant Sections and required
Cover Texts given in the Document's license notice.
H. Include an
unaltered copy of this License.
I. Preserve the section entitled
"History", and its title, and add to it an item stating at
least the title, year, new authors, and publisher of the Modified
Version as given on the Title Page. If there is no section entitled
"History" in the Document, create one stating the title,
year, authors, and publisher of the Document as given on its Title
Page, then add an item describing the Modified Version as stated in
the previous sentence.
J. Preserve the network location, if any,
given in the Document for public access to a Transparent copy of the
Document, and likewise the network locations given in the Document
for previous versions it was based on. These may be placed in the
"History" section. You may omit a network location for a
work that was published at least four years before the Document
itself, or if the original publisher of the version it refers to
gives permission.
K. In any section entitled "Acknowledgements"
or "Dedications", preserve the section's title, and
preserve in the section all the substance and tone of each of the
contributor acknowledgements and/or dedications given therein.
L.
Preserve all the Invariant Sections of the Document, unaltered in
their text and in their titles. Section numbers or the equivalent
are not considered part of the section titles.
M. Delete any
section entitled "Endorsements". Such a section may not be
included in the Modified Version.
N. Do not retitle any existing
section as "Endorsements" or to conflict in title with any
Invariant Section.
If the Modified Version includes new
front-matter sections or appendices that qualify as Secondary
Sections and contain no material copied from the Document, you may at
your option designate some or all of these sections as invariant. To
do this, add their titles to the list of Invariant Sections in the
Modified Version's license notice. These titles must be distinct from
any other section titles.
You may add a section entitled
"Endorsements", provided it contains nothing but
endorsements of your Modified Version by various parties--for
example, statements of peer review or that the text has been approved
by an organization as the authoritative definition of a
standard.
You may add a passage of up to five words as a
Front-Cover Text, and a passage of up to 25 words as a Back-Cover
Text, to the end of the list of Cover Texts in the Modified Version.
Only one passage of Front-Cover Text and one of Back-Cover Text may
be added by (or through arrangements made by) any one entity. If the
Document already includes a cover text for the same cover, previously
added by you or by arrangement made by the same entity you are acting
on behalf of, you may not add another; but you may replace the old
one, on explicit permission from the previous publisher that added
the old one.
The author(s) and publisher(s) of the Document do
not by this licence give permission to use their names for publicity
for or to assert or imply endorsement of any Modified Version.
5.
COMBINING DOCUMENTS
You may combine the Document with other
documents released under this License, under the terms defined in
section 4 above for modified versions, provided that you include in
the combination all of the Invariant Sections of all of the original
documents, unmodified, and list them all as Invariant Sections of
your combined work in its license notice.
The combined work
need only contain one copy of this License, and multiple identical
Invariant Sections may be replaced with a single copy. If there are
multiple Invariant Sections with the same name but different
contents, make the title of each such section unique by adding at the
end of it, in parentheses, the name of the original author or
publisher of that section if known, or else a unique number. Make the
same adjustment to the section titles in the list of Invariant
Sections in the license notice of the combined work.
In the
combination, you must combine any sections entitled "History"
in the various original documents, forming one section entitled
"History"; likewise combine any sections entitled
"Acknowledgements", and any sections entitled
"Dedications". You must delete all sections entitled
"Endorsements."
6. COLLECTIONS OF DOCUMENTS
You
may make a collection consisting of the Document and other documents
released under this License, and replace the individual copies of
this License in the various documents with a single copy that is
included in the collection, provided that you follow the rules of
this License for verbatim copying of each of the documents in all
other respects.
You may extract a single document from such a
collection, and distribute it individually under this License,
provided you insert a copy of this License into the extracted
document, and follow this License in all other respects regarding
verbatim copying of that document.
7. AGGREGATION WITH
INDEPENDENT WORKS
A compilation of the Document or its
derivatives with other separate and independent documents or works,
in or on a volume of a storage or distribution medium, does not as a
whole count as a Modified Version of the Document, provided no
compilation copyright is claimed for the compilation. Such a
compilation is called an "aggregate", and this License does
not apply to the other self-contained works thus compiled with the
Document, on account of their being thus compiled, if they are not
themselves derivative works of the Document.
If the Cover Text
requirement of section 3 is applicable to these copies of the
Document, then if the Document is less than one quarter of the entire
aggregate, the Document's Cover Texts may be placed on covers that
surround only the Document within the aggregate. Otherwise they must
appear on covers around the whole aggregate.
8.
TRANSLATION
Translation is considered a kind of modification,
so you may distribute translations of the Document under the terms of
section 4. Replacing Invariant Sections with translations requires
special permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections. You may include a
translation of this License provided that you also include the
original English version of this License. In case of a disagreement
between the translation and the original English version of this
License, the original English version will prevail.
9.
TERMINATION
You may not copy, modify, sublicense, or
distribute the Document except as expressly provided for under this
License. Any other attempt to copy, modify, sublicense or distribute
the Document is void, and will automatically terminate your rights
under this License. However, parties who have received copies, or
rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
10.
FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation
may publish new, revised versions of the GNU Free Documentation
License from time to time. Such new versions will be similar in
spirit to the present version, but may differ in detail to address
new problems or concerns. See http://www.gnu.org/copyleft/.
Each
version of the License is given a distinguishing version number. If
the Document specifies that a particular numbered version of this
License "or any later version" applies to it, you have the
option of following the terms and conditions either of that specified
version or of any later version that has been published (not as a
draft) by the Free Software Foundation. If the Document does not
specify a version number of this License, you may choose any version
ever published (not as a draft) by the Free Software Foundation.
Annexe II Détail des différentes catégories de messages ICMP
Détail des différentes catégories de messages ICMP donnés dans la liste ci-dessous où chaque alinéa commence par le couple (type,code) de la catégorie décrite.
(0,0) ou (8,0) Demande (type 8) ou réponse (type 0) d'écho dans le cadre de la commande ping.
(3,0-13) Compte-rendu de destination inaccessible délivré quand un routeur ne peut délivrer un datagramme. Le routeur génère et envoie ce message ICMP à l'expéditeur de ce datagramme. Il obtient l'adresse de cet expéditeur en l'extrayant de l'en-tête du datagramme, il insère dans les données du message ICMP toute l'en-tête ainsi que les 8 premiers octets du datagramme en cause. Une liste non exhaustive des différents codes d'erreurs possibles est :
00 Le réseau est inaccessible.
01 La machine est inaccessible.
02 Le protocole est inaccessible.
03 Le port est inaccessible.
04 Fragmentation nécessaire mais bit de non fragmentation positionné à 1.
05 Échec de routage de source.
06 Réseau de destination inconnu.
07 Machine destinataire inconnue.
08 Machine source isolée (obsolète)
09 Communication avec le réseau de destination administrativement interdite.
10 Communication avec la machine de destination administrativement interdite.
11 Réseau inaccessible pour ce type de service.
12 Machine inaccessible pour ce type de service.
13 Communication administrativement interdite par filtrage.
(4,0) Demande de limitation de production pour éviter la congestion du routeur qui envoie ce message.
(5,0-3) Demande de modification de route expédiée lorsqu'un routeur détecte qu'un ordinateur utilise une route non optimale, ce qui peut arriver lorsqu'un ordinateur est ajouté au réseau avec une table de routage minimale. Le message ICMP généré contient l'adresse IP du routeur à rajouter dans la table de routage de l'ordinateur. Les différents codes possibles ci-après expliquent le type de redirection à opérer par l'ordinateur.
0 Redirection pour un réseau.
1 Redirection pour une machine.
2 Redirection pour un type de service et réseau.
3 Redirection pour un type de service et machine.
(9,0) Avertissement de routeur expédié par un routeur.
(10,0) Sollicitation de routeur diffusé par une machine pour initialiser sa table de routage.
(11,0) TTL détecté à 0 pendant le transit du datagramme IP, lorsqu'il y a une route circulaire ou lors de l'utilisation de la commande traceroute.
(11,1) TTL détecté à 0 pendant le réassemblage d'un datagramme.
(12,0) Mauvaise en-tête IP.
(12,1) Option requise manquante.
(13-14,0) Requête (13) ou réponse (14) timestamp, d'estampillage horaire.
(15,0) et (16,0) devenues obsolètes.
(17-18,0) Requête (17) ou réponse (18) de masque de sous-réseau.
Annexe III Lise des ports et leurs attributions courantes
Cette annexe présente le début (jusque 80) de la liste des ports TCP tel qu'assignés par l'IANA. La liste complète officielle et mise à jour peut être trouvée sur: http://www.iana.org/assignments/port-numbers
Keyword Decimal Description
0/tcp Reserved
tcpmux 1/tcp TCP Port Service Multiplexer
compressnet 2/tcp Management Utility
compressnet 3/tcp Compression Process
# 4/tcp Unassigned
rje 5/tcp Remote Job Entry
# 6/tcp Unassigned
echo 7/tcp Echo
# 8/tcp Unassigned
discard 9/tcp Discard
# 10/tcp Unassigned
systat 11/tcp Active Users
# 12/tcp Unassigned
daytime 13/tcp Daytime (RFC 867)
# 14/tcp Unassigned
# 15/tcp Unassigned [was netstat]
# 16/tcp Unassigned
qotd 17/tcp Quote of the Day
msp 18/tcp Message Send Protocol
chargen 19/tcp Character Generator
ftp-data 20/tcp File Transfer [Default Data]
ftp 21/tcp File Transfer [Control]
ssh 22/tcp SSH Remote Login Protocol
telnet 23/tcp Telnet
24/tcp any private mail system
smtp 25/tcp Simple Mail Transfer
# 26/tcp Unassigned
nsw-fe 27/tcp NSW User System FE
# 28/tcp Unassigned
msg-icp 29/tcp MSG ICP
# 30/tcp Unassigned
msg-auth 31/tcp MSG Authentication
# 32/tcp Unassigned
dsp 33/tcp Display Support Protocol
# 34/tcp Unassigned
35/tcp any private printer server
# 36/tcp Unassigned
time 37/tcp Time
rap 38/tcp Route Access Protocol
rlp 39/tcp Resource Location Protocol
# 40/tcp Unassigned
graphics 41/tcp Graphics
name 42/tcp Host Name Server
nameserver 42/tcp Host Name Server
nicname 43/tcp Who Is
mpm-flags 44/tcp MPM FLAGS Protocol
mpm 45/tcp Message Processing Module [recv]
mpm-snd 46/tcp MPM [default send]
ni-ftp 47/tcp NI FTP
auditd 48/tcp Digital Audit Daemon
tacacs 49/tcp Login Host Protocol (TACACS)
re-mail-ck 50/tcp Remote Mail Checking Protocol
la-maint 51/tcp IMP Logical Address Maintenance
xns-time 52/tcp XNS Time Protocol
domain 53/tcp Domain Name Server
xns-ch 54/tcp XNS Clearinghouse
isi-gl 55/tcp ISI Graphics Language
xns-auth 56/tcp XNS Authentication
57/tcp any private terminal access
xns-mail 58/tcp XNS Mail
59/tcp any private file service
60/tcp Unassigned
ni-mail 61/tcp NI MAIL
acas 62/tcp ACA Services
whois++ 63/tcp whois++
covia 64/tcp Communications Integrator (CI)
tacacs-ds 65/tcp TACACS-Database Service
sql*net 66/tcp Oracle SQL*NET
bootps 67/tcp Bootstrap Protocol Server
bootpc 68/tcp Bootstrap Protocol Client
tftp 69/tcp Trivial File Transfer
gopher 70/tcp Gopher
netrjs-1 71/tcp Remote Job Service
netrjs-2 72/tcp Remote Job Service
netrjs-3 73/tcp Remote Job Service
netrjs-4 74/tcp Remote Job Service
75/tcp any private dial out service
deos 76/tcp Distributed External Object Store
77/tcp any private RJE service
vettcp 78/tcp vettcp
finger 79/tcp Finger
http 80/tcp World Wide Web HTTP
Annexe IV The Art of Port Scanning
Cet article a été traduit de l'anglais par OUAH, http://www.ouah.org. La version originale est de Fyodor (fyodor@dhp.com) et peut être obtenue à http://www.insecure.org/. La publication initiale a été faite dans Phrack 51, article 11 (http://www.phrack.org)
Cet article énumère plusieurs des techniques employées pour déterminer quels ports (ou toute similaire abstraction de protocole) d'un hôte sont en attente de connexion. Ces ports représentent des voies de transmissions potentielles.Tracer leur existence facilite l'échange d'information avec l'hôte et c'est ainsi assez utile pour n'importe qui, dont les hackers, souhaitant explorer l'environnement du réseau. En dépit de ce que vous avez entendu des médias, Internet ce n'est PAS tout ce qui a trait au port TCP 80. N'importe qui comptant uniquement sur le WWW pour rassembler des informations obtiendra les mêmes résultats que les mêmes moyens d'AOL qui font la même chose. Ce article est également sensé servir d'introduction à une documentation auxiliaire d'un projet de code sur lequel j'ai travaillé. C'est un portscanner robuste et complet qui (je l'espère) devrait résoudre certains des problèmes que j'ai rencontré en utilisant d'autres scanners et en faisant des scans sur d'énormes réseaux. Le programme, nmap, peut faire les choses suivantes:
- Vanilla TCP connect() scanning,
-
TCP SYN (half open) scanning,
- TCP FIN (stealth) scanning,
-
TCP ftp proxy (bounce attack) scanning,
- SYN/FIN scanning using
IP fragments (bypasses packet filters),
- UDP recvfrom()
scanning,
- UDP raw ICMP port unreachable scanning,
- ICMP
scanning (ping-sweep), et
- Reverse-ident scanning.
les sources librement distribuables du code sont disponibles à http://www.insecure.org/nmap/
Introduction
Le scanning en tant que méthode pour découvrir des voies de communications exploitables date de longtemps. L'idée est de sonder autant de voies que possible et de garder celles qui sont récéptives ou particulièrement utiles. Plusieurs champs de la publicité sont basés sur ce concept et forcer les gens à la voir en distribuant en bloc des mails est un parallèle presque parfait à ce dont nous discuterons. Envoyez un message seulement dans chaque mailbox et attendez les réponses pour tendre vos filets.
Le scanning est entré dans l'histoire déjà avec les systèmes téléphoniques. Nous avons là ce réseau global énorme de télécommunication, dont tous les hôtes sont accessibles avec des codes sur notre téléphone. Des millions de numéros sont accessibles localement, pourtant nous allons seulement nous intéresser à 0.5% de ceux-ci, peut-être ceux avec un répondeur au bout du fil.
La solution logique pour trouver ces numéros qui nous intéressent est de tous les essayer. C'est comme ça que le "wardialing" a surgi. D'excellents programmes comme Toneloc ont été développés pour faciliter le test d'échanges complets et plus encore. L'idée de base est simple. Si vous composez un numéro et que votre modem vous sort un CONNECT, vous le gardez. Sinon l'ordinateur raccroche et compose inlassablement les prochains.
Bien que le wardialing soit encore utile, nous constatons maintenant que plusieurs ordinateurs avec lesquels nous voulons communiquer sont reliés par des réseaux plutôt comme Internet que comme les téléphones analogiques. Scanner ces machines implique la même technique de brute forcing. Nous envoyons une rafale de paquets pour différents protocoles et nous déduisons des réponses reçues (ou pas reçues) quels services sont en train d'écouter.
Technique
Avec le temps, un certain nombre de techniques ont été développées pour examiner les protocoles et les ports sur lesquels une machine cible écoute. Elles offrent toutes différents avantages et problèmes. Voici une énumération des plus connues:
- TCP connect() scanning: c'est le scanning TCP le plus courant. L'appel système connect() fourni par votre os est utilisé pour ouvrir une connexion sur tous les ports intéressants de la machine. Si le port est en train d'écouter, connect() sera réussi, autrement le port n'est pas accessible. Un grand avantage de cette technique c'est que vous n'avez besoin d'auncun privilège spécial. N'importe quel utilisateur d'un ordinateur UNIX est libre d'utiliser cet appel. Un autre avantage est sa vitesse. Tandis que faire en série un appel connect() séparé pour chaque port cible prendrait beaucoup de temps avec une connexion lente, vous pouvez accélérer le scan en utilisant plusieurs sockets en parallèle. Utiliser un système I/O non-blocking vous permet de définir un bas time-out et d'observer toutes les sockets immédiatement. Le grand désavantage est que ce genre de scan est facilement détectable et filtrable. Les logs de l'hôte cible montreront une masse de connexions et de messages d'erreur pour les services qui ont capturé les connexions et les ont ensuite immédiatement fermées.
- TCP SYN scanning: Cette technique est souvent mentionnée comme scanning "demi-ouvert" parce que vous n'ouvrez pas une connexion TCP complète. Vous envoyez un paquet SYN comme si vous alliez ouvrir une vraie connexion et attendre une réponse. Un SYN|ACK indique que le port écoute. Un RST indique que le port n'écoute pas. Si vous recevez SYN|ACK, vous lui enverrez immédiatement un RST pour interrompre la connexion (en fait le kernel le fait pour nous). Le grand avantage de cette technique de scan est que moins de cibles la loggeront. Malheureusement il vous faut avoir les privilèges root pour construire ces paquets standarts SYN. Le scanning SYN se fait avec l'option -s de nmap.
- TCP FIN scanning: il arrive des fois que même le scanning SYN n'est pas assez clandestin. Certains firewall et filteur de paquets écoutent les SYNs sur des ports critiques et des programmes comme synlogger et Courtney sont disponibles pour détecter ces scans. Les paquets FIN d'autre part peuvent être capables de passer tranquillement. Cette technique de scan a été décrite en détail par Ureil Maimon dans le Phrack 49, article 15. L'idée est que les ports fermés tentent de répondre à votre paquet FIN avec un RST propre. Les ports ouverts d'autre part tentent d'ignorer le paquet en question. Comme Alan Cox l'avait précisé c'est un comportement exigé de TCP/IP. Toutefois quelques systèmes (notamment les systèmes Mirco$oft) sont intouchables dans ce sens. Ils envoyent des RST indépendamment de l'état du port et ils ne sont ainsi pas vulnérables à ce type de scan. Cela marche bien sur la plupart des autres systèmes que j'ai essayés. En fait, cela est souvent utile afin de distinguer un système *NIX d'un NT, et on peut l'utiliser pour ça. Le scannning FIN se fait avec l'option -U (Uriel) de nmap.
- Fragmentation scanning: Ce n'est pas une méthode nouvelle et indépendante de scanning mais une variation d'autres techniques. Au lien de seulement envoyer le paquet espion, vous le diviser en plusieurs petits fragments IP. Vous fractionnez l'en-tête TCP sur plusieurs paquets pour rendre la chose plus difficile aux filtreurs de paquets et ainsi détecter ce que vous en êtes en train de faire. Fais attention avec cela! Certains programmes ont de la peine à manipuler d'aussi petits paquets. Mon sniffer préféré me fait un segmentation fault directement après la réception du premier fragment de 36-bytes. Ensuite un de 24 bytes arrive! Alors que cette méthode ne marche pas avec les filtreurs de paquets et les firewalls qui mettent en file d'attente tous les fragments IP (comme l'option Linux CONFIG_IP_ALWAYS_DEFRAG), beaucoup de réseaux n'ont pas les capacités de résoudre ce problème. Cette possibilité est assez unique dans un scanner (en tout cas je n'en ai vu aucun le faire). Merci à daemon9 de m'en avoir donné l'idée. L'option -f dit au scan SYN ou FIN spécifié d'utiliser de petits paquets fragmentés.
- TCP reverse ident scanning: Comme l'a remarqué Dave Goldsmith dans un envoi de 1996 à Bugtraq, le protocole ident (rfc 1413) permet de révéler le nom de l'utilisateur propriétaire de n'importe quel processus relié par TCP, même si ce processus n'as pas initié de connexion. Ainsi vous pouvez par exemple vous connecter au port http et ensuite utiliser identd pour savoir si le serveur est exécuté par root. Cela peut seulement être fait par une connexion complète au port cible (càd l'option -t). L'option -i de nmap demande à identd le propriétaire de chaque port écouté par listen().
- FTP bounce attack: Une possibilité intéressante du protocole ftp (RFC 959) est qu'il supporte des connexions ftp par "proxy". En d'autres mots, je devrais pouvoir me connecter de evil.com au serveur PI (protocol interpreter) ftp de target.com pour établir une connexion. Ensuite je serais capable de demander que le serveur PI lance un serveur DTP (data transfer process) actif pour envoyer un fichier N'IMPORTE Où sur le net! Vraisemblablement à un User DTP, bien que la RFC dit spécifiquement que demander à un serveur d'envoyer un fichier à un autre est permis. Bon cela a pu bien marcher en 1985 quand la RFC venait d'être écrite. Mais de nos jours il ne peut y avoir des gens qui hijackent des serveurs ftp et demandent que les données soient renvoyeés vers n'importe quels points du net. Comme *Hobbit* l'avait écrit en 1995, ce défaut du protocole "peut être utilisé pour poster des mails et des news pratiquement non retraçables, attaquer des serveurs depuis différents endroits, remplir des diques durs, traverser des firewalls et généralement être ennuyant et difficile à retrouver en même temps". Ce que nous ferons pour cela (surprise surprise) c'est de scaner des ports TCP d'un serveur ftp "proxy". Ainsi vous pourriez vous connecter à un serveur ftp derrière un firewall et puis scanner ceux qui sont le plus probablement bloqués (le port 139 est un bon exemple). Si le serveur ftp permet de lire et d'écrire sur un répertoire (comme /incoming), vous pouvez envoyer n'importe quelles données sur les ports que vous trouvez ouverts.
Notre technique pour le scan de port est d'utiliser la commande PORT pour dire que notre "User-DTP" passif écoute le système cible sur un certain numéro de port. Ensuite nous allons essayer de LIST le répertoire actuel et le résultat est envoyé par le serveur DTP. Si notre hôte cible écoute sur le port spécifié, le transfert sera couronné de succès (en générant un réponse 150 ou 226). Autrement nous obtiendront "425 Can't build data connection: Connection refused." Ensuite nous envoyons une autre commande PORT pour essayer avec un prochain port de l'autre cible. Les avantages de cette méthode sont évidents (plus difficile à tracer, possibilité de contourner des firewalls). Les principaux désavantages sont la lenteur et le fait que certains serveurs FTP l'ont finalement remarquée et ont désactivé cette possibilité de "proxy". Pour montrer que cela en vaut la peine voici une liste de bannières d'endroits où cela a marché/pas marché:
* Bounce attaque qui a marchée*
220 xxxxxxx.com FTP server (Version
wu-2.4(3) Wed Dec 14 ...) ready.
220 xxx.xxx.xxx.edu FTP server
ready.
220 xx.Telcom.xxxx.EDU FTP server (Version wu-2.4(3) Tue
Jun 11 ...) ready.
220 lem FTP server (SunOS 4.1) ready.
220
xxx.xxx.es FTP server (Version wu-2.4(11) Sat Apr 27 ...) ready.
220
elios FTP server (SunOS 4.1) ready
* Bounce attaque qui a échouée*
220 wcarchive.cdrom.com FTP server
(Version DG-2.0.39 Sun May 4 ...) ready.
220 xxx.xx.xxxxx.EDU
Version wu-2.4.2-academ[BETA-12](1) Fri Feb 7
220 ftp Microsoft
FTP Service (Version 3.0).
220 xxx FTP server (Version
wu-2.4.2-academ[BETA-11](1) Tue Sep 3 ...) ready.
220 xxx.unc.edu
FTP server (Version wu-2.4.2-academ[BETA-13](6) ...) ready.
Les 'x' sont là d'une part pour protéger ceux responsables d'exécuter un serveur défectueux mais surtout pour adapter les lignes aux 80 colonnes. De même pour les points de suspension. L'attaque bounce se fait avec l'option -b de nmap. proxy_server peut-être donné dans le format URL standart, username:password@server:port avec tout mais le serveur qui est optionnel.
- UDP ICMP port unreachable scanning: Cette méthode de scan diffère de ce qu'il y a au-desssus parce qu'ici nous utilisons le protocole UDP au lieu de TCP. Alors que ce protocole est plus simple, le scanning est réellement sensiblement plus difficile. Ceci parce ce que les ports ouverts ne sont pas obligés d'envoyer un acknowlegment en réponse à une demande et les ports fermés ne doivent même pas renvoyer de paquet d'erreur. Heureusement, la plupart des hôtes renvoient une erreur ICMP_PORT_UNREACH quand vous envoyez un paquet à un port UDP fermé. Ainsi vous pouvez savoir si un port N'est PAS ouvert donc par exclusion déterminer quels ports sont ouverts. Comme il n'est garanti ni que les paquets UDP, ni que les erreurs ICMP arrivent, les scanners UDP de ce genre doivent aussi implémenter une retransmission des paquets qui pourraient être perdus (sinon vous obtiendrez un groupe faussement positif). En outre cette technique est lente en raison des machines qui appliquent la RFC 1812 section 4.3.2.8 pour découragez et limitez le taux d'erreurs ICMP. Par exemple, le kernel Linux (dans net/ipv4/icmp.h) limite la production de message de destination innaccessible à 80 chaque 4 secondes avec une pénalité de 1/4 de secondes en cas de dépassement. Dans quelque temps j'ajouterai un meilleur algorithme à nmap pour détecter cela. De plus vous devez être root pour accéder au raw ICMP socket nécessaire pour la lecture du port inaccessible. L'option -u (UDP) de nmap incorpore cette méthode de scannings pour les utilisateurs root.
Certaines personnes pensent que le scanning UPD est lent et inutile. Je leur rappelle généralement le récent bug rcpbind de Solaris. Rcpbind peut se cacher sur un port UDP non documenté quelque part au-dessus de 32770. Ainsi on s'en fout que le port 111 soit bloqué par un firewall. Mais pouvez-vous trouver sur lequel des 30'000 ports plus hauts il écoute? Avec un scanner UDP vous pouvez!
- UDP recvfrom() and write() scanning: Alors que les utilisateurs qui ne sont pas root ne peuvent pas lire les erreurs de ports innacessibles directement, Linux est assez sympa pour informer l'utilisateur indirectement quand elles ont été reçues. Par exemple un deuxième appel write() à un port fermé échouera normalement. Cela arrive à beaucoup de scanners comme netcat et pscan.c de Pluvius. J'ai aussi remarqué que recvfrom() sur des non-blocking sockets UDP retourne EAGAIN ("Try Again", errno 13) si l'erreur ICMP n'a pas été reçue et ECONNREFUSED ("Connection refused", errno 111) si elle a été reçue. C'est la technique utilisée pour déterminer les ports ouverts quand les utilisateurs qui ne sont pas root utilise l'option -u (UDP). Les utilisateurs root peuvent aussi utiliser l'option -l (lamer UDP scan) pour forcer que cela se passe mais c'est une idée vraiment bête.
- ICMP echo scanning: ce n'est pas vraiment du portscanning vu que ICMP n'a pas de port abstraction. Mais il est parfois utile de savoir quels hôtes dans un réseau sont up en les pingant tous. l'option -P le fait. Le scan ICMP se fait maintenant en parallèle il peut être ainsi assez rapide. Pour encore plus accélérer les choses vous pouvez augmenter le nombre de ping en parallèle avec l'option '-L'. Il peut être aussi utile de modifier la valeur du ping timeout avec l'option '-T'. nmap supporte une notation en hôte / masque de bits pour faciliter ce genre de chose. Par exemple 'nmap -P cert.org/24 152.148.0.0/16' scannera le réseau du CERT de classe C et toutes les entitée de class B rprèssentées par 152.148.* . Hôte/26 est intéressant pour les sous-réseaux de 6-bits dans une organisation. Nmap permet maintenant aussi une syntaxe plus puissante. Vous pouvez maintenant manipulez des addresses comme '150.12,17,71-79.7.*' et nmap en fera ce que vous voulez. Pour chacune des quatre valeurs vous pouvez soit mettre un simple nombre, soit un intervalle (avec '-'), une liste d'intervalles et de nombres séparés par des virgules, ou un '*' qui est synonyme de 0-255. Par défaut, les adresses de broadcast d'un réseau comme .0 et .255 ne sont pas scannées mais l'option '-A' vous permet d'y remédier si vous le souhaiter.
(...) La fin du document ne concernant que nmap et ne concernant plus la technique du port scan a été supprimée, vous pouvez la retrouver aux adresses données au début de ce document.
Annexe V Détection d'OS distante par prise d'empreinte de la pile TCP/IP
Article
écrit par Fyodor fyodor@dhp.com
(www.insecure.org).
Traduis par Arhuman arhuman@francemel.com.
Article parus originellement dans Phrack Magazine Volume 8, Numéro
54 article 09. Vous pouvez trouver la traduction frnçaise
originale à l'adresse http://www.ouah.org/nmap.html.
----[ Objectifs
Je pense que l'utilité de déterminer l'OS qui tourne sur un système est assez évidente, c'est pourquoi je ne m'étendrai pas sur ce point. Un des exemples les plus forts de cette utilité, est que beaucoup de failles de sécurité sont dépendantes d'une version d'OS. Supposons que vous faites un test de pénétration et que vous trouvez le port 53 ouvert. Si c'est une version vulnérable de bind, vous avez une seule chance de l'exploiter car un essai infructueux crashera le démon. Avec un bon "identificateur TCP/IP", vous trouverez rapidement que cette machine fait tourner 'Solaris 2.51' ou 'Linux 2.0.35' et vous pourrez ajuster votre scriptshell en conséquence. (...)
----[ Méthodologie de la prise d'empreinte.
Il y a de nombreuses techniques qui peuvent être utilisées pour prendre une empreinte des piles réseau. A la base, on cherche juste des choses qui diffèrent parmi les OS et on écrit un test pour déterminer la différence. Si vous combinez assez de ces techniques, vous pouvez déduire les OS d'une manière très fine. Par exemple nmap peut distinguer d'une manière fiable Solaris 2.4 par opposition a Solaris 2.5-2.51 ou Solaris 2.6. Il peut aussi dire Linux kernel 2.0.30 plutôt que 2.0.31-34 ou 2.0.35. Voici quelques techniques:
- Le test FIN -- La nous envoyons un paquet FIN (ou n'importe quel paquet sans flag ACK ou SYN) a un port ouvert et attendons la réponse. Le comportement conforme à la RFC793 est de ne PAS répondre, mais beaucoup d'implémentations incorrectes comme MS Windows, BSDI, CISCO, HP/UX, MVS et IRIX répondent par un RST. La plupart des outils courants utilisent cette technique.
- Le teste du flag BUG -- L'idée est de positionner un flag "TCP" indéfini (64 ou 128) dans l'en-tête TCP d'un paquet SYN. Les systèmes Linux antérieur au 2.0.35 conservent ce flag positionné dans leur réponse. Je n'ai trouve aucun autre OS ayant ce bug. Cependant, certains systèmes semblent reseter la connexion quand ils reçoivent un paquet SYN+BUG. Ce comportement pourrait être utile pour les identifier.
- Echantillonnage TCP ISN -- L'idée est ici de trouver les types de nombres de séquence initial (ISN) choisis par les implémentations TCP quand ils répondent à une demande de connexion. Ils peuvent être ranges dans plusieurs groupes comme le traditionnel 64K(beaucoup de vieux Unix), incréments aléatoires (dernier Solaris, IRIX, FreeBSD, Digital UNIX, Cray, et beaucoup d'autres), vraiment aléatoires (Linux 2.0.*, OpenVMS, derniers AIX, etc.). Les systèmes Windows (et quelques autres) utilisent un modèle "dépendant du temps" ou l'ISN est incrémenté d'un petit montant d'une manière périodique. (...)
- Bit "ne pas fragmenter" -- Beaucoup de systèmes d'exploitation commencent par positionner le flag IP "Ne pas fragmenter" sur certains des paquet qu'ils envoient. Cela permet des gains de performance. Tous les OS ne le font pas et certains le font dans d'autres situations, on peut donc en prêtant attention a ce bit glaner encore plus d'information sur l'OS cible.
- Fenêtre initiale TCP -- Il s'agit juste de vérifier la taille de la fenêtre sur les paquets retournes. Ce test donne actuellement beaucoup d'informations, car certains OS peuvent être identifies par cette fenêtre seulement (par exemple, AIX est le seul OS de ma connaissance utilisant 0x3F25). Dans leur pile TCP/IP "complètement réécrite" pour NT5, Microsoft utilise 0x402E. Il est intéressant de noter que c'est le même nombre que celui utilise par OpenBSD et FreeBSD.
- Valeur ACK -- Bien que vous puissiez penser que c'est complètement standard, les implémentations diffèrent par la valeur utilisée pour le champ ACK dans certains cas. Par exemple, supposons que vous envoyez un FIN|PSH|URG a un port TCP ferme. La plupart des implémentations affecteront au champ ACK la même valeur que votre ISN, cependant, Windows et quelques imprimantes stupides reverront seq+1. Si vous envoyez FIN|PSH|URG a un port ouvert, Windows est très inconstant. Il renvoi parfois seq d'autres fois il renvoi S++, et d'autres fois il renvoi une valeur visiblement aléatoire.
- Extinction des messages erreurs ICMP -- Certains OS (astucieux) suivent la suggestion de la RFC 1812 limitant la vitesse a laquelle divers messages erreurs sont envoyés. Par exemple, le noyau Linux (dans net/ipv4/icmp.h) limite la génération des messages destination inaccessible a 80 par 4 secondes, avec 1/4 de seconde de pénalité en cas de dépassement. Un moyen de tester ceci est envoyer un lot de paquet a un port haut UDP (choisi aléatoirement) et de compter le nombre de "destination inaccessible" reçus.
- Citation de message ICMP -- Les RFC spécifient qu'un message d'erreur ICMP cite une partie du message ayant cause les erreurs. Pour un message port inaccessible, presque toutes les implémentations renvoient seulement l'en-tête IP + 8 octets. Cependant, Solaris renvoi un peu plus et Linux encore un peu plus. La beauté de la chose est que ca autorise Nmap a reconnaître Linux et Solaris même s'ils n'ont pas de ports à l'écoute.
-
Intégrité des messages d'erreur ICMP émis
-- Comme il a été dit précédemment, les
machines doivent renvoyer une partie du message original avec un
message port inaccessible. Actuellement certaines machines utilisent
les en-têtes comme espace de travail pendant le traitement
initial, et ces en-têtes sont donc un peu altérés
quand ils les renvoient.
Par exemple AIX et BSDI renvoient un
champ IP 'taille totale' trop grand de 20 octets. Certains BSDI,
FreeBSD, OpenBSD, ULTRIX et VAX bousillent l'ID IP qu'on leur envoie.
Alors que la somme de contrôle va changer a cause de la
modification du champ TTL (**NDT : Champ Time To Live), il y a
certaines machines (AIX, FreeBSD, etc.) qui renvoient une somme de
contrôle inconsistante ou nulle. On constate la même
chose avec les sommes de contrôles UDP. L'un dans l'autre, Nmap
fait 9 tests différents sur les erreurs ICMP pour détecter
les subtiles différences de ce type.
- Type de service -- Pour les messages ICMP port inaccessible j'ai regarde la valeur du Type de service (TOS) du paquet retourne. Presque toutes les implémentations utilisent 0 pour les erreurs ICMP cependant Linux utilise 0xC0. Cela n'indique pas une des valeurs standards du TOS, mais est plutôt une partie du champ deprèsséance inutilisé (pour autant que je sache). Je ne sais pas pourquoi il est positionne, mais s'il change cette valeur en 0, nous serons capable d'identifier les vieilles versions ET nous serons capable de distinguer entre l'ancienne et la nouvelle.
- Gestion de la fragmentation -- Elle prend avantage du fait que différentes implémentations gèrent souvent différemment les fragments IP se recouvrant. Certains recouvrent la vieille partie avec la nouvelle dans d'autres cas c'est la vieille partie qui prédomine. Il y a beaucoup de tests différents qu'on peut utiliser pour déterminer comment le paquet a été réassemblé. Pour plus d'information sur les fragments se recouvrant, vous pouvez lire leur article (www.secnet.com).
-
Options TCP -- Elles sont vraiment une mine d'or en terme de
source d'information:
1) Elles sont en général
optionnelles: ce qui fait que toutes les machines ne les implémentent
pas.
2) On sait si une machine les implémente en envoyant
une demande avec une option positionnée. La cible montre
généralement qu'elle supporte l'option en la
positionnant dans sa réponse.
3) On peut positionner tout
un tas d'options dans un paquet pour tout tester en une seule
fois.
Nmap envoi ces options avec quasiment tous les paquets de
test: Window Scale=10; NOP; Max Segment Size = 265; Timestamp; End of
Ops. Quand on obtient une réponse, on regarde quelles options
sont retournées et donc supportées. Certains OS comme
les machines BSD récentes supportent toutes celles
positionnées plus haut, alors que d'autres comme Linux 2.0.x
en supportent très peu. Les derniers noyaux Linux 2.1.x
supportent tous ceux définis plus haut. Même si
plusieurs OS supportent le même ensemble d'options, on peut
parfois les distinguer par la VALEUR de ces options. Par exemple, si
on envoi une petite valeur MSS a une machine Linux, elle répondra
généralement par cette même valeur. d'autres
machines retourneront des valeurs différentes. Et même
si on obtient le même ensemble d'options supportées ET
les mêmes valeurs, on peut encore faire une différence
via l'ORDRE dans lequel les options sont données. Par exemple
Solaris retourne 'NNTNWME', quand à Linux 2.1.122, il retourne
'MENNTNW'. Même options, même valeurs mais un ordre
diffèrent !
- Chronologie des exploits -- Même avec tous les testsvus plus haut, nmap est incapable de distinguer les piles TCP de Win95, WinNT ou Win98. C'est plutôt surprenant, particulièrement quand on sait que Win98 est sorti 4 ans après Win95. On pourrait penser qu'il se serait soucie d'améliorer un peu leur pile (comme par exemple en supportant plus d'options TCP) et cela nous aurais permis de détecter les changements et donc distinguer les OS. Malheureusement ce n'est pas le cas. La pile NT est apparemment la vieille pile merdique qu'ils ont mis dans '95'. Et ils ne sont pas embeter a l'améliorer pour '98'.
(...) La fin de cet article ne concernant que l'utilisation de nmap a été coupée. Pour une versioncomplètee, dirigez vous sur le lien au début de cet article.
Annexe VI Introduction aux débordements de tampon
par Stéphane Aubert (06/10/2000)
Vous pouvez trouver ce document dans son intégralité à l'adresse: http://www.hsc.fr/ressources/breves/stackoverflow.html
--[ Introduction
Voici quelques notes qui introduisent et essayent d'expliquer le problème des débordements de buffer (tampon en français). Pour comprendre les débordements de buffer il faut avoir quelques bases sur le fonctionnement d'un microprocesseur, de l'assembleur, des systèmes d'exploitations, des compilateurs et la programmation. Pour comprendre vraiment les débordements de buffer il faut en faire. Tout ce qui est écrit dans ce document est testé sur Linux (Slackware 7). Certaines choses sont testées sur *BSD, et j'essaierai autant que possible de faire un parallèle avec Solaris (euh Sparc) et même Windows NT (non non pas sur Sparc ;-)
--[ Rappels sur la pile
Si pour vous une pile est le petit cylindre qui fait marcher plus longtemps les petits lapins roses, vous allez devoir vous accrocher ;-)
Sinon vous vous souvenez certainement qu'une pile est une structure mémoire (aisément modélisable en lamda-calcul) qui possède une base et un sommet. En assembleur le sommet est stocké dans un registre, ESP pour intel ou SP pour Sparc. On ne peut ajouter et supprimer des informations qu'au sommet d'une pile.
Sur Unix (sur pc), un programme est exécuté dans un certain environnement. La gestion paginée de la mémoire fait que le code à exécuter est chargé en mémoire à une adresse virtuelle qui est toujours la même (souvent) sur un même système.
Avant l'exécution du programme, pour que tout fonctionne, le système réserve de la mémoire. Ce programme a besoin de sa propre pile et d'espace pour allouer de la mémoire (avec par exemple la fonction malloc). Ainsi, on se retrouve systématiquement dans la configuration suivante :
+----------------+ Mémoire haute exemple : 0xbfffffff
| Pile (Stack) | |
| |<--SP |Sens de remplissage de la pile
| | V
+----------------+
| Données |
| (dont le tas : |
| heap) |
| |
+----------------+
| |
| |
| |
|Code |<--IP (instruction pointer)
+----------------+ Mémoire basse
IP (instruction pointer, eip chez Intel) contient l'adresse de la prochaine instruction à exécuter. SP contient l'adresse du prochain octet libre dans la pile.
--[ Rôle et fonctionnement de la pile
La pile allouée à un programme permet principalement l'appel de fonctions en permettant de sauvegarder des variables (registres) qui pourront ainsi être modifiées dans la fonction et restaurées à la sortie de la fonction mais elle sert aussi à passer les paramètres aux fonctions et à allouer les variables locales. Ces variables locales sont ainsi "protégées" même lors de fonctions récursives.
Les principales fonctions assembleur pour utiliser la pile sont (chez Intel) push et pop (respectivement pushl et popl) pour empiler et dépiler un entier long dans la pile. Il faut aussi bien comprendre que le sommet de pile est stocké dans un registre (ex: %esp) et qu'en modifiant ce registre on modifie l'état de la pile.
Ainsi, l'instruction : "subl $1024, %esp" permet d'allouer 1024 octets dans la pile en augmentant la taille de la pile de 1024 octets. Pour augmenter la taille de la pile il faut bien diminuer la valeur du registre SP car la pile est tête-bêche (la tête en bas).
Si on regarde le code asm généré par GCC lors de l'appel de fonctions et l'allocation de variables locales avec "gcc simple.c -S" il est relativement simple de comprendre la gestion de la pile.
% cat simple.c
int Func( char a ) {
char tmp[256], b;
b = a;
return 2;
}
int main( void ) {
int x;
x = Func( 0x41 );
return 0x33;
}
Il est aussi possible de voir le code avec la fonction disassemble de gdb :
(gdb) disassemble Func
Dump of assembler code for function Func:
0x8048380 <Func>: push %ebp
0x8048381 <Func+1>: mov %esp,%ebp
0x8048383 <Func+3>: sub $0x108,%esp
0x8048389 <Func+9>: mov 0x8(%ebp),%eax
0x804838c <Func+12>: mov %al,0xffffffff(%ebp)
0x804838f <Func+15>: mov 0xffffffff(%ebp),%al
0x8048392 <Func+18>: mov %al,0xfffffefb(%ebp)
0x8048398 <Func+24>: mov $0x2,%eax
0x804839d <Func+29>: jmp 0x80483a0 <Func+32>
0x804839f <Func+31>: nop
0x80483a0 <Func+32>: leave
0x80483a1 <Func+33>: ret
(gdb) disassemble main
Dump of assembler code for function main:
0x80483a4 <main>: push %ebp
0x80483a5 <main+1>: mov %esp,%ebp
0x80483a7 <main+3>: sub $0x4,%esp
0x80483aa <main+6>: push $0x41
0x80483ac <main+8>: call 0x8048380 <Func>
0x80483b1 <main+13>: add $0x4,%esp
0x80483b4 <main+16>: mov %eax,%eax
0x80483b6 <main+18>: mov %eax,0xfffffffc(%ebp)
0x80483b9 <main+21>: mov $0x33,%eax
0x80483be <main+26>: jmp 0x80483c0 <main+28>
0x80483c0 <main+28>: leave
0x80483c1 <main+29>: ret
Remarque : la fonction main est une fonction comme les autres :) avec les
mêmes problèmes de débordements de buffer !
Pour l'instant les lignes importantes sont :
main : push %ebp permet de sauvegarder %ebp car la ligne suivante écrase %ebp (Base Pointer)
main+3 : sub $0x4,%esp réserve 4 octets (var locale) dans la pile
main+6 : push $0x41 empile le paramètre de la fonction Func
main+8 : call va dérouter le processeur à l'adresse de Func en ayant préalablement empiler l'adresse de la prochaine instruction à exécuter après la fonction, ici : 0x80483b1
Donc à chaque appel de fonction la pile va contenir :
: :<-SP dans la fonction
+---------------+
| var. locale C |
+---------------+
| var. locale B |
+---------------+
| var. locale A |
+---------------+
| base pointer |
+---------------+
| @ de retour |
+---------------+
| paramètre X |
+---------------+
| paramètre Y |
+---------------+
| paramètre Z |
+---------------+
|/ / / / / / / |
| / / / / / / /|
+---------------+ <-- base de la pile = mémoire haute
Avec la fonction Func :
void Func( int X, int Y, int Z ) {
int A; int B; int C;
...
Pour la suite il faudra connaître l'adresse du sommet de la pile même approximativement. Quand on exécute un programme localement il est simple même en C d'obtenir le Stack Pointer :
% cat sp.c
long get_esp() {
__asm__("movl %esp,%eax\n");
}
int main( void ) {
printf( "SP : 0x%lx\n", get_esp() );
}
% gcc sp.c -g -o sp
% ./sp
SP : 0xbffff6f0
Remarque : tout le monde a bien compris comment fonctionne la fonction get_esp. Pas la peine de rappeler que la variable renvoyée par une fonction est stockée dans le registre AX (heuu %eax c'est plus du 8086 depuis longtemps ;-)). Donc il suffit de copier SP dans AX et de retourner au programme principal.
Si on exécute ce programme sur d'autre systèmes on obtient des valeurs différentes.
Linux mais root : 0xbffff780
root autre env. : 0xbffff7a0
Linux 2.0.36 : 0xbffff9e0
Sur un autre 2.0.36 : 0xbffffbf0
FreeBSD 5.0-CURRENT : 0xbfbffa28
OpenBSD 2.6 : 0xdfbfdce8
OpenBSD 2.7 : 0xdfbfd7a8
NetBSD 1.4Y : 0xbfbfd684
NT4.0 SP4 : 0x240ff98
NT4.0 SP6a : 0x240ff98
Solaris 2.6 (sparc) : 0xeffffcd0
--[ Description du problème de débordement de buffer
Il y a problème lorsqu'il y a débordement. Il y a débordement lorsque le code est mal écrit. Ce qui permet d'écrire : Il y a problème lorsque le code est mal écrit !
Le problème se situe plus précisément dans la pile lors, pour un exemple simple, de l'affectation d'une variable locale. Cette variable locale, comme nous l'avons vu, est allouée dans la pile.
Pour l'exemple (en langage C ;-)) suivant :
void Func( int X ) {
char tmp[16];
...
}
Lors de l'exécution du programme la place de 16 caractères (consécutifs) sera réservée dans la pile pour la variable nommée tmp. Si dans cette même fonction une suite d'instructions vient remplir cette variable avec plus de 16 caractères (octets), l'emplacement réservé à la variable tmp va être écrasé mais aussi les octets suivants dans la pile.
: :<-SP dans la fonction
+---------------+
| |<- tmp
| 256 octets |
| | |
+---------------+ |
| base pointer | | Sens de remplissage de la pile
+---------------+ |
| @ de retour | V
+---------------+
| paramètre X |
+---------------+
|/ / / / / / / |
| / / / / / / |
+---------------+ <-- base de la pile = mémoire haute
Les octets tout de suite écrasés sont le base pointer puis l'adresse de retour qui sera dépilée lorsque la fonction se terminera. A cet instant, le programme va exécuter l'instruction qui se trouve à l'adresse de retour. Qui était je le rappelle l'adresse de l'instruction suivant l'appel de cette fonction (la prochaine instruction à exécuter).
Si l'adresse de retour est écrasée, par exemple, par des caractères 'A' l'adresse de la prochaine instruction à exécuter est 0x41414141 (non valide), on peut dire qu'aucune instruction n'estprèssente à cette adresse, donc le programme arrête de fonctionner et plante. Le résultat obtenu est alors nommé : déni de service.
Si l'adresse de retour (pour faire simple, c'est pas tout à fait comme ça mais bon ...) est l'adresse de tmp et qu'à cet endroit on trouve des instructions que le processeur est en mesure d'exécuter alors à la sortie de la fonction le programme exécute des instructions non prévues par les programmeurs mais fournies par un utilisateur.
Si cet utilisateur est à l'autre bout d'Internet, il peut alors faire exécuter du code à distance sur le serveur et c'est ce qui s'appelle exploiter un débordement de buffer à distance. Les octets qui sont utilisés pour écraser la pile (ceux qui contiennent des instructions) sont appelés le shellcode (car ces premiers shellcode permettaient de lancer /bin/sh et d'avoir un shell interactif à distance).
Dans les 2 cas nous disons que le programme est vulnérable.
--[ Quelques liens
. Smashing The Stack For Fun And Profit
by Aleph One
ftp://phrack.infonexus.com/pub/phrack/phrack49.tar.gz
. How to write Buffer Overflows
by Mudge
http://www.l0pht.com/advisories/bufero.html
. Writing buffer overflow exploits - a tutorial for beginners
by Mixter
http://mixter.void.ru/exploit.txt
. http://www.bufferoverflow.org/textos.htm
Annexe VII IP Spoofing Appliqué
par truff@projet7.org
Ce texte est disponible dans son intégralité à l'adresse http://projet7.tuxfamily.org/factory/articles/ipsapp/ipspapp.html, nous en conragons vivement le lecteur à consulter l'article complet.
Introduction.
L'Ip spoofing est une attaque bien connue dans son principe de nos jours, c'est pourquoi je ne reviendrai pas sur une explication qui a déja été faite de nombreuses fois. Je m'attarderai ici dans une explication plus applicative en m'appuyant sur mes recherches personnelles dans ce domaine. La première partie de cette attaque consiste en une étude de la génération des ISN de différents systèmes d'exploitations. Dans un premier temps j'ai réalisé un utililitaire destiné à étudier la génération d'ISN par différents systèmes d'exploitation. A partir des résultats obtenus j'ai pu juger de la difficulté de l'attaque suivant les systèmes d'exploitation et ainsi pouvoir déterminer une méthode grossière de prédiction des ISNs qui m'a permis de réussir l'attaque sur des systèmes d'exploitation de type Win98. Enfin, j'ai amélioré ce code en utilisant une méthode mathématique beaucoups plus évoluée qui m'a permis d'attaquer d'autres systèmes d'exploitation.
Etude de faisabilité.
Génération d'ISN de différents systèmes d'exploitation.
A l'époque de la parution de l'article "IP Spoofing Demystified" [1] les générateurs d'ISN des systèmes d'exploitation étaient dépendants de seulement deux variables qui sont le temps et le nombre de connexion. Ceci permettait de prévoir trés facilement par un simple calcul mathématique la valeur d'un ISN à partir de celle d'un ISN précédemment acquis. L'ISN augmentait de 128000 chaque seconde et de 64000 à chaque nouvelle connexion. En réalisant l'attaque rapidement on pouvait considérer qu'aucune connexion ne serai établie et cela rendait donc la prédiction d'ISN assez triviale. Une première phase d'étude consistait donc a étudier la génération d'ISN de plusieurs systèmes d'exploitation de manière à établir des corrélation entre le temps et l'évolution des ISN. Pour cela j'ai dévellopé un utilitaire nommé Analysor [2] dont un des modes de fonctionnement permet de créer des listes de valeurs d'ISNs en fonction du temps. Dans l'état actuel Analysor possède 3 modes de fonctionnement symbolisés par les options -j, -k et -m. La première des options à avoir été implémentée est l'option -j qui permet d'obtenir 2 colonnes de nombres qui rprèssentent d'une part le temps écoulé depuis le début de l'expérience, et d'autre part la valeur de l'ISN de la cible. Ce formatage permet de tracer des graphiques a l'aide de l'utilitaire Gnuplot. Le schéma de fonctionnement de l'option -j est le suivant:
1/
Analysor: A------>B
Syn
2/
Analysor: A<------B
Syn/Ack
3/
Kernel: A------>B
Rst
Le fonctionnement est donc assez simple: on envoie un Syn, le serveur nous Ack/Syn en nous donnant une valeur d'ISN puis notre Kernel émet tout seul un Rst car il n'a pas été averti de l'ouverture d'une connexion et il pense donc que ce Ack/Syn n'a pas à être recu. Le fait que le Kernel envoye tout seul ce Rst est assez pratique car il permet de fermer automatiquement la demande de connexion engendrée pas le Syn. Si ce Rst ne partait pas, la connexion se retrouverai dans un état 'semi-établi', ce qui entrainerai en cas de nombreuses réitération du schéma précedent une forte consommation des resources du côté de l'host B.
Acquisition
des données.
J'ai
testé Analysor sur les différents systèmes
d'exploitation que j'avais sous la main de manière à
déterminer le plus vulnérable à l'Ip Spoofing.
Le test consiste en l'envoie de 1000 paquets à intervalles
réguliers de 20000 µs. A l'aide de ces 1000 ISNs
récoltés pour chaque système d'exploitation il
est possible de tracer des graphiques donnant une allure générale
de l'évolution des ISNs en fonction de temps.
Analyse des données.
A l'aide de l'utilitaire Gnuplot il est possible de se donner une rprèssentation plus explicite des résultats obtenus à l'aide de Analysor. On trace tout d'abord des graphiques distincts pour chaque système d'exploitation de manière à se donner une idée générale de l'évolution des ISNs sur ces systèmes d'exploitation. Enfin, on représente toutes les courbes sur un même graphique ce qui nous permet de constater les lacunes et les aventages qu'ont chaque système d'exploitation par rapport aux autres. Les tests on été réalisés sur un réseau ethernet 100 Mb/s avec 2 machines reliées par cable RJ45 croisé.
OpenBSD 2.9
Analyse:
- Amplitude = 4.25e+09 - 2.2e+09
= 2.05e+09
Cette valeur de l'amplitude représente la moitié de la plage dans laquelle peut se situer un ISN. Le générateur aléatoire d'OpenBSD 2.9 utilise donc assez bien les 32 bits attribués à un ISN. Les ISNs sont stoqués sur 32 bits et sont des nombres non signés, un calcul rapide nous donne la valeur maximale que peut avoir un ISN: 2^32 = 42949667296. OpenBSD 2.9 génère donc des valeurs d'ISN qui atteignent le maximum. On vois que la valeur des ISNs passe d'une valeur minimale a une valeur maximale très rapidement. L'évolution générale n'étant pas monotone cette dernière remarque assure avec les deux précédentes une robustesse assez acrue pour le générateur aléatoire d'OpenBSD 2.9.
Commetaire:
OpenBSD 2.9 démontre ici toutes
sa puissance dans le domaine de la sécurité. Ce système
puise sa robustesse à l'aide de l'audit du code source, mais
aussi à l'aide d'une très bonne gestion de la
cryptographie [4]. Les algorithmes cryptographiques nécessitent
des nombres aléatoires, on ne s'étonne donc pas de voir
que le générateur aléatoire d'OpenBSD 2.9 soit
trés fiable. Ce dernier utilise plusieurs sources d'entropie :
délais entre les interruption de la souris
délais entre les packets réseaux échangés,
délais entre l'appui sur les touches du clavier
accéaccès
Linux 2.2.16
Analyse:
- Amplitude = 3.629e+09 - 3.614e+09
= 15e+06
Les ISNs évoluent rapidement sur une plage de 15 millions de valeurs ce qui reste tout à fait acceptable. De plus cette évolution pas à pas n'est pas monotone: la valeur augmente puis elle décroit. L'allure générale de l'évolution de la génération d'ISN est ici monotone croissante ce qui permet de renforcer (très légèrement) la robustesse du générateur aléatoire de Linux.
Commetaire:
Linux possède un générateur
de nombre pseudo aléatoires de bonne qualité. Bien
qu'il n'atteigne pas le niveau de celui d'OpenBSD 2.9, il permet de
rendre trés difficile, voir presque impraticable les attaques
de type Blind Ip Spoofing.
Windows 98
Analyse: - Amplitude = 0(c'est une ligne droite)
Les ISNs évoluent linéairement (et lentement) avec le temps. De plus, les valeurs d'ISNs sont peu élevées
Commentaire: Le générateur n'est pas aléatoire, il dépend implicitement du temps et évolue lentement avec ce dernier. Ceci engendre la possibilité d'une attaque de Blind Spoofing. Comme chacun sait, les sources de Windows ne sont pas libres, mais à la vue de cette courbe on imagine facilement l'allure de la fonction et surtout l'incompétence des développeurs qui l'ont codé.
Linux
2.2.16 / OpenBSD 2.9 / Windows
98
Ce
dernier graphique permet de comparer les différents
générateurs de nombres pseudo-aléatoire entre
eux. On vois bien qu'OpenBSD possède le plus robuste. Linux
bien que possédant un bon générateur aléatoire
lui permettant de se mettre a l'abris de la plupart des attaques est
quand même bien loin d'OpenBSD. Enfin, Windows 98 est ridicule
avec un générateur qui ne décolle même pas
et dont on a du mal à différencier la courbe avec l'axe
des absices.
(..) Le reste de l'article n'étant que d'un application limitée a Windows 98 nous laissons au lecteur le soin (tout en l'encourageant vivement) d'aller consulter l'article en ligne à l'adresse http://www.projet7.org.
5.0 Bibliographie et Codes.
[01]IP-spoofing
Demystified,
by daemon9 / route / infinity.
[02]Analysor
by
truff.
[03]Gunplot
by Thomas Williams, by Colin Kelley and many
others.
[04]OpenBSD
Cryptography.
[05]Linux
2.2.x ISN Vulnerability,
by Teso.
[06]Server.tcl
by truff.
[07]Spoof.tcl
by truff.
[08]Nemesis
by obecian.
[09]Strange
Attractors and TCP/IP Sequence Number Analysis
by
Michal Zalewski.
[10]Blindy
by truff.
[11]isnpatch
by truff & climax.
Bit:
C'est l'unité binaire de quantité d'information qui peut représenter deux valeurs distinctes : 0 ou 1.
Buffer:
Une mémoire utilisée pour conserver temporairement les données pendant leur transmission.
Byte:
Un champ de 8 bits.
BSD:
Systéme d'exploitation OpenSource fortement apparenté aux systéme de type GNU/Linux.
CGI:
(Anglais : Common Gateway Interface). Une interface d'exécution des programmes sur un serveur.
CRC:
(Anglais : Cyclic Redundancy Checking). Un type de détection d'erreur.
Cryptographie:
(Anglais : Cryptography) (Italien : Crittografia)
La science du code. Elle protége des regards indiscrets votre correspondance sur le réseau (messages, fichiers). Seul un mot de passe, une clé numérique, permet d'y accéder.
CPU:
Le microprocesseur. Ses caractéristiques les plus importantes sont sa fréquence de fonctionnement et le nombre de bits qu'il adresse simultanément. Les PENTIUM sont des processeurs 32 bits à des fréquences entre 60 et 1,5 GHZ. Ces informations ne sont pas suffisantes pour comparer deux processeurs de famille différente. Leur rapidité dépend du nombre de cycles d'horloge que chaque instruction et de leur architecture CISC, RISC etc...
Encapsulation:
Principe consistant à enfermer les données et les algorithmes des objets en ne laissant visibles que les interfaces
Ethernet
Un type de réseau local rapide et très répandu conçu à l'origine par Xerox, Intel et Digital en 1976. La vitesse de transmission est de 10 Mbps et la limite de chaque section est de 2.5 km. Une nouvelle version d'ethernet appelée 100-Base-T offre une vitesse de transmission de 100 Mbps.
Extranet:
Réseau de télécommunication et de téléinformatique constitué d'un intranet étendu pour permettre la communication avec certains organismes extérieurs, par exemple des clients ou des fournisseurs.
Firewall:
Dispositif matériel ou plus souvent logiciel destiné à filtrer les informations transmisses sur un réseau.
GNU:
(Anglais : Gnus Not Unix). Association de programmeurs pour l'écriture et la diffusion de logiciels libres (pour Linux par exemple). Ce sont eux qui distribuent l'éditeur de texte Emacs. Leur projet GUILE met en avant le langage Scheme comme langage embarqué universel pour les applications
GNU/Linux:
Linux est une version d'UNIX gratuite et librement diffusable crée par Linus Torvalds. Linux prend de plus en plus d'importance. Le kernel (noyau) a pu se développer par l'intermédiaire d'Internet et des passionnés de programmation. L'avantage de Linux est qu'on peut trouver des mises à jour très rapidement. En réseau Linux prends une ampleur certaine et est vraiment incomparable à certains autres systèmes : passerelles, serveurs ftp, dns, Web etc... Une nouvelle étape a été franchie l'arrivée du noyeau 2.2.0 qui a en effet quelques merveilles le tout livré avec les sources et librement téléchargeables et diffusables. C'est-à-dire que si vous avez une distribution de Linux sur cd rom et que vous voulez en faire une copie la GPL (Gnu Public License) vous en donne le droit et tout ceci gratuitement.
Hexadécimal:
Un système numérique de base (ou radical) 16. Les symboles utilisés dans ce système sont les chiffres de 0 à 9 et six chiffres supplémentaires généralement représentés par les lettres A, B, C, D, E et F.
IDS:
Dispositif matériel ou plus souvent logiciel permettant de monitorer l'activité sur un réseau et d'y détecter des actions inhabituelles. Un IDS permet de détecter l'infiltration du réseau par un pirate grâce à l'activité qu'il y provoque.
Interface:
Une voie d'échange d'informations qui permet à un ordinateur ou plusieurs ordinateurs ou des équipements extérieurs (imprimantes, moniteurs ou modems) ou deux ou plusieurs ordinateurs de communiquer.
Intranet:
Réseau local et privé (entreprise) qui utilise les technologies de l'Internet : Web, e-mail, etc., mais ne s'ouvre pas aux connexions publiques. Contrairement à Internet, nom propre, on écrira intranet, comme internaute.
Macro:
Une série de commandes qui s'exécute automatiquement pour accomplir une tâche répétitive.
Multiplexage:
Consiste à partager un même support physique pour obtenir plusieurs liaisons.
Octet:
Voir byte.
OpenSource:
Logiciel dont les sources sont disponible avec le programme.
OS:
(Anglais : Operating system) (Français : système d'exploitation)
Programme assurant la gestion de l'ordinateur et de ses composants. Exemples : Linux, Windows, Unix, MacOS ou encore BeOS.
Processus:
Instance d'un programme informatique en exécution.
Proxy:
Ordinateur qui s'intercale entre un réseau privé et l'Internet. Pour faire office de firewall ou de cache. Dans ce dernier cas, il enregistre les pages Web transférées par les utilisateurs pour les délivrer sans qu'il soit nécessaire de se connecter sur le serveur initial.
Proof of Concept:
Exploit ou technique décrits uniquement dans un but d'application d'une théorie pour prouver sa validité pratique.
Réseau Switché:
Dans une typologie de réseau en étoile, chaque interface réseau est connectée via un câble à un répartiteur central. Ce répartiteur se décline généralement en deux types, soit un HUB, qui va répéter chaque paquet à toutes les machines connectées, ou soit un switch qui ne va renvoyer le paquet qu'à la machine concernée par un système de mémoire cache.
Routeur:
(Anglais : router). Outil logiciel ou matériel pour diriger les données à travers un réseau. Il s'agit souvent d'une passerelle entre plusieurs serveurs pour que les utilisateurs accédent facilement à toutes les ressources proposées sur le réseau. Le routeur désigne également une interface entre deux réseaux utilisant des protocoles différents.
Synchronisation:
(Anglais : synchronization) Technique qui permet d'établir et de maintenir des signaux en synchronisme dans un réseau.
1Permission vous est donnée de copier, distribuer et/ou modifier ce document selon les termes de la Licence GNU Free Documentation License, Version 1.1 ou ultérieure publiée par la Free Software Foundation.
2Uniway est une société référence en belgique comme entreprise d'intégration de services d'informations sécurisés. Située à Bruxelles, elle compte parmi ses clients l'Etat belge, différentes banques et compagnies aérienne belge et luxembourgeoise, l'armée et bien évidemment différentes entreprises commerciales.
4Le protocole ARP est définis par la RFC 826 disponible à l'url: http://www.faqs.org/rfcs/rfc826.html
5Le Protocole IP est définis par la RFC 791 disponible à l'url: http://www.faqs.org/rfcs/rfc791.html
6La nouvelle version 6 du protocole IP qui va être mise en place introduit des adresses notées sur 128 bits, soit 2^128 adresses possibles.
10L'algorithme de réassemblage est décrit dans la RFC 815: http://www.faqs.org/rfcs/rfc815.html
11Le Protocole TCP est définis par la RFC 793 disponible à l'url: http://www.faqs.org/rfcs/rfc793.html
12Le protocole UDP est définis par la RFC 768 disponible à l'url: http://www.faqs.org/rfcs/rfc768.html
13Le protocole ICMP est définis par la RFC 792 disponible à l'url: http://www.faqs.org/rfcs/rfc792.html
14Par exemple la loi française interdisant le cryptage avec des clés supérieures à 128 bits, ce qui place le décryptage à portée de l'Etât mais aussi, malheureusement, du premier quidam venu. On peut aussi citer plus récemment l'interdiction par les organismes (principalement européens) de régulation des ondes hertziennes de l'utilisation des technologies wireless à cryptage fort, limitant celle-ci a un cryptage faible etdèssuet.
15Voir l'annexe IV avec le texte de référence sur ce sujet, The Art of Port Scanning
16FrontPage est un ensemble d'outils pour l'administration de site web distribué par Microsoft.
18Le protocole rloginpermet d'accéder à un terminal sur la machine qui fournit ce service sur seule foix de l'adresse IP du demandeur. Très peux sécurisé, ce protocole a tendance a disparaître (et heureusement) pour être remplacé par des solutions plus sécurisée comme SSH (voir chapitre concernant la sécurisation du réseau).
19Notons que MafiaBoy, adolescent de 15 ans au moment des faits, a été reconnu coupable de l'attaque DdoS contre les sites de CNN, eBay, etc. dont le coût a été évalué à 1,6 Milliards de dollars par les Services Fédéraux américains. Il a été comdamné a 8 mois de détention dans un centre pour adolescent par la justice cannadienne.