Tutorial de instalación y uso de Python3 + Scapy

1. Descripción

Al escribir un programa DoS antes (ver " Comprensión, defensa e implementación de la denegación de servicio (DoS) "), el paquete de datos está completamente construido por usted mismo. Una de las dificultades es tener claros los campos, la longitud de los campos y los valores De las distintas capas del protocolo. Todavía caracteres, cabeza grande o cabeza pequeña, y la segunda es calcular la suma de comprobación. Todo el proceso es más doloroso.

De hecho, para construir paquetes DoS, a menudo solo queremos falsificar algunos campos, como la IP de origen, pero de hecho se dedica mucho tiempo a la construcción de otros campos que a la mayoría no les interesan.

En el proceso de búsqueda de información, descubrí que muchos programas DoS usan directamente un paquete "Scapy" (al principio pensé que Scrapy estaba pensando en cuándo podría usarse Scrapy para construir un paquete de datos, y luego noté que la "r" Estaba faltando). No me importó demasiado en ese momento. Mirando hacia atrás, Scapy es de hecho un "artefacto" y vale la pena grabarlo.

Este artículo se refiere principalmente a documentos oficiales. Para obtener más información, consulte: https://scapy.readthedocs.io/en/latest/usage.html

 

Dos, instalación

Instalar directamente usando pip:

pip instalar scapy

Algunas funciones extendidas están instaladas, opcionales:

pip instalar criptografía pyx matplotlib

 

Tres, generar paquete de datos

3.1 Iniciar el shell interactivo scapy

Cambie a la carpeta Scripts de Python e inícielo directamente con el comando scapy (esencialmente scapy.bat):

escamoso

La interfaz de inicio es la siguiente (debido a que no instalé PyX, indica que no se pueden usar psdump () y pdfdump (), y hay algunas advertencias que no son importantes y no se procesarán):

 

3.2 Generar paquete de datos

En scapy, los paquetes de datos debajo de la capa de aplicación se pueden generar directamente usando básicamente el método correspondiente a las mayúsculas del protocolo. Tal como:

Copiar codigo

# Use el método Ether () para generar un paquete de datos de capa Ethernet 
eth_packet = Ether () 
# Use el método IP () para generar un paquete de datos de capa de red 
ip_packet = IP () 
# Use el método TCP () para generar datos tcp packet 
tcp_packet = TCP () 
# Use el método UDP () para generar un paquete udp 
udp_packet = UDP () 
# Use el método ICMP () para generar un paquete udp 
icmp_packet = ICMP ()

Copiar codigo

 

3.3 Ver el contenido del paquete de datos

El paquete de datos generado en la sección anterior, si es tan largo, es completamente una caja negra, necesitamos alguna forma de saber cuál es el paquete de datos (cada campo).

Los paquetes de datos de cualquier protocolo son similares. Tomemos un paquete de datos tcp como ejemplo. Puede ver los paquetes de datos de otros protocolos para operaciones similares.

Copiar codigo

# Use el método IP () para generar un paquete de datos tcp 
ip_packet = IP () 

# Método uno, use el método raw () para ver 
raw (ip_packet) 

# Método dos, use hexdump () para ver. Similar a Wireshark 
hexdump (ip_packet) 

# Método tres, vista raw () con clase de protocolo. Mejor 
# Ver el contenido de la capa Ethernet del paquete (el contenido de la capa inferior no se muestra en capas y el contenido de la capa superior no se analiza sino que se muestra en forma de carga) 
Ether (raw (ip_packet)) 
# Ver el contenido de la capa de red del paquete (el contenido de la capa inferior no se muestra en capas, El contenido de la capa superior no se analiza y solo se muestra en forma de carga) 
IP (sin procesar (ip_packet))

Copiar codigo

 

3.4 Valor de campo personalizado

En la sección anterior, usamos raw para cooperar con el método de protocolo para ver claramente el valor de cada campo en el paquete de datos. Estos valores se generan automáticamente en base a la información local. Veamos cómo personalizar el valor de cada campo. .

Hay dos formas de definir el valor de un campo, una es pasar el parámetro directamente durante la construcción y la otra es reasignar el valor después de la generación; en cuanto al nombre del parámetro, son los elementos escritos en la sección anterior. .

Tome la modificación de la dirección IP de origen y TTL como ejemplo. En la sección anterior, puede ver que la dirección IP de origen predeterminada se llama "src" y el valor es "10.10.6.91" (esta es la dirección IP actual de mi máquina), y el TTL se llama ttl El valor predeterminado es 64.

Copiar codigo

# Un método, cuando los parámetros de configuración se transmiten directamente 
# src pasa el valor a 10.10.6.92, ttl pasa el valor de 128; un campo en la cadena de caracteres transmitida, un campo de valor numérico es el valor para pasar 
ip_packet = IP (src = "10.10 .6.92 ", ttl = 128) 
# Ver los valores del paquete de datos, confirmar si el elemento src es 10.10.6.92 y el elemento ttl es 128 
IP (raw (ip_packet)) 

# Método dos, reasignar después generación 
# Asignar un valor a src 10.10.6.92, asignación ttl 128; campo asignado a una cadena de caracteres, un campo de valor numérico es el valor de Fu 
ip_packet.src = "10.10.6.93" 
ip_packet.ttl = 200 is 
# view packet the valor confirmado src Si el artículo es 10.10.6.93 y si el artículo ttl es 200 
IP (raw (ip_packet))

Copiar codigo

 

3.5 Personalizar los campos del protocolo multicapa al mismo tiempo

En la sección anterior, personalizamos la dirección IP de origen, pero hay un problema: ¿qué pasa si quiero personalizar la dirección MAC de origen en este momento? Quiero pasar los parámetros directamente en la construcción usando IP () en lugar de Ether (); Quiero reasignar el valor después de la generación, la sección anterior ha probado el src para cambiar la ip de origen, y el mac de origen no puede ser cambiado a través del elemento src.

Para construir un protocolo multicapa, el constructor puede estar separado por "/", la función de bajo nivel está al frente y la función de alto nivel está al final; finalmente, la función de nivel más bajo en el constructor puede ser utilizado para ver el contenido del paquete de datos.

Copiar codigo

# Construya un paquete IP, el mac de origen se establece en "00: 00: 00: 00: 00: 11", el ip de origen se establece en "10.10.6.92" 
ip_packet = Ether (src = "00:00:00: 00:00: 11 ") / IP (src =" 10.10.6.92 ") 
# La capa más baja en la letra de estructura actual es Ether 
Ether (raw (ip_packet)) 

# Define un paquete TCP, el mac de origen se establece en" 00 : 00: 00: 00: 00: 11 ", la IP de origen se establece en" 10.10.6.92 ", el puerto de origen se establece en 1234 
tcp_packet = Ether (src =" 00: 00: 00: 00: 00: 11 " ) / IP (src = "10.10.6.92") / TCP (sport = 1234) 
# La capa más baja en la letra de estructura actual es Ether 
Ether (raw (tcp_packet)) 

# Define un paquete de datos de capa de aplicación, el contenido de la aplicación la capa es "GET / HTTP / 1.0 \ r \ n \ r \ n" 
app_packet = IP () / TCP () / "GET / HTTP / 1.0 \ r \ n \ r \ n" 
# La capa más baja en la estructura actual la letra es IP 
IP (sin formato (app_packet))

Copiar codigo

 

Cuarto, envíe y reciba paquetes de datos.

4.1 Enviar solo paquetes de datos pero no recibir paquetes de datos

La función send () le permite personalizar la capa de red y la función sendp () le permite personalizar la capa Ethernet.

Independientemente de TCP o UDP, puede usar directamente send () y otras funciones. Scapy elegirá el tipo de socket por sí mismo. No nos importa.

enviar (IP (dst = "10.10.6.92") / ICMP ()) 

enviarp (Ether () / IP (dst = "10.10.6.92") / ICMP ())

 

4.2 Enviar y recibir paquetes de respuesta

La función sr1 () participa en una capa de red personalizada, y la función srp () permite una capa de enlace de datos de capa personalizada

rec_packet = sr1 (IP (dst = "10.10.6.92") / ICMP () / "abcdefg") 
rec_packet 
# Leer directamente el valor de un elemento 
rec_packet.src 
# Usar el método show () para formatear la salida 
rec_packet.show ( )

 

4.3 escaneo sincronizado

El llamado escaneo de sincronización es para especificar explícitamente el campo Flags como SYN

rec_packet = sr1 (IP (dst = "10.10.6.92") / TCP (dport = 80, flags = "S")) 
rec_packet.show ()

 

 

Cinco, usar en el código

Todos nos basamos en el shell interactivo antes, si está en el archivo, cómo usar scapy.

No hay diferencia en la escritura de código entre un shell interactivo y un archivo. La única diferencia es que el shell interactivo ha importado todas las clases scapy, y la forma más sencilla de importar todas las clases scapy en el archivo es:

desde scapy.all import *

(En la práctica, se encuentra que esta forma de escritura aún solicitará "Referencia no resuelta" en Pycharm, pero no informará un error cuando se ejecute; es realmente imposible usar la tecla "Alt + Enter" para importar las clases usadas. por uno.)

 

referencia:

https://scapy.readthedocs.io/en/latest/usage.html

https://github.com/secdev/scapy/

Supongo que te gusta

Origin blog.csdn.net/THMAIL/article/details/107490817
Recomendado
Clasificación