Les Forums

Les Forums

Les forums sont fermés. Ils restent présent pour consultation et archivage.
Vous pouvez désormais poser vos questions directement dans les commentaires en bas de chaque page du site.
Alors n'hésitez pas à participer

Ping TCP en C

Bonjour,
On m'a demandé pour un projet d\'école, de mettre en place un ping TCP en
langage C. Ce ping doit pouvoir se faire à partir d'une machine Linux
(principalement Ubuntu), d'une machine FreeBSD, et éventuellement à
partir d'un OS Windows.
Mon probleme est le suivant :
Comment envoyer une trame TCP en langage C vers une adresse IP, sachant
que la machine cible n'aura aucun port ouvert?
Un deuxieme probleme qui à mon avis est plus trivial : Comment évaluer le
temps de réponse de la cible, avec une précision à la milliseconde, voire
microseconde.

Je vous remercie de votre aide précieuse
Lu gurbix,

Si tu envoi un SYN à un hote qui n'écoute pas le port, tu recevras, probablement, un retour d'erreur ICMP. Cela peux te permetre la mesure. Sinon, oui le port devra être ouvert.

@+
_SebF - Sébastien FONTAINE
Hello,

Après avoir étudié un peu plus en détail le problème, voilà comment je vois la chose.

Je devrais commencer par créer une trame TCP SYN. Une fois cette trame créée, je devrais ensuite l'envoyer à la cible en lançant un chronomètre, et attendre sa réponse (que ce soit un ACK ou un RST importe peu finalement, tant qu'il y a une réponse) pour arrêter le chrono et afficher le résultat de la requête.

Je suis malheuresement confronté à 2 problèmes principaux : Comment fait-on pour créer une trame TCP?, et comment fait-on pour l'envoyer sans avoir à ouvrir de socket?

Merci de ton aide
Lu gurbix,

Tu développe avec la librairie Libpcap et alors u forgera au niveau 2 et donc sans utiliser les socket.

@+
_SebF - Sébastien FONTAINE
Ne pas farfouiller à partir de ce lien si tu as envie de te prendre la tête à écrire le code toi-même, sinon gogo 🙂
http://www.elifulkerson.com/projects/tcping.php
Hello,

Merci à vous 2, j'ai suivi tes conseils sebf, et voila où j'en suis :
J'ai téléchargé libnet pour générer les trames, et libpcap pour sniffer le traffic et analyser les trames.
J'ai fini la partie génération de trames, il ne me reste plus qu'à les récuperer avec libpcap pour obtenir la réponse au SYN.

J'ai par contre un problème minime qui peut quand même s'avérer problématique. La génération de trames avec libnet fonctionne parfaitement, mais uniquement lorsque je suis connecté en ethernet. Dès que je passe sur le wifi, libnet ne veut plus générer la trame et me met un message d'erreur comme quoi il ne veut pas générer la trame IP parcequ'il n'a pas d'adresse source valide. Je pense que ça vient de ma distrib d'Ubuntu, puisque le message provient d'ioctrl. Si vous avez des pistes pour résoudre ce problème, elles seront toutes bienvenues.

Je vous tiendrais au courant de mon avancement
Lu gurbix,

Libpcap fonctionne très en wifi. Tu tester les différents exe de ce site et regarder leurs code source.

@+
_SebF - Sébastien FONTAINE
Hello seb,

Oui c'est sur libpcap fonctionne très bien sur n'importe quelle interface, mais dans toutes les docs que j'ai consulté, libpcap sert à sniffer les paquets passants sur une/des interfaces. Pour faire fonctionner mon ping TCP, je dois non seulement sniffer l'interface qui va recevoir le ACK ou RST, mais aussi générer ma trame pour l'envoyer à l'IP de destination avec le flag. On peut générer des trames avec libpcap?
Oui sans soucis
_SebF - Sébastien FONTAINE
[i:fce1598726]libnet ne veut plus générer la trame et me met un message d'erreur comme quoi il ne veut pas générer la trame IP parcequ'il n'a pas d'adresse source valide.

Ca ressemble plus à un problème lié au fait que tu sois pas en managed, voire not-associated au moment où tu utilises ton soft oO

Que ca soit wifi ou ethernet, le protocole réseau ne change pas (je parle pas des aspects wifi mais du phénomène d'abstraction matérielle). Exemple tout bête, l'utilitaire ping fonctionne en ethernet comme en wifi, car les interfaces sont les memes, c le driver qui gère les spécificités.

Quoiqu'il en soit, tu peux utiliser un utilitaire de sebf pour te forger un paquet pour voir si c'est possible, il y a de forte chance que tu aies le meme message d'erreur, et que par conséquent le problème vienne plutot de te configuration au moment du test !

My 2 cents 🙂

NB: Par contre, rien n'empeche aussi que ca soit un bug lié au driver wifi que tu as, perso j'ai un chip intel 4965, et j'ai eu beaucoup de mal à faire fonctionner le mode monitor par exemple (bugs sur bugs) :]