Как я должен отправить волшебный пакет моему дрону со Scapy? - PullRequest
2 голосов
/ 23 мая 2019

Я пытаюсь инициировать поток видеоданных с моего дрона на мой компьютер. Дрон запускает точку доступа Wi-Fi для управления видео и фото через мобильное приложение (контроллер полета использует отдельный сигнал 2,4 ГГц). Я запустил приложение на эмуляторе Android на компьютере и обнаружил следующий трафик:

drone_app_handshake Обратите внимание, что после успешного подключения:

  • Дрон отправляет пакет PSH,ACK с 20 байтами данных, который выглядит следующим образом:

Дрон к данным клиента - образец 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
  • клиент отправляет PSH,ACK пакет с 12 байтами данных

Я написал сценарий TCP-соединения со Scapy, и я могу добраться до последнего пакета PSH, ACK, от клиента к серверу (дрон). Затем дрон немедленно отправляет пакет FIN. Я использую netcat для прослушивания порта 6666, который всегда является портом, на который дрон пытается отправить UDP-пакеты в виде фрагментированных пакетов IPv4.

Вот захват из скриптового соединения:

drone_script_handshake

Вот мой скрипт 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]

Данные клиент-дрон - Захват 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]

Данные клиент-дрон - захват 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]

Мне нужно понять, как отправить те же 12 байтов данных с помощью Scapy. Я считаю, что пакет PSH,ACK, который клиент посылает дрону, является магическим пакетом, а 12 байтов данных - волшебным словом.

Приложение Android содержит набор общих объектов C ++, которые, очевидно, обрабатывают соединение, которое я пытаюсь эмулировать.

Как мне добавить необходимые 12 байтов данных в мой скрипт Scapy, чтобы инициировать поток фрагментированных пакетов IPv4 на порт UDP на клиенте? Или, похоже, что скрипт Scapy правильный и проблема в конфигурации клиента, то есть доступности порта назначения?

...