繁体   English   中英

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

[英]How to get the length of http response python 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' object has no attribute 'getlayer'

任何帮助,将不胜感激

正如您所怀疑的那样,由于使用了复数形式,因此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 )。

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所重载的其他内容。

不要单独使用packet[TCP].payload ,它包括填充,如果数据包有填充,它会给你一个不正确的长度。

相反,您可以使用:

tcp_payload_len = len(pkt[TCP].payload)
if pkt.haslayer(Padding):
  tcp_payload_len -= len(pkt[Padding])

见: https : //github.com/secdev/scapy/issues/707

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM