2016-07-23 3 views
0

Я пытаюсь отправить HTTP GET-запрос на google.com, но я получаю ответ ACK, а не файл HTML. Вот код:Я не получаю HTTP-ответ с помощью функции sr. Просто ACK

def Make_Get(): 
     synR = IP(dst = 'www.google.com', ttl = 64)/TCP(dport = 80,sport = randint(1024,65535), flags = 'S') 
     synAckAN = sr1(synR) 
     req = (IP(dst='www.google.com')/TCP(dport=80, sport=synAckAN[TCP].dport, seq=synAckAN[TCP].ack, ack=synAckAN[TCP].seq + 1, flags='A')/"GET/HTTP/1.0 \n\n") 

     ans, a = sr(req) 
     return ans 

и это те два пакета, которые я получил взамен этой функции:

###[ IP ]### 
    version = 4 
    ihl  = None 
    tos  = 0x0 
    len  = None 
    id  = 1 
    flags  = 
    frag  = 0 
    ttl  = 64 
    proto  = tcp 
    chksum = None 
    src  = 192.168.233.128 
    dst  = 216.58.214.100 
    \options \ 
###[ TCP ]### 
    sport  = 35534 
    dport  = http 
    seq  = 1 
    ack  = 1964930533 
    dataofs = None 
    reserved = 0 
    flags  = A 
    window = 8192 
    chksum = None 
    urgptr = 0 
    options = {} 
###[ Raw ]### 
     load  = 'GET/HTTP/1.0 \n\n' 
None 


###[ IP ]### 
    version = 4L 
    ihl  = 5L 
    tos  = 0x0 
    len  = 40 
    id  = 32226 
    flags  = 
    frag  = 0L 
    ttl  = 128 
    proto  = tcp 
    chksum = 0x6425 
    src  = 216.58.214.100 
    dst  = 192.168.233.128 
    \options \ 
###[ TCP ]### 
    sport  = http 
    dport  = 35534 
    seq  = 1964930533 
    ack  = 18 
    dataofs = 5L 
    reserved = 0L 
    flags  = A 
    window = 64240 
    chksum = 0xe5e6 
    urgptr = 0 
    options = {} 
###[ Padding ]### 
     load  = '\x00\x00\x00\x00\x00\x00' 
None 

Когда я понюхал трафик в то время как я послал этот пакет, я получил это:

###[ Ethernet ]### 
    dst= 00:0c:29:bb:8e:79 
    src= 00:50:56:e9:b8:b1 
    type= 0x800 
###[ IP ]### 
    version= 4L 
    ihl= 5L 
    tos= 0x0 
    len= 517 
    id= 32136 
    flags= 
    frag= 0L 
    ttl= 128 
    proto= tcp 
    chksum= 0x5004 
    src= 172.217.20.100 
    dst= 192.168.233.128 
    \options\ 
###[ TCP ]### 
     sport= http 
     dport= 1928 
     seq= 1828330545 
     ack= 18 
     dataofs= 5L 
     reserved= 0L 
     flags= FPA 
     window= 64240 
     chksum= 0x8b5f 
     urgptr= 0 
     options= [] 
###[ HTTP ]### 
###[ HTTP Response ]### 
       Status-Line= u'HTTP/1.0 302 Found' 
       Accept-Ranges= None 
       Age= None 
       E-Tag= None 
       Location= u'http://www.google.co.il/?gfe_rd=cr&ei=9fiTV6P6FuWg8weei7rQDA' 
       Proxy-Authenticate= None 
       Retry-After= None 
       Server= None 
       Vary= None 
       WWW-Authenticate= None 
       Cache-Control= u'private' 
       Connection= None 
       Date= u'Sat, 23 Jul 2016 23:08:37 GMT' 
       Pragma= None 
       Trailer= None 
       Transfer-Encoding= None 
       Upgrade= None 
       Via= None 
       Warning= None 
       Keep-Alive= None 
       Allow= None 
       Content-Encoding= None 
       Content-Language= None 
       Content-Length= u'261' 
       Content-Location= None 
       Content-MD5= None 
       Content-Range= None 
       Content-Type= u'text/html; charset=UTF-8' 
       Expires= None 
       Last-Modified= None 
       Headers= u'Date: Sat, 23 Jul 2016 23:08:37 GMT\r\nContent-Length: 261\r\nContent-Type: text/html; charset=UTF-8\r\nLocation: http://www.google.co.il/?gfe_rd=cr&ei=9fiTV6P6FuWg8weei7rQDA\r\nCache-Control: private' 
       Additional-Headers= None 
###[ Raw ]### 
       load= '<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">\n<TITLE>302 Moved</TITLE></HEAD><BODY>\n<H1>302 Moved</H1>\nThe document has moved\n<A HREF="http://www.google.co.il/?gfe_rd=cr&amp;ei=9fiTV6P6FuWg8weei7rQDA">here</A>.\r\n</BODY></HTML>\r\n' 

Как вы можете видеть, последний слой в этом случае содержит код, который мне нужен.

мой вопрос:

Почему я не получаю пакет с sr() и как я могу получить его, чтобы собрать HTML-код?

EDIT:

Вызов функции:

print Make_Get('www.google.com')[0][Raw] 

Функция:

def Make_Get(ipp): 
     ip = DNS_Req(ipp) 
     synR = IP(dst = ip)/TCP(dport = 80,sport = randint(1024,65535), flags = 'S') 
     syn_ack = sr1(synR) 
     getStr = "GET/HTTP/1.1\r\nHost: {}\r\n\r\n".format(ip) 
     request = (IP(dst= ip)/TCP(dport=80, sport=syn_ack[TCP].dport, seq=syn_ack[TCP].ack, ack=syn_ack[TCP].seq + 1, flags='A')/getStr) 
     an = sr(request) 
     return an 

В resuls:

Begin emission: 
.Finished to send 1 packets. 
* 
Received 2 packets, got 1 answers, remaining 0 packets 
Begin emission: 
*Finished to send 1 packets. 

Received 1 packets, got 1 answers, remaining 0 packets 
[] 

ответ

1

Во-первых, в HTTP правильная строка новой строки - «\ r \ n», а не «\ n».

Во-вторых, есть ли причина, по которой вы используете HTTP/1.0, а не HTTP/1.1? Если нет, то вы должны изменить свой запрос по адресу:

GET/HTTP/1.1\r\n 
Host: www.google.com\r\n 
\r\n 

В-третьих, ACK вы получаете обычно посылается сервером перед отправкой фактического ответа HTTP подтвердить ваш запрос быстрее. Второй сегмент затем отправляется с ответом HTTP. Вам не хватает этого в вашем первом примере show().

Посмотрите here.

Чтобы поймать этот сегмент, вы можете использовать sr() функцию с параметром timeout и multi:

ans, unans = sr(request, timeout=2, multi=True) 

for c, s in ans: 
    if s.haslayer(Raw): 
     print b[Raw] 
    print("-----------") # just a delimiter 

timeout используется для того, чтобы sr() остановится (значение 2 произвольно). multi означает «принимать несколько ответов для одного и того же стимула», если он не существует, sr() перестанет обнюхивать после ответа на отправленный запрос.

+0

Я отредактировал мое первое сообщение. посмотрите пожалуйста. thanks :) – jony

+0

Вы используете sr1(), поэтому захватывается только ACK вашего HTTP-запроса. Попробуйте использовать sr() с таймаутом и использовать второй сегмент, который вы захватите с ним. Выше ссылка дает объяснение. –

+0

Я тоже это пробовал ... давал мне пустой список ... Кстати, спасибо за помощь :) :) :) ваш заставка;) – jony

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

  • Нет связанных вопросов^_^