 La prochaine chose est la dernière présentation, c'est Julien qui va nous parler de paquet de manipulation avec Scapy. Scapy est un outil qui est développé pour simplement être interactif et aussi utiliser dans l'escript directement en pitton. Il est pas capé sur Ubuntu, GDM, puis sur la plupart des redats Fedora aussi. L'interface se présente comme un interquater, comme High Python. C'est vraiment un interquater pitton en complet, mais vous pouvez aussi l'apporter dans le script. Il sert entièrement à manipuler des paquets. Après le site web, ça va forger, décoder, capturer, envoyer, faire des correspondances entre des requêtes et des réponses. Ce que je vais faire aujourd'hui, c'est que je vais vous présenter rapidement qu'est-ce que c'est Scapy. Je vais juste faire un tour d'horizon parce qu'il y a conversément beaucoup de documentation, mais c'est vraiment très utile pour la manipulation, que ce soit en sécurité ou en reverse engineering. Les fonctions qu'on consiste ici, il y a beaucoup d'outils qui font déjà ça. Vous avez déjà Asping, Nmap, déjà beaucoup d'outils. L'intérêt ici, c'est que c'est vraiment un seul outil qui intègre tout et directement en pitton. Vous avez toute la puissance du langage pitton, mais en plus vous avez des objets pour manipuler directement des paquets d'asos. Il n'y a aucune intelligence en faire derrière Scapy. Ce qui est intéressant, c'est que vous allez vraiment manipuler les données brutes. C'est vos scripts qui vont faire un télégenre, donc ils ne vont pas essayer d'interpréter les résultats. Si vous regardez Nmap quand vous envoyez un paquet qui vous renvoie le résultat filtré, ça veut dire que la machine est morte, c'est-à-dire que vous êtes fait intercepter par un bouton entre deux, c'est-à-dire que la machine de destination vous ne vous répond pas. Il y a beaucoup d'hypothèses, puis Nmap a l'habitude de répondre pour vous. Lui, il ne fait rien de tout ça, il va vraiment vous laisser diagnostiquer tout ça. En plus, il va vous servir aussi à injecter des paquets non valides, par des paquets et des outils qui servent à manipuler du réseau, ils vont vouloir injecter des paquets valides avec bien bien formés tout ça. Ici, il va vous laisser faire vraiment ce que vous voulez sur le réseau. Vous pouvez descendre vraiment très bas dans les couches, vous pouvez aller jusqu'au 802.11, puis vous pouvez faire un point d'accès au complet directement avec des scripts en tout temps. Si votre carte supporte l'adjection des paquets, puis vous pouvez ensuite combiner toutes les techniques. Si vous voulez fabriquer un paquet qui sert à sauter d'un vilain, puis dans ce vilain là, injecter des paquets RP, vous pouvez juste enchaîner les paquets, juste en quelques lignes de commandes en pitant. Donc, là je vais en représenter une liste de scripts avec des petites démo de comment ça fonctionne, puis après quelques exemples un petit peu plus avancés. Donc, tout d'abord, on a des commandes. Donc, ce sont les commandes intégrées, c'est vraiment juste. Quelques-uns que j'ai sortis, il y en a beaucoup plus que ça, juste pour donner des exemples. Avec le LS, ça nous donne la liste des couches qui sont déjà définies. Vous voyez déjà des couches, le protocole que vous connaissez déjà, RP, DHCP, LS, ça supporte complètement IPv6, puis mobile IPv6 aussi. Et c'est très facile aussi de rajouter des nouvelles couches. Donc, si vous avez un protocole que vous voulez analyser, justement un malois qui fait du trafic, vous commencez à comprendre le protocole, vous pouvez fabriquer vos classes pitant, puis il va vous permettre d'interpréter, puis vous manipuler automatiquement des paquets. C'est assez petit. Puis, il y a beaucoup de fonctionnalités déjà, des fonctions toutes faites, comme ici, vous avez ARP, Cache, présent. Directement, vous lui passez deux ordres ACP, puis va faire automatiquement le manual de middle en ARP, CodeBit pour changer des bits aléatoires dans des paquets, fragmenter, des fragmenter, une fonction de phasing. Je vais vous montrer un peu tout ça. Donc, premier exemple, vous pouvez justement envoyer un ping. Donc, je vais vous montrer un petit peu l'interface. Je ne sais pas si vous voyez quelque chose. Qu'est-ce que vous voyez quelque chose ici ? Qu'est-ce qu'il dit ? C'est un ping ? Non, en fait, c'est un ping. En fait, la syntax, c'est qu'on fait des objets. Donc, un ping c'est un object, et on empile les couches avec les slashes. Donc, c'est l'opérateur slash, en fait, ça sert à mettre des nouvelles couches. Donc, c'est vraiment très facile et les fonctionnalités pratiques de Scabies, c'est qu'aussi, les valeurs par défaut fonctionnent. Donc là, vous voyez, je n'ai pas précisé grand-chose, j'ai juste mis une destination, puis j'ai l'arresté de mon récapitant, et c'est simplement une arresté. Lui, automatiquement, il va générer tous les champs comme il faut. Et puis, le type ICMP, automatiquement, c'est un ping. Donc, c'est un correct request. Donc, ça, c'est la version sable. Bon, ici, ça ne marchera pas le ping de mon récapitant. Je vais vous montrer avec un autre exemple, ici. Ici, je vais simplement pinger une machine virtuelle qui tourne sur mon laptop. Donc, la première chose que j'ai fait ici, c'est mettre l'interface d'Azo, parce que lui, il ne va pas utiliser la table de routage et il peut l'utiliser, mais on veut vraiment l'imiter d'utilisation. Donc, on devrait vraiment tout bien indiquer. Donc, là, je lui ai dit que c'était un break sur ma magie. Et là, ici, je fais simplement envoyer un ping. Donc, ça, c'était la commande qui était marquée sur l'écran. SR1, c'est send, receive, un paquet d'eau. Alors, j'envoie ce paquet d'eau, et j'attends la réponse qui va être associée au paquet. Puis, je store le résultat dans la variable PAP. Si on regarde la variable PAP, maintenant, ce qu'elle contient, c'est l'interface. Donc, là, ce qu'on voit ici, c'est automatiquement ça, c'est le paquet que j'ai reçu en réponse. Ici, on voit, ici, il a interprété le truc ICMP parce qu'il connaît la correspondance entre le numéro et le paquet. Puis, automatiquement, ça, c'est tout le champ du paquet IP. Donc, ici, si vous voulez, après, ensuite accéder à la couche directement ICMP, vous pouvez directement accéder ici. Puis, simplement afficher ça. Vous pouvez manipuler les champs. Donc, si vous voulez échanger le code ici, vous pouvez juste tout faire le code égal à un ici. Je viens de mettre un joueur automatiquement, mon paquet. Donc, ça, c'est très facile à manipuler. C'est vraiment un accès direct au paquet. Donc, ça, c'est mon premier exemple. C'est simplement pour envoyer un ping. Est-ce que c'est clair que je suis là ? Est-ce que je parle assez fort ? Deuxième exemple. Donc, en fait, on va... C'est un peu la même chose que ce que je viens d'expliquer juste avant, mais c'est juste pour montrer qu'on peut créer le paquet en plusieurs étapes. Donc, là, la variable A ici, ça va être simplement une inverse IP. On va changer le champ IP du paquet IP. On va créer une variable B qui va contenir un tableau de points de destination. Puis, au final, on va créer le paquet C qui va être la couche IP et la couche TCP en pied. Donc, là, en fait, ce qu'on vient de faire, c'est qu'on vient de créer trois paquets en une seule variable. Donc, là, si vous avez un tableau, j'envoie ce paquet-là, si ça veut générer trois paquets. Donc, si je fais ça ici, je change le ID. C'est juste pour montrer qu'on peut accéder directement au champ des paquets IP directement. On crée la couche TCP. On crée le paquet ici. Donc, là, si on regarde C, on obtient un paquet IP avec, en dessous, une couche TCP et trois paquets IP. Et puis, il a reconnu les points. Il a déterminé ça. Et là, on peut les envoyer. Donc, ce qu'il vient de faire, c'est qu'il vient d'envoyer trois paquets basés ici sur les trois ports de destination qu'il y avait et il a mis des réponses dans la variable D. En tout cas, la variable D, si on regarde, on voit qu'il y a trois paquets TCP qui ont une réponse de tous les autres. Mais si je n'avais pas eu de réponse, je n'aurais aussi plus l'air équitable. Si on s'y rentre ici, on a notre premier paquet TCP. Donc, ça, ici, on a la roquette et la réponse. Donc, si je regarde ici, la roquette, ça, c'est mon premier paquet TCP. Donc, en gros, c'était un TCP SIN que j'avais fait à destination du port SSH. Puis, si on regarde, on peut rapidement regarder sa réponse ici. On voit que la machine m'a répondu ici. Donc, son port source, c'est le port SSH. Et elle m'a envoyé un SIN acquis. Donc, ça, c'est un port qui fonctionnait. Si je regarde, j'avais une autre machine, ici, elle, je suis connecté sur le port 23 à port MNet qui est fermée sur ma machine. Donc, là, j'ai envoyé un SIN, puis la réponse ici, on voit un reset. Donc, tout simplement, vraiment très rapidement, j'ai vu ces quelques lignes, on a généré trois paquets, on a reçu, envoyé et reçu la réponse. Si on regarde maintenant, on peut aussi descendre un peu plus bas dans les couches. J'ai parlé de 800 euros tout à l'heure, mais il y a aussi entre les deux, on peut aller jouer directement sur la couche éternelle de l'eau. Si on veut fabriquer des paquets RP, si on veut faire du man de middle à la main, c'est aussi très facile à faire. Il suffit simplement de préciser la couche éterne en dessous. On a accès à tous les champs de la couche éternelle. Donc, là, pour l'instant, j'ai juste pris l'adrasmac de destination qui est l'adrasmac de broadcast. On a pu mettre la porte à l'eau. Normalement, c'est une seule ligne. Il paye ici, j'ai plusieurs destinations. Et ici, j'ai plusieurs TTL. Ce que ça, ça génère 18 paquets. Ça génère 9 paquets pour Montréal, plutôt au point d'arrogue, avec un TTL de 1 à 9, puis 9 paquets pour Montréal, avec la même chose. Donc, ça vous a fait composition de toutes les possibilités. Là, en fait, le CNP, c'est l'envoi du paquet. Puis, lui, il a envoyé 18 paquets avec toutes les combinaisons possibles qu'il y avait dans la chaîne. C'est assez intéressant, parce qu'une seule ligne, les SR, puis CNP ici, on est obligé d'utiliser quand on précise la couche éternelle aussi. Donc, c'est pour dire qu'on s'adresse au plus bon niveau, puis qu'on veut gérer de même la couche éternelle. Il y a quand même un CNP pour les termes ? Non, c'est vraiment tout manuel. Il n'y a pas d'ARP, il y a rien de tout ça. C'est la différence. Si on fait CNP, on va avoir l'ARP qui va générer tout ce qu'on fait. Si on fait CNP, c'est à dire que c'est bien mis des gens. Puis, on peut mettre ce qu'on veut vraiment. C'est ça l'intérêt. Et là, on peut jouer aussi avec du phasing. Donc là, on peut lui dire qu'on va fabriquer un paquet d'une destination quelconque. Puis, la couche d'au-dessus, on va pouvoir faire tous les champs. On voit absolument que ce soit un paquet UDP, par contre. Dans ce paquet UDP, on est un pilote qui soit un paquet NTP de version 4. Tout le reste, ça peut bouger. Donc là, il va automatiquement nous générer une liste de paquets qu'il va servir à envoyer. Je vais vous montrer la petite démonstration ici. Là, je suis en train d'envoyer des paquets. Puis, on regarde... On est en train d'envoyer des paquets. Si on regarde ici, ça, automatiquement, il est en train de le faire des paquets. Ce qu'on voit, c'est que TCP Note, il remarque que c'est quand même des paquets NTP valides. Mais on voit que, ici, à la vitesse où ça change, c'est vraiment tous les types possibles qui sont en train d'en passer. Donc là, il va générer 870-14 paquets qu'on n'aurait plus à enregistrer, puis après, il va rejouer et faire des choses comme ça. Et quand il connaît les champs, il va s'amuser automatiquement à remplacer les valeurs au bon endroit. C'est un moyen d'entrer dans la loupe, dans le sens que tu peux être délicit d'un processus de paquets à planter. Oui, c'est ça plutôt. Ici, à la place de faire le scène, ici, j'aurais plus simplement généré un tableau puis envoyer des paquets à part un peu. C'est pour après pouvoir leur jouer. Et c'est sûr exactement quel paquet fait le problème. On peut aussi récupérer du trafic, mais plus simplement ici avec la command-sri, je vais la montrer après. Ce qui est intéressant ici, c'est qu'on lui passe un nom de paquet qu'on va recevoir. Donc ça, c'est vraiment un tcp. Puis il filtre ici, c'est un filtre à la tcp. Donc c'est la même s'attaque, c'est exactement. Puis lui, dès qu'il a reçu deux paquets sur le port 22, automatiquement il va retourner. Puis il va retourner ça dans un tableau qui va être une liste de paquets. Donc après, on peut les manipuler, puis faire ce qu'on veut avec. On peut lire des fichiers pick-up. Donc ça, c'est très pratique aussi pour l'analyse rapide de les fichiers. Ici, donc c'est la commande rdpcap avec un fichier. Puis ici, j'ai cet exemple d'une fonction qui va juste passer dans la liste des 43 paquets tcp. Puis ici, il y a des données qui va regarder est-ce qu'il y a la chaîne cookie qui présente dans le payload puis va la ficher. Donc là, si je regarde ici, j'ai un petit web.pcap qui est juste une requête, une connexion à Google ici. C'est le script que je viens de vous montrer. Ici, ce qu'il a fait, c'est qu'il est passé dans les 43 paquets. Puis il a fichier à chaque fois, adresser des sources, des destinations et puis simplement ici, le payload seulement s'il détectait la chaîne cookie. Donc ça permet de passer très rapidement à travers et les paquets sont forcément à avoir besoin de les aspecter. Un petit exemple de script que vous connaissez. C'est-à-dire qu'il y a le réseau live de percevoir les paquets. Oui, la command sniff ici, c'est ça. Elle va se baser sur l'interface qu'on a mis en configuration. Il fait juste écouter. Il y a des événements qui sont garagés et réproquent des paquets. Il y a plusieurs façons de le faire. Là, j'ai mis quant et égal 2. Donc à 2, ils retournent. Sinon, il faut mettre un paramètre qui doit appuyer à chaque paquet. Il y en a qui mettent des lambda pour le replay, c'est à apprendre à ficher pk pour l'entrée, puis le réexécuter en sortie. Ici, ça, c'est un exemple un peu plus évolué de DCP-UPD. Parce qu'ici, on va lire un fichier pk. Et pour chacun des paquets, on va appliquer une modification. Et ici, ce que je fais, c'est que je change l'adresse IP de destination. Donc 1.67.001, je vais mettre 127.002. Je vais renvoyer le même paquet. Donc automatiquement, je vais changer la façon de faire le replay. Là, j'ai mon fichier ici. Je pense que j'ai encore un fichier FASNTP qui est le TCP d'un que vous voyez quand je faisais FASNTP tout à l'heure. Je vais voir si je fais... C'est pas grave. Si je le fichie, j'ai pas un exemple. Mais c'est ce concept. Il va juste changer l'adresse. Donc là, vous pourriez faire toutes les modifications que vous voulez sur les paquets, les renvoyer. Là, il ne faut pas oublier. Un truc, c'est qu'ici, on est en UDP ou BCCMP, c'est facile. On peut juste injecter des paquets. Vous pouvez oublier que si on est en TCP, il y a toute la partie de gestion de connexion à faire. Parce que là, on fait vraiment tout à la main. Donc, ça, c'est vraiment important. Ici, je vais pas montrer la démo, mais je fais un truc qu'on n'a pas internet. Mais ça, c'est un place route en TCP. Donc là, ici, tout ce que je fais, c'est faire varier le TTA de 0 à 25. Et j'envoie un signe à destination de l'adresse. Puis si jamais je l'ai reçu, je vais recevoir la réponse. Je vais automatiquement interagir directement depuis un chiffre habitant avec les résultats de TTA. Si c'est un autre exemple, pour tester si votre ISP peut bloquer sur le port source. Ici, on va faire varier le port source de 0 à 25. Puis on va envoyer les paquets. Et à la fin, on va juste afficher ceux qui ont pas répondu. Si jamais vous détectez du filtrage bizarre qui est fait sur un port source, vous allez pouvoir voir quel port source. On fait un timer de 30 secondes ici, mais on peut le changer ici. Ça, c'est un paramètre qui s'applique à la fonction de scène des RECIP. Je vais montrer un exemple un petit peu plus évolué juste avec TCP. Donc TCP, on est habitués à avoir la notion de le client envoie un SIN, le serveur envoie un SIN Act, le client envoie un Act, et après on a une session TCP établie. Et il y a un en peu près des questions qui ont commencé à jouer un peu sur les RECIP. Ils sont rendus compte qu'un SIN Act, en fait, c'est un paquet SIN et un paquet Act. C'est pas forcément obligatoirement un seul paquet. Donc ils sont amusés à tester les différentes appellementations parce qu'en fait, c'est possible de faire un TCP en casque de paquet SIN. Donc le client va nous envoyer un SIN, le serveur va répondre un autre SIN parce qu'intéressant, c'est que quand le serveur envoie un SIN, le client envoie un SIN Act. Donc là, ça inverse un petit peu le concept de session parce que tous les IDS et les firewalls qui sont basés sur le SIN Act pour détecter les sessions établies ils se reposent avec le client qui vient d'établir, le serveur qui vient d'établir une connexion avec le client pour lui être l'inverse. Puis ça, c'est supporté dans l'RFC, puis ils en trouvent vraiment beaucoup de problèmes, puis ils en trouvent encore, parce que les IDS basés là-dessus, donc là, je vais vous montrer rapidement ici. Donc ça, c'est une boucle ici. Donc les IDS, le SINIF que j'ai parlé tout à l'heure. Ici, tout ce qu'on fait, c'est attendre un seul paquet quand il y a des destinations du port 80 et que c'est un SIN. Je vais envoyer le paquet. Je vais vous montrer rapidement. Donc ici, ça, c'est le GNVM ici. Donc là ici, je simule un serveur TCP ici qui écoute sur le port 80. Puis lui, il va se connecter ici. On regarde. Donc là ici, tu le connectes. Donc là, ici, le NET4, ici, vient établir une connexion. Si on regarde le NETstat, on voit que la connexion ici, elle est établie. Donc, point de vue du kernel, tout va bien. Puis ici, on regarde un petit peu au point de vue des paquets. On va voir que le client nous a envoyé un SIN. Le Saron aura vraiment envoyé un autre SIN. Le client, lui-même, nous a envoyé un SINAC. Et enfin, comme ça, on a vraiment un TCP qui est inversé. Puis ça, ça pourrait permettre d'établir une connexion envers dans un BAD. C'est intéressant. Ça, c'est juste pour s'amuser aussi un canal caché en DNS. Donc, DNS, c'est pratique parce que c'est utilisé partout. Puis c'est autorisé partout, surtout. Pour tout, ça va vous faire des portails captifs. Donc là, je vous détaille pas. Mais ici, on fabrique un paquet DNS complètement valide. Je vais l'utiliser pour envoyer à savoir des données. Donc, si on regarde juste, c'est rapidement. Il m'affiche ici, salut. Donc, il a bien reçu mon message. Mais par contre, si on regarde sur le réseau ici, si je recommence. En gros, ici, c'est un beau paquet DNS ici complètement valide. Puis, si on regarde un peu plus en détail, on voit un paquet DNS à destination qui a une réponse à Google ici qui donne l'adresse IP. Si on regarde, c'est sûr que si on regarde après les champs du paquet, on va trouver la chaîne. Parce que là, c'est pas encrypté. Donc, si vous voulez utiliser votre imagination que vous voulez pour cacher plus de données, cacher du IP là-dedans. Voilà. C'est la réponse. Donc, voilà. Si vous voulez plus d'information, il y a une petite table de scp. Mais la démo, les slides, elles sont sur l'adresse ici. Puis, c'est peut-être pour la cosmo. La compétition, c'est clair. Si vous avez des questions, je pense qu'on a du temps. Je voudrais rappeler la session avec les sponsors. Je vous remercie. Benelux, Sama Felilix, Luria, QNX, Lycitte, et iWeb. Merci beaucoup, les gars. C'est là qu'il va faire. C'est le gars qui va vous aider à Benelux. Il y a deux bières. Il y a deux bières. Il y a deux bières. Il y a des deux bières. II est poder. Toutefois, il est super. Mais vous allez pouvoir vers la rue. Vous allez suivre Mathew. Il va être ce qui vous Hundreds et pour te donner des tickets à long HAVE. Juste que vous avez des bières flash virtuels, ce ne vous signifie que vous n'ont pas les pierres,HAIT, TOGEN pour vous extremant. Merci beaucoup.