
Kit de ferramentas de ataque IPv6
THC-IPV6-ATTACK-TOOLKIT (c) 2005-2022 [email protected] https://github.com/vanhauser-thc/thc-ipv6
Licenciado sob AGPLv3 (ver arquivo LICENSE)
Este código foi inspirado quando entrei em contato com IPv6, aprendi mais e mais sobre ele – e então não encontrei ferramentas para brincar (leia-se: "hackear") por aí. Primeiro tentei implementar coisas com libnet, mas descobri que a implementação IPv6 é apenas parcial – e é ruim. Tentei adicionar o código faltando, mas bem, não era tão fácil, então economizei meu tempo e rapidamente escrevi minha própria biblioteca.
Este código atualmente só roda em:
Você precisa ter o libpcap-dev instalado para poder construir as ferramentas. Além disso, libssl-dev e libnetfilter-queue-dev também são recomendados.
Eles podem ser instalados por (Kali, Debian, Ubuntu): sudo apt-get install libpcap-dev libssl-dev libnetfilter-queue-dev
Você pode construir as ferramentas executando: make all
Você pode instalar as ferramentas e as páginas de manual existentes executando: make install
O THC IPV6 ATTACK TOOLKIT já vem com muitas ferramentas de ataque eficazes:
Basta executar as ferramentas sem opções e elas lhe darão ajuda e mostrarão as opções de linha de comando.
A biblioteca thc-ipv6-lib.c é o coração e alma de todas as ferramentas – e aquelas que você pode querer escrever. A implementação é tão simples que geralmente são apenas 2 a 4 linhas para criar um pacote IPv6/ICMPv6 completo com o conteúdo de sua escolha.
Sua estrutura básica que você usa é (thc_ipv6_hdr *) por exemplo: thc_ipv6_hdr *my_ipv6_packet; int my_ipv6_packet_len; e você nunca precisará mexer com suas opções/campos.
Sempre que você quiser construir um pacote IPv6, basta escrever: my_ipv6_packet = thc_create_ipv6_extended(interface, prefer, &my_ipv6_packet_len, src6, dst6, ttl, length, label, class, version); se algo falhar, retorna NULL (apenas se my_ipv6_packet_len ou dst6 não existirem ou malloc falhar). As opções para thc_create_ipv6_extended são: (char*) interface - a interface na qual você deseja enviar o pacote (int) prefer - PREFER_LINK (para usar o endereço link-local) ou PREFER_HOST para usar um endereço IPv6 de host, e PREFER_GLOBAL para usar um endereço IP6 público (internet) (padrão) (int ) &my_ipv6_packet_len - o tamanho do pacote que será criado (unsigned char) src6 - o IP6 de origem (OPCIONAL - será selecionado se NULL) (unsigned char*) dst6 - o IP6 de destino (em formato de rede, 16 bytes) geralmente o resultado de thc_resolve6("ipv6.google.com"); (int) ttl - o TTL do pacote (OPCIONAL - 0 definirá para 255) (int) length - o comprimento que será definido no cabeçalho (OPCIONAL - 0 = comprimento real) (int) label - o rótulo de fluxo (0 é ok) (int) class - a classe do pacote (0 é ok) (int) version - a versão do IP6 (OPCIONAL - 0 definirá para versão 6) Retorna NULL em erros ou uma estrutura alocada via malloc em caso de sucesso. free() quando terminar de usá-lo.
Agora você pode definir cabeçalhos de extensão sobre ele: 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); As funções explicadas: _route: Adicionar um Cabeçalho de Roteamento (como IP Source Routing) (int) routers - o número de roteadores em routerptr (char**) routerptr - uma estrutura char[routers + 1] com destinos de roteador em formato de rede. Veja alive6.c para um exemplo. _fragment: Adicionar um Cabeçalho de Fragmento (int) offset - o offset no qual os dados devem ser escritos (nota: coloque a localização do offset em bytes aqui, não em octetos) (int) more_frags - defina como 0 se for o último fragmento, 1 em todos os outros (int) id - um ID para o pacote (mesmo para todos os fragmentos) _dst: Adicionar um Cabeçalho de Opções de Destino (char) buf - um buffer de char. Você mesmo deve gerenciar este buffer com o que quiser escrever nele. (int) buflen - o comprimento de buf _hopbyhop: Adicionar um Cabeçalho Hop-By-Hop (char*) buf - um buffer de char. Você mesmo deve gerenciar este buffer com o que quiser escrever nele. (int) buflen - o comprimento de buf _nonxt: Especificar que não haverá cabeçalhos seguintes quaisquer (int) hdropt - esta opção é atualmente ignorada _misc: Especificar um cabeçalho miscelâneo. Use isso se quiser projetar um cabeçalho de extensão inválido ou inexistente. (int) type - O ID do tipo para especificar o cabeçalho (int) len - O comprimento a anunciar para o cabeçalho (OPCIONAL - -1 define para o valor correto) (char*) buf - um buffer de char. Você mesmo deve gerenciar este buffer com o que quiser escrever nele. (int) buflen - o comprimento de buf Essas funções retornam (int) 0 em caso de sucesso e -1 em erro.
Finalmente você pode adicionar os cabeçalhos de fluxo (stream) ou 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: Adicionar um cabeçalho de pacote ICMP6 (int) type: o tipo ICMP6 (int) code: o código ICMP6 (int) flags: as flags ICMP6 (char*) buf - um buffer de char. Você mesmo deve gerenciar este buffer com o que quiser escrever nele. (int) buflen - o comprimento de buf _tcp|_udp: Adicionar um cabeçalho TCP ou UDP (ushort) source_port: porta de origem (ushort) destination_port: porta de destino (uint) sequence_number: número de sequência TCP (uint) ack_number: número de confirmação TCP (ushort) checksum: checksum UDP, 0 = gerar checksum (para TCP o checksum é sempre calculado) (uchar) flags: flags TCP: TCP_SYN, TCP_ACK, TCP_FIN, TCP_RST, TCP_PSH, ... (uint) window_size: tamanho da janela TCP (uint) urgent_pointer: ponteiro urgente TCP (geralmente 0) (char*) options: buffer de opções TCP, pode ser NULL (uint) options_length: o comprimento do buffer de opções TCP (char*) data: os dados que o protocolo carrega (uint) data_length: o comprimento do buffer de dados _data6: Adicionar um cabeçalho miscelâneo (int) type: o ID do protocolo (char*) buf - um buffer de char. Você mesmo deve gerenciar este buffer com o que quiser escrever nele. (int) buflen - o comprimento de buf Essas funções retornam (int) 0 em caso de sucesso e -1 em erro.
Uma vez terminado, você cria e envia o pacote. 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 combinados em uma única função: thc_generate_and_send_pkt(interface, srcmac, dstmac, my_ipv6_packet, &my_ipv6_packet_len);
thc_generate_and_send_pkt: Isso gera o pacote IPv6 real e final e então o envia. (char*) interface - a interface para enviar o pacote (unsigned char*) srcmac - o mac de origem a usar (em formato de rede) (OPCIONAL, o mac real é usado se NULL) (unsigned char*) dstmac - o mac de destino a usar (em formato de rede) (OPCIONAL, o mac real é consultado se NULL) O thc_generate_pkt e thc_send_pkt juntos fornecem a mesma funcionalidade. Você geralmente os usa apenas se fizer algo como thc_generate_pkt(...); while(1) thc_send_pkt(...); Essas funções retornam (int) 0 em caso de sucesso e -1 em erro.
Quando terminar, libere a memória com: thc_destroy_packet(my_ipv6_packet);
Existem algumas funções auxiliares importantes que você precisará: thc_resolve6(destinationstring); Isso resolve o endereço IPv6 ou nome DNS para um endereço de rede IPv6. Use isso para dst6 em thc_create_ipv6_extended(). O resultado precisa ser liberado com free() quando não for mais necessário. thc_inverse_packet(my_ipv6_packet, &my_ipv6_packet_len); Esta função inteligente troca os endereços de origem e destino, troca o tipo de cabeçalho ICMP (ECHO REQUEST -> ECHO REPLY etc.) e recalcula o checksum. Se você não tem ideia para que isso pode ser útil, vá brincar com seu xbox :-)
Se você só quer fazer algo muito rápido, existem algumas funções predefinidas de criação de ICMPv6 que enviam pacotes ICMP6 em apenas uma linha 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); Elas fazem o que você espera, então estou com preguiça^H^H^H^H^Hocupado para descrever em mais detalhes.
As seguintes funções alocam memória para o ponteiro de resultado, então lembre-se de liberar os ponteiros de resultado dessas funções quando não precisar mais deles: 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()
Ajuda muito se você der uma olhada em exemplos de uso. Os melhores são as ferramentas do pacote thc-ipv6, especialmente implementation6.c e fake_*6.c - divirta-se, e mande código de volta, para que a comunidade possa continuar construindo em cima dele.
A maioria das ferramentas pode ser facilmente detectada por um IDS ou software de detecção especializado. Isso é feito de propósito para facilitar a detecção de uso malicioso. As ferramentas ou especificam uma assinatura de pacote fixa, ou farejam genericamente por pacotes (por exemplo, respondendo também a solicitações de vizinho ICMPv6 que são enviadas para um mac inexistente, e são portanto muito fáceis de detectar). Se você não quiser isso, altere o código.
Envie-os para vh (at) thc (dot) org (e adicione "antispam" na linha de assunto) Ou submeta via github: https://github.com/vanhauser-thc/thc-ipv6
Divirta-se!