我正在尝试构建一个简单的 Scapy 脚本,该脚本手动管理 3 次握手,向 Web 服务器发出 HTTP GET 请求(通过发送单个数据包)并手动管理响应数据包(我需要手动发送 ACK 数据包)回复)。
这是脚本的开头:
#!/usr/bin/python
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
# Import scapy
from scapy.all import *
# beginning of 3-way-handshake
ip=IP(dst="www.website.org")
TCP_SYN=TCP(sport=1500, dport=80, flags="S", seq=100, options=[('NOP', None), ('MSS', 1448)])
TCP_SYNACK=sr1(ip/TCP_SYN)
my_ack = TCP_SYNACK.seq + 1
TCP_ACK=TCP(sport=1500, dport=80, flags="A", seq=101, ack=my_ack)
send(ip/TCP_ACK)
TCP_PUSH=TCP(sport=1500, dport=80, flags="PA", seq=102, ack=my_ack)
send(ip/TCP_PUSH)
# end of 3-way-handshake
# beginning of GET request
getString = 'GET / HTTP/1.1\r\n\r\n'
request = ip / TCP(dport=80, sport=1500, seq=103, ack=my_ack + 1, flags='A') / getString
# help needed from here...
上面的脚本完成了 3 次握手并准备了 HTTP GET 请求。
然后,我必须通过以下方式发送请求:
send(request)
现在,在发送之后,我应该获取/手动读取响应。
我的目的确实是通过手动发送响应的 ACK 数据包来读取响应(这是脚本的主要重点)。
我怎样才能做到这一点?
该send(_)
功能是否合适,或者最好使用类似的东西response = sr1(request)
(但在这种情况下,我认为 ACK 是自动发送的)?