Modbus a través de Scapy

En redes industriales uno de los protocolos más común es el ModBus, que tradicionalmente funcionaba en puertos seriales con transmisión en RTU, pero que en los últimos años la tecnología ha hecho que migre a funcionar sobre TCP usando por defecto el puerto 502, tiene un formato de la trama muy definido, compuesto de la Unidad de Datos de Aplicación (ADU) y dentro de esta la Unidad de Datos de Protocolo (PDU), como se ve en la siguiente imagen.

Figura 1: http://webdiis.unizar.es/~ricardo/files/PFCs-TFGs/Analisis-Vulnerabilidades-Securizacion-ModbusTCP/Memoria_TFG_AnalisisVulnerabilidadesSecurizacionModbusTCP.pdf

Donde se pueden tener dos tipos de ADU, uno enviado desde el cliente al servidor, donde usualmente contiene un requerimiento; el otro tipo es el enviado desde el servidor al cliente, donde usualmente esta la respuesta al requerimiento recibido. Donde como se ve en la imagen, uno de los valores más importantes es el código de la función, que es el que contiene el tipo de valor solicitado, ya sea de solo lectura o de escritura

Teniendo esto como base de funcionamiento, la librería de Python llamada Scapy, posee un modulo que analiza específicamente al protocolo ModBus y que permite hacer un análisis de los paquetes en una muestra de red. La documentación completa del modulo esta en este enlace y como dependiendo de las diferentes funciones extrae algunos datos.

Para la demostración simple del análisis vamos a tomar dos paquetes de red, uno con un query y el otro con su respuesta. Los cuales veremos a continuación usando wireshark.

Figura 2: Paquete enviado por el cliente al servidor con el query.
Figura 3: Respuesta del servidor al cliente

En Python con la librería scapy, se valida si en el paquete tiene un ADU de requerimiento o de respuesta, que puede realizarse así:

Figura 4: Detectar ADU en la trama

Después de eso, la librería permite extraer del paquete toda la información correspondiente al protocolo ModBus, como se ve en la imagen a continuación:

Si extraemos los dos fragmentos que están enmarcados, podemos ve la información de la trama, para el caso del requerimiento seria así:

Figura 6: Información del query

Como se puede apreciar son los mismos datos que se ven en la Figura 2 extraídos por con wireshark. Para el caso de la respuesta, es el mismo proceso como se puede ver a continuación:

Figura 7: Información de la respuesta

Como se puede apreciar contiene la misma información capturada en la Figura 3 por wireshark.

Esta librería es muy poderosa y permite una extracción detallada de cada paquete, muy útil en procesos de análisis de incidente y en procesos forenses, donde se tenga una muestra del tráfico de la red.

Leave a Reply

Your email address will not be published. Required fields are marked *