2011-01-20 4 views
21

Я умеренный программист, просто входя в сетевое программирование.Python-Scapy и т. П. Как создать HTTP-запрос GET на уровне пакетов

Как попытка улучшить мое понимание сетей в целом, я пытаюсь выполнить несколько основных действий HTTP с уровня пакета. Мой вопрос таков: как я могу использовать библиотеку, такую ​​как SCAPY, для создания запроса HTTP GET и ассоциированных элементов на уровне пакета? Я понимаю, это может показаться странным, но я не могу найти никакой информации, детализирующей его, и мои собственные попытки с PAROS и Ethereal были ... Менее удовлетворительными.

Спасибо за любую предлагаемую помощь!

Trimiert

+0

Я хотел бы предложить, чтобы сделать это на языке низкого уровня, чем Python, как C/C++. – orlp

+13

@ nightcracker: Я категорически не согласен. Scapy позволяет создавать и отправлять пакеты очень легко, не беспокоясь о том, что нужно программисту C или C++. Если вам интересно, как работают сети, Scapy - это путь. Если вы хотите написать фактический сервер, то, возможно, другой язык более уместен. И я говорю это как человека, который пишет код C для сетевых устройств для жизни. – nmichaels

+3

@OP: Послушайте, что говорит nmichaels. Я всего лишь 16-летний мужчина с (несвязанным) мнением обо всем. – orlp

ответ

34

Если вы хотите сделать полный три рукопожатия, вы должны сделать это вручную.

Начать с пакетом SYN:

>>> syn = IP(dst='www.google.com')/TCP(dport=80, flags='S') 
>>> syn 
<IP frag=0 proto=tcp dst=Net('www.google.com') |<TCP dport=www flags=S |>> 

Затем получить пакет SYN-ACK от сервера SR1 работ. Затем отправьте запрос GET HTTP:

>>> syn_ack = sr1(syn) 
Begin emission: 
Finished to send 1 packets. 
* 
Received 1 packets, got 1 answers, remaining 0 packets 

>>> syn_ack 
<IP version=4L ihl=5L tos=0x0 len=44 id=424 flags= frag=0L ttl=55 proto=tcp chksum=0x2caa src=74.125.226.148 dst=10.20.30.40 options=[] |<TCP sport=www dport=ftp_data seq=3833491143 ack=1 dataofs=6L reserved=0L flags=SA window=5720 chksum=0xd8b6 urgptr=0 options=[('MSS', 1430)] |<Padding load='\x00\x00' |>>> 

Затем установите последовательность и Ack номера TCP и отправить GET:

getStr = 'GET/HTTP/1.1\r\nHost: www.google.com\r\n\r\n' 
request = IP(dst='www.google.com')/TCP(dport=80, sport=syn_ack[TCP].dport, 
      seq=syn_ack[TCP].ack, ack=syn_ack[TCP].seq + 1, flags='A')/getStr 
reply = sr1(request) 
+0

Большое спасибо! Безусловно, лучшая информация, которую я видел. И да, я действительно планировал сделать трёхсторонний поход, но это было так же, как и у меня. Спасибо! – Trimiert

+0

Есть ли способ захватить http-пакет, используя sniff и последние вставлять в него заголовки http? – fayyazkl

+3

@fayyazkl: Это то, что должно быть его собственным вопросом. – nmichaels

1

Вы взглянули на the tutorial? Простое копирование и вставка, это выглядит, как он собирается собрать запрос HTTP:

>>> a=Ether()/IP(dst="www.slashdot.org")/TCP()/"GET /index.html HTTP/1.0 \n\n" 
+1

Да, я это сделал. Но просто отправка его вроде бы не работала и не дает мне представления о том, как она работает на уровне пакетов. – Trimiert

+0

Не работает и для меня. Просто пытается получить навсегда. –

+0

Вопрос задает вопрос о том, как создать запрос HTTP-запроса на уровне пакета, и этот ответ проясняет это. Предполагается, что вам необходимо выполнить tcp handshake. Не думайте, что с ответом что-то не так. Хотя люди, которые не знают о рукопожатии tcp, должны ссылаться на правильный ответ. –

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