python - 自定义 OpenVPN 客户端不接收 TLS ServerHello

标签 python ssl scapy openvpn

我正在编写一个简单的 OpenVPN 客户端(使用 Python & Scapy & [scapy-ssl_tls] ) 应该连接到 OpenVPN 服务器。

我在 Python 中打开 UDP 套接字并使用 Scapy 在 UDP 之上定义我自己的 OpenVPN 层(根据 OpenVPN 规范)并在其上发送数据包(就像原始客户端一样)。

我能够成功发送初始 P_CONTROL_HARD_RESET_CLIENT_V2 消息并从服务器接收响应,即 P_CONTROL_HARD_RESET_SERVER_V2,然后我发送 P_ACK_V1 消息。

请记住,我正确生成了所有 session ID。

现在,当我发送第一个 P_CONTROL_V1 消息(本质上是 OpenVPN 层顶部的 TLS ClientHello)时,我从服务器收到了一个 P_ACK_V1 确认,仅此而已。请注意,此 ACK 仅表示服务器收到了 OpenVPN 消息,不一定是 TLS 数据。我应该得到 ServerHello 和所有剩余的东西,但服务器在 ACK 之后没有发送任何东西。

http://i.stack.imgur.com/4RBSV.png

我将发送的数据包的数据包格式和所有网络层与真实客户端的通信(下图)进行了比较,几乎所有字段都是相同的。

http://i.stack.imgur.com/OYTLU.png

Wireshark 在完成握手后会自动组合和组装数据包,因此比较它并不难。

我还尝试重播来自之前真实客户端通信的完整 ClientHello 消息(虽然我生成了自己的本地时间)但结果是相同的 - ACK 然后什么都没有。

我还检查了服务器日志,没有发现任何错误或任何可以帮助我的东西。

我这样创建我的 TLS 数据包(有更多选项):

pack = openvpn(opcode=0x20, session_id=ses, message_packet_id_array_length=0, message_packet_id=0000)/TLSRecord()/TLSHandshake()/TLSClientHello()

openvpn 是我在 Scapy 中自己定义的层。

为什么我没有得到 ServerHello 有什么想法吗?

编辑:考虑到我没有从服务器收到任何警报,我很确定服务器出于某种原因甚至没有看到我的 ClientHello。

最佳答案

显然 Message Packet-ID 必须为 1(或更多)。现在我得到了服务器的响应。

enter image description here

Official specification不过只提到 Packet-id 用于重放保护..

关于python - 自定义 OpenVPN 客户端不接收 TLS ServerHello,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33873869/

相关文章:

python - 在python中获取 float 的小数部分

python - 在 hadoop 中将附加文件附加到 python 流作业

python - 通过networkx并使用python在图中添加节点和边

scapy - 使用 Scapy 制作 S1AP 数据包

python - 如何使用 AT 命令发送/接收短信?

java - 在运行时导入自签名证书的 SSL 客户端-服务器在握手时失败

java - Tomcat webcontainer - 如何访问 ssl 加密的 oracle 数据库

php - 必须如何配置服务器才能通过 php 脚本连接到邮箱

Scapy ARP 中毒

python - 用于 Python 的简单 SQLite 包装器