gpt4 book ai didi

python - Scapy 中 HTTP 连接的低级管理

转载 作者:可可西里 更新时间:2023-11-01 16:38:23 26 4
gpt4 key购买 nike

我正在尝试构建一个简单的 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 是自动的发送)?

最佳答案

使用 sr(),从接收到的每个 ans 中读取数据(您需要根据您是否使用传输分块来解析 Content-Length 或 block 长度)然后发送ACK 以响应 ans 列表中的 last 元素,然后重复直到满足结束条件(不要忘记包括全局超时,我使用了 8 次传递而没有得到任何回复,即 2 秒).

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

请注意,当您使用传输分块时,您也可以尝试作弊并只读取 0\r\n\r\n 但如果它确实在数据流中......是的。不要依赖 TCP PSH,无论多么诱人,它都可能会处理一些带有琐碎用例的 Wireshark session 。

显然,最终结果并不是一个完全可行的用户代理,但对于大多数用途来说已经足够接近了。不要忘记发送 Keep-Alive header 、异常时的 RST 并在一切正常时礼貌地关闭 TCP session 。

请记住,RFC 2616 的 176 页不只是为了好玩。

关于python - Scapy 中 HTTP 连接的低级管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16748592/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com