scapy命令
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 | data[0]来查看数据包详细信息 |
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 | ip = IP(dst='192.168.1.8') |
可以用sr来接受报文,因为刚才都是发送报文
1 | sr(IP(dst='1.2.3.4') / ICMP()) |
也可以用刚才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 | ans.summary()查看输出 |
然后来构造一个四层报文
1 | ans,uans = sr(IP(dst='192.168.1.8') / TCP(sport=30,dport=80,flags='S')) |
然后拿到回应,可以看到我们flags其实表示syn,活着ack等等,一共八种标识
可以看到回应为ACK!
我们的发送端口可以换成RandShort()表示任意端口。
也可以RandNum(1000,1500)顾名思义。
或者用
1 | ans, unans = sr(IP(dst = "192.168.2.11") / fuzz(TCP(dport = 80, flags = "S"))) |
fuzz可以帮我们检查并且声称端口号!
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment