Capturas de red en Windows


Es probable que, si eres administrador de sistemas, o si trabajas en ciberseguridad, en algún momento hayas tenido que realizar una captura de red en sistemas Windows.

En sistemas Linux es común saber que, normalmente, se utilizaría la aplicación tcpdump, aunque más adelante revisaré sí hay alguna otra forma de capturar la actividad de la red del equipo local.

En sistemas Windows, el procedimiento no es tan conocido, por lo que dejaré aquí apuntado a modo de nota personal, y para quien le sirva, dos formas diferentes de realizar capturas de red utilizando herramientas que se ofrecen con una instalación por defecto de Windows: netsh y pktmon.

netsh

Network Shell es una herramienta de linea de comandos que permite modificar la configuración de red de un equipo. A diferencia del segundo método, este compatible con sistemas operativos a partir de Windows Server 2008 / Windows 7 en adelante (no recuerdo ahora si llegué a utilizarlo en algún sistema Windows Server 2003 / Windows XP), y será el método a utilizar hasta Windows 10 20H1.

Esta herramienta es muy potente y puede ser bastante dificil de dominar, la documentación oficial se puede hayar aquí. Pero para el caso que nos ocupa el funcionamiento es sencillo. Se utilizará el subcomando trace, y la sintaxis mínima para realizar una captura sería la siguiente:

netsh trace start capture=yes tracefile=c:\temp\nettrace.etl

También existe la posibilidad de realizar una captura de forma persistente, de forma que seguiría capturando incluso después de un eventual reinicio (voluntario o no) utilizando el parámetro persistent=yes.

netsh trace start persistent=yes capture=yes tracefile=c:\temp\nettrace-boot.etl

Hay otros parámetros interesantes como maxSize, fileMode y overwrite que merecen la pena explorar.

Una vez se haya capturado la conexión de interés, se puede parar la captura con el parámetro stop de la siguiente forma:

netsh trace stop

El fichero generado será en formato etl, que para poder explorar con Wireshark (como será en la mayoría de los casos), se deberá de utilizar una herramienta auxiliar como etl2pcapng aunque esto se podrá realizar desde un dispositivo diferente al de la captura.

Se puede encontrar más información acerca de netsh traceen la página de documentación del comando.

pktmon

Packet Monitor es una alternativa más reciente a la función trace de netsh, y su función está más limitada a la captura e inspección de tráfico de red. Este método a diferencia del anterior, permite filtrar los puertos de los cuales que quiere realizar captura.

En este artículo se mostrará un uso sencillo de la herramienta, pero se puede encontrar más información en la página de la documentación de Microsoft.

Veamos un ejemplo de uso: configurar pktmon para capturar la comunicación entre la máquina local y un servidor forward proxy por el puerto 8080.

Partiremos con la revisión del filtro actual, para revisar que no hay ningún filtro existente.

pktmon filter list

Una vez validado que partimos con el filtro en blanco, se puede añadir el filtro de puerto -p y -t para indicar el número de puerto así cómo el protocolo (icmp, tcp o udp):

pktmon filter add -p 8080
pktmon filter add -t tcp

Tras la configuración anterior, es posible revisar de nuevo la configuración actual con el comando:

pktmon filter list

Una vez tenemos todo listo, arrancar la captura con:

pktmon start -c -f capture.etl

De forma similar a netsh se parará la captura con el parámetro stop:

pktmon stop

Si bien cómo netsh, pktmon también trabaja de forma predeterminada con ficheros etl, a diferencia de este tiene una herramienta integrada para convertir el fichero etl resultante a formato pcap:

pktmon etl2pcap capture.etl --out cap1.pcapng

Una vez finalizado el proceso, se podrá explorar el fichero con Wireshark.

Conclusión

Si bien los dos comandos son útiles para el propósito de la captura de paquetes, una de las dos herramientas no está disponible en todos los sistemas (al menos en los más antiguos) y tienen capacidades diferentes.

A criterio personal, creo que lo mejor es utilizar siempre que sea posible el método de pktmon, ya que tiene ventajas notables con el procedimiento de netsh:

  • Permite filtrar por puerto y protocolo.
  • La captura resultante es fácilmente convertible a pcapng.

Por otro lado, quizá hay escenarios en que netsh será la única opción por limitaciones de pktmon:

  • Equipos antiguos donde pktmon no está disponible.
  • Capturas de red desde el arranque de la máquina, gracias al parámetro persistent.

Atención: Es probable que tras la captura y la conversión a pcapng, te encuentres con que durante el análisis del tráfico veas un monton de paquetes duplicados y RST.

¡No te asustes! Es probable que debas volver a realizar la captura (si te es posible), por alguna razón a veces no se genera el fichero de forma correcta, y lo que ves no representa la actividad real del tráfico que se produjo durante la captura.