ICMP重定向攻击
(新搭了博客,贴一篇远古前的文章看看效果)
一 实验原理
ICMP重定向信息是路由器向主机提供实时的路由信息,当一个主机收到ICMP重定向信息时,它就会根据这个信息来更新自己的路由表。由于缺乏必要的合法性检查,如果一个黑客想要被攻击的主机修改它的路由表,黑客就会发送ICMP重定向信息给被攻击的主机,让该主机按照黑客的要求来修改路由表,如果黑客要求该主机将网关修改为黑客自己的机器,就使得该主机在发送数据包时,都会被黑客获取,进一步实现中间人攻击或者DOS攻击。
ICMP数据包格式:
有多种不同的ICMP报文,每种报文都有自己的格式,但是所有的ICMP报文都有三个共同的字段:
- TYPE(8-bit): identifies the message
- CODE(8-bit): provides further information about the message type
- CHECKSUM(16-bit)
- In addition, ICMP messages that report errors always include the header and the first 64 data bits of the datagram causing the problem.
TYPE字段:8位
- 0:Echo Reply
- 3:Destination Unreachable
- 4:Source Quench
- 5:Redirect (change route)
- 8:Echo Request
- 9:Router Advertisement
- 10:Router Solicitation
- 11:time Exceeded for a Datagram
- 12:Parameter Problem on a Datagram
- 13:timestamp Request
- 14:Timestamp Reply
- 17:Address Mask Request
- 18:Address Mask Reply
在此要实现的是ICMP的重定向,所以编码时TYPE应该为5,在写PING包的时候,请求时的TYPE应该为8,而回复时应该为0 。
CODE字段:8位
- 0:network unreachable
- 1:host unreachable
- 2:protocol unreachable
- 3:port unreachable
- 4:fragmentation needed and DF(don’t fragment) set
- 5: source route failed
CHECKSUM:16位校验和。
Gateway Internet Address:对于ICMP重定向包,需要让对方依照收到的网关地址将路由表中的网关地址进行修改。
DATA:包内容,需要28字节的数据,包括原始IP数据报的头部(20字节)及其数据部分的前8字节。
综上,在进行发包的时候我们需要填写内容有:20字节的IP包头部+8字节的ICMP包头部+28字节的数据部分。
二 实验环境
Mac OS IP地址:192.168.1.97(攻击机)
Ubuntu IP地址:192.168.1.4(被攻击机)
Kali Linux IP地址:192.168.1.14(攻击机)
原始网关地址:192.168.1.1
三 实验步骤
- 使用netwox体会实验效果,使用netwox 86发送ICMP重定向包,
sudo netwox 86 –g 192.168.1.97 –i 192.168.1.1
被攻击机使用ping http://baidu.com命令,可以得到以下结果:
表示netwox成功进行了ICMP重定向。
启动wireshark,观察netwox发出的数据包:
通过wireshark抓包查看所发出的数据包的源IP是.1而不是攻击者真实的IP;
通过抓包,查看攻击数据包的结构
请注意,ICMP重定向报文除了ICMP包中的通用头部之外,还包括原始IP头部信息和数据报文的前8个字节。也即,在构造ICMP重定向包中,除了头部之外,还需要额外的28字节(在IP头部没有可选字段的情况下)
另外,注意观察,netwox发出的ICMP重定向包的目的IP是受害者正通信的IP,也即,netwox先抓到受害者的数据包,根据捕获包的IP地址,再构造攻击包。
- 在充分了解实验原理的基础上,自己使用raw socket,写出来一个icmp redirect包,达到使受害者不能正常上网的目的。
代码如下:
- 主函数
1 | int main(int argc, char *argv[]) |
主函数引导用户输入攻击机ip,受害者ip,网关地址,然后利用FindDev()函数查找主机默认的设备。然后执行sniff()嗅探过程。
- FindDev()
用于查找默认设备。
1 | char *FindDev(){ // 查找默认设备 |
- 嗅探
1 | void sniff(char * dev){ |
嗅探过程利用到pcap。
其中pcap_open_live()打开设备进行嗅探。
pcap_compile()进行流量过滤,设置过滤表达式,来接收来自受害者主机的包。
pcap_setfilter()为对过滤表达式的应用。
之后执行pcap_loop()使其持续进行嗅探的操作,并且在接收到数据包时,调用回调函数Redirect来发送重定向包。
- 回调函数Redirect()发包
1 | void Redirect(u_char *arg, const struct pcap_pkthdr *pkthdr, const u_char *packet){ |
对于数据包,前14字节为帧首部,之后20字节为ip首部,之后8字节为icmp首部,之后28字节的内容应填写为针对的原始ip首部及数据部分前28字节。(实验中测试了这28字节,发现一个比较疑惑的点:无论是否填写该部分内容,对结果都没有影响,都可以实现重定向。)
- 代码实现结果:
可以看到,攻击机进行攻击时会不断嗅探受害者发送的包,并返回一个重定向包。
此时受害者进行ping操作时,会收到重定向包。
利用wireshark抓包,可以看到重定向包内容,且该重定向包的源IP为原网关的IP地址。