Documentación china aterradora: III.
En Windows, abra un símbolo del sistema (cmd.exe) y asegúrese de tener derechos de administrador:
Scapy le avisará si no tiene todos los paquetes opcionales instalados. Algunas características son no disponible:
Incluso sin instalación, la funcionalidad básica de enviar y recibir paquetes seguirá funcionando.
Esta sección presentará algunas de las funciones de Scapy. Abramos Scapy como se describe arriba y probemos algunos ejemplos por nosotros mismos.
Creemos un paquete para probarlo
El operador / combina dos capas. Al utilizar este operador, una capa inferior puede anular uno o más de sus campos predeterminados, dependiendo de su capa superior. También es posible utilizar una cadena como capa original (aún puedes darle el valor que desees).
Cada paquete se puede construir o descomponer (nota: en Python _ (guión bajo) es el resultado de la declaración anterior):
Lo que vemos es un paquete con todos los campos acolchados paquete de descomposición. Esto se debe a que creo que el campo al que se agrega la cadena original tiene su propio valor.
Puede leer y escribir paquetes en un archivo PCAP.
Si tiene PyX instalado, puede hacer un volcado gráfico PostScript/PDF del paquete (vea la fea imagen PNG a continuación, el PostScript/PDF es de mejor calidad...)
Actualmente, solo estamos generando un paquete. Veamos qué fácil es personalizar un conjunto de paquetes de datos. Cada campo del paquete completo (incluso a nivel de red) puede ser una colección. El concepto de conjunto de paquetes se define implícitamente aquí, es decir, un conjunto de paquetes generado utilizando el producto cartesiano entre todos los campos.
Algunas operaciones (como modificar cadenas en paquetes) no se pueden utilizar con grupos de paquetes. En este caso, si olvida expandir el conjunto de paquetes, solo se utilizará el primer elemento de la lista que olvidó generar para ensamblar el paquete.
Ahora sabemos cómo manejar los paquetes. Veamos cómo enviarlos. La función send() enviará el paquete a la capa 3. Esto significa que manejará el enrutamiento y los datos de capa 2 por usted. La función sendp() funcionará en la capa 2. Debe elegir la interfaz correcta y el protocolo de capa de enlace correcto.
La función fuzz() puede cambiar cualquier valor predeterminado pasando un objeto con un valor aleatorio del tipo de datos correcto, pero el valor no se puede calcular (como una suma de verificación). Esto hace posible crear rápidamente plantillas de prueba de fuzz de bucle. En el siguiente ejemplo, la capa IP es normal y las capas UDP y NTP están ofuscadas. La suma de comprobación para UDP es correcta, NTP recarga el puerto de destino para UDP a 123 y la versión de NTP se cambia a 4. Todos los demás puertos se agruparán aleatoriamente:
Ahora, hagamos algo divertido. La función sr() se utiliza para enviar paquetes y recibir respuestas. Esta función devolverá un par de paquetes y sus respuestas, así como paquetes sin respuestas. La función sr1() es una variante que devuelve un paquete de respuesta. srp() utiliza paquetes de capa 2 (Ethernet, 802.3, etc.).
Búsqueda de DNS (rd = quiere ser recursivo). El host 192.168.5.1 es mi servidor DNS. Tenga en cuenta que el relleno no nulo de Linksys es vulnerable a la vulnerabilidad Etherleak:
La familia de funciones de envío y recepción es una parte central de scapy. Devuelven dos listas. La primera es una lista de paquetes enviados y sus respuestas, la segunda es una lista de paquetes sin respuesta.
Para mostrarlos mejor, los encapsulamos en un objeto y proporcionamos algunos métodos para hacerlos más fáciles de usar:
Si hay un límite en la velocidad de los paquetes de respuesta, puede usar la configuración de parámetros inter La espera intervalo entre dos paquetes. Si se pierden algunos paquetes o el intervalo de tiempo es insuficiente, puede reenviar todos los paquetes sin respuesta. Solo necesita llamar a la función nuevamente para obtener la lista de paquetes sin respuesta o configurar los parámetros de reintento. Si el parámetro de reintento se establece en 3, scapy reenviará los paquetes sin respuesta tres veces. Si el parámetro de reintento se establece en -3, scapy seguirá enviando paquetes sin respuesta hasta que se envíe. El parámetro de tiempo de espera establece el tiempo de espera después de enviar el último paquete:
Ejecute el siguiente comando en el indicador de Scapy para inicializar el escaneo SYN clásico:
El comando anterior envía un SYN a Google Paquete del puerto 80, saliendo después de recibir una respuesta:
Como puede ver en el resultado anterior, Google devolvió una respuesta al paquete. Como puede ver, Google devuelve un indicador SA (SYN-ACK), que indica que el puerto 80 está abierto.
Escanee el sistema en busca de los puertos 440 a 443 usando indicadores adicionales:
O
Puede resumir los paquetes recopilados para comprender rápidamente la situación de respuesta:
La imagen de arriba muestra los pares solicitud-respuesta durante el proceso de escaneo. También podemos usar un bucle para mostrar solo la información que nos interesa:
Puede usar la función make_table() para crear una tabla para mostrar mejor la información para múltiples objetivos:
En el ejemplo anterior, si se recibe un paquete ICMP en lugar del paquete TCP esperado, se imprimirá el tipo (tipo) de error ICMP.
Para escaneos más grandes podemos estar interesados en una respuesta específica, el siguiente ejemplo solo muestra paquetes con el indicador "SA" configurado:
Si queremos un análisis profesional de la respuesta, puedes usar el siguiente comando para mostrar qué puertos están abiertos:
Para escaneos más grandes, podemos crear una tabla de puertos abiertos:
Si lo anterior no es suficiente, Scapy también contiene una función report_ports(), que no solo realiza automáticamente el escaneo SYN, sino que también genera los resultados recopilados en formato LaTeX:
Seguimiento de ruta TCP:
Nota: TCP traceroute y otros Las funciones de nivel se han creado hace mucho tiempo:
TCP traceroute y otras funciones de alto nivel se han creado.
El proceso de envío y recepción de paquetes de datos es bastante complejo.
Podemos simplemente capturar paquetes, o clonar las funciones tcpdump o tethereal. Si no se especifica ninguna interfaz, el rastreo se realizará en todas las interfaces:
Para controlar la información de salida, podemos usar la función sprintf():
Podemos hacer esto mientras rastreamos Pasivo huellas digitales del sistema operativo:
Para adivinar la versión del sistema operativo, el número al frente es la precisión de la suposición.
Demostración del filtro bpf y el método sprintf():
Aquí hay un ejemplo de algo así como la funcionalidad (h)ping: puedes seguir enviando el mismo conjunto de paquetes para ver si hay alguno. cambios:
Normalmente, los paquetes se pueden guardar como archivos pcap para su uso posterior o para su uso por otras aplicaciones:
Para restaurar un archivo pcap previamente guardado:
o
Scapy le permite generar paquetes codificados en diferentes formatos hexadecimales.
El uso de la función hexdump() generará el paquete en formato hexdump clásico:
Usando la función import_hexcap(), el volcado hexadecimal anterior se puede volver a importar a Scapy:
Uso La función str() puede convertir el paquete completo en una cadena hexadecimal:
Seleccionando una capa inicial apropiada (por ejemplo, Ether()) podemos volver a importar la cadena hexadecimal.
Usando la función export_object(), Scapy puede convertir el paquete en una estructura de datos Python codificada en base64:
Usando la función import_object(), podemos volver a importar la salida anterior en Scapy:
Finalmente, puede guardar todas las variables de la sesión usando la función save_session():
Usando la función load_session(), puede cargar la sesión guardada la próxima vez que inicie Scapy:
Ahora, demostremos qué hace la función make_table(). Los argumentos de la función incluyen una lista y otra función que devuelve una tupla de tres elementos. El primer elemento es un valor en el eje x de la tabla, el segundo elemento es un valor en el eje y y la tercera primitiva es el valor correspondiente a las coordenadas (x, y), que se devolverá como un mesa. Hay dos variantes de esta función, make_lined_table() y make_tex_table(), que se pueden copiar/pegar en informes LaTeX. Cada una de estas funciones se puede utilizar como métodos en el objeto de resultado:
Aquí podemos ver una ruta de seguimiento paralela de múltiples computadoras (Scapy ya tiene capacidades de seguimiento de rutas de múltiples TCP, ver más abajo):
Aquí hay un ejemplo más complejo: identificar un host a partir de un campo IPID. Podemos ver que 172.20.80.200 solo responde en el puerto 22, mientras que 172.20.80.201 responde en todos los puertos; 172.20.80.197 no responde en el puerto 25, sino en todos los demás puertos.
Está utilizando TTL y muestra el TTL recibido, etc. Puede ayudarle fácilmente a identificar la topología de la red.
Scapy ahora tiene su propia tabla de enrutamiento, por lo que puede enrutar paquetes de manera diferente que el sistema operativo:
Podemos trazar fácilmente los datos recopilados en Gnuplot. (Por ejemplo, podemos ver cuántas pilas de IP diferentes utiliza el balanceador de carga observando el patrón. Cuántas pilas de IP diferentes hay:
Scapy también tiene una potente función de trazado de ruta TCP. En cambio, Scapy no la tiene. de esperar una respuesta de cada nodo antes de pasar al siguiente nodo, la desventaja es que no sabe cuándo detenerse (de ahí el parámetro maxttl. Se necesitan menos de 3 segundos para obtener los resultados de un destino múltiple). traceroute:
La última línea es en realidad el valor de retorno de la función: traceroute devuelve un objeto y una lista de paquetes sin respuesta.
Al igual que otros objetos devueltos, los objetos de traceroute también se pueden sumar :
Los objetos de retorno de Traceroute tienen una propiedad muy útil: dibujarán todas las rutas obtenidas en un gráfico dirigido y AS Organize el enrutamiento. Necesita tener Graphviz instalado. De forma predeterminada, utiliza ImageMagick para mostrar gráficos. Si tiene instalado VPython, se puede utilizar traceroute.
El botón de la derecha gira el patrón, el botón del medio acerca o aleja el zoom y el botón de la izquierda mueve el patrón. Si hace clic en una bola, su dirección IP aparecerá/desaparecerá. Si mantiene presionada la tecla Ctrl y hace clic en una bola, escaneará los puertos 21, 22, 23, 25, 80 y 443 y mostrará los resultados:
Un requisito previo para la inyección de tramas es su tarjeta de red inalámbrica y controlador El programa debe estar configurado correctamente.