Python Scapy中HTTP连接的低层管理

Python Scapy中HTTP连接的低层管理,python,http,networking,packet,scapy,Python,Http,Networking,Packet,Scapy,我正在尝试构建一个简单的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

我正在尝试构建一个简单的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...
上面的脚本完成三方握手并准备HTTP GET请求。
然后,我必须通过以下方式发送请求:

send(request)
现在,在发送之后,我应该获取/手动读取响应。
我的目的确实是通过手动发送响应的ACK数据包来读取响应(这是脚本的主要重点)

我该怎么做

send(41;
函数是否合适,或者最好使用
response=sr1(request)
之类的函数(但在这种情况下,我认为ACK是自动发送的)?

您是否尝试过:

responce = sr1(request)
print responce.show2
还可以尝试使用不同的嗅探器,如wireshark或tcpdump,因为netcat有一些bug。

使用sr(),从接收到的每个ans读取数据(您需要根据是否使用传输分块来解析内容长度或分块长度),然后发送ACK以响应ans列表中的最后一个元素,然后重复,直到满足结束条件(不要忘了包括一个全局超时,我使用了八次,没有得到任何答复,这是2秒)

确保sr为sr(req,multi=True,timeout=0.25)或其左右。偶尔,当您循环时,会出现没有数据包出现的时段,这就是HTTP具有所有这些长度规范的原因。如果超时太高,您可能会发现服务器不耐烦地等待ACK并开始重新发送

请注意,当您使用传输分块时,您也可以尝试欺骗并仅读取0\r\n\r\n,但如果数据流中确实存在此内容。。。是 啊不要依赖于TCP PSH,尽管它很吸引人,但在一些使用简单用例的Wireshark会话之后

显然,最终的结果不是一个完全可行的用户代理,但对于大多数目的来说,它已经足够接近了。别忘了发送Keep-Alive头文件,在异常情况下发送RST,如果一切正常,礼貌地关闭TCP会话

请记住,RFC2616的页面长度并不是176页,只是为了咯咯地笑。

TCP\u PUSH=TCP(sport=1500,dport=80,flags=“PA”,seq=102,ack=my\u ack) 发送(ip/TCP\U推送)

seq应该是101而不是102