Python-Scapy или тому подобное. Как я могу создать HTTP-запрос GET на уровне пакета - PullRequest
22 голосов
/ 20 января 2011

Я умеренный программист, только начинаю изучать сетевое программирование.

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

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

Trimiert

Ответы [ 2 ]

34 голосов
/ 20 января 2011

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

Начните с пакета 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 работает.Затем отправьте запрос HTTP GET:

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

Затем установите последовательность 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)
1 голос
/ 20 января 2011

Вы смотрели учебник ? Просто копируя и вставляя, похоже, что он собирается собрать HTTP-запрос:

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