在Scapy中发送原始数据无法正常工作

时间:2015-09-22 09:23:11

标签: scapy

我使用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个字节。

1 个答案:

答案 0 :(得分:1)

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

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

此套接字管理以太网 IP & UDP 图层本身,由用户通过各种辅助方法和参数提供指导,例如您在代码段中实际使用的connect方法:

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

它的各种send方法,即使封装为 scapy StreamSocket对象的一部分,也希望以"数据的形式接收-to-发送"参数只是分层在 UDP 层之上的应用程序有效负载 但是,您将整个协议堆栈有效负载传递给它,即以太网 IP & UDP 标头,它被误解为您希望发送给另一方的有效负载数据的一部分:

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")