
Kit de herramientas de ataque IPv6
THC-IPV6-ATTACK-TOOLKIT (c) 2005-2022 [email protected] https://github.com/vanhauser-thc/thc-ipv6
Licenciado bajo AGPLv3 (ver archivo LICENSE)
Este código fue inspirado cuando entré en contacto con IPv6, aprendí más y más sobre él, y luego no encontré herramientas para jugar (léase: "hackear") con él. Primero intenté implementar cosas con libnet, pero luego descubrí que la implementación de IPv6 es solo parcial - y es pésima. Intenté agregar el código faltante, pero bueno, no fue tan fácil, así que ahorré mi tiempo y rápidamente escribí mi propia librería.
Este código actualmente solo funciona en:
Debes tener instalado libpcap-dev para poder construir las herramientas. Adicionalmente se recomienda libssl-dev y libnetfilter-queue-dev.
Se pueden instalar con (Kali, Debian, Ubuntu): sudo apt-get install libpcap-dev libssl-dev libnetfilter-queue-dev
Puedes construir las herramientas ejecutando: make all
Puedes instalar las herramientas y las páginas de manual existentes ejecutando: make install
EL THC IPV6 ATTACK TOOLKIT ya viene con muchas herramientas de ataque efectivas:
Simplemente ejecuta las herramientas sin opciones y te darán ayuda y mostrarán las opciones de línea de comandos.
La librería thc-ipv6-lib.c es el corazón y el alma de todas las herramientas - y aquellas que quizás quieras escribir. La implementación es tan simple que normalmente son solo 2-4 líneas para crear un paquete IPv6/ICMPv6 completo con el contenido que elijas.
Tu estructura básica que usas es (thc_ipv6_hdr *) por ejemplo thc_ipv6_hdr *my_ipv6_packet; int my_ipv6_packet_len; y nunca tendrás que jugar con sus opciones/campos.
Cuando quieras construir un paquete IPv6, solo escribes: my_ipv6_packet = thc_create_ipv6_extended(interface, prefer, &my_ipv6_packet_len, src6, dst6, ttl, length, label, class, version); si algo falla, devuelve NULL (solo si my_ipv6_packet_len o dst6 no existen o malloc falla). Las opciones de thc_create_ipv6_extended son: (char*) interface - la interfaz en la que deseas enviar el paquete (int) prefer - puede ser PREFER_LINK (para usar la dirección de enlace local) o PREFER_HOST para usar una dirección IPv6 de host, y PREFER_GLOBAL para usar una dirección IP6 pública (internet) (por defecto) (int ) &my_ipv6_packet_len - el tamaño del paquete que se creará (unsigned char) src6 - la IP6 de origen (OPCIONAL - se seleccionará si es NULL) (unsigned char*) dst6 - la IP6 de destino (en formato de red, 16 bytes de longitud) usualmente el resultado de thc_resolve6("ipv6.google.com"); (int) ttl - el ttl del paquete (OPCIONAL - 0 establecerá esto a 255) (int) length - la longitud que se establecerá en la cabecera (OPCIONAL - 0 = longitud real) (int) label - la etiqueta de flujo (0 está bien) (int) class - la clase del paquete (0 está bien) (int) version - la versión de IP6 (OPCIONAL - 0 establecerá esto a la versión 6) Devuelve NULL en errores o una estructura asignada con malloc en caso de éxito. libérela con free() una vez que hayas terminado con ella.
Ahora puedes establecer cabeceras de extensión sobre ella: 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); Las funciones explicadas: _route: Agrega una cabecera de reenvío de enrutamiento (como Source Routing IP) (int) routers - el número de routers en routerptr (char**) routerptr - una estructura char[routers + 1] con destinos de router en formato de red. Consulta alive6.c para un ejemplo. _fragment: Agrega una cabecera de fragmento (int) offset - el desplazamiento en el cual se deben escribir los datos (nota: aquí coloca la ubicación del desplazamiento en bytes, no en octetos de byte) (int) more_frags - establece a 0 si es el fragmento final, 1 en todos los demás (int) id - un ID para el paquete (igual para todos los fragmentos) _dst: Agrega una cabecera de opciones de destino (char) buf - un búfer de caracteres. Debes controlar este búfer tú mismo con lo que quieras escribir en él. (int) buflen - la longitud de buf _hopbyhop: Agrega una cabecera salto por salto (char*) buf - un búfer de caracteres. Debes controlar este búfer tú mismo con lo que quieras escribir en él. (int) buflen - la longitud de buf _nonxt: Especifica que no habrá cabeceras siguientes en absoluto (int) hdropt - esta opción actualmente se ignora _misc: Especifica una cabecera miscelánea. Úsala si quieres diseñar una cabecera de extensión inválida o inexistente. (int) type - el ID de tipo para especificar la cabecera (int) len - la longitud que se anunciará para la cabecera (OPCIONAL - -1 establece esto a el valor correcto) (char*) buf - un búfer de caracteres. Debes controlar este búfer tú mismo con lo que quieras escribir en él. (int) buflen - la longitud de buf Estas funciones devuelven (int) 0 en caso de éxito y -1 en caso de error.
Finalmente puedes agregar las cabeceras de flujo o datagrama. 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: Agrega una cabecera de paquete ICMP6 (int) type: el tipo ICMP6 (int) code: el código ICMP6 (int) flags: las banderas ICMP6 (char*) buf - un búfer de caracteres. Debes controlar este búfer tú mismo con lo que quieras escribir en él. (int) buflen - la longitud de buf _tcp|_udp: Agrega una cabecera TCP o UDP (ushort) source_port: puerto de origen (ushort) destination_port: puerto de destino (uint) sequence_number: número de secuencia TCP (uint) ack_number: número de acuse de recibo TCP (ushort) checksum: suma de comprobación UDP, 0 = generar suma de comprobación (para TCP la suma de comprobación siempre se calcula) (uchar) flags: banderas TCP: TCP_SYN, TCP_ACK, TCP_FIN, TCP_RST, TCP_PSH, ... (uint) window_size: tamaño de ventana TCP (uint) urgent_pointer: puntero urgente TCP (normalmente 0) (char*) options: búfer de opciones TCP, puede ser NULL (uint) options_length: la longitud del búfer de opciones TCP (char*) data: los datos que transporta el protocolo (uint) data_length: la longitud del búfer de datos _data6: Agrega una cabecera miscelánea (int) type: el ID del protocolo (char*) buf - un búfer de caracteres. Debes controlar este búfer tú mismo con lo que quieras escribir en él. (int) buflen - la longitud de buf Estas funciones devuelven (int) 0 en caso de éxito y -1 en caso de error.
Una vez que hayas terminado, creas y envías el paquete. 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 combinado en una sola función: thc_generate_and_send_pkt(interface, srcmac, dstmac, my_ipv6_packet, &my_ipv6_packet_len);
thc_generate_and_send_pkt: Esto genera el paquete IPv6 real y final y luego lo envía. (char*) interface - la interfaz para enviar el paquete (unsigned char*) srcmac - la mac de origen a usar (en formato de red) (OPCIONAL, se usa la mac real si es NULL) (unsigned char*) dstmac - la mac de destino a usar (en formato de red) (OPCIONAL, se busca la mac real si es NULL) thc_generate_pkt y thc_send_pkt juntos proporcionan la misma funcionalidad. Normalmente los usas solo si haces algo como thc_generate_pkt(...); while(1) thc_send_pkt(...); Estas funciones devuelven (int) 0 en caso de éxito y -1 en caso de error.
Cuando hayas terminado, libera la memoria con: thc_destroy_packet(my_ipv6_packet);
Hay algunas funciones auxiliares importantes que necesitarás: thc_resolve6(destinationstring); Esto resuelve la dirección IPv6 o nombre DNS a una dirección de red IPv6. Úsalo para dst6 en thc_create_ipv6_extended(). El resultado debe liberarse con free cuando ya no sea necesario. thc_inverse_packet(my_ipv6_packet, &my_ipv6_packet_len); Esta inteligente función intercambia la dirección de origen y destino, intercambia el tipo de cabecera ICMP (ECHO REQUEST -> ECHO REPLY, etc.) y recalcula la suma de comprobación. Si no tienes idea de para qué podría ser esto útil, ve a jugar con tu xbox :-)
Si solo quieres hacerlo muy rápido, hay algunas funciones predefinidas de creación de ICMPv6 que envían paquetes ICMPv6 en solo una línea de código: 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); Estas hacen lo que esperas que hagan, así que estoy demasiado perezoso^H^H^H^H^Hocupado para describirlo con más detalle.
Las siguientes funciones asignan memoria para el puntero de resultado, así que recuerda liberar los punteros de resultado de estas funciones una vez que no los necesites más: 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()
Ayuda mucho si observas los usos de ejemplo. Los mejores son las herramientas del paquete thc-ipv6, especialmente implementation6.c y fake_*6.c - diviértete, y envía código de vuelta, para que la comunidad pueda seguir construyendo sobre él.
La mayoría de las herramientas pueden ser fácilmente detectadas por un IDS o software de detección especializado. Esto se hace a propósito para facilitar la detección de usos maliciosos. Las herramientas o especifican una firma de paquete fija, o genéricamente olfatean paquetes (por ejemplo, respondiendo también a solicitudes de vecinos ICMPv6 que se envían a una mac inexistente, y por lo tanto son muy fáciles de detectar). Si no quieres esto, cambia el código.
Envíalos a vh (at) thc (dot) org (y agrega "antispam" a la línea de asunto) O envíalos a través de github: https://github.com/vanhauser-thc/thc-ipv6
¡Diviértete!