2015-01-22 2 views
0

Итак, я пишу скрипт python scapy, который сначала просто завершит трехстороннее рукопожатие, отправьте http get, а затем закроет соединение.Как получить длину ответа http python scapy

Это код до сих пор:

!/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' 

В основном я просто хочу, чтобы извлечь Len данных из ПА, которая является ответом HTTP, так что я могу правильно генерировать следующий порядковый номер АСК http-ответ.

Я также пробовал: ans, uns = sr (get1) Но я не мог найти хороший способ получить длину от этого.

Я также пробовал: печать Len (pkts.getlayer (TCP)) AttributeError: 'список' объект не имеет атрибута 'getlayer'

Любая помощь будет оценена

ответ

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).

+0

Это скомпилируется, но я не получу длину, я получаю ??? Вот вывод: Начало излучения: ......... Готово отправить 1 пакет. . * Получено 11 пакетов, получено 1 ответов, остальные 0 пакетов . Отправлено 1 пакет. Ether/IP/TCP 31.31.31.17:http> 31.31.31.10:20810 PA/Raw ?? – dlo

+0

Ты прав, моя ошибка. Я обновил ответ, теперь должен работать. – Pierre

0

Scapy перегружает множество внутренних атрибутов в базовом классе, один из которых является __len__. Опираясь на @ ответ Пьера я думаю, что

for p in pkts: 
    print len(p) 

если вам нужно только для длины пакета TCP и далее только, попробуйте:

for p in pkts: 
    print len(p[TCP]) 

загляните в источнике Scapy на scapy/package.py, чтобы понять, что еще перегружено class Packet.

Смежные вопросы