Как преобразовать данные потока байтов в тип сообщения GTPv2 с помощью scapy? - PullRequest
1 голос
/ 10 июля 2020

Я работаю с scapy в течение некоторого времени, и у меня возникла проблема с преобразованием байтовых данных в GTPv2- C msg с правильным заголовком и IE телом. Я подготовил переменную msg байтового типа (содержит правильное сообщение GTPV2EchoRequest):

echo_bytes_msg =b'H\x01\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x01\x00\x00\xff\x00\x03\x00\xa99\x12'

Я знаю, как создать сообщение с использованием класса GTPHeader, объекта типа IElist и объединить его в одно сообщение, но я не знаю, как обратить этот процесс вспять. Я пытался использовать класс GTPHeader с одним частным методом (_pkt):

from scapy.contrib.gtp_v2 import *    
echo_res_bin = b'H\x01\x00\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x03\x00\x01\x00\x00\xff\x00\x03\x00\xa99\x12'    
    Original_msg = GTPHeader(_pkt=echo_res_bin)
    Original_msg.show()

Но результат возврата такой же:

##[ GTP v2 Header ]### 
  version   = 2
  P         = 0
  T         = 1
  SPARE     = 0
  SPARE     = 0
  SPARE     = 0
  gtp_type  = echo_request
  length    = 15
  teid      = 0x0
  seq       = 0
  SPARE     = 0
###[ Raw ]### 
     load      = '\x03\x00\x01\x00\x00\xff\x00\x03\x00\xa99\x12'

Сам заголовок декодируется правильно, но IE элементы тела рассматриваются как необработанная нагрузка. Кто-нибудь может помочь мне с этим или иметь представление, как с ними справиться. Цель состоит в том, чтобы декодировать сообщение, не зная, какое сообщение ожидается от службы, например

Использование python ver: 3.8.3

Используемая версия scapy-lib: scapy === git -archive.devcb13a5fa19

1 Ответ

0 голосов
/ 15 июля 2020

Хорошо, в scapy lib есть ошибка, связанная с определением сообщения заголовка Echo Request и Response. После исправления все сообщения GTPv2- c msg декодируются правильно. Ошибка обнаружена в scapy.contrib.gtp_v2 lib:

bind_layers(GTPHeader, GTPV2EchoRequest, gtp_type=1, T=0)
bind_layers(GTPHeader, GTPV2EchoResponse, gtp_type=2, T=0)

Следует изменить на:

bind_layers(GTPHeader, GTPV2EchoRequest, gtp_type=1) 
bind_layers(GTPHeader, GTPV2EchoResponse, gtp_type=2)

Похоже, что эти переменные T испортили элементы длины IE, и причина того, что функция GTPHeader может правильно декодировать сообщение

...