myst : le « blackhat tool » de madame michu

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… »

21 commentaires

  1. testeur Répondre

    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 🙂

  2. hoper Répondre

    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 🙂

  3. Jo Répondre

    Ç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

  4. hoper Répondre

    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)

  5. Jo Répondre

    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 !

  6. doublenain Répondre

    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.

  7. hoper Répondre

    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.

  8. Jo Répondre

    À 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..

  9. jeanminux Répondre

    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

  10. hoper Répondre

    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 ?

  11. jeanminux Répondre

    Oh putain! la honte sur ma tête… À ma décharge il était 6h30 et je me levais. Mea maxima culpa!

  12. hoper Répondre

    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.

  13. testeur Répondre

    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 🙂

  14. hoper Répondre

    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 🙂

  15. yamo' Répondre

    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).

  16. hoper Répondre

    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.

  17. Paulli Répondre

    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.

  18. Mr132 Répondre

    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 ) ?

  19. hoper Répondre

    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 🙂

  20. user Répondre

    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 🙂

  21. hoper Répondre

    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 🙂

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.