Análisis de Paquetes con PowerShell

A veces, la única opción para localizar problemas en una aplicación o servicio consiste en analizar el tráfico de red, para comprobar que todo está funcionando correctamente.Una pequeña joya disponible para los aficionados a la Shell son los cmdlets de Captura de Paquetes de Eventos de Red (Network Event Packet Capture cmdlets). Están disponibles para Windows Server 2012R2 y Windows 8.1.

Captura de Paquetes

Con esos cmdlets es posible registrar todos los eventos de red que se producen en la máquina. Tan sólo hace falta alguna forma de guardarlos. Aquí entra en juego el “ETL Logging” (ETL por Event Trace Log), que viene a ser la tecnología que permite a Windows guardar todos los eventos del sistema, para luego poder consultarlos con el Visor de Eventos (tip: para abrirlo de la forma más rápida posible, usa el cuadro de diálogo “ejecutar”, y se escribe el nombre de la aplicación del visor de eventos: Win+R –> eventvwr).

¿Cómo lo hago?

En resumidas cuentas, para capturar los eventos de red, hay que crear una sesión del capturador, establecer un proveedor de logs, iniciar la sesión, hacer lo que haya que hacer con la red, parar la sesión, y finalmente… eliminar la sesión. El proceso paso a paso queda así:

  • En primer lugar es necesario abrir una sesión de Administrador de PowerShell. El motivo es que la captura de paquetes requiere de privilegios elevados. Puede parecer una molestia, pero es una buena práctica de seguridad.
  • Crear la sesión de captura de paquetes: new-neteventsession -name “sesion1”image
  • Hasta aquí todo fácil. Toca elegir un proveedor de logs, para guardar un registro del tráfico. Una manera sencilla de obtener una lista de proveedores de logs relacionados con la red es con el comando logman query providers | select-string tcp
    image Se obtienen tres proveedores, para elegir el primero se escribe: Add-NetEventProvider -Name “Microsoft-Windows-TCPIP” -SessionName “sesion1”
    image
  • Ya está todo listo, se puede empezar a capturar los paquetes. Para ello, se inicia la sesión de captura. Start-NetEventSession –Name “sesion1”
    image
  • Se puede obtener información sobre la sesión de captura de paquetes con el cmdlet Get-NetEventSession
    image
  • Una vez obtenida la información deseada, se detiene la captura con Stop-NetEventSession -Name sesion1
    image
  • Finalmente, una vez detenida la sesión, se puede eliminar de la Shell. Para variar, usaremos un pipe con el cmdlet Remove-NetEventSession. Como se ha visto en artículos anteriores, la primera parte del pipe/tubería obtiene todas las sesiones, y las pasa una a una a la segunda parte del pipe, que en este caso, se encarga de eliminar las sesiones.
    image

Una vez se han completado todos estos pasos, se tiene un archivo de log con la información de red capturada, pero falta por responder una pregunta esencial: ¿Cómo visualizar/analizar estos datos? Como se comentó al principio es posible emplear el visor de Eventos de Windows para leerlos.

image

Para ello, se usa el menú Acción, Abrir Log guardado, y se abre el archivo de log que se ha creado durante la sesión de captura de paquetes. En este caso, el archivo en cuestión es C:Windowssystem32configsystemprofileAppDataLocalNetEventTrace.etl

image

Una vez abierto, nos aparece una nueva sección en la aplicación llamada “Saved Logs”, en la que se encuentra el archivo que se acaba de abrir

Capture

Conclusión

PowerShell ofrece herramientas de monitorización de red, que se pueden integrar en un script, por ejemplo, para analizar si una determinada aplicación se está comportando de la forma debida, o incluirlo dentro de rutinas de mantenimiento para detectar tráfico a direcciones o puertos sospechosos.

Bonus

La Shell también ofrece un cmdlet para leer archivos de log ETL, Get-WinEvent. Esto proporciona capacidades de filtrado de cadenas adicional, que no se tiene en la aplicación del visor de Eventos.

image

Por ejemplo, y sin ir más lejos, una vez que se tiene la variable $log con la ejecución de la línea mostrada en la captura anterior, se puede lanzar el siguiente comando: $log.message | Select-String -SimpleMatch ‘fail’ , lo que mostraría una lista de errores de conexión.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *