vanhauser-thc/thc-ipv6

GitHub: vanhauser-thc/thc-ipv6

一套由著名黑客组织 THC 出品的 IPv6 协议攻击工具集,用于对 IPv6 网络进行安全评估、中间人攻击、拒绝服务测试和协议实现缺陷挖掘。

Stars: 1167 | Forks: 226

``` THC-IPV6-ATTACK-TOOLKIT ``` (c) 2005-2022 vh@thc.org https://github.com/vanhauser-thc/thc-ipv6 ``` Licensed under AGPLv3 (see LICENSE file) ``` # 简介 当我接触到 IPv6 并不断深入了解它时,这段代码诞生了——随后我发现没有工具可以用来玩(读作:“hack”)。 起初我尝试用 libnet 来实现一些功能,但后来发现其 IPv6 的实现并不完整——而且很糟糕。我试着补充缺失的代码,但这并不容易,因此我为了节省时间,直接快速编写了自己的库。 # 局限性 此代码目前仅能在以下环境运行: - Linux 2.6.x 或更新版本(因为使用了 /proc) - Ethernet 但这对于所有 Linux 用户来说,意味着它能满足 98% 的使用场景。 非常欢迎提交补丁!(请在主题行中添加 "antispam" 以通过我的反垃圾邮件保护,否则邮件会被退回) # 构建 您必须安装 libpcap-dev 才能构建这些工具。 此外,也推荐安装 libssl-dev 和 libnetfilter-queue-dev。 可以通过以下命令安装它们(适用于 Kali, Debian, Ubuntu): sudo apt-get install libpcap-dev libssl-dev libnetfilter-queue-dev 您可以通过运行以下命令来构建工具: make all 您可以通过运行以下命令来安装工具和现有的手册页: make install # 工具 THC IPV6 ATTACK TOOLKIT 已经附带了许多有效的攻击工具: - parasite6: ICMPv6 邻居请求/通告欺骗器,将你置于中间人位置,等同于 ARP mitm(以及 parasite) - alive6: 一个有效的存活扫描器,将检测所有监听此地址的系统 - dnsdict6: 并发的 IPv6 DNS 字典爆破器 - fake_router6: 在网络上以最高优先级将自己宣布为路由器 - redir6: 使用巧妙的 ICMPv6 重定向欺骗器,智能地将流量重定向到你(中间人) - toobig6: MTU 缩减器,具有与 redir6 相同的智能性 - detect-new-ip6: 检测加入网络的新 IPv6 设备,你可以运行脚本自动扫描这些系统等。 - dos-new-ip6: 检测新的 IPv6 设备并告诉它们所选择的 IP 在网络上发生了冲突(DOS)。 - trace6: 非常快速的 traceroute6,支持 ICMP6 echo request 和 TCP-SYN - flood_router6: 用随机的路由器通告淹没目标 - flood_advertise6: 用随机的邻居通告淹没目标 - fuzz_ip6: IPv6 fuzzer(模糊测试器) - implementation6: 对 IPv6 执行各种实现检查 - implementation6d: 用于 implementation6 的监听守护进程,以检查防火墙之后的情况 - fake_mld6: 在网络上将自己宣布到您选择的多播组中 - fake_mld26: 与上相同,但用于 MLDv2 - fake_mldrouter6: 伪造 MLD 路由器消息 - fake_mipv6: 如果认证不需要 IPSEC,则将移动 IP 窃取到你的机器上 - fake_advertiser6: 在网络上宣布你自己 - smurf6: 本地 smurfer - rsmurf6: 远程 smurfer,目前已知的仅对 Linux 有效 - exploit6: 针对目标测试已知的 IPv6 漏洞 - denial6: 针对目标的拒绝服务攻击测试集合 - thcping6: 发送手工制作的 ping6 数据包 - sendpees6: 一个由 willdamn@gmail.com 编写的工具,它生成带有大量 CGA(加密相关的东西 ;-))的邻居请求,以保持 CPU 繁忙。非常棒。 以及大约 25 个供您探索的工具 :-) 只需不带参数运行这些工具,它们就会为您提供帮助并显示命令行选项。 # 库 库 thc-ipv6-lib.c 是所有工具的核心与灵魂——也包括那些您可能想要编写的工具。 实现非常简单,通常只需 2-4 行代码即可创建一个包含您选择内容的完整 IPv6/ICMPv6 数据包。 您使用的基本结构是 (thc_ipv6_hdr *) 例如 thc_ipv6_hdr *my_ipv6_packet; int my_ipv6_packet_len; 并且您将永远不必直接处理其选项/字段。 每当您想构建一个 IPv6 数据包时,只需编写: my_ipv6_packet = thc_create_ipv6_extended(interface, prefer, &my_ipv6_packet_len, src6, dst6, ttl, length, label, class, version); 如果出现错误,它将返回 NULL(仅当 my_ipv6_packet_len 或 dst6 不存在或 malloc 失败时)。 thc_create_ipv6_extended 的选项包括: (char*) interface - 您想要发送数据包的接口 (int) prefer - PREFER_LINK(使用链路本地地址),PREFER_HOST(使用主机 IPv6 地址),或 PREFER_GLOBAL(使用公共(互联网)IP6 地址,默认) (int *) &my_ipv6_packet_len - 将要创建的数据包大小 (unsigned char*) src6 - 源 IP6(可选 - 如果为 NULL 则自动选择) (unsigned char*) dst6 - 目标 IP6(网络格式,16 字节长)通常是 thc_resolve6("ipv6.google.com"); 的结果 (int) ttl - 数据包的 ttl(可选 - 0 会将其设置为 255) (int) length - 将在头部中设置的长度(可选 - 0 = 真实长度) (int) label - 流标签(填 0 即可) (int) class - 数据包的类别(填 0 即可) (int) version - IP6 版本(可选 - 0 会将其设置为版本 6) 发生错误时返回 NULL,成功时返回一个 malloc 分配的结构。 完成后请将其 free() 掉。 现在您可以在其之上设置扩展头部: 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); 函数解释: _route:添加路由转发头部(类似于 IP 源路由) (int) routers - routerptr 中的路由器数量 (char**) routerptr - 一个包含网络格式路由器目标的 *char[routers + 1] 结构。示例请参见 alive6.c。 _fragment:添加分片头部 (int) offset - 数据应该写入的偏移量(注意:在此处放置以字节为单位的偏移位置,而不是位组) (int) more_frags - 如果是最后一个分片则设置为 0,其他所有分片设置为 1 (int) id - 数据包的 ID(所有分片相同) _dst:添加目标选项头部 (char*) buf - 一个 char 缓冲区。您必须自行控制此缓冲区并写入您想要的内容。 (int) buflen - buf 的长度 _hopbyhop:添加逐跳头部 (char*) buf - 一个 char 缓冲区。您必须自行控制此缓冲区并写入您想要的内容。 (int) buflen - buf 的长度 _nonxt:指定之后没有任何头部 (int) hdropt - 此选项目前被忽略 _misc:指定一个杂项头部。如果您想设计一个无效或不存在的扩展头部,请使用此选项。 (int) type - 将头部指定为的类型 ID (int) len - 要作为头部通告的长度(可选 - -1 会将其设置为正确值) (char*) buf - 一个 char 缓冲区。您必须自行控制此缓冲区并写入您想要的内容。 (int) buflen - buf 的长度 这些函数在成功时返回 (int) 0,在错误时返回 -1。 最后您可以添加 stream 或 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:添加一个 ICMP6 数据包头部 (int) type:ICMP6 类型 (int) code:ICMP6 代码 (int) flags:ICMP6 标志 (char*) buf:一个 char 缓冲区。您必须自行控制此缓冲区并写入您想要的内容。 (int) buflen:buf 的长度 _tcp|_udp:添加一个 TCP 或 UDP 头部 (ushort) source_port:源端口 (ushort) destination_port:目标端口 (uint) sequence_number:TCP 序列号 (uint) ack_number:TCP 确认号 (ushort) checksum:UDP 校验和,0 = 生成校验和(对于 TCP,总是计算校验和) (uchar) flags:TCP 标志:TCP_SYN, TCP_ACK, TCP_FIN, TCP_RST, TCP_PSH, ... (uint) window_size:TCP 窗口大小 (uint) urgent_pointer:TCP 紧急指针(通常为 0) (char*) options:TCP 选项缓冲区,可以为 NULL (uint) options_length:TCP 选项缓冲区的长度 (char*) data:协议承载的数据 (uint) data_length:数据缓冲区的长度 _data6:添加一个杂项头部 (int) type:协议 ID (char*) buf:一个 char 缓冲区。您必须自行控制此缓冲区并写入您想要的内容。 (int) buflen:buf 的长度 这些函数在成功时返回 (int) 0,在错误时返回 -1。 完成后,您将创建并发送数据包。 thc_generate_pkt(interface, srcmac, dstmac, my_ipv6_packet, &my_ipv6_packet_len); thc_send_pkt(interface, my_ipv6_packet, &my_ipv6_packet_len); 或者合并为一个函数: thc_generate_and_send_pkt(interface, srcmac, dstmac, my_ipv6_packet, &my_ipv6_packet_len); thc_generate_and_send_pkt:生成真实且最终的 IPv6 数据包,然后发送它。 (char*) interface - 发送数据包的接口 (unsigned char*) srcmac - 要使用的源 MAC(网络格式)(可选,如果为 NULL 则使用真实 MAC) (unsigned char*) dstmac - 要使用的目标 MAC(网络格式)(可选,如果为 NULL 则查找真实 MAC) thc_generate_pkt 和 thc_send_pkt 组合起来提供了相同的功能。 通常只有在执行类似如下操作时才使用它们: thc_generate_pkt(...); while(1) thc_send_pkt(...); 这些函数在成功时返回 (int) 0,在错误时返回 -1。 完成后,请使用以下命令释放内存: thc_destroy_packet(my_ipv6_packet); 您将需要用到一些重要的辅助函数: thc_resolve6(destinationstring); 这将 IPv6 地址或 DNS 名称解析为 IPv6 网络地址。 在 thc_create_ipv6_extended() 中将其用于 dst6。不再需要时必须释放结果。 thc_inverse_packet(my_ipv6_packet, &my_ipv6_packet_len); 这个聪明的函数会交换源地址和目标地址,交换 ICMP 头部类型(ECHO REQUEST -> ECHO REPLY 等)并重新计算校验和。如果您不知道这有什么用,那就去玩您的 xbox 吧 :-) 如果您想非常快速地完成,这里有一些预定义的 ICMPv6 创建函数,只需一行代码即可发送 icmp6 数据包: 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); 这些函数的作用正如您所期望的那样,所以我太懒^H^H^H^H^H忙了,就不做更详细的描述了。 以下函数会为结果指针分配内存,因此请记住在不再需要时释放这些函数返回的结果指针: thc_ipv6_dummymac() thc_ipv62notation() thc_ipv62string() thc2ipv6() 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() 如果您查看一下示例用法,将会大有裨益。最好的示例就是 thc-ipv6 包中的工具,特别是 implementation6.c 和 fake_*6.c - 祝您玩得开心,并回馈代码,以便社区能在其基础上进一步构建。 # 检测 大多数工具很容易被 IDS 或专门的检测软件检测到。 这是有意为之的,以使恶意使用的检测更加容易。 这些工具要么指定了固定的数据包签名,要么泛泛地嗅探数据包(例如,因此也会回应发送给不存在 MAC 的 ICMPv6 邻居请求,因此非常容易被检测到)。 如果您不希望这样,请修改代码。 # 补丁、BUG、提示等 将它们发送到 vh (at) thc (dot) org(并在主题行中添加 "antispam") 或者通过 github 提交:https://github.com/vanhauser-thc/thc-ipv6 祝您使用愉快!
标签:ICMPv6欺骗, IPv6安全, Libpcap, Linux安全工具, MITM, NDP欺骗, THC-IPV6, 中间人攻击, 云存储安全, 协议漏洞利用, 实时处理, 客户端加密, 密码管理, 局域网攻击, 插件系统, 欺骗攻击, 网络安全, 网络扫描, 网络攻击工具包, 路由欺骗, 隐私保护