[Table des matières] - [précédent] - [suivant]


Titre : Effectuer un traceroute
Option : Sortie graphique 2D et 3D
Paquets utiles : graphviz, imagemagick, visual


Une commande traceroute est directement implémentée au sein de scapy. Elle permet d'effectuer des requêtes au format TCP, ce qui permet éventuellement de passer des pare-feu présents sur votre chemin.

Voyons les paramètres de la commande (on utilise le listing des commandes) :

>>> lsc(traceroute)

Les paramètres de la fonction nous sont retournés :

Instant TCP traceroute
traceroute(target, [maxttl=30,] [dport=80,] [sport=80,] [verbose=conf.verb]) -> None

La cible peut être seule ou multiple. Quelques exemples :

["www.eof.eu.org"]
["www.google.com", "www.yahoo.fr", "www.microsoft.com"]

Le maxttl correspond au nombre maximum de sauts que l'on souhaite faire lors de notre requête. Ici, il est à 30 par défaut.

Le dport est le port de destination. Bien choisi, il permettra de passer à travers quelques firewalls.

À ce stade, nous pouvons forger une requête et analyser les résultats. Cependant, comme toujours avec scapy, il peut y avoir un intérêt certain à se plonger dans le code de l'application. Dont acte.


Entrons un peu plus en profondeur, dans le code de scapy :

def traceroute(target, dport=80, minttl=1, maxttl=30, sport=RandShort(), l4 = None, filter=None, timeout=2, verbose=None, **kargs):

On s'aperçoit qu'il y a quelques paramètres positionnés par défaut, et surtout quelques quelques arguments non documentés

    if verbose is None:
        verbose = conf.verb

On positionne un filtre afin de ne récupérer que les paquets qui nous intéressent :

    if filter is None:
        filter="(icmp and icmp[0]=11) or (tcp and (tcp[13] & 0x16 > 0x10))"

Voici une des options non documentée des plus intéressantes. En effet, elle vous permet de choisir le protocole de niveau 4 que vous souhaitez. Si par exemple vous préférez positionner de l'UDP, il vous suffira de positionner l4="mon protocole de niveau 4". Dans le cas où la variable l4 est laissée par défaut, on fait une interrogation en TCP.

    if l4 is None:
        a,b = sr(IP(dst=target, id=RandShort(), ttl=(minttl,maxttl))/TCP(seq=RandInt(),sport=sport, dport=dport),
                 timeout=timeout, filter=filter, verbose=verbose, **kargs)
    else:
        a,b = sr(IP(dst=target, id=RandShort(), ttl=(minttl,maxttl))/l4,
                 verbose=verbose, timeout=timeout, **kargs)

Pour finir, la fonction envoie la demande et affiche le résultat :

    a = TracerouteResult(a.res)
    if verbose:
        a.show()
    return a,b

La fonction traceroute est un très bon exemple de ce que l'on peut faire avec scapy.


En résumé, voici une commande :

>>> res,unans = traceroute(["www.google.fr","www.yahoo.fr","www.microsoft.com"], dport=80, retry=-2, maxttl=25)

Le retour est affiché à l'écran mais également dans la variable res.

Begin emission:
********************************************************Finished to send 75 packets.
*********Begin emission:
*Finished to send 10 packets.
*Begin emission:
**Finished to send 8 packets.
Begin emission:
*Finished to send 6 packets.
Begin emission:
Finished to send 5 packets.
.Begin emission:
Finished to send 5 packets.
*Begin emission:
Finished to send 4 packets.
Begin emission:
Finished to send 4 packets.

Received 72 packets, got 71 answers, remaining 4 packets
   207.46.19.254:tcp80 209.85.129.147:tcp80 217.12.3.11:tcp80  
1  192.168.0.254   11  192.168.0.254   11   192.168.0.254   11 
2  82.240.204.254  11  82.240.204.254  11   82.240.204.254  11 
3  213.228.11.190  11  213.228.11.190  11   213.228.11.190  11 
4  212.27.50.141   11  212.27.50.141   11   212.27.50.141   11 
6  212.27.57.190   11  212.27.51.10    11   212.27.51.186   11 
7  212.27.58.26    11  213.228.3.136   11   212.27.56.42    11 
8  212.27.40.22    11  64.233.175.234  11   195.69.145.110  11 
9  207.46.47.92    11  72.14.233.105   11   66.196.65.73    11 
10 207.46.41.46    11  72.14.232.203   11   66.196.65.67    11 
11 207.46.33.213   11  72.14.233.206   11   217.12.0.229    11 
12 207.46.34.250   11  209.85.129.147  SA   217.12.0.211    11 
13 207.46.44.94    11  209.85.129.147  SA   217.12.3.11     SA 
14 207.46.44.37    11  209.85.129.147  SA   217.12.3.11     SA 
15 207.46.19.254   SA  209.85.129.147  SA   217.12.3.11     SA 
16 207.46.19.254   SA  209.85.129.147  SA   217.12.3.11     SA 
17 -                   209.85.129.147  SA   217.12.3.11     SA 
18 207.46.19.254   SA  209.85.129.147  SA   217.12.3.11     SA 
19 207.46.19.254   SA  209.85.129.147  SA   217.12.3.11     SA 
20 207.46.19.254   SA  209.85.129.147  SA   217.12.3.11     SA 
21 207.46.19.254   SA  209.85.129.147  SA   217.12.3.11     SA 
22 207.46.19.254   SA  209.85.129.147  SA   217.12.3.11     SA 
23 207.46.19.254   SA  209.85.129.147  SA   217.12.3.11     SA 
24 207.46.19.254   SA  209.85.129.147  SA   217.12.3.11     SA 
25 207.46.19.254   SA  209.85.129.147  SA   217.12.3.11     SA 

On demande alors une sortie graphique :

>>> res.graph()

Traceroute depuis un poste wanadoo vers Yahoo, Microsoft et Google

[Le lecteur attentif aura constaté que les adresses de retour du traceroute et celles présentes sur le graphique sont différentes ; l'auteur s'en excuse et refera une sortie cohérente dès que possible afin de conserver l'intérêt et le fil pédagogique de la chose :p]

Cette sortie nécessite le logiciel graphviz et utilise imagemagick en éditeur par défaut.

Il est possible de rediriger les graphiques vers des sorties plus "conventionnelles". Nous pouvons par exemple envoyer notre sortie graphique vers une imprimante postscript :

>>> res.graph(type="ps",target="| lp") 

On peut également rediriger (indirection unix) la sortie vers un fichier, ici au format svg :

>>> res.graph(target="> /tmp/graph.svg") 

Pour finir, ceux qui souhaitent s'offrir une petite animation interactive en 3D, il suffit d'appeler la méthode trace3D :

>>> res.trace3D()

Vous pouvez consulter un aperçu [ici http://secdev.org/projects/scapy/doc/img/trace3d_2.png]

Nous reviendrons plus en détail sur ce module dans le chapitre dédié à ce sujet.

[Table des matières] - [précédent] - [suivant]

Attachments