Paquete escalofriante: utilice el script Python para construir un paquete con un encabezado de protocolo privado (datos hexadecimales directos)

Descripción del problema:      

 Debido a los requisitos de prueba, se debe enviar un paquete con datos de encabezado de protocolo privado para otros casos de uso relacionados con la prueba, y scapy solo puede transportar protocolos de red conocidos (datos de protocolo Ethernet de capa 2 Ether, protocolo ip, etc.) después de verificar la información y probar ) Datos de encabezado, si desea traer otros datos de mensaje, solo se pueden tratar como una cadena, no directamente con los datos hexadecimales que desea.

Por ejemplo, quiero enviar un paquete con mis propios datos de encabezado de protocolo privado antes de los datos del encabezado de Ethernet, de la siguiente manera:

Datos de protocolo de encabezado privado: 03 00 00 02 10 02 00 00 40 00 00 00 80 03
Datos de encabezado de Ethernet:
                           1. Dirección mac de destino: 00: 11: 22: 33: 44: 55

                           2. Dirección MAC de origen: 00: 22: 22: 22: 22: 22

                           3. Datos de la etiqueta vlan: TPID: 8100; CFI: 0 PCP: 0, vlan: d 

Intenta enviar los siguientes datos directamente cuando envíes paquetes de miedo:

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)

Solución:

Se descubrió que "0300000210020000400000008003" se reconocía directamente como una cadena de caracteres, se convertía en el código ASCII correspondiente y se enviaba en lugar de los datos hexadecimales que quería traer, pero escribí un script de Python para construir los datos del protocolo de encabezado privado. El script .py es el siguiente:

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()

 Ejecute el script, puede construir cualquier dato que desee. Puede modificar para agregar datos de protocolo privado en cualquier posición del mensaje según sus necesidades.

Los resultados muestran:

El resultado de la ejecución es el siguiente: el mensaje con los datos del encabezado del protocolo privado "03 00 00 02 10 02 00 00 40 00 00 00 80 03" se envió correctamente:

 

Publicado 59 artículos originales · Me gusta 41 · Visitas 140,000+

Supongo que te gusta

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