MYST c’est quoi ?
myst (my snifing tool) est un petit outil ayant trois fonctions simples:
- Scanner le réseau pour savoir rapidement ce qui s’y trouve
- Empêcher une machine donnée d’aller sur Internet
- Suivre l’activité d’une machine et récupérer ce qu’elle fait transiter en clair
Tout cela en utilisant l’attaque ancestrale du « Man in the middle » par empoisonnement du cache arp de la victime. Mais puisque ce truc ne révolutionne rien du tout…
Pourquoi utiliser ce bidule ?
- myst est, à ma connaissance, le premier outil à implémenter simultanément un scan arp et SSDP (Simple Service Discovery Protocol).
j’en avais déjà parlé ici. Cela permet d’avoir une vision rapide et souvent très précise de ce qui se trouve sur un réseau.
- Il a été entièrement conçu pour être « michu compliant ».
La philosophie est simple : une seule commande à lancer, avec le moins d’option possibles. Typiquement la seule chose à indiquer sera l’ip de la victime, myst se débrouillera tout seul pour le reste.
- Parce que c’est moi qui l’ai fait !
Sérieusement, myst n’est qu’un script en python/scapy d’environ 300 lignes (dont pas mal de blabla en français). Il peut donc être compris et modifié très facilement.
Petit exemple d’utilisation
Vous arrivez chez des (futurs anciens) amis, et avez envie de voir un peu ce qu’ils ont chez eux. Connecter vous en filaire ou en wifi sur leur réseau et lancez un scan :
sudo myst -s
Chez moi, vous obtiendriez quelque chose comme ça :
$ sudo myst -s
Guessing values... Interface : eth0 IP/netmask : 192.168.1.12/24 Gateway : 192.168.1.254 Usually scan will take less than 10 seconds. Please be patient. 6 hosts founds : 192.168.1.2 ? 192.168.1.5 ? 192.168.1.7 http://192.168.1.7:1107/DeviceDescription.xml 192.168.1.101 http://192.168.1.101:62580/ 192.168.1.253 http://192.168.1.253:49152/InternetGatewayDevice.xml 192.168.1.254 http://192.168.1.254:52424/device.xml
Les points d’interrogations sont des machines qui n’ont pas de services UPNP actifs. Ici il s’agit d’un serveur sous linux et d’un PC sous windows (correctement configuré pour désactiver tous ces machins). Pour les autres, c’est que du bonheur. Les urls fournies vous donneront des informations complètes sur l’équipement en question (type, marque, modèle, possibilité, configuration etc.) Dans la majorité des cas vous n’avez plus qu’a aller récupérer le mot de passe admin par défaut sur le net… (ce qui, chez moi, ne fonctionnera pas).
Supposons maintenant que vous ayez envie de regarder quels genre de sites va consulter votre « ami ». La commande sera :
sudo myst -w IP
En ajoutant un -d si vous voulez visualiser tout le contenu du trafic http, ou un -a si vous voulez aussi suivre les réponses du serveur. A ce moment, vous découvrez avec horreur qu’il passe son temps à visionner des vidéos de propagande de la RIAA. Pour son propre bien, et parce qu’il n’a finalement pas su sécuriser correctement son installation (un délit puni par la loi je vous rappel), « déconnecter » le vous même :
sudo myst -k IP
Installation
Comme d’habitude, vous avez le choix entre un paquet au format deb (qui devrait fonctionner sous debian et sous ubuntu), ou uniquement le script en python|. Script qui ne fonctionnera pas si vous n’installez pas les pré-requis suivants :
sudo apt-get install tcpdump python-scapy tcpflow gupnp-tools
Le futur
Écouter ce qui passe en clair c’est bien. Mais 99% du trafic passe maintenant par ssl. Je voudrai donc réussir à associer myst et sslstrip. Mais ce sera pour plus tard…
Conclusion
Have fun !
PS : Si une personne vous rapproche d’avoir « écouté » ses conversations, répondez lui d’un air entendu, et sur ton un poil provocateur : « Non mais tu sais, la vie privée de nos jours, ça ne veut plus dire grand chose. Entre les réseaux sociaux, les services de renseignements qui se refilent nos données personnels, et les mastodontes du web qui nous vendent comme du bétail… Franchement qui s’en souci ? Tant que tu n’a rien à te reprocher… »
madame michu a un peu de mal:
==============================
# python myst.py -s
Guessing values…
interface : eth0
eth0
Traceback (most recent call last):
File « myst.py », line 285, in <module>
own_mac = get_if_hwaddr(interface)
File « /usr/lib/python2.7/dist-packages/scapy/arch/__init__.py », line 39, in get_if_hwaddr
addrfamily, mac = get_if_raw_hwaddr(iff)
File « /usr/lib/python2.7/dist-packages/scapy/arch/linux.py », line 82, in get_if_raw_hwaddr
return struct.unpack(« 16xh6s8x »,get_if(iff,SIOCGIFHWADDR))
File « /usr/lib/python2.7/dist-packages/scapy/arch/linux.py », line 269, in get_if
ifreq = ioctl(s, cmd, struct.pack(« 16s16x »,iff))
IOError: [Errno 19] No such device
==============================
Mais good job quand meme 🙂
Heu… alors la c’est… pas normal. (oui je sais tu t’en doutais un peu 😉
Pourrais tu me donner le résultat de la commande : « /sbin/route -n » stp ?
J’aimerai aussi que tu essaye la commande suivante pour voir :
sudo myst -s -i eth0
Merci 🙂
Ça ne fonctionne pas ici aussi :-/
Pourtant toutes les dépendances sont installées, et une fois les erreurs de syntaxe (Python 3.4.2, print()..) corrigées il n’arrive pas à trouver scapy…
Traceback (most recent call last):
File « /home/jo/Téléchargements/myst.py », line 50, in <module>
from scapy.main import *
ImportError: No module named ‘scapy’
$ yaourt -Qs scapy
community/scapy 2.3.1-1
A powerful interactive packet manipulation program written in Python
Bonjour,
Il y a deux problèmes distincts dans ce que tu décrit:
Un problème de compatibilité entre les versions de python.
La, méa culpa je suis loin de maîtriser les subtilités de python, ceci doit être mon deuxième ou troisième script. Du coup, je suis vraiment très intéressé par ta version corrigée (a part les parenthèses pour les print, il y a autre chose ?)
Sans ces parenthèse, il se passe quoi chez toi ? Quelle différence lorsque tu les ajoute ?
Le second problème est donc qu’il ne trouve pas scapy. La je pense qu’il s’agit plus d’un problème lié à la distribution et/ou à l’installation de scapy. Quelle distribution utilise tu ? (Visiblement ni debian ni ubuntu puisque tu as semble t-il téléchargé le script seul).
Merci d’avance pour tout compléments d’infos. Accessoirement, je n’ai pas de nouvelles du testeur précédent 🙁
en ne comptant que la version en .deb, ce script à été téléchargé plus d’une centaine de fois. Alors si ça fonctionne correctement chez quelqu’un, n’hésitez pas le signaler non plus hein :o)
Salut,
Non il n’y a que les paranthèses pour les print qui clochaient au niveau de la syntaxe, les erreurs renvoyées étaient du type :
File « /usr/bin/myst », line 61
print « \nmyst » + version
^
SyntaxError: Missing parentheses in call to ‘print’
Une fois ajoutées, le script semble s’executer normalement et c’est là qu’il indique ne pas trouver scapy…
Le script corrigé : http://pastebin.com/ciVVRmc7
J’utilise Archlinux, Scapy est bien installé (version 2.3.1), un executable (/usr/bin/scapy) est d’ailleurs présent et son fichier contient :
#!/usr/bin/python2
from scapy.main import interact
interact()
Mais en fait il suffit de l’executer avec python2 et tout fonctionne !
Testé et approuvé ! Beau travail, fonctionne impeccable.
Linux E5500 3.13.0-24-generic #47-Ubuntu SMP Fri May 2 23:30:00 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type « help », « copyright », « credits » or « license » for more information.
doublenain : Merci ! un retour positif ça fait toujours plaisir 🙂
jo : Super, merci beaucoup pour cette version modifiée. Et puisque :
« Python 2 doesn’t have a problem with additional parentheses, but in contrast, Python 3 would raise a SyntaxError if we called the print function the Python 2-way without the parentheses. »
je conserve ta version qui devient officiellement la version 0.2 du script. Je vais sûrement en profiter pour modifier quelques trucs mineurs et refaire un .deb.
À la bonne heure !
Et créer un dépot Git public, est-ce au programme ? Ça serait quand même plus facile pour les contributions..
Salut,
après install du deb (sur Mint), la commande:
sudo myst -w IP
renvoie:
Traceback (most recent call last):
File « /usr/bin/myst », line 281, in <module>
target_mac = getmacbyip(target_ip)
File « /usr/lib/python2.7/dist-packages/scapy/layers/l2.py », line 53, in getmacbyip
tmp = map(ord, inet_aton(ip))
socket.error: illegal IP address string passed to inet_aton
jeanminux : Mmm… oui oui… La vérification des entrées… C’est prévu pour la version 0.2… En attendant… Franchement…. Si tu remplaçais « IP » par une adresse IP valide sur le réseau ? Celle de ta cible ?
Oh putain! la honte sur ma tête… À ma décharge il était 6h30 et je me levais. Mea maxima culpa!
La version 0.2 de myst est publiée. Cette version ajoute donc les () dans les print (Merci Jo !), ce qui devrait la rendre compatible avec la version 3.4 et supérieur de python. J’ai aussi ajouté des vérifications ou cas ou, par exemple, une personne s’amuse à mettre « IP » à la place d’un véritable adresse (merci jeanminux…) :o)
Les liens de téléchargements restent les mêmes.
Désoler pour le retard, je fais ca de la machine du taff (donc uniquement le trolldi).
=================================================
14:51 root@joker /home/devops # /sbin/route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.254 0.0.0.0 UG 202 0 0 eth0
0.0.0.0 192.168.1.254 0.0.0.0 UG 1024 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 202 0 0 eth0
192.168.1.23 127.0.0.1 255.255.255.255 UGH 202 0 0 lo
14:52 root@joker /home/devops #
=================================================
par contre ./myst.py -s -i eth0 fonctionne nickel 🙂
Le problème vient bien de ta table de routage particulièrement chelou.
D’après cette table, tu as deux « routes par défaut » (ce qui est déjà pas normale).
La première route par défaut passe par eth0 et la seconde… par eth0.
La suite est tout aussi curieuse. Bref, pour moi il y a un soucis de configuration réseau sur cette machine, et pour ça que myst à un peu de mal. Je pourrai ajouter quelque chose pour traiter ce genre de cas de figure, ce serait pas trop compliqué…
En attendant, il suffit donc de ne pas laisser faire « l’auto-detect » de l’interface est de la préciser à la main 🙂
Sur une debian wheezy de test (pas d’interface graphique, elle est destinée à tester des scripts d’installation de serveurs) :
root@test:~# apt-get install tcpdump python-scapy tcpflow gupnp-tools
Lecture des listes de paquets… Fait
Construction de l’arbre des dépendances
Lecture des informations d’état… Fait
Vous pouvez lancer « apt-get -f install » pour corriger ces problèmes :
Les paquets suivants contiennent des dépendances non satisfaites :
gupnp-tools : Dépend: libgdk-pixbuf2.0-0 (>= 2.22.0) mais ne sera pas installé
Dépend: libglib2.0-0 (>= 2.16.0) mais ne sera pas installé
Dépend: libgssdp-1.0-3 (>= 0.12.0) mais ne sera pas installé
Dépend: libgtk-3-0 (>= 3.0.0) mais ne sera pas installé
Dépend: libgupnp-1.0-4 (>= 0.18.0) mais ne sera pas installé
Dépend: libgupnp-av-1.0-2 (>= 0.6.0) mais ne sera pas installé
Dépend: libsoup2.4-1 (>= 2.4.0) mais ne sera pas installé
Dépend: gnome-icon-theme mais ne sera pas installé
tcpdump : Dépend: libpcap0.8 (>= 1.2.1) mais ne sera pas installé
tcpflow : Dépend: libpcap0.8 (>= 0.9.8) mais ne sera pas installé
E: Dépendances non satisfaites. Essayez « apt-get -f install » sans paquet
(ou indiquez une solution).
Bonjour yamo.
J’ai justement une debian wheezy qui tourne chez moi, et je n’ai eu aucun problèmes avec les dépendances. Les deux seules lignes qui ne sont pas
commentées dans mon fichiers /etc/apt/sources.list sont :
deb http://ftp.fr.debian.org/debian/ wheezy main non-free
deb http://security.debian.org/ wheezy/updates main contrib non-free
Et je ne pense pas qu’il y ai besoin d’autre choses. Essaye de faire un apt-get update ou je ne sais pas… Mais pour moi le problème est chez toi.
Tu peux utiliser un dist-upgrade pour voir si il n’y a pas des paquets « kept back ». Sinon aptitude te donnera plein de solutions possibles.
Du coup c’est un poil plus compliqué que prévu pour Madame Michu (sauf si c’est une ‘nerd’ of course). Y’a pas moyen de distribuer ça en container docker ( https://www.docker.com/ pour ceux qui ne connaitraient pas ) ?
Désolé mais j’ai pas trop compris ton message la…
Qu’est ce qui est compliqué exactement ?
docker, ça c’est un truc de nerd :p
Cliquer sur un lien, installer le paquet, et lancer le programme, ça c’est un truc de madame michu (qui à ubuntu sur son pc parce que son fils est pas trop idiot 😉
PS : Évidement j’ai rien contre docker hein 🙂
Ca marche plutôt bien chez moi (version paquet deb)
sudo myst -s
Guessing values…
interface : eth0
IP/netmask : 192.168.1.11/24
gateway : 192.168.1.1
Scan will take less than 10 seconds. Please be patient.
4 hosts founds :
192.168.1.1 ?
192.168.1.10 http://192.168.1.10:8080/BasicDevic…
192.168.1.15 ?
192.168.1.19 ?
Seul visible: décodeur TV.
Je me demandais s’il y avait d’autres possibilités de savoir qui est sur le réseau (materiel, nom de l’user…) comme sur Glasswire (windows, https://www.glasswire.com/features/…) sachant qu’ils font surement du MitM aussi en reroutant toute la connexion…
Merci encore 🙂
Je suis allé voir l’url indiquée. Mais non, ils n’ont absolument pas besoin de faire du mitm pour ça 🙂 Ils se contentent d’observer les paquets qui passent (mode promiscous sur l’interface ethernet, et peut etre monitor sur l’interface wifi).
Ensuite pour savoir de quel type d’équipement il s’agit, il suffit de comparer la mac adresse avec une base de données de constructeurs (les premiers octets des mac adresses dépendent directement du constructeur).
Content que ça fonctionne 🙂