
Toolkit per attacchi IPv6
THC-IPV6-ATTACK-TOOLKIT (c) 2005-2022 [email protected] https://github.com/vanhauser-thc/thc-ipv6
Licensed under AGPLv3 (vedi file LICENSE)
Questo codice è nato quando sono entrato in contatto con IPv6, ho imparato sempre di più - e poi non ho trovato strumenti per giocare (leggi: "hackerare") con esso. All'inizio ho provato a implementare cose con libnet, ma poi ho scoperto che l'implementazione IPv6 è solo parziale - e fa schifo. Ho provato ad aggiungere il codice mancante, ma beh, non era così facile, quindi ho risparmiato tempo e ho scritto rapidamente la mia libreria.
Questo codice attualmente funziona solo su:
Devi avere installato libpcap-dev per poter compilare gli strumenti. Inoltre sono raccomandati anche libssl-dev e libnetfilter-queue-dev.
Questi possono essere installati con (Kali, Debian, Ubuntu): sudo apt-get install libpcap-dev libssl-dev libnetfilter-queue-dev
Puoi compilare gli strumenti eseguendo: make all
Puoi installare gli strumenti e le pagine man esistenti eseguendo: make install
Il THC IPV6 ATTACK TOOLKIT viene già fornito con molti strumenti di attacco efficaci:
Basta eseguire gli strumenti senza opzioni e ti daranno aiuto e mostreranno le opzioni della riga di comando.
La libreria thc-ipv6-lib.c è il cuore e l'anima di tutti gli strumenti - e quelli che potresti voler scrivere. L'implementazione è così semplice, di solito sono bastano 2-4 righe per creare un pacchetto IPv6/ICMPv6 completo con il contenuto che desideri.
La struttura base che usi è (thc_ipv6_hdr *) per esempio thc_ipv6_hdr *my_ipv6_packet; int my_ipv6_packet_len; e non dovrai mai giocare con le sue opzioni/campi.
Ogni volta che vuoi costruire un pacchetto IPv6, scrivi: my_ipv6_packet = thc_create_ipv6_extended(interface, prefer, &my_ipv6_packet_len, src6, dst6, ttl, length, label, class, version); se qualcosa fallisce, restituisce NULL (solo se my_ipv6_packet_len o dst6 non esistono o malloc fallisce). Le opzioni di thc_create_ipv6_extended sono: (char*) interface - l'interfaccia su cui inviare il pacchetto (int) prefer - PREFER_LINK (per usare l'indirizzo link-local) o PREFER_HOST per usare un indirizzo IPv6 host, e PREFER_GLOBAL per usare un indirizzo IP6 pubblico (default) (int ) &my_ipv6_packet_len - la dimensione del pacchetto che verrà creato (unsigned char) src6 - l'IP6 sorgente (OPZIONALE - verrà selezionato se NULL) (unsigned char*) dst6 - l'IP6 di destinazione (in formato rete, 16 byte) solitamente il risultato di thc_resolve6("ipv6.google.com"); (int) ttl - il ttl del pacchetto (OPZIONALE - 0 lo imposterà a 255) (int) length - la lunghezza che verrà impostata nell'header (OPZIONALE - 0 = lunghezza reale) (int) label - l'etichetta di flusso (0 va bene) (int) class - la classe del pacchetto (0 va bene) (int) version - la versione IP6 (OPZIONALE - 0 imposterà la versione 6) Restituisce NULL in caso di errore o una struttura mallocata in caso di successo. free() una volta che hai finito.
Ora puoi impostare header di estensione sopra: thc_add_hdr_route(my_ipv6_packet, &my_ipv6_packet_len, routers, routerptr); thc_add_hdr_fragment(my_ipv6_packet, &my_ipv6_packet_len, offset, more_frags, id); thc_add_hdr_dst(my_ipv6_packet, &my_ipv6_packet_len, buf, buflen); thc_add_hdr_hopbyhop(my_ipv6_packet, &my_ipv6_packet_len, buf, buflen); thc_add_hdr_nonxt(my_ipv6_packet, &my_ipv6_packet_len, hdropt); thc_add_hdr_misc(my_ipv6_packet, &my_ipv6_packet_len, type, len, buf, buflen); Le funzioni spiegate: _route: Aggiungi un Routing Forwarding Header (come IP Source Routing) (int) routers - il numero di router in routerptr (char**) routerptr - una struttura char[routers + 1] con destinazioni router in formato rete. Vedi alive6.c per un esempio. _fragment: Aggiungi un Fragment Header (int) offset - l'offset in cui scrivere i dati (nota: inserisci la posizione dell'offset in byte qui, non in ottetti) (int) more_frags - impostato a 0 se è l'ultimo frammento, 1 su tutti gli altri (int) id - un ID per il pacchetto (uguale per tutti i frammenti) _dst: Aggiungi un Destination Options Header (char) buf - un buffer di char. devi gestire questo buffer tu stesso con ciò che vuoi scrivere dentro. (int) buflen - la lunghezza di buf _hopbyhop: Aggiungi un Hop-By-Hop Header (char*) buf - un buffer di char. devi gestire questo buffer tu stesso con ciò che vuoi scrivere dentro. (int) buflen - la lunghezza di buf _nonxt: Specifica che non ci saranno header successivi (int) hdropt - questa opzione è attualmente ignorata _misc: Specifica un header miscellaneo. Usalo se vuoi progettare un header di estensione non valido o inesistente. (int) type - l'ID del tipo per specificare l'header (int) len - la lunghezza da pubblicizzare per l'header (OPZIONALE - -1 imposta il valore corretto) (char*) buf - un buffer di char. devi gestire questo buffer tu stesso con ciò che vuoi scrivere dentro. (int) buflen - la lunghezza di buf Queste funzioni restituiscono (int) 0 in caso di successo e -1 in caso di errore.
Infine puoi aggiungere gli header stream o dgram. thc_add_icmp6(my_ipv6_packet, &my_ipv6_packet_len, type, code, flags, buf, buflen, checksum); thc_add_tcp(my_ipv6_packet, &my_ipv6_packet_len, source_port, destination_port, sequence_number, ack_number, flags, window_size urgent_pointer, options, optione_length, data, data_length); thc_add_udp(my_ipv6_packet, &my_ipv6_packet_len, source_port, destination_port, checksum, data, data_length); thc_add_data6(my_ipv6_packet, &my_ipv6_packet_len, type, buf, buflen); _icmp6: Aggiungi un header di pacchetto ICMP6 (int) type: il tipo ICMP6 (int) code: il codice ICMP6 (int) flags: i flag ICMP6 (char*) buf - un buffer di char. devi gestire questo buffer tu stesso con ciò che vuoi scrivere dentro. (int) buflen - la lunghezza di buf _tcp|_udp: Aggiungi un header TCP o UDP (ushort) source_port: porta sorgente (ushort) destination_port: porta destinazione (uint) sequence_number: numero di sequenza TCP (uint) ack_number: numero di acknowledgement TCP (ushort) checksum: checksum UDP, 0 = genera checksum (per TCP il checksum è sempre calcolato) (uchar) flags: flag TCP: TCP_SYN, TCP_ACK, TCP_FIN, TCP_RST, TCP_PSH, ... (uint) window_size: dimensione finestra TCP (uint) urgent_pointer: puntatore urgente TCP (di solito 0) (char*) options: buffer opzioni TCP, può essere NULL (uint) options_length: la lunghezza del buffer delle opzioni TCP (char*) data: i dati che il protocollo trasporta (uint) data_length: la lunghezza del buffer dati _data6: Aggiungi un header miscellaneo (int) type: l'ID del protocollo (char*) buf - un buffer di char. devi gestire questo buffer tu stesso con ciò che vuoi scrivere dentro. (int) buflen - la lunghezza di buf Queste funzioni restituiscono (int) 0 in caso di successo e -1 in caso di errore.
Una volta finito, crei e invii il pacchetto. thc_generate_pkt(interface, srcmac, dstmac, my_ipv6_packet, &my_ipv6_packet_len); thc_send_pkt(interface, my_ipv6_packet, &my_ipv6_packet_len); o combinato in una singola funzione: thc_generate_and_send_pkt(interface, srcmac, dstmac, my_ipv6_packet, &my_ipv6_packet_len);
thc_generate_and_send_pkt: Genera il pacchetto IPv6 reale e finale e poi lo invia. (char*) interface - l'interfaccia su cui inviare il pacchetto (unsigned char*) srcmac - il mac sorgente da usare (in formato rete) (OPZIONALE, viene usato il mac reale se NULL) (unsigned char*) dstmac - il mac destinazione da usare (in formato rete) (OPZIONALE, viene cercato il mac reale se NULL) thc_generate_pkt e thc_send_pkt insieme forniscono la stessa funzionalità. Di solito li usi solo se fai qualcosa come thc_generate_pkt(...); while(1) thc_send_pkt(...); Queste funzioni restituiscono (int) 0 in caso di successo e -1 in caso di errore.
Quando hai finito, libera la memoria con: thc_destroy_packet(my_ipv6_packet);
Ci sono alcune importanti funzioni helper di cui avrai bisogno: thc_resolve6(destinationstring); Risolve l'indirizzo IPv6 o il nome DNS in un indirizzo di rete IPv6. Usalo per dst6 in thc_create_ipv6_extended(). Il risultato deve essere free()ato quando non serve più. thc_inverse_packet(my_ipv6_packet, &my_ipv6_packet_len); Questa intelligente funzione inverte indirizzo sorgente e destinazione, scambia il tipo di header ICMP (ECHO REQUEST -> ECHO REPLY ecc.) e ricalcola il checksum. Se non hai idea di a cosa possa servire, vai a giocare con la tua xbox :-)
Se vuoi fare tutto molto velocemente, ci sono alcune funzioni predefinite per creare pacchetti ICMPv6 che inviano pacchetti ICMP6 in una sola riga di codice: thc_ping6(interface, src, dst, size, count); thc_neighboradv6(interface, src, dst, srcmac, dstmac, flags, target); thc_neighborsol6(interface, src, dst, target, srcmac, dstmac); thc_routeradv6(interface, src, dst, srcmac, default_ttl, managed, prefix, prefixlen, mtu, lifetime); thc_routersol6(interface, src, dst, srcmac, dstmac); thc_toobig6(interface, src, srcmac, dstmac, mtu, my_ipv6_packet, my_ipv6_packet_len); thc_paramprob6(interface, src, srcmac, dstmac, code, pointer, my_ipv6_packet, my_ipv6_packet_len); thc_unreach6(interface, src, srcmac, dstmac, icmpcode, my_ipv6_packet, my_ipv6_packet_len); thc_redir6(interface, src, srcmac, dstmac, newrouter, newroutermac, my_ipv6_packet, my_ipv6_packet_len); thc_send_as_fragment6(interface, src, dst, type, buf, buflen, frag_len); Fanno quello che ti aspetti, quindi sono troppo pigro^H^H^H^H^Hoccupato per descriverle nel dettaglio.
Le seguenti funzioni allocano memoria per il puntatore di risultato, quindi ricordati di liberare i puntatori risultato da queste funzioni quando non ti servono più: thc_ipv6_dummymac() thc_ipv62notation() thc_ipv62string() thc_string2ipv6() thc_string2notation() thc_resolve6() thc_get_own_ipv6() thc_get_own_mac() thc_get_multicast_mac() thc_get_mac() thc_lookup_ipv6_mac() thc_look_neighborcache() thc_generate_key() thc_generate_cga() thc_generate_rsa()
Aiuta molto dare un'occhiata agli esempi di utilizzo. I migliori sono gli strumenti del pacchetto thc-ipv6, specialmente implementation6.c e fake_*6.c - divertiti, e rimanda indietro il codice, così la comunità può ulteriormente costruirci sopra.
La maggior parte degli strumenti può essere facilmente rilevata da un IDS o un software di rilevamento specializzato. Questo è fatto apposta per rendere più facile il rilevamento di usi malintenzionati. Gli strumenti specificano una firma fissa del pacchetto, o sniffano genericamente i pacchetti (es. quindi rispondono anche a neighbor solicitation ICMPv6 inviate a un mac inesistente, e sono quindi molto facili da rilevare). Se non vuoi questo, modifica il codice.
Inviate a vh (at) thc (dot) org (aggiungete "antispam" all'oggetto) O inviate via github: https://github.com/vanhauser-thc/thc-ipv6
Divertitevi!