伪造的ICMP回复被发送者忽略



我已经编写了一个小型应用程序来响应ICMP,但发件人似乎忽略了ICMP回复。检查Wireshark中的数据包时,它们缺少时间戳字段,而来自实际设备的工作ICMP回复包含时间戳字段。这只是我在我的设备中缺少它们的情况吗?

我已经破坏了ARP缓存,所以它在ARP表中有一个正确的ARP映射。

我已经使用TCPDump确认ICMP回复至少到达了接口,不确定它们是否正在被处理-如果有人对在哪里检查有任何建议,我们将不胜感激

def respond_to_icmp(self, icmp_packet):
if icmp_packet["IP"].dst == self.ip: # if this is my IP
eth = Ether(dst=icmp_packet["Ether"].src, src=self.mac)
ip = IP(src=icmp_packet["IP"].dst, dst=icmp_packet["IP"].src)
icmp = ICMP(type=0, id=icmp_packet['ICMP'].id, seq=icmp_packet['ICMP'].seq)
icmp_reply = eth/ip/icmp
sendp(icmp_reply, iface=self.interface) # eth0 (on which it is received)

ICMP应答数据包

###[ Ethernet ]### 
dst       = de:ad:be:ef:ee:ff
src       = aa:bb:cc:dd:ee:ff
type      = IPv4
###[ IP ]### 
version   = 4
ihl       = None
tos       = 0x0
len       = None
id        = 1
flags     = 
frag      = 0
ttl       = 64
proto     = icmp
chksum    = None
src       = 192.168.3.46
dst       = 192.168.3.1
options   
###[ ICMP ]### 
type      = echo-reply
code      = 0
chksum    = None
id        = 0x6b86
seq       = 0x19f

发件人的ICMP活动

21:14:06.487711 IP 192.168.3.46 > 192.168.3.1: ICMP echo reply, id 0, seq 0, length 8
21:14:07.417939 IP 192.168.3.1 > 192.168.3.46: ICMP echo request, id 27526, seq 52, length 64
21:14:07.487494 IP 192.168.3.46 > 192.168.3.1: ICMP echo reply, id 0, seq 0, length 8
21:14:08.441948 IP 192.168.3.1 > 192.168.3.46: ICMP echo request, id 27526, seq 53, length 64
21:14:08.548995 IP 192.168.3.46 > 192.168.3.1: ICMP echo reply, id 0, seq 0, length 8

实际ICMP结果

From 192.168.3.1 icmp_seq=368 Destination Host Unreachable
From 192.168.3.1 icmp_seq=369 Destination Host Unreachable
From 192.168.3.1 icmp_seq=370 Destination Host Unreachable
From 192.168.3.1 icmp_seq=458 Destination Host Unreachable
From 192.168.3.1 icmp_seq=459 Destination Host Unreachable
From 192.168.3.1 icmp_seq=460 Destination Host Unreachable

事实证明,当Linux负责ICMP时,它包含了一个很好的小数据负载,如果没有将此负载添加到回复中,Linux一定会认为数据包存在错误或畸形。

def respond_to_icmp(self, icmp_packet):
if icmp_packet["IP"].dst == self.ip:
eth = Ether(dst=icmp_packet["Ether"].src, src=icmp_packet["Ether"].dst)
ip = IP(src=icmp_packet["IP"].dst, dst=icmp_packet["IP"].src)
icmp = ICMP(type=0, id=icmp_packet['ICMP'].id, seq=icmp_packet['ICMP'].seq)
raw = Raw(load=icmp_packet["Raw"].load)
icmp_reply = eth/ip/icmp/raw
sendp(icmp_reply, iface=self.interface)

相关内容

  • 没有找到相关文章

最新更新