cómo agregar encabezados http a un paquete detectado mediante scapy

Estoy intentando rastrear un paquete http saliente usando scapy, agregar algunos encabezados http nuevos y enviarlo por adelantado. La intención aquí es solo insertar nuevos encabezados mientras se mantiene el paquete intacto. En el máximo, cualquier recuento de sum de comprobación se debe hacer si es necesario.

He pasado por casi todas las preguntas sobre SO, pero no obtuve una solución exacta.

Lo siguiente es lo que he hecho.

def parse(pkt): if pkt.haslayer(TCP) and pkt.getlayer(TCP).dport == 80 and pkt.haslayer(Raw): pkt = pkt / "New Header:value\r\n\r\n" # OR i tried this #pkt = pkt.getlayer(Raw).load / Raw.load(load="New Header:value\r\n\r\n") #pkt.getlayer(Raw).load("New Header:value\r\n\r\n") pkt.show() #del pkt[IP].chksum send(pkt) #end parse function # start sniffing a=sniff(filter="tcp and ( port 80 )", prn=parse) 

El problema es que el código anterior inserta una nueva sección de carga útil en bruto en lugar de agregar un encabezado simple. Ya existe una doble línea nueva \ r \ n \ r \ n para indicar la terminación del encabezado de acuerdo con el estándar HTTP.

Para superar esto, intenté eliminar la última \ r \ n haciendo lo siguiente

  #pkt = pkt.getlayer(Raw).load[-2:] / Raw.load(load="New Header:value\r\n\r\n") 

Pero esto elimina todos los encabezados existentes anteriormente y solo queda el “Nuevo encabezado”.

He intentado esto en Linux mint.

ACTUALIZACIÓN: Estoy tratando de crear una nueva carga útil http que contendría los encabezados anteriores y agregaré algunos. ¿Puede alguien ayudarme a eliminar una capa existente?

Si comprendo correctamente, el problema que tiene es que desea actualizar una solicitud HTTP existente con un nuevo encabezado. Lo que desea es actualizar una cadena en su lugar, algo que Python no puede hacer directamente (las cadenas son inmutables).

Entonces, lo que debes hacer es tomar el encabezado HTTP:

old_hdr = pkt[Raw] o old_hdr = pkt[TCP].payload

y manipularlo como una cuerda:

 new_hdr = 'New Header: value' hdr = old_hdr.split('\r\n') # This is a crappy hack. Parsing HTTP headers hdr.insert(new_hdr, 2) # is a [solved problem][1]. send_hdr = '\r\n'.join(hdr) pkt[TCP].payload = send_hdr 

Si encuentra que las sums de comprobación no se están actualizando, elimínelas antes de enviar el paquete:

 del pkt[TCP].chksum 

y Scapy los devolverá por ti, con los valores correctos.

Edit: Me acabo de dar cuenta de que mi enlace es fallido. Aquí es cómo analizar los encabezados HTTP.