
IPv6-Angriffs-Toolkit
THC-IPV6-ATTACK-TOOLKIT (c) 2005-2022 [email protected] https://github.com/vanhauser-thc/thc-ipv6
Lizenziert unter AGPLv3 (siehe LICENSE-Datei)
Dieser Code entstand, als ich mit IPv6 in Berührung kam, immer mehr darüber lernte – und dann keine Werkzeuge fand, um damit herumzuspielen (lies: „hacken“). Zuerst versuchte ich Dinge mit libnet zu implementieren, stellte dann aber fest, dass die IPv6-Implementierung nur teilweise vorhanden ist – und schlecht. Ich versuchte, den fehlenden Code hinzuzufügen, aber das war nicht so einfach, also sparte ich mir die Zeit und schrieb schnell meine eigene Bibliothek.
Dieser Code läuft derzeit nur auf:
Sie müssen libpcap-dev installiert haben, um die Werkzeuge bauen zu können. Zusätzlich werden libssl-dev und libnetfilter-queue-dev empfohlen.
Diese können installiert werden mit (Kali, Debian, Ubuntu): sudo apt-get install libpcap-dev libssl-dev libnetfilter-queue-dev
Sie können die Werkzeuge durch Ausführen von bauen: make all
Sie können die Werkzeuge und vorhandenen Handbuchseiten installieren durch: make install
Das THC IPV6 ATTACK TOOLKIT enthält bereits viele effektive Angriffswerkzeuge:
Führen Sie die Werkzeuge einfach ohne Optionen aus, sie zeigen dann Hilfe und die Befehlszeilenoptionen an.
Die Bibliothek thc-ipv6-lib.c ist das Herz und die Seele aller Werkzeuge – und derer, die Sie vielleicht schreiben möchten. Die Implementierung ist so einfach, dass es normalerweise nur 2–4 Zeilen braucht, um ein vollständiges IPv6/ICMPv6-Paket mit dem gewünschten Inhalt zu erstellen.
Ihre grundlegende Struktur, die Sie verwenden, ist (thc_ipv6_hdr *) z. B. thc_ipv6_hdr *my_ipv6_packet; int my_ipv6_packet_len; und Sie müssen nie mit seinen Optionen/Feldern spielen.
Wann immer Sie ein IPv6-Paket erstellen möchten, schreiben Sie einfach: my_ipv6_packet = thc_create_ipv6_extended(interface, prefer, &my_ipv6_packet_len, src6, dst6, ttl, length, label, class, version); Wenn etwas fehlschlägt, gibt es NULL zurück (nur wenn my_ipv6_packet_len oder dst6 nicht existieren oder malloc fehlschlägt). Die Optionen für thc_create_ipv6_extended sind: (char*) interface - das Interface, über das Sie das Paket senden möchten (int) prefer - entweder PREFER_LINK (um die Link-Local-Adresse zu verwenden) oder PREFER_HOST, um eine Host-IPv6-Adresse zu verwenden, und PREFER_GLOBAL, um eine öffentliche (Internet-)IPv6-Adresse zu verwenden (Standard) (int ) &my_ipv6_packet_len - die Größe des Pakets, das erstellt wird (unsigned char) src6 - die Quell-IPv6 (OPTIONAL - wird ausgewählt, falls NULL) (unsigned char*) dst6 - die Ziel-IPv6 (im Netzwerkformat, 16 Byte lang) normalerweise das Ergebnis von thc_resolve6("ipv6.google.com"); (int) ttl - der TTL des Pakets (OPTIONAL - 0 setzt dies auf 255) (int) length - die Länge, die im Header gesetzt wird (OPTIONAL - 0 = echte Länge) (int) label - der Flow-Label (0 ist in Ordnung) (int) class - die Klasse des Pakets (0 ist in Ordnung) (int) version - die IPv6-Version (OPTIONAL - 0 setzt dies auf Version 6) Gibt NULL bei Fehlern oder eine mit malloc belegte Struktur bei Erfolg zurück. free() sie, wenn Sie damit fertig sind.
Jetzt können Sie darüber Erweiterungs-Header setzen: 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); Die Funktionen erklärt: _route: Fügt einen Routing-Forwarding-Header hinzu (wie IP Source Routing) (int) routers - die Anzahl der Router in routerptr (char**) routerptr - eine char[routers + 1]-Struktur mit Router-Zielen im Netzwerkformat. Siehe alive6.c für ein Beispiel. _fragment: Fügt einen Fragment-Header hinzu (int) offset - der Offset, an den die Daten geschrieben werden sollen (Hinweis: setzen Sie den Offset-Ort hier in Bytes, nicht in Byte-Oktetten) (int) more_frags - setzen Sie auf 0, wenn es das letzte Fragment ist, auf 1 bei allen anderen (int) id - eine ID für das Paket (gleich für alle Fragmente) _dst: Fügt einen Destination-Options-Header hinzu (char) buf - ein Zeichenpuffer. Sie müssen diesen Puffer selbst steuern mit dem, was Sie hineinschreiben möchten. (int) buflen - die Länge von buf _hopbyhop: Fügt einen Hop-By-Hop-Header hinzu (char*) buf - ein Zeichenpuffer. Sie müssen diesen Puffer selbst steuern mit dem, was Sie hineinschreiben möchten. (int) buflen - die Länge von buf _nonxt: Gibt an, dass es keinerlei folgende Header mehr gibt (int) hdropt - diese Option wird derzeit ignoriert _misc: Gibt einen sonstigen Header an. Verwenden Sie dies, wenn Sie einen ungültigen oder nicht existierenden Erweiterungs-Header entwerfen möchten. (int) type - die Typ-ID, um den Header zu spezifizieren (int) len - die Länge, die für den Header angegeben werden soll (OPTIONAL - -1 setzt dies auf den korrekten Wert) (char*) buf - ein Zeichenpuffer. Sie müssen diesen Puffer selbst steuern mit dem, was Sie hineinschreiben möchten. (int) buflen - die Länge von buf Diese Funktionen geben (int) 0 bei Erfolg und -1 bei Fehler zurück.
Schließlich können Sie die Stream- oder Dgram-Header hinzufügen. 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: Fügt einen ICMP6-Paket-Header hinzu (int) type: der ICMP6-Typ (int) code: der ICMP6-Code (int) flags: die ICMP6-Flags (char*) buf - ein Zeichenpuffer. Sie müssen diesen Puffer selbst steuern mit dem, was Sie hineinschreiben möchten. (int) buflen - die Länge von buf _tcp|_udp: Fügt einen TCP- oder UDP-Header hinzu (ushort) source_port: Quellport (ushort) destination_port: Zielport (uint) sequence_number: TCP-Sequenznummer (uint) ack_number: TCP-Bestätigungsnummer (ushort) checksum: UDP-Prüfsumme, 0 = Prüfsumme generieren (bei TCP wird die Prüfsumme immer berechnet) (uchar) flags: TCP-Flags: TCP_SYN, TCP_ACK, TCP_FIN, TCP_RST, TCP_PSH, ... (uint) window_size: TCP-Fenstergröße (uint) urgent_pointer: TCP-Urgent-Pointer (normalerweise 0) (char*) options: TCP-Optionen-Puffer, kann NULL sein (uint) options_length: die Länge des TCP-Optionen-Puffers (char*) data: die Daten, die das Protokoll trägt (uint) data_length: die Länge des Datenpuffers _data6: Fügt einen sonstigen Header hinzu (int) type: die Protokoll-ID (char*) buf - ein Zeichenpuffer. Sie müssen diesen Puffer selbst steuern mit dem, was Sie hineinschreiben möchten. (int) buflen - die Länge von buf Diese Funktionen geben (int) 0 bei Erfolg und -1 bei Fehler zurück.
Wenn Sie fertig sind, erstellen und senden Sie das Paket. thc_generate_pkt(interface, srcmac, dstmac, my_ipv6_packet, &my_ipv6_packet_len); thc_send_pkt(interface, my_ipv6_packet, &my_ipv6_packet_len); oder kombiniert in einer Funktion: thc_generate_and_send_pkt(interface, srcmac, dstmac, my_ipv6_packet, &my_ipv6_packet_len);
thc_generate_and_send_pkt: Erzeugt das echte und endgültige IPv6-Paket und sendet es dann. (char*) interface - das Interface, über das das Paket gesendet werden soll (unsigned char*) srcmac - die zu verwendende Quell-MAC (im Netzwerkformat) (OPTIONAL, die echte MAC wird verwendet, wenn NULL) (unsigned char*) dstmac - die zu verwendende Ziel-MAC (im Netzwerkformat) (OPTIONAL, die echte MAC wird nachgeschlagen, wenn NULL) Die thc_generate_pkt- und thc_send_pkt-Funktionen bieten zusammen die gleiche Funktionalität. Sie verwenden diese normalerweise nur, wenn Sie so etwas tun wie thc_generate_pkt(...); while(1) thc_send_pkt(...); Diese Funktionen geben (int) 0 bei Erfolg und -1 bei Fehler zurück.
Wenn Sie fertig sind, geben Sie den Speicher frei mit: thc_destroy_packet(my_ipv6_packet);
Es gibt einige wichtige Hilfsfunktionen, die Sie benötigen werden: thc_resolve6(destinationstring); Löst die IPv6-Adresse oder den DNS-Namen in eine IPv6-Netzwerkadresse auf. Verwenden Sie dies für dst6 in thc_create_ipv6_extended(). Das Ergebnis muss mit free() freigegeben werden, wenn es nicht mehr benötigt wird. thc_inverse_packet(my_ipv6_packet, &my_ipv6_packet_len); Diese clevere Funktion tauscht Quell- und Zieladresse, tauscht den ICMP-Header-Typ (ECHO REQUEST -> ECHO REPLY usw.) und berechnet die Prüfsumme neu. Wenn Sie keine Ahnung haben, wofür das nützlich sein könnte, gehen Sie und spielen Sie mit Ihrer Xbox :-)
Wenn Sie es sehr schnell machen möchten, gibt es einige vordefinierte ICMPv6- Erzeugungsfunktionen, die impc6-Pakete in nur einer Codezeile senden: 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); Diese tun, was Sie erwarten, also bin ich zu faul^H^H^H^H^Hbeschäftigt, um es genauer zu beschreiben.
Die folgenden Funktionen allokieren Speicher für den Ergebniszeiger, denken Sie also daran, die Ergebniszeiger dieser Funktionen freizugeben, sobald Sie sie nicht mehr benötigen: 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()
Es hilft sehr, wenn Sie sich Beispielverwendungen ansehen. Die besten sind die Werkzeuge aus dem thc-ipv6-Paket, insbesondere implementation6.c und fake_*6.c - viel Spaß, und senden Sie Code zurück, damit die Community weiter darauf aufbauen kann.
Die meisten Werkzeuge können leicht von einem IDS oder einer speziellen Erkennungssoftware erkannt werden. Dies geschieht absichtlich, um die Erkennung missbräuchlicher Nutzung zu erleichtern. Die Werkzeuge geben entweder eine feste Paketsignatur vor oder schnüffeln generisch nach Paketen (z. B. daher auch Antworten auf ICMPv6-Neighbor- Solicitations, die an eine nicht existierende MAC gesendet werden, und sind daher sehr leicht zu erkennen). Wenn Sie das nicht möchten, ändern Sie den Code.
Senden Sie diese an vh (at) thc (dot) org (und fügen Sie „antispam“ in die Betreffzeile ein) Oder reichen Sie sie über GitHub ein: https://github.com/vanhauser-thc/thc-ipv6
Viel Spaß!