Programmation.c : traceroute udp ou comment faire sans icmp ?
Posté par RB () le 17 décembre 2007
Hello,
je sais que les prog de traceroute d'aujourd'hui utilisent udp pour qu'un utilisateur sans les droit root puissent l'exécuter. Ce que je ne comprend pas c'est comment cela fonctionne vu qu'effecivement les paquets udp sont envoyé avec des ttl qui augmentent mais les erreurs sont renvoyées en ICMP (donc il faut ouvrir un raw socket pour les recevoir...).
J'ai analysé avec tcpdump et effectivement, on a aucun reply udp mais que icmp, je ne comprend pas d'ou sortent les adresses des routeurs et comment elles sont remontées au programme (vu qu'il n'y a pas de raw socket ouverts en user à part socket(PF_NETLINK, SOCK_RAW, 0) (vu avec strace))
J'essaie de voir avec le code source des traceroute en ce moment mais je ne suis toujours pas au clair...
Si quelqu'un sait la réponse merci.
je sais que les prog de traceroute d'aujourd'hui utilisent udp pour qu'un utilisateur sans les droit root puissent l'exécuter. Ce que je ne comprend pas c'est comment cela fonctionne vu qu'effecivement les paquets udp sont envoyé avec des ttl qui augmentent mais les erreurs sont renvoyées en ICMP (donc il faut ouvrir un raw socket pour les recevoir...).
J'ai analysé avec tcpdump et effectivement, on a aucun reply udp mais que icmp, je ne comprend pas d'ou sortent les adresses des routeurs et comment elles sont remontées au programme (vu qu'il n'y a pas de raw socket ouverts en user à part socket(PF_NETLINK, SOCK_RAW, 0) (vu avec strace))
J'essaie de voir avec le code source des traceroute en ce moment mais je ne suis toujours pas au clair...
Si quelqu'un sait la réponse merci.
> Lire le message (2 commentaires, moyenne: 1).
Vous avez demandé le commentaire #890709.



bon j'ai compris...
en fait en appelant avec un socket UDP (entre autres) avec
recvmsg(sk, &msg, MSG_ERRQUEUE)
On va avoir les erreurs dans msg (struct msghdr). Ensuite il faut parser le tout et on peut retrouver différentes sources d'erreurs dont les erreurs ICMP.
man recvfrom
man cmsg
Bref, si on ne peut pas écouter les erreurs ICMP directement en raw socket, le noyau nous permet de les récupèrer quand même indirectement via ce méchanisme.
[^]Re: bon j'ai compris...
En fait ces paquets icmp sont liés aux paquets udp envoyés car faisant partie de la même "connexion" (attention aux guillemets). Le noyau permet donc de récupérer l'information.
Vous admin ? http://linux-attitude.fr