
Un outil de création de paquets pour Linux.
Pig (que l'on peut comprendre comme Packet intruder generator) est un outil de création de paquets pour Linux.
Vous pouvez utiliser Pig pour tester votre IDS/IPS entre autres choses.
Pig apporte un ensemble de signatures d'attaques bien connues prêtes à l'emploi et vous pouvez étendre cette collection
avec des choses plus spécifiques selon vos besoins.
Jusqu'à présent, il est possible de créer des signatures IPv4 avec une couche de transport basée sur TCP, UDP et ICMP.
Vous pouvez également créer des signatures basées sur le protocole ARP, en plus de construire le paquet depuis sa trame Ethernet.
Si vous êtes arrivé ici grâce à mon article dans le 2600 du numéro SPRING 2016 issue,
continuez à lire les sections de documentation suivantes car ce petit Pig a évolué depuis.
C'est très simple :
[email protected]:~/src# git clone https://github.com/rafael-santiago/pig pig
[email protected]:~/src# cd pig
[email protected]:~/src/pig# git submodule update --init
Vous devez utiliser Hefesto pour construire pig. Après avoir suivi
les étapes pour faire fonctionner Hefesto sur votre système, déplacez-vous dans le sous-répertoire src de pig et exécutez
la commande suivante :
[email protected]:~/src/pig/src# hefesto
Après cette commande, vous devriez trouver le binaire pig sous le chemin src/bin. Vous pouvez utiliser le binaire relativement depuis
src/bin ou l'installer.
Si pour une raison quelconque vous rencontrez des problèmes de construction, vous devriez essayer de lire quelques remarques dans BUILD.md.
Pour l'installation, vous devez être dans le sous-répertoire src et appeler :
[email protected]:~/src/pig/src# hefesto --install
Pour désinstaller, en étant dans le sous-répertoire src, vous devez appeler :
[email protected]:~/src/pig/src# hefesto --uninstall
Les Fichiers Pigsty sont des fichiers texte brut où vous pouvez définir un ensemble de signatures de paquets. Il y a une syntaxe spécifique à
suivre. Regardez un exemple de fichier pigsty :
[ signature = "Hello",
ip.version = 4,
ip.ihl = 5,
ip.tos = 0,
ip.src = 192.30.70.10,
ip.dst = 192.30.70.3,
ip.protocol = 17,
udp.dst = 1008,
udp.src = 32000,
udp.payload = "Hello!!" ]
En gros, toutes les données de signature doivent être entre crochets : [ ... ].
À l'intérieur de cette zone, l'information est fournie par le schéma champ = donnée.
Si vous avez de l'expérience avec les réseaux informatiques, la majorité des champs listés dans le Tableau 1
ont une signification forte pour vous. Vous devez utiliser ces champs pour créer vos futures signatures.
Tableau 1 : Les champs de signature de pig.
Lors de la création d'une signature, vous n'avez pas besoin de spécifier toutes les données. Si vous spécifiez uniquement les parties les plus pertinentes du paquet,
les parties restantes seront remplies avec des valeurs par défaut. Les sommes de contrôle sont toujours recalculées.
Astuce : jetez un œil au sous-répertoire pigsty. Vous trouverez beaucoup de fichiers de signature et vous verrez qu'il est
très simple d'en définir de nouveaux.
Oui, c'est possible. Pour utiliser cette fonctionnalité, il suffit de spécifier les valeurs listées dans le Tableau 2
dans les champs de type adresse IP.
Tableau 2 : IPs par zone géographique.
| Valeur à utiliser |
|---|
Vous devez, dans tout champ de type adresse IP, utiliser user-defined-ip comme valeur. Notez que vous devez utiliser l'option de ligne de commande
--targets dans ce cas. Voir la section Utiliser pig pour plus d'informations.
Si vous créez des fichiers pigsty que vous jugez pertinents au-delà de votre propre environnement, ouvrez une pull request afin
d'inclure ces fichiers utiles ici. Merci d'avance !
L'utilisation de Pig est très simple, il est nécessaire de fournir quatre options de base :
--signatures--gateway--net-mask--lo-ifaceVous voulez en savoir plus sur chaque option, hein ?... Alors allons-y :
--signatures reçoit une liste de chemins de fichiers vers des fichiers pigsty.--gateway est l'endroit où vous spécifiez l'adresse de votre passerelle. Soyez conscient que pig génère ou du moins essaie de générer les trames ethernet aussi. De ce fait, l'adresse de la passerelle est plutôt importante pour composer correctement les données de la couche-1.--net-mask pour les problèmes de routage doit recevoir votre masque de réseau.--lo-iface est l'endroit où vous devez indiquer le nom de l'interface réseau locale que vous utiliserez pour "évacuer" les paquets générés.--no-gateway indique qu'aucun paquet ne sera envoyé en dehors du réseau.Supposons que nous voulions générer du trafic basé sur DDos :
[email protected]:~# pig --signatures=pigsty/ddos.pigsty\
> --gateway=10.0.2.2\
> --net-mask=255.255.255.0 --lo-iface=eth0
Maintenant, nous voulons tout perturber :
[email protected]:~# pig --signatures=pigsty/ddos.pigsty,pigsty/attackresponses.pigsty,\
> pigsty/badtraffic.pigsty,pigsty/backdoors.pigsty\
> --gateway=10.0.2.2 --net-mask=255.255.255.0 --lo-iface=eth0
Pour cela, utilisez l'option --timeout=<millisecondes>
Utilisez l'option --no-echo.
Utilisez l'option --targets. Vous pouvez spécifier une liste basée sur des IP exactes, des masques IP et des CIDRs.
Regardez ceci :
[email protected]:~# pig --signatures=pigsty/local-mess.pigsty\
> --targets=192.30.70.3,192.30.70.*,192.30.70.0/9\
> --gateway=10.0.2.2\
> --net-mask=255.255.255.0\
> --lo-iface=eth0
Ceci est utile lorsque les signatures chargées n'enverront pas de données en dehors du réseau actuel. Pour le signaler, vous devez utiliser
l'option --no-gateway. Lorsque l'option --no-gateway est utilisée, vous n'avez pas besoin de spécifier l'adresse de la passerelle
car les paquets ne circuleront pas en dehors du segment actuel. En conséquence, indiquer le masque de réseau devient également inutile.
Par exemple :
[email protected]:~# pig --signatures=pigsty/local_traffic.pigsty --no-gateway --lo-iface=eth2
Dans l'exemple ci-dessus, la trame ethernet ne sera plus de la responsabilité de pig. Pour cette raison, pig ne se plaindra pas
du manque des options --gateway et --net-mask.
L'option --no-gateway est très pratique dans les cas où vous devez générer du trafic ARP. Jetez un œil à cet autre
document expliquant comment effectuer une usurpation ARP avec pig.
Peut-être avez-vous besoin d'envoyer une seule signature, puis de revenir à l'appelant pour vérifier ce qui s'est passé après. Ce genre de
besoin est courant lorsque vous utilisez cette application comme support pour des tests système ou des tests unitaires. Donc, si vous avez besoin
de faire cela, vous devriez essayer d'utiliser l'option --single-test :
[email protected]:~# pig --signature=pigsty/syn-scan.pigsty --targets=127.0.0.1 --single-test\
> --gateway=10.0.2.2 --net-mask=255.255.255.0 --lo-iface=eth0
Après avoir exécuté cette commande, pig sélectionnera une seule signature du fichier syn-scan.pigsty, essaiera de l'envoyer, puis se fermera.
Si une erreur s'est produite pendant le processus, pig se fermera avec un code de sortie égal à 1, sinon pig se fermera
avec un code de sortie égal à 0.
Le mode de fonctionnement de base de pig est une boucle sans fin qui crache des tonnes de paquets sur le réseau en respectant un
délai d'attente préalablement défini.
Vous pouvez définir la manière dont pig parcourt les paquets chargés pour les envoyer en utilisant l'option --loop=<mode>. Pour l'instant,
les modes sont deux : random (par défaut) et sequential.
Le mode sequential réitérera les signatures lorsqu'il atteindra la fin de la liste des signatures de paquets chargées.
Les sous-tâches sont des tâches mineures utiles liées à la création de paquets qui sont intégrées dans pig pour vous aider lors de vos
sessions de création. Ces tâches peuvent être accessibles en utilisant l'option --sub-task=<nom-tache>.
En raison du fait qu'elles sont pratiquement des sous-programmes, les sous-tâches ont leurs propres particularités et, de ce fait,
les détails les concernant se trouvent dans leur propre manuel. Jetez un œil au Tableau 3 pour y accéder.
Tableau 3 : Les sous-tâches de pig.
Jusqu'à présent, vous pouvez construire des paquets basés sur IPv4 avec UDP ou TCP dans leur couche de transport. Vous pouvez également construire
des paquets ARP.
Cependant, vous pouvez aussi construire des paquets en partant de la trame Ethernet. L'avantage est la possibilité
de virtuellement construire n'importe quoi au-dessus de la charge utile Ethernet.
Par exemple, même si pig ne propose pas encore de support pour la construction IPv6 cuisinée, vous pouvez toujours la
construire en utilisant un pigsty basé sur Ethernet brut. Regardez :
[ eth.hwdst = "5C:AC:4C:AA:F5:B5",
eth.hwsrc = "08:95:2A:AD:D6:4F",
eth.type = 0x86DD,
eth.payload = "\x60\x00\x00\x00\x00\x20\x3a\xff\xfe\x80\x00\x00\x00\x00\x00\x00\x0a\x95\x2a\xff\xfe\xad\xd6\x4f\xfe\x80\x00\x00\x00\x00\x00\x00\x55\x51\x00\xc2\x18\x0f\xdb\x46\x88\x00\x32\x01\xe0\x00\x00\x00\xfe\x80\x00\x00\x00\x00\x00\x00\x0a\x95\x2a\xff\xfe\xad\xd6\x4f\x02\x01\x08\x95\x2a\xad\xd6\x4f",
signature = "IPv6 from Sparta" ]
En tenant compte du fait que l'inclusion des adresses MAC de destination et source dans un "pigsty Ethernet" est
facultative, nous pouvons faire le travail même sans utiliser de champ peluche.
C'est intéressant lorsque vous devez tester de nouveaux protocoles dans votre environnement, entre autres choses amusantes et anormales. De cette manière brute,
pig peut rester utile pour vous.
Enregistrez les données suivantes sous le nom "oink.pigsty" :
[ signature = "oink",
ip.version = 4,
ip.ihl = 5,
ip.tos = 0,
ip.src = 127.0.0.1,
ip.dst = user-defined-ip,
ip.protocol = 17,
udp.dst = 1008,
udp.src = 32000,
udp.payload = "Oink!!\n" ]
Sur un autre tty, exécutez netcat en mode UDP à l'écoute des connexions sur le port 1008 :
[email protected]:~# nc -u -l -p 1008
Maintenant, exécutez pig en utilisant "oink.pigsty", en indiquant comme cible le loopback :
[email protected]:~# pig --signatures=oink.pigsty --targets=127.0.0.1\
> --gateway=10.0.2.2 --net-mask=255.255.255.0 --lo-iface=eth0
Le netcat devrait commencer à recevoir plusieurs oink et... oui, félicitations !! pig est opérationnel sur votre système ! ;)
Essayez de sniffer votre réseau pour obtenir plus d'informations sur ces paquets UDP qui circulent sur vos interfaces...
Amusez-vous bien !
| Champ | Signification | Protocole | Type de données | Exemple de définition |
|---|
signature | Le nom de la signature | - | chaîne | signature = "Inondation UDP" |
eth.hwdst | MAC dest. Ethernet | Ethernet | MAC | eth.hwdst = "00:de:ad:be:ef:00" |
eth.hwsrc | MAC source Ethernet | Ethernet | MAC | eth.hwsrc = "00:de:ad:be:ef:00" |
eth.type | Type Ether | Ethernet | nombre | eth.type = 0x0800 |
eth.payload | Charge utile Ethernet | Ethernet | chaîne | eth.payload = "f\x00ob\x04r" |
ip.version | Version IP | IP | nombre | ip.version = 4 |
ip.ihl | Longueur en-tête IP | IP | nombre | ip.ihl = 5 |
ip.tos | Type de service | IP | nombre | ip.tos = 0 |
ip.tlen | Longueur totale | IP | nombre | ip.tlen = 20 |
ip.id | ID du paquet | IP | nombre | ip.id = 0xbeef |
ip.flags | Drapeaux IP | IP | nombre | ip.flags = 4 |
ip.offset | Décalage fragment | IP | nombre | ip.offset = 0 |
ip.ttl | Durée de vie | IP | nombre | ip.ttl = 64 |
ip.protocol | Protocole | IP | nombre | ip.protocol = 6 |
ip.checksum | Somme de contrôle | IP | nombre | ip.checksum = 0 |
ip.src | Adresse source | IP | adresse IP | ip.src = 192.30.70.3 |
ip.dst | Adresse destination | IP | adresse IP | ip.dst = 192.30.70.3 |
ip.payload | Charge utile brute IP | IP | chaîne | ip.payload = "\x01\x02" |
tcp.src | Port source | TCP | nombre | tcp.src = 80 |
tcp.dst | Port destination | TCP | nombre | tcp.dst = 21 |
tcp.seqno | Numéro de séquence | TCP | nombre | tcp.seqno = 10202 |
tcp.ackno | Numéro d'accusé de récep. | TCP | nombre | tcp.ackno = 10200 |
tcp.size | Longueur TCP | TCP | nombre | tcp.size = 4 |
tcp.reserv | Champ réservé TCP | TCP | nombre | tcp.reserv = 0 |
tcp.urg | Drapeau urg. TCP | TCP | bit | tcp.urg = 0 |
tcp.ack | Drapeau ack. TCP | TCP | bit | tcp.ack = 1 |
tcp.psh | Drapeau psh. TCP | TCP | bit | tcp.psh = 0 |
tcp.rst | Drapeau rst. TCP | TCP | bit | tcp.rst = 0 |
tcp.syn | Drapeau syn. TCP | TCP | bit | tcp.syn = 0 |
tcp.fin | Drapeau fin. TCP | TCP | bit | tcp.fin = 0 |
tcp.wsize | Taille fenêtre TCP | TCP | nombre | tcp.wsize = 0 |
tcp.checksum | Somme de contrôle | TCP | nombre | tcp.checksum = 0 |
tcp.urgp | Pointeur urgent | TCP | nombre | tcp.urgp = 0 |
tcp.payload | Charge utile | TCP | chaîne | tcp.payload = "\x01abc" |
udp.src | Port source | UDP | nombre | udp.src = 53 |
udp.dst | Port destination | UDP | nombre | udp.dst = 7 |
udp.size | Longueur UDP | UDP | nombre | udp.size = 8 |
udp.checksum | Somme de contrôle | UDP | nombre | udp.checksum = 0 |
udp.payload | Charge utile | UDP | nombre | udp.payload = "boo!" |
icmp.type | Type ICMP | ICMP | nombre | icmp.type = 0 |
icmp.code | Code ICMP | ICMP | nombre | icmp.code = 0 |
icmp.checksum | Somme de contrôle | ICMP | nombre | icmp.checksum = 0 |
icmp.payload | Charge utile | ICMP | chaîne | icmp.payload = "ping!" |
arp.hwtype | Type matériel ARP | ARP | nombre | arp.hwtype = 0x1 |
arp.ptype | Type protocole ARP | ARP | nombre | arp.ptype = 0x0800 |
arp.hwlen | Longueur matériel ARP | ARP | nombre | arp.hwlen = 6 |
arp.opcode | Code opération ARP | ARP | nombre | arp.opcode = 2 |
arp.hwsrc | Adresse matérielle src ARP | ARP | MAC | arp.hwsrc = "de:ad:be:ef:0:0" |
arp.psrc | Adresse protocole src ARP | ARP | adresse IP | arp.psrc = 192.30.70.3 |
arp.hwdst | Adresse matérielle dst ARP | ARP | MAC | arp.hwdst = "de:ad:be:ef:0:0" |
arp.pdst | Adresse protocole dst ARP | ARP | adresse IP | arp.pdst = 192.30.70.3 |
| Signification |
|---|
north-american-ip | Adresses IP d'Amérique du Nord |
south-american-ip | Adresses IP d'Amérique du Sud |
asian-ip | Adresses IP d'Asie |
european-ip | Adresses IP d'Europe |
| Sous-tâche | Que fait-elle ? | Manuel |
|---|
pcap-import | Importe un paquet depuis un fichier PCAP vers un fichier pigsty | cat doc/pcap-import.md |
shell | Exécute pig en mode interactif | cat doc/shell.md |