如何使用 Scapy 将魔包发送到我的无人机?

问题描述 投票:0回答:1

我正在尝试启动从无人机到计算机的视频数据流。无人机运行一个 WiFi 接入点,通过移动应用程序进行视频和照片控制(飞行控制器使用单独的 2.4 GHz 信号)。我在计算机上的 Android 模拟器上运行该应用程序,并嗅探到以下流量:

连接成功后请注意:

  • 无人机发送一个包含 20 字节数据的
    PSH,ACK
    数据包,如下所示:

无人机到客户数据 - 示例 1:

Data (20 bytes)
    Data: 637d00000180ffffd188d5ca3586d5ca00020000
    Text: c}
    [Length: 20]

无人机到客户数据 - 示例 2:

Data (20 bytes)
    Data: 569500000168ffffaaac8c4c01aa8c4c00020000
    Text: V\357\277\275
    [Length: 20]

无人机到客户数据 - 示例 3:

Data (20 bytes)
    Data: 1e9a00000164ffff46bdb26265bbb26200020000
    Text: \036\357\277\275
    [Length: 20]
  • 客户端将
    ACK
    数字增加 20
  • 客户端发送一个包含 12 字节数据的
    PSH,ACK
    数据包

我用 Scapy 编写了一个 TCP 连接脚本,我可以从客户端到服务器(无人机)获取最后一个 PSH、ACK 数据包。然后,无人机立即发送一个

FIN
数据包。我正在使用 netcat 监听端口 6666,该端口始终是无人机尝试将 UDP 数据包(作为分段 IPv4 数据包)发送到的端口。

这是脚本连接的捕获:

这是我的 Scapy 脚本:

from scapy.all import *

#SYN
ip = IP(src="172.16.10.139",dst="172.16.10.1")
SYN = TCP(sport=39921,dport=8888,flags="S",seq=2091127182,options=[('MSS', 1460), ('SAckOK', b''), ('NOP', None), ('WScale', 6)]) 
SYNACK=sr1(ip/SYN) 

#ACK
ACK=TCP(sport=39921,dport=8888,flags="A",seq=SYNACK.ack, ack=SYNACK.seq +1)
PSHACK=sr1(ip/ACK)

#ACK2
ACK2=TCP(sport=39921,dport=8888,flags="A",seq=PSHACK.ack, ack=PSHACK.seq +20)
send(ip/ACK2)

#PSHACK2
PSHACK2=TCP(sport=39921,dport=8888,flags="PA",seq=PSHACK.ack, ack=PSHACK.seq +20)
send(ip/PSHACK2/'\001\357\277\275\357\277\27')

请注意,我最初将值

\275
作为字符串的最后四个字符,但随后 Wireshark 将数据长度显示为 13 个字节。我省略了最后一个
5
,然后Wireshark报告数据长度为12字节。我不确定数字
5
的意义是什么,或者我是否发送了正确的 12 个字节。

这些是我发送的 12 个字节,如 Wireshark 中观察到的:

Data (12 bytes)
    Data: 01c3afc2bfc2bdc3afc2bf17
    Text: \001\357\277\275\357\277\275\357\277\275\357\277\275\357\277\275\357\277\275\357\277\275\357\277\275\357\277\275\357\277\275\027
    [Length: 12]

我使用模拟器捕获了几个成功的连接,我注意到捕获的数据有以下几个方面的变化:

客户端到无人机数据 - 捕获 1

Data (12 bytes)
    Data: 0174b21607b6c6fc082a7913
    Text: \001t\357\277\275\026\a\357\277\275\357\277\275\357\277\275\b*y\023
    [Length: 12]

客户端到无人机数据 - 捕获 2

Data (12 bytes)
    Data: 01f8d7142452257d254afd91
    Text: \001\357\277\275\357\277\275\024$R%}%J\357\277\275\357\277\275
    [Length: 12]

客户端到无人机数据 - Capture 3

Data (12 bytes)
    Data: 0128e514ba003ceabb2821ff
    Text: \001(\357\277\275\024\357\277\275
        [Expert Info (Warning/Undecoded): Trailing stray characters]
            [Trailing stray characters]
            [Severity level: Warning]

客户端到无人机数据 - Capture 4

Data (12 bytes)
    Data: 01c0cf16a1c4d009a284a020
    Text: \001\357\277\275\357\277\275\026\357\277\275\357\277\275\357\277\275\t\357\277\275\357\277\275\357\277\275 
    [Length: 12]

我需要了解如何使用 Scapy 发送相同的 12 字节数据。我相信客户端发送给无人机的

PSH,ACK
数据包就是魔术包,而12字节的数据就是魔术字。

Android 应用程序包含一组 C++ 共享对象,这些对象显然处理我试图模拟的连接。

我应该如何将必要的 12 字节数据添加到我的 Scapy 脚本中,以将分段 IPv4 数据包流启动到客户端上的 UDP 端口?或者,Scapy 脚本看起来是否正确,问题是否出在客户端配置(即目标端口的可用性)?

python networking udp wireshark scapy
1个回答
-2
投票

首先,[无人机]1保持在水面上。然后打开它的开关。通过遥控器上方的按钮,您就可以让它飞起来。

© www.soinside.com 2019 - 2024. All rights reserved.