IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

Probleme avec tcp_info


Sujet :

Réseau C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut Probleme avec tcp_info
    Bonjour,

    je réalise un sniffer avec pcap (tcpdump) sous linux et j'aimerais utiliser la structure tcp_info pour affiner mon filtre (par exemple : si le mss est spécifié).

    Le probleme est que je ne comprend rien à cette structure qui n'est ni commentée ni expliquée nulle part (<netinet/tcp.h>). Comment savoir quelles options sont utilisées ?

    Merci d'avance

  2. #2
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    J'avais déjà vu cette page mais cela ne m'avais pas aidé.

    Je vous explique rapidement plus en détails mon problème.

    J'utilise pcap pour récupérer des paquets sur lesquels je veux avoir certaines informations (valeur du MSS lors du handshake en l'occurrence).

    Pour cela je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    const struct etherhdr*etherhdr;
    const struct ip* iphdr;
    const struct tcphdr* tcphdr;
    const struct tcp_info* tcpinfo;
     
    int etherhdr_size = sizeof(struct etherhdr);
    int iphdr_size = sizeof(struct ip);
    int tcphdr_size = sizeof(struct tcphdr);
    int tcpinfo_size = sizeof(struct tcp_info);
     
    etherhdr = (struct etherhdr *) packet;
    iphdr = (struct ip *) (packet + etherhdr_size);
    tcphdr = (struct tcphdr *) (packet + etherhdr_size + iphdr_size);
    tcpinfo = (struct tcp_info *) (packet + etherhdr_size + iphdr_size + tcphdr_size);
    Lorsque j'affiche des informations sur le header TCP ou IP j'ai des informations correctes mais lorsque je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("Send MSS = %u & Receive MSS = %u & Advertised MSS = %u\n", tcpinfo->tcpi_snd_mss, tcpinfo->tcpi_rcv_mss, tcpinfo->tcpi_advmss);
    J'ai des valeurs bizzaroides comme 4154236971 pour le MSS send alors que wireshark m'indique des valeurs cohérentes, 1460, 1448, ...

    J'ai également fais un ntohs sur ces valeurs mais elles ne semblent pas plus cohérentes (259, 11176, ...).

    J'espère que c'est clair

    Merci

  4. #4
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Qu'est ce qui te fait penser que tu peux faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tcpinfo = (struct tcp_info *) (packet + etherhdr_size + iphdr_size + tcphdr_size);
    J'ai l'impression que tu n'as pas vraiment lu le lien que j'ai donné.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Re,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tcpinfo = (struct tcp_info *) (packet + etherhdr_size + iphdr_size + tcphdr_size);
    Semblait couler de source vu que cela vient après le header TCP (qui ne contient pas ces infos).

    J'ai lu plus en détails l'article et ca ne m'aide pas vraiment. Il explique une méthode pour récupérer des informations sur une connexion TCP en créant une socket. Mais moi dans mon sniffer je n'ai accès à aucune socket (utilise les fonctionnalités de pcap) et je risque d'avoir plusieurs centaines de connexions TCP simultanées, entrantes ou sortantes ...

    Puis il indique un fichier (tcp.c) ou on peut trouver des explications sur comment la structure est remplie mais je n'ai pas ce fichier sur ma distri (Ubuntu 8.04).

    Ou alors j'ai raté qqchose dans l'article

    Donc que ce soit en utilisant cette structure tcp_info ou pas, comment puis avoir accès aux informations contenues dans les options des paquets TCP (à part chercher pendant longtemps pour créer ma propre structure ...) ?

    Merci d'avance

  6. #6
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Martin.D Voir le message
    Semblait couler de source vu que cela vient après le header TCP (qui ne contient pas ces infos).
    Ah bon? où as tu été péché cela? après le header TCP, il y a les datas.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Oui, je sais ! Mais comme la structure tcphdr de tcp.h ne comptait que 20 octet pour une taille supérieure du header length (lors du hanshake spécialement), je me suis dis que pour capturer ces informations il suffisait d'utiliser la structure tcp_info juste après.

    Car si on met la structure de 20 octet du TCP header, il reste certains bits qui ne doivent pas être des données mais bien partie de l'header TCP ...

    As tu une idée pour récupérer ces informations stp ?

  8. #8
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Dans ce cas, le seul moyen que je vois est d'inspecter les segments pendant le three way handshake et notamment durant le SYN et SYN ACK, le MSS est envoyé à ce moment là (mais ça n'est pas obligatoire).
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Tout à fait d'accord !

    Mais le soucis c'est que je n'arrive pas à accéder à ces informations vu qu'elles se trouvent dans les options de l'header TCP et que ces options ne sont pas prises en comptes par le header TCP de <netinet/tcp.h>.

    Dés que le header length est supérieur à 20 c'est qu'il y a des options. Mon expression du filtre est de prendre juste les packets ayant le flag syn ou les flags syn et ack à 1. Tout ca marche très bien, le seul soucis c'est l'accès aux options ...

    Donc comment récupérer ces informations ??

    (merci pour ces réponses rapides en passant)

  10. #10
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Comment les récupérer? en les analysant!
    voici la procédure:
    vérifier le champ Data offset, il doit avoir la valeur 5 minimum, s'il vaut plus, c'est qu'il y a des options.
    Le format des options est le suivant:
    un identifiant sur 1 octet qui vaut:
    0 - End of options list
    1 - No operation (NOP, Padding)
    2 - Maximum segment size (see maximum segment size)
    3 - Window scale (see window scaling for details)
    4 - Selective Acknowledgement ok (see selective acknowledgments for details)
    8 - Timestamp (see TCP Timestamps for details)

    Les identifiants 2, 3 et 8 sont suivis d'un octet précisant la longueur de l'option en octet, suivi de l'information elle même.
    Exemple en hexa:
    020405B4 => 02 nous dit qu'il s'agit du MSS, 04 nous qu'il y a en tout 4 octets pour cette option donc 1 octet pour l'indentifiant, 1 autre pour la longueur et les 2 autres pour le MSS lui même, on a donc déjà lu 2 octets, il nous en reste 2 à lire, 05B4 soit 1460.

    J'espère avoir réussi à me faire comprendre car ce n'est pas facile à expliquer.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    J'y suis finalement arrivé ! Merci bien nicolas.sitbon

    Je vais vous mettre mon code qui n'a rien d'optimiser ni de complet vu que je ne traite pas toute les options, mais c'est une bonne base.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    const struct etherhdr* etherhdr;
    const struct ip* iphdr;
    const struct tcphdr* tcphdr;
     
    int etherhdr_size = sizeof(struct etherhdr);
    int iphdr_size = sizeof(struct ip);
    int tcphdr_size = sizeof(struct tcphdr);
     
    etherhdr = (struct etherhdr *) packet;	
    iphdr = (struct ip *) (packet + etherhdr_size);
    tcphdr = (struct tcphdr *) (packet + etherhdr_size + iphdr_size);
     
    if (tcphdr->doff  > 5) {
      const u_char* tcpOptions = packet + etherhdr_size + iphdr_size + 20;
      char kind[4];
      sprintf(kind, "%3d", *tcpOptions);
      int optType = atoi(kind);
     
      while (optType != 0) {
        if (optType != 2) {
          switch (optType) {		
            case 1 : tcpOptions++;	break;
            // Autres options à gérer pour être complet
          }
        }
        else {
          tcpOptions += 2;
          char mss_hexa[5];
          sprintf(mss_hexa, "%2x%2x", *tcpOptions, *(tcpOptions + 1));
          int mss = hex2Dec(mss_hexa);
          break;
        }
        sprintf(kind, "%3d", *tcpOptions);
        optType = atoi(kind);
      }
    }
    Ce n'est pas commenté mais ca me semble assez explicite. J'ai pas trouvé d'autres moyens pour les conversions u_char, char, hex, dec :s

    Résolu

  12. #12
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Sans parler des problèmes de sécurité inhérents à ton code, ton algo n'est pas bon, exemple :
    Ici j'ai mis le SACK en premier et le mss en second et ton va prendre le 02 qui indique la longueur de l'option sack, pour l'identifiant de MSS.
    De plus le MSS est uint32_t, donc il peut varier de 1 à 4 octets, d'où l'importance de lire la longueur contrairement à ce que tu fais où tu présumes celle ci à être toujours 2.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Ok, pour la longueur j'avais oublié ce détails.

    Pour l'autre point j'en étais bien conscient ! J'ai ici mis un premier jet de code fonctionnel ! Juste pour donner l'idée générale.

    Sais tu si toutes les options listées ici sont susceptibles d'apparaitres lors du handshake ?

    Merci pour ces conseils

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Après quelque recherche concernant l'option MSS, la taille de cette option semble fixée à 4 octets et donc 2 pour la valeur du MSS. Je suppose que cette façon de faire permet de supporter l'évolution future des MTU. Mais avec 2 octets on arrive déjà à 65536 octets ...ce qui est suffisant normalement sauf si utilisation de jumbogram.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo