Pour les addicts du sniffing réseau: Junkie
Par poz le mardi 21 décembre 2010, 20:51 - geeking - Lien permanent
Un peu de proselytisme ne fait jamais de mal, alors voilà Junkie, un sniffer releasé en Open Source par la société SecurActive.
Pour l'instant il a été programmé pour tourner sur du Linux debian-like, donc...
Un extrait du README:
Compared to previously available tools junkie lies in between tcpdump and wireshark. Unlike tcpdump, its purpose is to parse protocols of any depth; unlike wireshark, through, junkie is designed to analyze traffic in real-time and so cannot parse traffic as completely as wireshark does. In addition, junkie's design encompasses extendability and speed: - plug-in system + high-level extension language that eases the development and combination of new functionalities; - threaded packet capture and analysis for handling of high bandwidth network; - modular architecture to ease the addition of any protocol layer; - based on libpcap for portability; - well tested on professional settings.
Il manque un "IPv6 compliant" je pense, dans ce README.
Seuls les parseurs sont releasés en Open Source, mais c'est déjà bien sympa. Le design est fait de telle sorte qu'il est facile d'ajouter un plugin d'analyse pour un protocole particulier 1. Et pour ceux qui n'aiment pas le C, il y a possibilité d'exercer vos talents de codeurs Scheme (guile plus précisemment), car il est scriptable à l'aide de ce langage ! Ouh ouh !
Un petit exemple d'utilisation ? OK, c'est parti :
$ sudo ./src/junkie -i wlan0 -c config/start-repl.scm 2010-12-22 00:36:45: J-main: log.c/log_set_file: Opening log file.
OK, là on lui a dit de loguer sur stdout, d'écouter l'interface wireless wlan0, et de prendre le fichier de conf par défaut qui active le REPL. Donc, dans un autre terminal, je vais me connecter sur la machine, en tcp/29000 pour ajouter des settings sur la mouche comme disent nos amis anglais (ie. "on the fly"... ok c'est nul).
$ rlwrap telnet localhost 29000 Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. junkie> (set-iface-filter "wlan0" "icmp") #t junkie> (set-log-level 6) #<unspecified> junkie>
Les valeurs de retour affichées sont celles de guile, à savoir #t pour true, et
#<unspecified> pour dire qu'il n'y a pas de code de retour. C'est un peu
curieux au début, mais ceux qui ont utilisé ce langage ne seront pas
dépaysés.
Là je lui ai demandé de prendre en compte le filtre BPF (tcpdump, vous connaissez, hein ?) "icmp" pour l'interface wlan0.
Hey ouais, c'est ça qui est cool, on peut écouter sur différentes interfaces avec des filtres différents. Bref, dans un autre terminal je tape :
$ ping free.fr -c1 PING free.fr (212.27.48.10) 56(84) bytes of data. 64 bytes from www.free.fr (212.27.48.10): icmp_seq=1 ttl=118 time=37.1 ms --- free.fr ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 37.176/37.176/37.176/0.000 ms
Et si on repasse dans la console de log, on a :
Capture@0x23f0068: head_len=48, payload=60, dev_id=0, tv=1293009623s 788239us Ethernet@0x2413ea8: head_len=14, payload=46, vlan_id=0, source=00:1b:2f:2e:e0:fa, dest=ff:ff:ff:ff:ff:ff, proto=2054 Capture@0x23f0068: head_len=48, payload=74, dev_id=0, tv=1293009880s 139307us Ethernet@0x2413ea8: head_len=14, payload=60, vlan_id=0, source=00:1c:bf:9d:2e:21, dest=00:15:e9:f2:30:67, proto=2048 IPv4@0x2414e38: head_len=20, payload=40, version=4, addr=10.0.63.10->82.237.175.5, proto=6, ttl=64 TCP@0x23bcf08: head_len=40, payload=0, ports=42007->1234, flags=Syn, win=5840, ack=0, seq=902941316 Capture@0x23f0068: head_len=48, payload=98, dev_id=0, tv=1293009631s 741103us Ethernet@0x2413ea8: head_len=14, payload=84, vlan_id=0, source=00:1c:bf:9d:2e:21, dest=00:15:e9:f2:30:67, proto=2048 IPv4@0x2414e38: head_len=20, payload=64, version=4, addr=10.0.63.10->212.27.48.10, proto=1, ttl=64 ICMP@0x23bb198: head_len=64, payload=0, type=EchoRequest, err=NONE Capture@0x23f0068: head_len=48, payload=98, dev_id=0, tv=1293009631s 744391us Ethernet@0x2413ea8: head_len=14, payload=84, vlan_id=0, source=00:15:e9:f2:30:67, dest=00:1c:bf:9d:2e:21, proto=2048 IPv4@0x2414e38: head_len=20, payload=64, version=4, addr=212.27.48.10->10.0.63.10 (hashed the other way), proto=1, ttl=122 ICMP@0x23bb198: head_len=64, payload=0, type=EchoReply, err=NONE
Un lecteur attentif verra qu'il n'y a pas que de l'ICMP qui a été logué (cf. les premières lignes). Il a raison ! Mais comme je l'ai dit plus haut, on a changé la config à chaud, donc Junkie a eu le temps de loguer quelques paquets avant de prendre en compte le filtre BPF.
Et voilà ! Bon, c'est un exemple parmi des tonnes hein, chacun peut y trouver son compte, là c'est vraiment pour expliquer le fonctionnement. Pour plus d'infos :
$ junkie -h
Ou bien pour des détails vraiment poussés, dans le REPL :
junkie> (help) [...] junkie> (help 'commande)
1 Tutorial de codage d'un parseur : parser implementation

Commentaires
Comme indiqué sur IRC, packet-o-matic est une alternative qui semble répondre au même type de problèmatique : http://www.packet-o-matic.org/