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, 中间人攻击, 云存储安全, 协议漏洞利用, 实时处理, 客户端加密, 密码管理, 局域网攻击, 插件系统, 欺骗攻击, 网络安全, 网络扫描, 网络攻击工具包, 路由欺骗, 隐私保护