
Kit d'attaque IPv6
THC-IPV6-ATTACK-TOOLKIT (c) 2005-2022 [email protected] https://github.com/vanhauser-thc/thc-ipv6
Sous licence AGPLv3 (voir le fichier LICENSE)
Ce code a été inspiré lorsque j'ai découvert IPv6, en ai appris de plus en plus – et n'ai trouvé aucun outil pour m'amuser (lire : « hacker ») avec. J'ai d'abord essayé d'implémenter des choses avec libnet, mais j'ai constaté que l'implémentation IPv6 n'est que partielle – et nulle. J'ai essayé d'ajouter le code manquant, mais ce n'était pas si simple, j'ai donc économisé du temps et rapidement écrit ma propre bibliothèque.
Ce code ne fonctionne actuellement que sur :
Vous devez avoir libpcap-dev installé pour pouvoir construire les outils. De plus, libssl-dev et libnetfilter-queue-dev sont également recommandés.
Ces derniers peuvent être installés par (Kali, Debian, Ubuntu) : sudo apt-get install libpcap-dev libssl-dev libnetfilter-queue-dev
Vous pouvez construire les outils en exécutant : make all
Vous pouvez installer les outils et les pages de manuel existantes en exécutant : make install
LA THC IPV6 ATTACK TOOLKIT contient déjà de nombreux outils d'attaque efficaces :
Exécutez simplement les outils sans options et ils vous donneront de l'aide et montreront les options de ligne de commande.
La bibliothèque thc-ipv6-lib.c est le cœur et l'âme de tous les outils – et de ceux que vous voudrez peut-être écrire. L'implémentation est si simple qu'il ne faut généralement que 2 à 4 lignes pour créer un paquet IPv6/ICMPv6 complet avec le contenu de votre choix.
Votre structure de base est (thc_ipv6_hdr *) par exemple thc_ipv6_hdr *my_ipv6_packet; int my_ipv6_packet_len; et vous n'aurez jamais à jouer avec ses options/champs.
Lorsque vous voulez construire un paquet IPv6, écrivez simplement : my_ipv6_packet = thc_create_ipv6_extended(interface, prefer, &my_ipv6_packet_len, src6, dst6, ttl, length, label, class, version); si quelque chose échoue, il retourne NULL (uniquement si my_ipv6_packet_len ou dst6 n'existent pas ou si malloc échoue). Les options de thc_create_ipv6_extended sont : (char*) interface - l'interface sur laquelle vous voulez envoyer le paquet (int) prefer - soit PREFER_LINK (pour utiliser l'adresse lien-local), soit PREFER_HOST pour utiliser une adresse IPv6 d'hôte, et PREFER_GLOBAL pour utiliser une adresse IP6 publique (Internet) (par défaut) (int ) &my_ipv6_packet_len - la taille du paquet qui sera créée (unsigned char) src6 - l'IP6 source (OPTIONNEL - sera sélectionnée si NULL) (unsigned char*) dst6 - l'IP6 destination (au format réseau, 16 octets) généralement le résultat de thc_resolve6("ipv6.google.com"); (int) ttl - le TTL du paquet (OPTIONNEL - 0 le mettra à 255) (int) length - la longueur qui sera définie dans l'en-tête (OPTIONNEL - 0 = longueur réelle) (int) label - l'étiquette de flux (0 convient) (int) class - la classe du paquet (0 convient) (int) version - la version IP6 (OPTIONNEL - 0 la mettra à la version 6) Il retourne NULL en cas d'erreur ou une structure allouée via malloc en cas de succès. free() la une fois que vous avez terminé.
Vous pouvez maintenant ajouter des en-têtes d'extension par-dessus : 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); Explication des fonctions : _route : Ajoute un en-tête de routage de transfert (comme le routage source IP) (int) routers - le nombre de routeurs dans routerptr (char**) routerptr - une structure char[routers + 1] avec les destinations des routeurs au format réseau. Voir alive6.c pour un exemple. _fragment : Ajoute un en-tête de fragment (int) offset - le décalage auquel les données doivent être écrites (note : mettez l'emplacement du décalage en octets ici, pas en octets d'octets) (int) more_frags - mis à 0 s'il s'agit du dernier fragment, 1 sur tous les autres (int) id - un ID pour le paquet (identique pour tous les fragments) _dst : Ajoute un en-tête d'options de destination (char) buf - un tampon de caractères. Vous devez contrôler ce tampon vous- même avec ce que vous voulez y écrire. (int) buflen - la longueur de buf _hopbyhop : Ajoute un en-tête Hop-By-Hop (char*) buf - un tampon de caractères. Vous devez contrôler ce tampon vous- même avec ce que vous voulez y écrire. (int) buflen - la longueur de buf _nonxt : Spécifie qu'il n'y aura aucun en-tête suivant de quelque sorte que ce soit (int) hdropt - cette option est actuellement ignorée _misc : Spécifie un en-tête divers. Utilisez-le si vous voulez concevoir un en-tête d'extension invalide ou inexistant. (int) type - L'ID de type pour spécifier l'en-tête (int) len - La longueur à annoncer pour l'en-tête (OPTIONNEL - -1 la définit à la valeur correcte) (char*) buf - un tampon de caractères. Vous devez contrôler ce tampon vous- même avec ce que vous voulez y écrire. (int) buflen - la longueur de buf Ces fonctions retournent (int) 0 en cas de succès et -1 en cas d'erreur.
Enfin, vous pouvez ajouter les en-têtes stream ou 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 : Ajoute un en-tête de paquet ICMP6 (int) type : le type ICMP6 (int) code : le code ICMP6 (int) flags : les indicateurs ICMP6 (char*) buf - un tampon de caractères. Vous devez contrôler ce tampon vous- même avec ce que vous voulez y écrire. (int) buflen - la longueur de buf _tcp|_udp : Ajoute un en-tête TCP ou UDP (ushort) source_port : port source (ushort) destination_port : port destination (uint) sequence_number : numéro de séquence TCP (uint) ack_number : numéro d'accusé de réception TCP (ushort) checksum : somme de contrôle UDP, 0 = générer la somme de contrôle (pour TCP, la somme de contrôle est toujours calculée) (uchar) flags : indicateurs TCP : TCP_SYN, TCP_ACK, TCP_FIN, TCP_RST, TCP_PSH, ... (uint) window_size : taille de fenêtre TCP (uint) urgent_pointer : pointeur urgent TCP (généralement 0) (char*) options : tampon d'options TCP, peut être NULL (uint) options_length : la longueur du tampon d'options TCP (char*) data : les données que le protocole transporte (uint) data_length : la longueur du tampon de données _data6 : Ajoute un en-tête divers (int) type : l'ID de protocole (char*) buf - un tampon de caractères. Vous devez contrôler ce tampon vous- même avec ce que vous voulez y écrire. (int) buflen - la longueur de buf Ces fonctions retournent (int) 0 en cas de succès et -1 en cas d'erreur.
Une fois terminé, vous créez et envoyez le paquet. thc_generate_pkt(interface, srcmac, dstmac, my_ipv6_packet, &my_ipv6_packet_len); thc_send_pkt(interface, my_ipv6_packet, &my_ipv6_packet_len); ou combinées en une seule fonction : thc_generate_and_send_pkt(interface, srcmac, dstmac, my_ipv6_packet, &my_ipv6_packet_len);
thc_generate_and_send_pkt : Génère le paquet IPv6 réel et final puis l'envoie. (char*) interface - l'interface sur laquelle envoyer le paquet (unsigned char*) srcmac - la mac source à utiliser (au format réseau) (OPTIONNEL, la mac réelle est utilisée si NULL) (unsigned char*) dstmac - la mac destination à utiliser (au format réseau) (OPTIONNEL, la mac réelle est recherchée si NULL) Les fonctions thc_generate_pkt et thc_send_pkt ensemble fournissent la même fonctionnalité. Vous les utilisez généralement seulement si vous faites quelque chose comme : thc_generate_pkt(...); while(1) thc_send_pkt(...); Ces fonctions retournent (int) 0 en cas de succès et -1 en cas d'erreur.
Lorsque vous avez terminé, libérez la mémoire avec : thc_destroy_packet(my_ipv6_packet);
Il y a quelques fonctions d'aide importantes dont vous aurez besoin : thc_resolve6(destinationstring); Résout l'adresse IPv6 ou le nom DNS en une adresse réseau IPv6. Utilisez-la pour dst6 dans thc_create_ipv6_extended(). Le résultat doit être libéré avec free() lorsqu'il n'est plus nécessaire. thc_inverse_packet(my_ipv6_packet, &my_ipv6_packet_len); Cette fonction intelligente permute les adresses source et destination, échange le type d'en-tête ICMP (ECHO REQUEST -> ECHO REPLY etc.) et recalcule la somme de contrôle. Si vous n'avez pas d'idée de l'utilité, allez jouer avec votre xbox :-)
Si vous voulez le faire très rapidement, il existe quelques fonctions prédéfinies de création ICMPv6 qui envoient des paquets ICMPv6 en une seule ligne de code : 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); Elles font ce à quoi vous vous attendez, donc je suis trop pares^H^H^H^H^Hoccupé pour les décrire plus en détail.
Les fonctions suivantes allouent de la mémoire pour le pointeur de résultat, alors pensez à libérer les pointeurs de résultat de ces fonctions une fois que vous n'en avez plus besoin : 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()
Cela aide beaucoup de jeter un œil aux exemples d'utilisation. Les meilleurs sont les outils du paquet thc-ipv6, en particulier implementation6.c et fake_*6.c – amusez-vous, et renvoyez du code, pour que la communauté puisse continuer à construire dessus.
La plupart des outils peuvent être facilement détectés par un IDS ou un logiciel de détection spécialisé. Cela est fait exprès pour faciliter la détection d'une utilisation malveillante. Les outils spécifient soit une signature de paquet fixe, soit reniflent génériquement les paquets (par exemple, répondant ainsi aux sollicitations de voisin ICMPv6 envoyées à une mac inexistante, et sont donc très faciles à détecter). Si vous ne le souhaitez pas, modifiez le code.
Envoyez-les à vh (at) thc (dot) org (et ajoutez « antispam » dans l'objet) Ou soumettez via github : https://github.com/vanhauser-thc/thc-ipv6
Amusez-vous bien !