Pacote Scapy: use o script Python para construir um pacote com um cabeçalho de protocolo privado (dados hexadecimais diretos)

Descrição do problema:      

 Devido aos requisitos de teste, um pacote com dados de cabeçalho de protocolo privado precisa ser enviado para outros casos de uso relacionados ao teste, e o scapy pode transportar apenas protocolos de rede conhecidos (dados do protocolo Ethernet Layer 2 Ether, protocolo IP, etc.) ) Dados do cabeçalho, se você deseja trazer outros dados da mensagem, eles podem ser tratados apenas como uma sequência, não diretamente com os dados hexadecimais desejados.

Por exemplo, quero enviar um pacote com meus próprios dados de cabeçalho de protocolo privado antes dos dados de cabeçalho de Ethernet, da seguinte maneira:

Dados do protocolo de cabeçalho privado: 03 00 00 02 10 02 00 00 40 00 00 00 80 03
Dados do cabeçalho Ethernet:
                           1. Endereço mac de destino: 00: 11: 22: 33: 44: 55

                           2. Endereço MAC de origem: 00: 22: 22: 22: 22: 22

                           3. dados TAG da vlan: TPID: 8100; CFI: 0 PCP: 0, vlan: d 

Tente enviar os seguintes dados diretamente ao enviar pacotes scapy:

p="0300000210020000400000008003"/Ether(dst='00:11:22:33:44:55', src='00:22:22:22:22:22')/Dot1Q(vlan=13) /"1122334455"
sendp(p, iface = 'veth12', count =1)

Solução:

Verificou-se que "0300000210020000400000008003" foi diretamente reconhecido como uma sequência de caracteres, convertido no código ASCII correspondente e enviado em vez dos dados hexadecimais que eu queria trazer, mas escrevi um script Python para construir os dados do protocolo de cabeçalho privado, send_tcp_packet O script .py é o seguinte:

import time
import threading
import sys
from scapy.all import *

running = 1;

pad = "0300000210020000400000008003"
pad_decode = pad.decode('hex')

class MyProtocol(Packet):
    name = "MyProtocol"
    fields_desc = [
        StrLenField("Pad","0")
    ]

class Thread_send(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
 
    def run(self):
        n = 0
        packet = MyProtocol(Pad = pad_decode)/Ether(dst='00:11:22:33:44:55', src='00:22:22:22:22:22') \
                        /Dot1Q(vlan=13) /"1122334455"

        sendp(packet, iface = 'veth0', verbose=False)

class Thread_stop(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
 
    def run(self):
        ver = raw_input('Press any key to stop send')
        global running
        running = 0

if __name__=='__main__':

    t1 = Thread_send()
    t2 = Thread_stop()
    t1.start()
    t2.start()

 Execute o script, você pode construir quaisquer dados que desejar. Você pode modificar para adicionar dados de protocolo privado em qualquer posição da mensagem, de acordo com suas necessidades.

Os resultados mostram:

O resultado da execução é o seguinte: A mensagem com os dados do cabeçalho do protocolo privado "03 00 00 02 10 02 00 00 40 00 00 00 80 03" foi enviada com êxito:

 

Publicado 59 artigos originais · Gosto 41 · Visita mais de 140.000

Acho que você gosta

Origin blog.csdn.net/weixin_42096901/article/details/105600253
Recomendado
Clasificación