1
sniff(filter='arp',prn=lambda x:x.summary(), count=10)

可以输出抓包固定协议的数据包

1
data = sniff(filter='not icmp',prn=lambda x:x.summary(),count=10)

可以通过

1
2
data[0]来查看数据包详细信息
#也可以通过data[0].show()

image-20220915135118825

hardware type(HTPYE)为0x0001的时候,表示Ethernet

protocol type(PTPYE)为0x0800的时候,表示IPv4

hardware length (HLEN)为0x06的时候,表示MAC地址长度为6byte

protocol length(PLEN)为0x04的时候,表示IP地址长度为4byte

ARP包有request和response之分,request包的OPER(Opcode)位为0x0001 (也就是这里的who has), response包的OPER位为0x0002。

最后的payload位(padding)即为我们自己定制的内容’abc’。

发包通常先设置

1
2
3
4
5
6
7
8
9
ip = IP(dst='192.168.1.8')
ls(ip)查看包信息
send(ip)
上面是三层数据包
#如果发送二层包
ip = IP(dst='192.168.1.8')
ls(ip)
data1 = sendp(Ether(dst='ff:ff:ff:ff:ff:ff') / ARP(hwsrc='00:22:d3:4e:cc:a1',psrc="...",hwdst='...',pdst='...') / 'abc',iface='eth0')
'abc'为我们发送的payload.然后在接受度安sniff即可。

可以用sr来接受报文,因为刚才都是发送报文

1
2
3
4
5
sr(IP(dst='1.2.3.4') / ICMP())
会得到两个答案,收到或者未收到,如图所示
不妨用两个变量去赋值
ans, uans= sr(IP(dst='1.2.3.4') / ICMP())

image-20220915140719074

也可以用刚才show的方式!

同理,用srp接受二层报文

1
ans, uans = srp(Ether(dst='ff:ff:ff:ff:ff:ff') / ARP(pdst='192.1608.3.0/24'), timeout=5,iface='ens33')

可以看到这是向整个网络广播,所以设置一个超时时间。

可以用

1
2
ans.summary()查看输出
#也可以用其他

然后来构造一个四层报文

1
ans,uans = sr(IP(dst='192.168.1.8') / TCP(sport=30,dport=80,flags='S'))

然后拿到回应,可以看到我们flags其实表示syn,活着ack等等,一共八种标识

image-20220915144039289

可以看到回应为ACK!

我们的发送端口可以换成RandShort()表示任意端口。

也可以RandNum(1000,1500)顾名思义。

或者用

1
ans, unans = sr(IP(dst = "192.168.2.11") / fuzz(TCP(dport = 80, flags = "S")))

fuzz可以帮我们检查并且声称端口号!