gpt4 book ai didi

scapy - 在 Scapy 中发送原始数据不能正常工作

转载 作者:行者123 更新时间:2023-12-02 01:33:28 26 4
gpt4 key购买 nike

我使用 Scapy 创建一个初始 OpenVPN 数据包并将其发送到 OpenVPN 服务器(作为客户端)。数据包的 OpenVPN 部分我只是从旧的捕获连接中重用,但它在这里无关紧要。

事情是,我添加了 42 字节的有效负载,但出于某种原因,当我使用 Wireshark 捕获数据包时,我可以看到 84 字节的 OpenVPN 内容。后半部分是我发送的正确负载,但我不知道前半部分是什么。所有其他层(以太网、IP、UDP)都具有正确的大小。

#!/usr/bin/env python
import socket
from scapy.all import *

mysocket=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
mysocket.connect(('192.168.138.129', 1194))

mystream=StreamSocket(mysocket)

ascapypacket=Ether()/IP(dst="192.168.138.129")/UDP(dport=1194, len=50)/Raw(load="\x38\x81\x38\x14\x62\x1d\x67\x46\x2d\xde\x86\x73\x4d\x2c\xbf\xf1\x51\xb2\xb1\x23\x1b\x61\xe4\x23\x08\xa2\x72\x81\x8e\x00\x00\x00\x01\x50\xff\x26\x2c\x00\x00\x00\x00\x00")

etherLoad = len(ascapypacket.getlayer(Ether)) # display size
print etherLoad
ipLoad = len(ascapypacket.getlayer(IP)) # display size
print ipLoad
udpLoad = len(ascapypacket.getlayer(UDP)) # display size
print udpLoad
rawLoad = len(ascapypacket.getlayer(Raw)) # display size
print rawLoad

mystream.send(ascapypacket)

我做了一个图像。在这里你可以看到绿色的东西是正确的——第一部分是 IP 和 UDP 层,第二个绿色部分是我的 OpenVPN 有效负载,但我不明白红色部分是什么。

enter image description here

编辑:如果我不发送原始负载,出于某种原因我仍然会收到那 42 个字节。

最佳答案

您已经创建了一个普通的UDP 数据报套接字:

mysocket=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

这个套接字自己管理以太网IPUDP层,在用户的指导下通过各种辅助方法和参数,例如作为您在代码片段中实际使用的 connect 方法:

mysocket.connect(('192.168.138.129', 1194))

它的各种 send 方法,即使封装为 scapyStreamSocket 对象的一部分,也期望接收作为它们的“数据” -to-send”参数只是位于 UDP 层之上的应用程序负载。
但是,您将整个协议(protocol)栈有效负载传递给它,即 ethernetIPUDP header ,这些 header 被误解为您希望发送到另一端的部分有效负载数据:

ascapypacket=Ether()/IP(dst="192.168.138.129")/UDP(dport=1194, len=50)/Raw(load="\x38\x81\x38\x14\x62\x1d\x67\x46\x2d\xde\x86\x73\x4d\x2c\xbf\xf1\x51\xb2\xb1\x23\x1b\x61\xe4\x23\x08\xa2\x72\x81\x8e\x00\x00\x00\x01\x50\xff\x26\x2c\x00\x00\x00\x00\x00")

因此,您用红色标记的数据实际上是您自己设置的负载数据,然后是OpenVPN 部分:

Ether()/IP(dst="192.168.138.129")/UDP(dport=1194, len=50)

绿色标记的第一部分,你误认为是你自己创建的,实际上是由socket对象生成的(内核,适当的驱动程序和底层硬件,更准确)。


根据您的需要,您应该将套接字实例化为原始套接字:

mysocket = socket(socket.AF_PACKET, socket.SOCK_RAW)

或者相应地将负载设置为 OpenVPN 数据:

ascapypacket=Raw(load="\x38\x81\x38\x14\x62\x1d\x67\x46\x2d\xde\x86\x73\x4d\x2c\xbf\xf1\x51\xb2\xb1\x23\x1b\x61\xe4\x23\x08\xa2\x72\x81\x8e\x00\x00\x00\x01\x50\xff\x26\x2c\x00\x00\x00\x00\x00")

关于scapy - 在 Scapy 中发送原始数据不能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32713185/

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