2016-07-23 1 views
0

google.com으로 HTTP GET 요청을 보내려고하지만 응답은 HTML 파일이 아닌 ACK입니다. 여기에 코드입니다 :sr 함수로 HTTP 응답을받지 못합니다. 그냥 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에서 올바른 줄 바꿈은 "\ n"이 아니라 "\ r \ n"입니다.

둘째, HTTP/1.0을 사용하고 HTTP/1.1을 사용하지 않는 이유가 있습니까? 그렇지 않다면, 당신이 요청을 변경해야합니다 :

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

셋째, 당신이 일반적으로 더 빨리 귀하의 요청을 인정하는 실제 HTTP 응답을 전송하기 전에 서버에서 전송 받고있는 ACK. 그런 다음 두 번째 세그먼트가 HTTP 응답과 함께 전송됩니다. 첫 번째 show() 예에서이 항목이 누락되었습니다.

보십시오 here.

이 세그먼트를 잡기 위해, 당신은 그것의 매개 변수 timeoutmultisr() 기능을 사용할 수 있습니다 :

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는 (값 2가 임의) sr()이 중지되도록하는 데 사용됩니다. multi은 "동일한 자극에 대해 복수 응답 허용"을 의미하지 않는 한 sr()은 요청에 대한 하나의 응답 이후에 스니핑을 중지합니다.

+0

첫 번째 메시지를 편집했습니다. 거기를 봐주세요. thanks :) – jony

+0

sr1()을 사용 중이므로 HTTP 요청의 서버 ACK 만 캡처됩니다. 시간 제한이있는 sr()을 사용하여 캡처 한 두 번째 세그먼트를 사용하십시오. 위의 링크는 설명을 제공합니다. –

+0

나는 이것도 시도했다. 나에게 빈 목록을주는 것들 ... 그건 그렇고, 도와 주셔서 감사합니다 :) :) 내 보호기;) – jony

관련 문제