Construyendo su propio monitor de red con Pyshark

Construyendo su propio monitor de red con Pyshark

Herramientas existentes

Muchas herramientas para el análisis de red han existido durante bastante tiempo. En Linux, por ejemplo, estos son Wireshark, TCPDUMP, NLOAD, IFTOP, IPTRAF, NETHOGS, BMON, TCPTRACK, así como Speedometer y Ettercap. Para una descripción detallada de ellos, puede echar un vistazo a la comparación de Silver Moon [1].

Entonces, ¿por qué no usar una herramienta existente y escribir la suya?? Las razones que veo son una mejor comprensión de los protocolos de red TCP/IP, aprenden cómo codificar correctamente o implementando solo la característica específica que necesita para su caso de uso porque las herramientas existentes no le dan lo que realmente necesita. Además, las mejoras de velocidad y carga en su aplicación/sistema también pueden desempeñar un papel que lo motiva a moverse más en esta dirección.

En la naturaleza, existen varias bibliotecas de Python para el procesamiento y análisis de la red. Para programación de bajo nivel, la biblioteca de socket [2] es la clave. Las bibliotecas basadas en protocolo de alto nivel son HttPlib, Ftplib, IMaplib y SMTPLIB. Para monitorear los puertos de red y los candidatos competitivos de flujo de paquetes, son Python-NMAP [3], DPKT [4] y Pyshark [5] se utilizan. Tanto para monitorear como cambiar la transmisión de paquetes, la biblioteca Scapy [6] está ampliamente en uso.

En este artículo, echaremos un vistazo a la biblioteca de Pyshark y monitorearemos qué paquetes llegan a una interfaz de red específica. Como verá a continuación, trabajar con Pyshark es sencillo. La documentación en el sitio web del proyecto lo ayudará para los primeros pasos; con ella, logrará un resultado utilizable muy rápidamente. Sin embargo, cuando se trata de lo esencial, se necesita más conocimiento.

Pyshark puede hacer mucho más de lo que parece a primera vista, y desafortunadamente, en el momento de este escrito, la documentación existente no cubre eso en su totalidad. Esto lo hace innecesariamente difícil y proporciona una buena razón para verse más profunda debajo del capó.

Sobre Pyshark

Pyshark [8] es un envoltorio de pitón para Tshark [10]. Simplemente utiliza su capacidad para exportar datos XML utilizando su análisis. Tshark en sí es la versión de línea de comandos de Wireshark. Tanto Tshark como Pyshark dependen de la biblioteca PCAP que realmente capture los paquetes de red y se mantiene bajo el capó de TCPDUMP [7]. Pyshark es desarrollado y mantenido continuamente por Dan (usa el nombre de Kiminewt en Twitter).

Para evitar una posible confusión, existe una herramienta de sonido similar, Apache Spark [11], que es un motor de análisis unificado para el procesamiento de datos a gran escala. El nombre Pyspark se usa para la interfaz de Python a Apache Spark, que no discutimos aquí.

Instalación de Pyshark

Pyshark requiere que se instalen tanto la biblioteca de PCAP como Tshark. Los paquetes correspondientes para Debian GNU/Linux 10 y Ubuntu se llaman libpcap0.8 y Tshark y se puede configurar de la siguiente manera usando apt-get:

Listado 1: Instalación de la biblioteca PCAP y Tshark

# PIP3 Instalar Python-Pyshark

Si aún no está instalado, Python3 y Pip también deben agregarse. Los paquetes correspondientes para Debian GNU/Linux 10 y Ubuntu se llaman Python3 y Python3-PIP y se pueden instalar de la siguiente manera usando apt-get:

Listado 2: Instale Python 3 y Pip para Python 3

# apt-get install python3 python3-pip

Ahora es el momento de agregar pyshark. Basado en nuestra investigación, Pyshark no está empaquetado para ninguna distribución importante de Linux hasta ahora. La instalación se realiza utilizando el instalador de paquetes Python PIP3 (PIP para Python 3) como un paquete de todo el sistema de la siguiente manera:

Listado 3: Instale Pyshark usando PIP

# PIP3 Instalar Python-Pyshark

Ahora, Pyshark está listo para usarse en scripts de Python en su sistema Linux. Tenga en cuenta que para ejecutar los scripts de Python a continuación como usuario administrativo, por ejemplo, usando sudo porque la biblioteca PCAP no le permite buscar paquetes como usuario regular.

La siguiente declaración agrega el contenido del módulo Pyshark al espacio de nombres de su script de Python:

Listado 4: Importar el módulo Pyshark

importar pyshark

Métodos para capturar paquetes

Fuera de la caja, Pyshark viene con dos modos diferentes con los que ofrece recolectar paquetes de la interfaz de red observada. Para una colección continua, use el método Livecapture () y para guardar en un archivo local, use el método fileCapture () desde el módulo pyshark. El resultado es una lista de paquetes (objeto iterador de python) que le permite pasar por el paquete de datos capturado por paquete. Los listados a continuación demuestran cómo usar los dos métodos.

Listado 5: Use Pyshark para capturar desde la primera interfaz wifi wlan0

importar pyshark
captura = pyshark.Livecapture (interfaz = 'wlan0')

Con las declaraciones anteriores, los paquetes de red capturados se mantienen en la memoria. La memoria disponible podría ser limitada, sin embargo, almacenar los paquetes capturados en un archivo local es una alternativa. En uso está el formato de archivo PCAP [9]. Esto le permite procesar e interpretar los datos capturados por otras herramientas que también están vinculadas a la biblioteca PCAP.

Listado 6: use Pyshark para almacenar los paquetes capturados en un archivo local

importar pyshark
captura = pyshark.FileCapture ('/TMP/NetworkPackages.gorra')

Ejecutando los listados 5 y 6, aún no tendrá ningún resultado. El siguiente paso es reducir los paquetes que se recopilarán con mayor precisión en función de los criterios deseados.

Selección de paquetes

El objeto de captura introducido previamente establece una conexión con la interfaz deseada. A continuación, los dos métodos Sniff () y Sniff_Continuously () del objeto de captura recolectan los paquetes de red. Sniff () regresa a la persona que llama tan pronto como se hayan recopilado todos los paquetes solicitados. Por el contrario, Sniff_Continuously () entrega un solo paquete a la persona que llama tan pronto como se recolectó. Esto permite una transmisión en vivo del tráfico de red.

Además, los dos métodos le permiten especificar diversas limitaciones y mecanismo de filtrado de los paquetes, por ejemplo, el número de paquetes que usan el parámetro Packet_Count, y el período durante el cual se recopilarán los paquetes utilizando el tiempo de espera del parámetro. El Listado 7 demuestra cómo recopilar 50 paquetes de red, solo, como una transmisión en vivo, utilizando el método Sniff_Continuously ().

Listado 7: Recopile 50 paquetes de red de WLAN0

importar pyshark
captura = pyshark.Livecapture (interfaz = 'wlan0')
para paquetes en captura.sniff_continuinty (paquete_count = 5):
Imprimir (paquete)

Se ven varios detalles del paquete utilizando la impresión de instrucciones (paquete) (ver Figura 1).

Figura 1: Contenido del paquete

En el Listado 7, recopiló todo tipo de paquetes de red sin importar qué protocolo o puerto de servicio. Pyshark le permite realizar un filtrado avanzado, utilizando el llamado filtro BPF [12]. Listado 8 demuestra cómo recopilar 5 paquetes TCP que entran a través del puerto 80 e imprimiendo el tipo de paquete. La información se almacena en el atributo de paquete Highest_layer.

Listado 8: Recopilación de paquetes TCP, solo

importar pyshark
captura = pyshark.Livecapture (interface = 'wlan0', bpf_filter = 'puerto tcp 80')
captura.Sniff (paquete_count = 5)
Imprimir (captura)
Para paquete en captura:
Imprimir (paquete.Highest_layer)

Guardar el Listado 8, como el archivo tcp-sniff.py, y ejecuta el guión de Python. La salida es la siguiente:

Listado 9: La salida del listado 8

# python3 tcp-sniff.py

TCP
TCP
TCP
OCSP
TCP
#

Desenbozar los paquetes capturados

El objeto capturado funciona como una muñeca de matroska rusa por capa, contiene el contenido del paquete de red correspondiente. Unboxing se siente un poco como la Navidad: nunca se sabe qué información se encuentra dentro hasta que la abrió. El Listado 10 demuestra capturar 10 paquetes de red y revelar su tipo de protocolo, tanto el puerto de origen como de destino y la dirección.

Listado 10: Mostrar fuente y destino del paquete capturado

importar pyshark
tiempo de importación
# Definir la interfaz
NetworkInterface = "ENP0S3"
# Definir objeto de captura
captura = pyshark.Livecapture (interface = networkInterface)
Imprimir ("Escuchar en % S" % NetworkInterface)
para paquetes en captura.Sniff_continuinty (paquete_count = 10):
# Salida ajustada
intentar:
# Obtén la marca de tiempo
Localtime = tiempo.ascTime (tiempo.Localtime (tiempo.tiempo()))
# Obtener contenido de paquetes
protocolo = paquete.Transport_layer # Tipo de protocolo
src_addr = paquete.IP.SRC # Dirección fuente
src_port = paquete [protocolo].puerto de origen srcport #
dst_addr = paquete.IP.Dist # Dirección de destino
dst_port = paquete [protocolo].Puerto de destino DSTPORT #
# Información del paquete de salida
Impresión ("%S IP%s:%s%s:%s (%s)"%(LocalTime, SRC_ADDR, SRC_PORT, DST_ADDR, DST_PORT, Protocolo))
Excepto AttributeerRor como E:
# Ignorar paquetes que no sean TCP, UDP e IPv4
aprobar
imprimir (" ")

El script genera una salida, como se muestra en la Figura 2, una sola línea por paquete recibido. Cada línea comienza con una marca de tiempo, seguida de la dirección IP y el puerto de origen, luego la dirección IP de destino y el puerto, y, finalmente, el tipo de protocolo de red.


Figura 2: Fuente y destino para paquetes capturados

Conclusión

Construir su propio escáner de red nunca ha sido más fácil que eso. Basado en los cimientos de Wireshark, Pyshark le ofrece un marco integral y estable para monitorear las interfaces de red de su sistema de la manera que lo necesita.

Enlaces y referencias

  • [1] Silver Moon: 18 comandos para monitorear el ancho de banda de la red en el servidor Linux, https: // www.titulares binarios.com/linux-commands-monitor-network/
  • [2] Python Socket Library, https: // documentos.pitón.org/3/biblioteca/socket.html
  • [3] Python-nmap, https: // pypi.org/proyecto/python3-nmap/
  • [4] dpkt, https: // pypi.org/proyecto/dpkt/
  • [5] Pyshark, https: // pypi.org/Project/Pyshark/
  • [6] Scapy, https: // pypi.org/Project/Scapy/
  • [7] tcpdump y libpcap, http: // www.tcpdump.org/
  • [8] Pyshark, sitio web del proyecto, http: // kiminewt.github.IO/Pyshark/
  • [9] Formato de archivo libpcap, wiki wireshark, https: // gitlab.com/wireshark/wireshark/-/wikis/desarrollo/libpcapfileformat
  • [10] Tshark, https: // www.Wireshark.org/Docs/Man Pages/Tshark.html
  • [11] Apache Spark, https: // chispa.apache.org/
  • [12] Filtro BPF, https: // wiki.Wireshark.org/capturarfilters