Herkeios

Système de détection des intrusions

Sockets entrants/sortants



   Dans ce court article, nous nous proposons juste de rappeller et d'expliquer le format des deux fichiers /proc/net/tcp et /proc/net/udp que nous avons utilisé dans notre programme de détection des comportements anormaux.

Le système de fichiers /proc
   Sous Linux, les fichiers du répertoire /proc constituent un lien entre les modules côté kernel et les applications côté utilisateur. Au final, beaucoup des programmes donnant des informations sur le systèmes (arp, lsmod, ...) les tirent finalement de fichiers contenus par ce dossier (ici, /proc/net/arp, /proc/modules, ...). Ce système de fichier est finalement utilisé par les modules car c'est le seul moyen de pouvoir ouvrir et lire/écrire dans des fichiers proprement depuis l'espace kernel. Effectivement, les appels systèmes sys_read() et sys_open() ne peuvent pas réellement être utilisés de façon propre depuis l'espace utilisateur (ils ont d'ailleurs été supprimés des symboles exportés depuis 2.6.25). Le sous-répertoire /proc/net regroupe notamment toutes les informations tirées des drivers réseaux et appels systèmes gérant par exemple les sockets. Un bon endroit pour y chercher des statistiques sur les sockets entrants/sortants non ?

Sockets UDP et TCP
   Parmi les fichiers utilisés par le programme netstat pour résumer les informations sur les connexions, il y a /proc/net/tcp et /proc/net/udp, contenant comme on peut s'y attendre les connexions actives TCP et UDP. Leur synthaxe est relativement similaire, une première ligne contenant les abréviations des 12 colonnes. Les lignes suivantes regroupent les infos sur les sockets suivant ces différentes colonnes que voici :
    - sl : numéro décimal unique identifiant la socket (numéro:)
    - local_address : l'adresse IP locale ainsi que le port de connexion local. Une adresse de 0 indique un serveur, un port de 0 indique "tous" (adresse:port, les 2 en hexadécimal)
    - rem_address : identique à local_address pour l'autre bout de la socket
    - st : Etat de la connexion, entre 0 et 12 en hexa. Voici un extrait d'un header de notre programme d'analyse statistique comprenant les différents états :
      /*
      * Etat de la connexion (surtout utilisé pour les connexions TCP)
      * Les connexions UDP par défaut seront dans un état CLOSE, même actives
      */
      #define UNKNOWN 0x0C
      #define CLOSING 0x0B //Sockets arrêtées mais données locales non envoyées
      #define TCP_LISTENING 0x0A //Socket à l'écoute de connexions entrantes
      #define LAST_ACK 0x09 //Attente d'acquittement de la fin de la connexion
      #define CLOSE_WAIT 0x08 //La socket distant a arrêté, attendant la fermeture du socket
      #define CLOSE 0x07 //Socket non utilisée
      #define TIME_WAIT 0x06 //La socket attend le traitement des autres paquets du réseau avant d'entreprendre la fermeture
      #define END_WAIT2 0x05 //Connecion fermée, socket attend la terminaison du distant
      #define END_WAIT1 0x04 //Socket fermée, socket en cours de terminaison
      #define SYN_RECV 0x03 //Requête de connexion vient d'être reçue du réseau
      #define SYN_SENT 0x02 //Socket attend activement l'établissement d'une connexion
      #define CONNECTED 0X01 //Connexion établie

    - tx_queue,rx_queue : Files d'attente en transmission et en réception (tx_queue:rx_queue, hexa)
    - tr,when : nombre de paquets en cours de transmission, heure du prochain timeout (tr:when), hexa
    - retrnsmt : le nombre de paquets qui ont été retransmis suite à des erreurs, hexa
    - uid : UID du propriétaire de la socket, décimal
    - timeout : durée d'un timeout, hexa
    - inode : entre 3 (UDP) et 8 (TCP) mots espacés contenant les informations sur l'inode (fichier effectif) où est stocké la socket.
Par conséquent, l'observation périodique des sockets entrants/sortants sur le système peut se faire simplement par la lecture de ce fichier qui rend toutes les informations nécessaires à une analyse simple.


Site sur la sécurité informatique - Qu'est-ce qu'un IDS ? - L'équipe Herkeios