【问题标题】:400 Bad request from some websites when replaying the captured HTTP/2 request packets using TLS wrapper400 使用 TLS 包装器重放捕获的 HTTP/2 请求数据包时来自某些网站的错误请求
【发布时间】:2021-09-18 14:31:37
【问题描述】:

我正在使用 Curl 实用程序向 www.google.com 发送 HTTP/2 请求,并且服务器正在合法响应。在此之后,我使用 tcpdump 捕获请求数据包(数据包使用 PolarProxy 解密)。然后我的 python 脚本(tls 包装器)使用 scapy 读取这些请求数据包的有效负载,然后使用 tls 包装器将其发送到www.google.com(参见下面的代码)。但是,尽管我正在重播使用 curl 发送的完全相同的请求,但 Google 正在返回 400 Bad request 错误。此方法适用于某些网站(twitter、天猫等),但不适用于 google、youtube 等网站。以下是在curl_wwwgoogle.pcap 文件中捕获的 HTTP/2 请求数据包的屏幕截图。

我的python脚本是:

import socket
import ssl
import requests
from scapy.all import *
from hpack import Encoder, Decoder

p=rdpcap('curl_wwwgoogle.pcap')

HOST, PORT = 'www.google.com', 443

payload=p[3][Raw].load+p[4][Raw].load+p[5][Raw].load+p[6][Raw].load

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)

wrappedSocket = ssl.wrap_socket(sock, ssl_version=ssl.PROTOCOL_TLS)

try:
    wrappedSocket.connect((HOST, PORT))
    wrappedSocket.send(payload)
    response = wrappedSocket.recv(1280)
    http_response = repr(response)
    http_response_len = len(http_response)
except:
    print("Connection error")
print(http_response)

wrappedSocket.close()

【问题讨论】:

    标签: python ssl web scapy http2


    【解决方案1】:

    确保您使用 ALPN 来发布 HTTP/2,例如:

    ctx = ssl.create_default_context()
    ctx.set_alpn_protocols(["h2"])
    wrappedSocket = ctx.wrap_socket(sock, server_hostname=HOST)
    

    【讨论】:

    • 感谢 Steffen :-)。这解决了这个问题。现在我得到了正确的 HTTP/2 响应。
    【解决方案2】:

    您是否使用 PolarProxy 解密 curl 请求和 python 请求?如果是,您是否验证了这两个请求的 HTTP/2 内容 100% 相同?

    【讨论】:

    • 是的,Erik,我验证了使用 curl 发送的请求内容与使用我的 python 脚本发送的请求内容完全相似。我也期待这两个请求与我没有在我的 python 脚本中的任何地方更改数据包内容完全相同。
    • 我不小心输入了我的问题作为答案而不是评论 [facepalm]。对于那个很抱歉。尽管如此,很高兴看到@steffen-ullrich 发现问题是缺少“h2”ALPN,这很有意义。
    猜你喜欢
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    相关资源
    最近更新 更多