代码之家  ›  专栏  ›  技术社区  ›  tarun14110

在python中使用scapy实现三方握手和get请求

  •  4
  • tarun14110  · 技术社区  · 7 年前

    我正在使用scapy进行三方握手,并发送get请求和接收响应。但我得到了一个TCP数据包,作为对FIN标志集的响应。我希望HTTP数据包包含请求的页面。我哪里做错了?

    import sys
    import socket
    
    from scapy.all import *
    
    
    # 3 way handshake
    ip=IP(dst="webs.com")
    SYN=TCP(sport=80, flags="S", seq=100, dport=80)
    SYNACK=sr1(ip/SYN)
    
    my_ack = SYNACK.seq + 1
    ACK=TCP(sport=80, flags="A", seq=101, ack=my_ack, dport=80)
    send(ip/ACK)
    
    # request 
    PUSH = TCP(sport=80, dport=80, flags='PA', seq=102, ack=my_ack)
    payload = "GET / HTTP/1.1\r\nHost: webs.com\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/58.0.3029.110 Chrome/58.0.3029.110 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.8\r\n\r\n"
    reply= sr1(ip/PUSH/payload, timeout=10)
    

    Wireshark结果

    wireshark result

    2 回复  |  直到 7 年前
        1
  •  2
  •   Noob123    7 年前

    您的计算机正在发送RST数据包。内核正在发送RST数据包。
    http://www.packetlevel.ch/html/scapy/scapy3way.html .

    尝试通过iptables丢弃RST数据包。
    iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 192.168.43.119 -j DROP

        2
  •  2
  •   dvk    7 年前

    发送请求时,似乎使用了错误的序列号:

    PUSH = TCP(sport=80, dport=80, flags='PA', seq=11, ack=my_ack)
    

    seq 应该是101,而不是11,因为您使用100表示SYN。更改它似乎可以解决问题。

    此外,如果您没有在测试中更改源端口,并且没有正确关闭TCP连接,或者在测试之间没有等待120秒,服务器可能会认为新数据包属于以前的连接,并发送您不期望的响应(取决于服务器连接的状态)。