8 байтов списаны с полезной нагрузки scapy из UDP - PullRequest
0 голосов
/ 29 мая 2018

Я отправляю пакет udp используя scapy.Я вижу первые 8 байтов, извлеченные из полезной нагрузки.Любые причины почему?

payload = '{ "dcgdsfjfghtimec": ' + str(datetime.now().strftime('%M:%S.%f')) + ', "sequence": ' + str(sequenceNum)+'}'
packet = IP(dst="127.0.0.1", src="10.0.0.1")/UDP(dport=5555)/Raw(load=json.dumps(payload))

На стороне получателя:

def packet_callback(packet):
    if packet[UDP].payload:
        pkt = str(packet[UDP].payload)

while True:
    sniff(filter="dst port 5555", prn=packet_callback, store=0)

Я наблюдаю полезную нагрузку на стороне сервера:

(Pdb) p packet[UDP].payload
<DNS  id=8827 qr=0 opcode=4 aa=0 tc=0 rd=0 ra=0 z=1 ad=0 cd=1 rcode=12 qdcount=8804 ancount=25447 nscount=25715 arcount=26218 qd='' an='' ns='' ar='' |<Raw  load='fghtimec\\": 33:44.120154, \\"sequence\\": 0}"' |>>

На стороне клиента послеотправка пакета:

(Pdb) p packet
<IP  frag=0 proto=udp src=10.0.0.1 dst=127.0.0.1 |<UDP  dport=rplay |<Raw  load='"{ \\"dcgdsfjhtimec\\": 32:49.187705, \\"sequence\\": 0}"' |>>>

Ровно 8 байтов, удаленных со стороны сервера .. почему?

Любая идея будет очень полезна.

Спасибо, Судип

1 Ответ

0 голосов
/ 29 мая 2018

Значение порта UDP по умолчанию для Scapy - 53 для источника и получателя.Это заставляет пункт назначения интерпретировать начало полезной нагрузки как слой DNS().Таким образом, байты не пропущены, они просто интерпретируются как (поврежденный) слой DNS.

Вы можете воспроизвести это локально (заменить raw() на str(), если вы используете Scapy <2.4.0) на* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Вы можете «исправить», когда Scapy создаст байты, которые он отправит на newtork, <code>IP().что при использовании другого порта источника (так как вы уже изменили порт назначения): packet = IP(dst="127.0.0.1", src="10.0.0.1")/UDP(sport=12345, dport=5555)/Raw(load=json.dumps(payload)).

В качестве примечания, на мой взгляд, у вас есть другая (настоящая, эта) проблема: вы, вероятно, неВместо этого нужно json.dumps() строка, но объект Python (используя текущий код, вы дважды кодируете данные в формате JSON, поскольку используемая вами строка уже закодирована в формате JSON):

payload = {"dcgdsfjfghtimec": datetime.now().strftime('%M:%S.%f'),
                      "sequence": sequenceNum}
packet = IP(dst="127.0.0.1", src="10.0.0.1")/UDP(sport=12345, dport=5555)/Raw(load=json.dumps(payload))
...