所以我正在编写一个python scapy脚本,它首先完成一次3次握手,发送一个http get,然后关闭连接。
这是到目前为止的代码:
!/usr/bin/env python
from scapy.all import *
getStr = 'GET / HTTP/1.0\r\nHost: www.google.com\r\n\r\n'
#Send SYN
syn = IP(src="31.31.31.10",dst='31.31.31.17') / TCP(dport=80,sport=RandShort(),flags='S')
syn_ack = sr1(syn)`
#Send GET w/ ACK of server's SA
get1 = (IP(src="31.31.31.10",dst="31.31.31.17")/TCP(dport=80, sport=syn_ack[TCP].dport,seq=syn_ack[TCP].ack, ack=syn_ack[TCP].seq + 1, flags='PA')/getStr)
send (get1)
pkts = sniff(count=1,filter="host 31.31.31.17 and port 80",prn=lambda x:x.summary())
print pkts.sprintf("%TCP.len%") #Will this work? I am getting an issue here
AttributeError: 'list' object has no attribute 'sprintf'
基本上我只想从PA中提取数据len,这是http响应,因此我可以正确生成以下序列号来确认http响应。
我也尝试过:ans,uns = sr(get1)但是我找不到一个很好的方法来获取它的长度。
我也尝试过:print len(pkts.getlayer(TCP))AttributeError:'list'对象没有属性'getlayer'
任何帮助将不胜感激
答案 0 :(得分:0)
如您所知,因为您使用过复数,pkts
是PacketList
而不是Packet
。
您可以使用:
for p in pkts:
if TCP in p:
print len(p[TCP].payload)
如果您想跳过没有数据的数据包,可以添加and not isinstance(p[TCP].payload, NoPayload)
。
您还可以修改BPF过滤器,使其显示为:"host 31.31.31.17 and tcp port 80"
(添加tcp
)。
答案 1 :(得分:0)
Scapy重载了它的基类中的许多内部属性,其中之一是__len__
。基于@Pierre的回答我会认为
for p in pkts:
print len(p)
如果只需要TCP数据包的长度而只需要向前,请尝试:
for p in pkts:
print len(p[TCP])
在scapy / packet.py中查看Scapy源代码,了解class Packet
重载的其他内容。