Как я могу извлечь HTML-код с помощью Scapy?

Недавно я начал использовать библиотеку scapy для Python 2.x. Я обнаружил, что там минимум документации. в функции sniff(). Я начал с ним экспериментировать и обнаружил, что могу просматривать TCP-пакеты на очень низком уровне. Пока нашел только информационные данные. Например:

Вот что я вставил в терминал scapy:

A = sniff(filter="tcp and host 216.58.193.78", count=2)

Это запрос к google.com, запрашивающий домашнюю страницу:

<Ether  dst=e8:de:27:55:17:f3 src=00:24:1d:20:a6:1b type=0x800 |<IP  version=4L ihl=5L tos=0x0 len=60 id=46627 flags=DF frag=0L ttl=64 proto=tcp chksum=0x2a65 src=192.168.0.2 dst=216.58.193.78 options=[] |<TCP  sport=54036 dport=www seq=2948286264 ack=0 dataofs=10L reserved=0L flags=S window=29200 chksum=0x5a62 urgptr=0 options=[('MSS', 1460), ('SAckOK', ''), ('Timestamp', (389403, 0)), ('NOP', None), ('WScale', 7)] |>>>

Вот ответ:

<Ether  dst=00:24:1d:20:a6:1b src=e8:de:27:55:17:f3 type=0x800 |<IP  version=4L ihl=5L tos=0x0 len=60 id=42380 flags= frag=0L ttl=55 proto=tcp chksum=0x83fc src=216.58.193.78 dst=192.168.0.2 options=[] |<TCP  sport=www dport=54036 seq=3087468609 ack=2948286265 dataofs=10L reserved=0L flags=SA window=42540 chksum=0xecaf urgptr=0 options=[('MSS', 1430), ('SAckOK', ''), ('Timestamp', (2823173876, 389403)), ('NOP', None), ('WScale', 7)] |>>>

Используя эту функцию, есть ли способ извлечь HTML-код из ответа?

Кроме того, как выглядят эти пакеты?

И, наконец, почему оба этих пакета практически идентичны?


person Elias Bothell    schedule 14.07.2016    source источник
comment
count=2 убивает его, я еще не видел фрагмента HTML, который был передан всего в двух TCP-пакетах.   -  person grochmal    schedule 15.07.2016
comment
Я понял это вскоре после публикации. Я изменил его на безлимитный и нашел много шестнадцатеричного кода. Могу ли я предположить, что это чистый html? Если нет, то что это?   -  person Elias Bothell    schedule 15.07.2016
comment
@EliasBothell, вы пробовали использовать https://github.com/invernizzi/scapy-http? Его можно использовать для разбора http в scapy.   -  person Noob123    schedule 15.07.2016
comment
@ Noob123 Я все еще изучаю низкоуровневые пакеты, поэтому прошу прощения за глупые вопросы. Зачем мне парсить http? Насколько я понимаю, это обычный текст, человекочитаемый.   -  person Elias Bothell    schedule 16.07.2016


Ответы (2)


Сегменты в вашем примере «почти идентичны», потому что они являются сегментами TCP SYN и SYN-ACK, которые являются частью рукопожатие TCP, HTTP-запрос и ответ приходят после этого во время соединения (обычно в состоянии ESTABLISHED, за исключением случаев, когда используется опция TCP Fast Open), поэтому вам нужно просмотреть сегменты после рукопожатия, чтобы получить интересующие вас данные.

         SYN
C ---------------> S
       SYN-ACK
C <--------------- S
         ACK
C ---------------> S
    HTTP request
C ---------------> S
         ACK
C <--------------- S
    HTTP response
C <--------------- S  <= Here is the server's answer
         ACK
C ---------------> S
...

Вы можете использовать слой Scapy Raw для извлечения данных выше TCP в вашем случае (например, pkt[Raw])

person Jeff Bencteux    schedule 18.07.2016

Вы пробовали использовать https://github.com/invernizzi/scapy-http? Это отличное расширение scapy, которое помогает решить именно эту проблему.

person StephenG    schedule 22.07.2016