如何获取http响应python scapy的长度

时间:2015-01-22 02:07:34

标签: python http tcp scapy

所以我正在编写一个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'

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

如您所知,因为您使用过复数,pktsPacketList而不是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重载的其他内容。