
Ein Linux-Paket-Erstellungstool.
„Pig“ (was als „P“acket „i“ntruder „g“enerator verstanden werden kann) ist ein „Linux“-Packet-Crafting-Tool. Du kannst „Pig“ verwenden, um deine „IDS“/„IPS“ unter anderem zu testen.
„Pig“ bringt eine Reihe bekannter Angriffssignaturen mit, die einsatzbereit sind, und du kannst diese Sammlung mit spezifischeren Dingen nach deinen Anforderungen erweitern.
Bisher ist es möglich, „IPv4“-Signaturen mit Transportschicht basierend auf „TCP“, „UDP“ und „ICMP“ zu erstellen. Du kannst auch Signaturen basierend auf dem „ARP“-Protokoll erstellen, zusätzlich zum Aufbau des Pakets ab seinem „Ethernet“-Frame.
Wenn du über meinen 2600-Artikel aus der „SPRING 2016“ Ausgabe hierher gekommen bist, lies die folgenden Dokumentationsabschnitte weiter, denn dieses kleine „Pig“ hat sich seitdem weiterentwickelt.
Es ist ganz einfach:
[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
Du musst Hefesto verwenden, um „pig“ zu bauen. Nachdem du
die Schritte befolgt hast, um „Hefesto“ auf deinem System zum Laufen zu bringen. Wechsle in das Unterverzeichnis „src“ von „pig“ und führe
den folgenden Befehl aus:
[email protected]:~/src/pig/src# hefesto
Nach diesem Befehl solltest du die „pig“-Binärdatei unter dem Pfad „src/bin“ finden. Du kannst die Binärdatei relativ von „src/bin“ verwenden oder installieren.
Wenn du aus irgendeinem Grund Bauprobleme hast, solltest du versuchen, einige Hinweise in BUILD.md zu lesen.
Zum Installieren musst du dich im Unterverzeichnis „src“ befinden und aufrufen:
[email protected]:~/src/pig/src# hefesto --install
Zum Deinstallieren, wenn du dich im Unterverzeichnis „src“ befindest, solltest du aufrufen:
[email protected]:~/src/pig/src# hefesto --uninstall
„Pigsty-Dateien“ sind reine Textdateien, in denen du einen Satz von Paketsignaturen definieren kannst. Es gibt eine spezifische Syntax, die befolgt werden muss. Sieh dir ein Beispiel einer Pigsty-Datei an:
[ signature = "Hallo",
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 = "Hallo!!" ]
Grundsätzlich müssen alle Signaturdaten zwischen eckigen Klammern stehen: [ ... ].
Innerhalb dieses Bereichs werden die Informationen durch das Schema Feld = Daten bereitgestellt.
Wenn du Erfahrung mit Computernetzen hast, haben die meisten der in „Tabelle 1“ aufgeführten Felder eine starke Bedeutung für dich. Du musst diese Felder verwenden, um deine weiteren Signaturen zu erstellen.
Tabelle 1: Die „pig“-Signaturfelder.
Beim Erstellen einer Signatur musst du nicht alle Daten angeben. Wenn du nur die wichtigsten Paketteile angibst, werden die restlichen Teile mit Standardwerten aufgefüllt. Die „Prüfsummen“ werden immer neu berechnet.
Tipp: Wirf einen Blick in das Unterverzeichnis „pigsty“. Du wirst viele Signaturdateien finden und sehen, dass es recht einfach ist, neue zu definieren.
Ja, das ist möglich. Um diese Funktion zu nutzen, musst du nur die in „Tabelle 2“ aufgeführten Werte
in Feldern vom Typ ip address angeben.
Tabelle 2: IPs nach geografischem Gebiet.
| Zu verwendender Wert |
|---|
Du solltest in jedem Feld vom Typ ip address den Wert user-defined-ip als Wert verwenden. Beachte, dass du in diesem Fall die
Befehlszeilenoption --targets verwenden musst. Siehe Abschnitt Pig verwenden für weitere Informationen.
Wenn du „Pigsty-Dateien“ erstellst, die du über deine eigene Umgebung hinaus als relevant erachtest, öffne einen Pull-Request, um diese nützlichen Dateien hier aufzunehmen. Vielen Dank im Voraus!
Die Verwendung von „Pig“ ist sehr einfach und erfordert die Angabe von vier grundlegenden Optionen:
--signatures--gateway--net-mask--lo-ifaceWillst du mehr über jede Option wissen, hm?... Dann los:
--signatures erhält eine Liste von Dateipfaden zu „Pigsty-Dateien“.--gateway gibt an, wo du deine Gateway-Adresse angibst. Beachte, dass „pig“ die „Ethernet-Frames“ ebenfalls generiert oder zumindest zu generieren versucht. Aus diesem Grund ist die Gateway-Adresse sehr wichtig, um die „Layer-1“-Daten korrekt zusammenzustellen.--net-mask muss für Routing-Probleme deine Netzmaske erhalten.--lo-iface ist der Ort, an dem du den Namen der lokalen Netzwerkschnittstelle angeben solltest, die du zum „Ableiten“ der generierten Pakete verwenden wirst.--no-gateway zeigt an, dass kein Paket außerhalb des Netzwerks gesendet wird.Angenommen, wir möchten „DDos“-basierten Datenverkehr generieren:
[email protected]:~# pig --signatures=pigsty/ddos.pigsty\
> --gateway=10.0.2.2\
> --net-mask=255.255.255.0 --lo-iface=eth0
Jetzt wollen wir alles durcheinanderbringen:
[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
Verwende dazu die Option --timeout=<Millisekunden>.
Verwende die Option --no-echo.
Verwende die Option --targets. Du kannst eine Liste basierend auf exakten IPs, IP-Masken und CIDRs angeben.
Sieh dir das an:
[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
Dies ist nützlich, wenn die geladenen Signaturen keine Daten außerhalb des aktuellen Netzwerks senden. Um dies zu kennzeichnen, musst du
die Option --no-gateway verwenden. Wenn die Option --no-gateway verwendet wird, musst du die Adresse des Gateways nicht angeben,
da die Pakete nicht außerhalb des aktuellen Segments fließen. Folglich wird auch die Angabe der Netzmaske irrelevant.
Zum Beispiel:
[email protected]:~# pig --signatures=pigsty/local_traffic.pigsty --no-gateway --lo-iface=eth2
Im obigen Beispiel liegt die Verantwortung für den Ethernet-Frame nicht mehr bei „pig“. Aus diesem Grund wird „pig“ sich nicht
über das Fehlen der Optionen --gateway und --net-mask beschweren.
Die Option --no-gateway ist sehr praktisch, wenn du ARP-Datenverkehr generieren musst. Wirf einen Blick in dieses andere
Dokument, das erklärt, wie man ARP-Spoofing mit pig durchführt.
Vielleicht musst du nur eine Signatur senden und dann zum Aufrufer zurückkehren, um zu überprüfen, was danach passiert ist. Diese Art von
Anforderung ist üblich, wenn du diese Anwendung als Unterstützung für „Systemtests“ oder „Unit-Tests“ verwendest. Wenn du dies
tun möchtest, solltest du versuchen, die Option --single-test zu verwenden:
[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
Nach Ausführung dieses Befehls wählt „pig“ nur eine Signatur aus der Datei „syn-scan.pigsty“ aus, versucht sie zu senden und beendet sich dann.
Wenn während des Vorgangs ein Fehler aufgetreten ist, beendet sich „pig“ mit einem „Exit-Code“ von 1, andernfalls beendet sich „pig“
mit einem „Exit-Code“ von 0.
Der grundlegende „pig“-Betriebsmodus ist eine endlose „Schleife“, die unter Berücksichtigung eines zuvor definierten Timeouts Tonnen von Paketen in das Netzwerk spuckt.
Du kannst definieren, wie „pig“ die geladenen Pakete zum Senden durchläuft, indem du die Option --loop=<Modus> verwendest. Bisher gibt es
zwei Modi: random (Standard) und sequential.
Der sequential-Modus wiederholt die Signaturen, wenn er das Ende der geladenen Paketsignaturenliste erreicht.
Unteraufgaben sind nützliche kleinere Aufgaben im Zusammenhang mit der Paketerstellung, die in „pig“ enthalten sind, um dir bei deiner
Erstellungssitzung zu helfen. Auf diese Aufgaben kann mit der Option --sub-task=<Aufgabenname> zugegriffen werden.
Da es sich praktisch um Unterprogramme handelt, haben die Unteraufgaben ihre eigenen Eigenheiten, und aus diesem Grund folgen die Details dazu in ihrer eigenen Anleitung. Wirf einen Blick auf die „Tabelle 3“, um dorthin zu gelangen.
Tabelle 3: Die „pig“-Unteraufgaben.
Bisher kannst du Pakete auf Basis von „IPv4“ mit „UDP“ oder „TCP“ in ihrer Transportschicht erstellen. Du kannst auch „ARP“-Pakete erstellen.
Du kannst jedoch auch Pakete ausgehend vom „Ethernet“-Frame erstellen. Das Schöne daran ist die Möglichkeit, praktisch alles oberhalb der „Ethernet“-Nutzlast zu erstellen.
Zum Beispiel: Auch wenn „pig“ bisher keine Unterstützung für gekochtes „IPv6“ bietet, kannst du es dennoch mit einer rohen „Ethernet“-basierten Pigsty erstellen. Sieh hier:
[ 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" ]
]
Wenn man bedenkt, dass die Angabe der Ziel- und Quell-„MAC“-Adressen in einer „Ethernet-Pigsty“ optional ist, können wir die Aufgabe auch ohne Verwendung eines „Plüschfeldes“ erledigen.
Es ist nützlich, wenn du neue Protokolle in deiner Umgebung testen musst, unter anderem andere anomale lustige Dinge. Auf diese rohe Weise kann dir „pig“ weiterhin nützlich sein.
## pig von Grund auf testen
Speichere die folgenden Daten als „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" ]
Führe auf einem anderen „tty“ den „netcat“ im „UDP-Modus“ aus und höre auf Verbindungen auf Port ``1008``:
[email protected]:~# nc -u -l -p 1008
Starte nun ``pig`` mit ``oink.pigsty`` und gib als Ziel die ``Loopback``-Adresse an:
[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
Der ``netcat`` sollte beginnen, mehrere „oinks“ zu empfangen, und... ja, herzlichen Glückwunsch!! „pig“ läuft und funktioniert auf deinem System! ;)
Versuche, dein Netzwerk zu überwachen, um weitere Informationen über diese „UDP-Pakete“ zu erhalten, die durch deine Schnittstellen fließen...
Viel Spaß!
| Feld | Bedeutung | Protokoll | Datentyp | Beispieldefinition |
|---|
signature | Der Signaturname | - | string | signature = "Udp flood" |
eth.hwdst | Ethernet Ziel-MAC | Ethernet | MAC | eth.hwdst = "00:de:ad:be:ef:00" |
eth.hwsrc | Ethernet Quell-MAC | Ethernet | MAC | eth.hwsrc = "00:de:ad:be:ef:00" |
eth.type | Ether-Typ | Ethernet | number | eth.type = 0x0800 |
eth.payload | Ethernet Nutzlast | Ethernet | string | eth.payload = "f\x00ob\x04r" |
ip.version | IP-Version | IP | number | ip.version = 4 |
ip.ihl | Internet Header Länge | IP | number | ip.ihl = 5 |
ip.tos | Diensttyp | IP | number | ip.tos = 0 |
ip.tlen | Gesamtlänge | IP | number | ip.tlen = 20 |
ip.id | Paket-ID | IP | number | ip.id = 0xbeef |
ip.flags | IP-Flags | IP | number | ip.flags = 4 |
ip.offset | Fragment-Offset | IP | number | ip.offset = 0 |
ip.ttl | Time to live | IP | number | ip.ttl = 64 |
ip.protocol | Protokoll | IP | number | ip.protocol = 6 |
ip.checksum | Prüfsumme | IP | number | ip.checksum = 0 |
ip.src | Quelladresse | IP | ip address | ip.src = 192.30.70.3 |
ip.dst | Zieladresse | IP | ip address | ip.dst = 192.30.70.3 |
ip.payload | IP-Rohnutzlast | IP | string | ip.payload = "\x01\x02" |
tcp.src | Quellport | TCP | number | tcp.src = 80 |
tcp.dst | Zielport | TCP | number | tcp.dst = 21 |
tcp.seqno | Sequenznummer | TCP | number | tcp.seqno = 10202 |
tcp.ackno | Bestätigungsnummer | TCP | number | tcp.ackno = 10200 |
tcp.size | TCP-Länge | TCP | number | tcp.size = 4 |
tcp.reserv | TCP-Reservierungsfeld | TCP | number | tcp.reserv = 0 |
tcp.urg | TCP-Urg.-Flag | TCP | bit | tcp.urg = 0 |
tcp.ack | TCP-Ack.-Flag | TCP | bit | tcp.ack = 1 |
tcp.psh | TCP-Psh.-Flag | TCP | bit | tcp.psh = 0 |
tcp.rst | TCP-Rst.-Flag | TCP | bit | tcp.rst = 0 |
tcp.syn | TCP-Syn.-Flag | TCP | bit | tcp.syn = 0 |
tcp.fin | TCP-Fin.-Flag | TCP | bit | tcp.fin = 0 |
tcp.wsize | TCP-Fenstergröße | TCP | number | tcp.wsize = 0 |
tcp.checksum | Prüfsumme | TCP | number | tcp.checksum = 0 |
tcp.urgp | Dringlichkeitszeiger | TCP | number | tcp.urgp = 0 |
tcp.payload | Nutzlast | TCP | string | tcp.payload = "\x01abc" |
udp.src | Quellport | UDP | number | udp.src = 53 |
udp.dst | Zielport | UDP | number | udp.dst = 7 |
udp.size | UDP-Länge | UDP | number | udp.size = 8 |
udp.checksum | Prüfsumme | UDP | number | udp.checksum = 0 |
udp.payload | Nutzlast | UDP | number | udp.payload = "boo!" |
icmp.type | ICMP-Typ | ICMP | number | icmp.type = 0 |
icmp.code | ICMP-Code | ICMP | number | icmp.code = 0 |
icmp.checksum | Prüfsumme | ICMP | number | icmp.checksum = 0 |
icmp.payload | Nutzlast | ICMP | string | icmp.payload = "ping!" |
arp.hwtype | ARP-Hardwaretyp | ARP | number | arp.hwtype = 0x1 |
arp.ptype | ARP-Protokolltyp | ARP | number | arp.ptype = 0x0800 |
arp.hwlen | ARP-Hardwarelänge | ARP | number | arp.hwlen = 6 |
arp.opcode | ARP-Operationscode | ARP | number | arp.opcode = 2 |
arp.hwsrc | ARP-Quell-HW-Adr. | ARP | MAC | arp.hwsrc = "de:ad:be:ef:0:0" |
arp.psrc | ARP-Quell-Proto-Adr. | ARP | ip address | arp.psrc = 192.30.70.3 |
arp.hwdst | ARP-Ziel-HW-Adr. | ARP | MAC | arp.hwdst = "de:ad:be:ef:0:0" |
arp.pdst | ARP-Ziel-Proto-Adr. | ARP | ip address | arp.pdst = 192.30.70.3 |
| Bedeutung |
|---|
north-american-ip | IP-Adressen aus Nordamerika |
south-american-ip | IP-Adressen aus Südamerika |
asian-ip | IP-Adressen aus Asien |
european-ip | IP-Adressen aus Europa |
| Unteraufgabe | Was führt sie aus? | Anleitung |
|---|
pcap-import | Importiert Paket aus einer PCAP-Datei in eine Pigsty-Datei | cat doc/pcap-import.md |
shell | Führt pig im interaktiven Modus aus | cat doc/shell.md |