
Uno strumento di creazione di pacchetti per Linux.
Pig (che può essere inteso come Packet intruder generator) è uno strumento Linux per la creazione di pacchetti.
Puoi usare Pig per testare il tuo IDS/IPS tra le altre cose.
Pig porta un mucchio di firme di attacco ben note già pronte per essere utilizzate e puoi espandere questa raccolta
con cose più specifiche secondo le tue esigenze.
Fino ad ora è possibile creare firme IPv4 con livello di trasporto basato su TCP, UDP e ICMP.
Puoi anche creare firme basate sul protocollo ARP, oltre a costruire il pacchetto a partire dal suo frame Ethernet.
Se sei arrivato qui tramite il mio articolo su 2600 del numero SPRING 2016 issue
continua a leggere le seguenti sezioni della documentazione perché questo piccolo Pig si è evoluto da allora.
È molto semplice:
[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
Devi usare Hefesto per compilare pig. Dopo aver seguito
i passaggi per mettere Hefesto in funzione sul tuo sistema, spostati nella sottodirectory pig chiamata src ed esegui
il seguente comando:
[email protected]:~/src/pig/src# hefesto
Dopo questo comando dovresti trovare il binario pig nel percorso src/bin. Puoi usare il binario relativamente da
src/bin o installarlo.
Se per qualche motivo hai problemi di compilazione, dovresti provare a leggere alcune osservazioni presenti in BUILD.md.
Per installare devi essere nella sottodirectory src e chiamare:
[email protected]:~/src/pig/src# hefesto --install
Per disinstallare, essendo nella sottodirectory src, devi chiamare:
[email protected]:~/src/pig/src# hefesto --uninstall
I file Pigsty sono file di testo semplice in cui puoi definire un insieme di firme di pacchetti. C'è una sintassi specifica da
seguire. Ecco un esempio di file 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!!" ]
Fondamentalmente, tutti i dati della firma devono essere tra parentesi quadre: [ ... ].
All'interno di quest'area le informazioni sono fornite tramite lo schema field = data.
Se hai un po' di esperienza con le Reti di Computer, è certo che la maggior parte dei campi elencati nella Tabella 1
hanno un forte significato per te. Devi usare questi campi per creare le tue successive firme.
Tabella 1: I campi delle firme di pig.
Quando crei una firma non devi specificare tutti i dati. Se specifichi solo le parti più rilevanti del pacchetto,
le parti rimanenti verranno riempite con valori predefiniti. I checksum vengono sempre ricalcolati.
Suggerimento: dai un'occhiata alla sottodirectory pigsty. Troverai molti file di firma e vedrai che è
abbastanza semplice definirne di nuovi.
Sì, è possibile. Per utilizzare questa funzione devi solo specificare i valori elencati nella Tabella 2
nei campi di tipo ip adddress.
Tabella 2: IP per area geografica.
| Valore da usare |
|---|
In qualsiasi campo di tipo ip address dovresti usare user-defined-ip come valore. Nota che in questo caso
devi usare l'opzione della riga di comando --targets. Vedi la sezione Using pig per maggiori informazioni.
Se crei file pigsty che ritieni siano rilevanti al di là del tuo ambiente, apri una pull request per includere
questi file utili qui. Grazie in anticipo!
L'uso di Pig è molto semplice, è necessario fornire quattro opzioni di base che sono:
--signatures--gateway--net-mask--lo-ifaceVuoi saperne di più su ogni opzione, eh?... Allora andiamo:
--signatures riceve un elenco di percorsi di file verso file pigsty.--gateway è dove specifichi l'indirizzo del tuo gateway. Tieni presente che pig genera o almeno cerca di generare anche i frame ethernet. Per questo motivo l'indirizzo del gateway è piuttosto importante per comporre correttamente i dati del layer-1.--net-mask per questioni di routing deve ricevere la tua maschera di rete.--lo-iface è il posto in cui dovresti indicare il nome dell'interfaccia di rete locale che utilizzerai per "far uscire" i pacchetti generati.--no-gateway indica che nessun pacchetto verrà inviato al di fuori della rete.Supponendo che vogliamo generare traffico basato su DDoS:
[email protected]:~# pig --signatures=pigsty/ddos.pigsty\
> --gateway=10.0.2.2\
> --net-mask=255.255.255.0 --lo-iface=eth0
Ora vogliamo fare un po' di caos:
[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
Per farlo usa l'opzione --timeout=<millisec>
Usa l'opzione --no-echo.
Usa l'opzione --targets. Puoi specificare un elenco basato su IP esatti, maschere IP e CIDR.
Guarda questo:
[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
Questo è utile quando le firme caricate non invieranno dati al di fuori della rete corrente. Per segnalarlo devi usare
l'opzione --no-gateway. Quando viene usata l'opzione --no-gateway non è necessario specificare l'indirizzo del gateway
perché i pacchetti non fluiranno al di fuori del segmento corrente. Di conseguenza, anche comunicare la maschera di rete diventa irrilevante.
Ad esempio:
[email protected]:~# pig --signatures=pigsty/local_traffic.pigsty --no-gateway --lo-iface=eth2
Nell'esempio sopra, il frame ethernet non sarà più responsabilità di pig. Per questo motivo pig non si lamenterà
dell'assenza delle opzioni --gateway e --net-mask.
L'opzione --no-gateway è molto comoda nei casi in cui devi generare traffico ARP. Dai un'occhiata a questo altro
documento che spiega come eseguire l'ARP spoofing con pig.
Forse hai bisogno di inviare una sola firma e poi tornare al chiamante per verificare cosa è successo. Questo tipo di
requisito è comune quando usi questa applicazione come supporto per test di sistema o test unitari. Quindi, se ne hai
bisogno dovresti provare a usare l'opzione --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
Dopo l'esecuzione di questo comando, pig selezionerà solo una firma dal file syn-scan.pigsty e proverà a inviarla per poi uscire.
Se si verifica un errore durante il processo, pig uscirà con codice di uscita uguale a 1, altrimenti pig uscirà
con codice di uscita uguale a 0.
La modalità operativa base di pig è un loop infinito che sputa tonnellate di pacchetti nella rete rispettando un
timeout precedentemente definito.
Puoi definire come pig attraversa i pacchetti caricati per inviarli usando l'opzione --loop=<mode>. Fino ad ora
le modalità sono due: random (predefinita) e sequential.
La modalità sequential reitererà le firme quando raggiunge la fine dell'elenco delle firme di pacchetti caricati.
Le sotto-attività sono attività minori utili correlate alla creazione di pacchetti che sono incluse in pig per aiutarti
durante la tua sessione di creazione. Queste attività possono essere accessibili usando l'opzione --sub-task=<task-name>.
Per il fatto di essere praticamente dei sottoprogrammi, le sotto-attività hanno le loro peculiarità e per questo motivo
i dettagli su di esse sono nei loro manuali. Dai un'occhiata alla Tabella 3 per seguirli.
Tabella 3: Le sotto-attività di pig.
Fino ad ora puoi costruire pacchetti basati su IPv4 con UDP o TCP nel loro livello di trasporto. Puoi anche costruire
pacchetti ARP.
Tuttavia, puoi ancora costruire pacchetti a partire dal frame Ethernet. La cosa interessante è la possibilità
di costruire virtualmente qualsiasi cosa sopra il payload di Ethernet.
Ad esempio, anche se pig fino ad ora non offre supporto per la costruzione di IPv6 "cucinato", puoi comunque costruirlo
usando un pigsty basato su Ethernet grezzo. Guarda:
[ 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" ]
]
Tenendo conto che l'inclusione degli indirizzi MAC di destinazione e sorgente all'interno di un "pigsty Ethernet" è
opzionale, possiamo svolgere il lavoro anche senza usare alcun campo di riempimento.
È utile quando devi testare nuovi protocolli nel tuo ambiente, tra le altre cose divertenti e anomale. In questo modo grezzo,
pig può continuare a esserti utile.
Salva i seguenti dati come "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" ]
Su un altro tty esegui netcat in modalità UDP in ascolto di connessioni sulla porta 1008:
[email protected]:~# nc -u -l -p 1008
Ora esegui pig usando il file "oink.pigsty", indicando come target il 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
Il netcat dovrebbe iniziare a ricevere diversi oink e... sì, complimenti!! pig è operativo sul tuo sistema! ;)
Prova a sniffare la tua rete per ottenere maggiori informazioni su questi pacchetti UDP che stanno circolando sulle tue interfacce...
Buon divertimento!
| Campo | Significa | Protocollo | Tipo di dato | Definizione di esempio |
|---|
signature | Il nome della firma | - | string | signature = "Udp flood" |
eth.hwdst | MAC Dest. Ethernet | Ethernet | MAC | eth.hwdst = "00:de:ad:be:ef:00" |
eth.hwsrc | MAC Sorgente Ethernet | Ethernet | MAC | eth.hwsrc = "00:de:ad:be:ef:00" |
eth.type | Tipo Ether | Ethernet | number | eth.type = 0x0800 |
eth.payload | Payload Ethernet | Ethernet | string | eth.payload = "f\x00ob\x04r" |
ip.version | Versione IP | IP | number | ip.version = 4 |
ip.ihl | Lunghezza intestaz. Internet | IP | number | ip.ihl = 5 |
ip.tos | Tipo di servizio | IP | number | ip.tos = 0 |
ip.tlen | Lunghezza totale | IP | number | ip.tlen = 20 |
ip.id | ID pacchetto | IP | number | ip.id = 0xbeef |
ip.flags | Flag IP | IP | number | ip.flags = 4 |
ip.offset | Offset di frammentazione | IP | number | ip.offset = 0 |
ip.ttl | Time to live | IP | number | ip.ttl = 64 |
ip.protocol | Protocollo | IP | number | ip.protocol = 6 |
ip.checksum | Checksum | IP | number | ip.checksum = 0 |
ip.src | Indirizzo sorgente | IP | ip address | ip.src = 192.30.70.3 |
ip.dst | Indirizzo destinazione | IP | ip address | ip.dst = 192.30.70.3 |
ip.payload | Payload IP grezzo | IP | string | ip.payload = "\x01\x02" |
tcp.src | Porta sorgente | TCP | number | tcp.src = 80 |
tcp.dst | Porta destinazione | TCP | number | tcp.dst = 21 |
tcp.seqno | Numero di sequenza | TCP | number | tcp.seqno = 10202 |
tcp.ackno | Numero di acknowledgement | TCP | number | tcp.ackno = 10200 |
tcp.size | Lunghezza TCP | TCP | number | tcp.size = 4 |
tcp.reserv | Campo riservato TCP | TCP | number | tcp.reserv = 0 |
tcp.urg | Flag urg. TCP | TCP | bit | tcp.urg = 0 |
tcp.ack | Flag ack. TCP | TCP | bit | tcp.ack = 1 |
tcp.psh | Flag psh. TCP | TCP | bit | tcp.psh = 0 |
tcp.rst | Flag rst. TCP | TCP | bit | tcp.rst = 0 |
tcp.syn | Flag syn. TCP | TCP | bit | tcp.syn = 0 |
tcp.fin | Flag fin. TCP | TCP | bit | tcp.fin = 0 |
tcp.wsize | Dimensione finestra TCP | TCP | number | tcp.wsize = 0 |
tcp.checksum | Checksum | TCP | number | tcp.checksum = 0 |
tcp.urgp | Puntatore urgente | TCP | number | tcp.urgp = 0 |
tcp.payload | Payload | TCP | string | tcp.payload = "\x01abc" |
udp.src | Porta sorgente | UDP | number | udp.src = 53 |
udp.dst | Porta destinazione | UDP | number | udp.dst = 7 |
udp.size | Lunghezza UDP | UDP | number | udp.size = 8 |
udp.checksum | Checksum | UDP | number | udp.checksum = 0 |
udp.payload | Payload | UDP | number | udp.payload = "boo!" |
icmp.type | Tipo ICMP | ICMP | number | icmp.type = 0 |
icmp.code | Codice ICMP | ICMP | number | icmp.code = 0 |
icmp.checksum | Checksum | ICMP | number | icmp.checksum = 0 |
icmp.payload | Payload | ICMP | string | icmp.payload = "ping!" |
arp.hwtype | Tipo hardware ARP | ARP | number | arp.hwtype = 0x1 |
arp.ptype | Tipo protocollo ARP | ARP | number | arp.ptype = 0x0800 |
arp.hwlen | Lunghezza hardware ARP | ARP | number | arp.hwlen = 6 |
arp.opcode | Codice operazione ARP | ARP | number | arp.opcode = 2 |
arp.hwsrc | Indirizzo hardware sorgente ARP | ARP | MAC | arp.hwsrc = "de:ad:be:ef:0:0" |
arp.psrc | Indirizzo protocollo sorgente ARP | ARP | ip address | arp.psrc = 192.30.70.3 |
arp.hwdst | Indirizzo hardware destinazione ARP | ARP | MAC | arp.hwdst = "de:ad:be:ef:0:0" |
arp.pdst | Indirizzo protocollo destinazione ARP | ARP | ip address | arp.pdst = 192.30.70.3 |
| Significa |
|---|
north-american-ip | Indirizzi IP dal Nord America |
south-american-ip | Indirizzi IP dal Sud America |
asian-ip | Indirizzi IP dall'Asia |
european-ip | Indirizzi IP dall'Europa |
| Sotto-attività | Cosa fa? | Manuale |
|---|
pcap-import | Importa pacchetti da un file PCAP in un file pigsty | cat doc/pcap-import.md |
shell | Esegue pig in modalità interattiva | cat doc/shell.md |