Esta vez vamos a utilizar los bloques de la librería LSQL partiendo del ejemplo que tiene colgado Siemens en su página, para registrar en una base de datos SQL con PLC S7-1500, después interceptados con Wireshark

Esto lo haremos de forma rápida para centrarnos después en cómo capturar los paquetes que envía el PLC a la base de datos y tratar de conseguir el acceso a la misma, de forma similar a como lo hicimos con Modbus. Podemos realizarlo en red local, o todo en el localhost, para el ejemplo es indiferente.

1- Escritura de variables

En este ejemplo usamos un 1515-2 PN Simulado para realizar el envío de querys a una base de datos donde queremos almacenar datos históricos de nuestras variables.

1- Instanciamos el bloque “Lsql_Microsoft”, generando el DB asociado y parametrizándolo con las variables del propio DB. En el ejemplo de Siemens viene todo preparado para esto y el manual lo explica bien.

2- Parametrizamos los datos de la conexión, los obtendremos de donde tengamos la BBDD que queramos escribir después.

  • Escribimos un comando de INSERT apropiado a la estructura de la base de datos, en mi caso son 3 temperaturas, dos presiones y una fecha (Timestamp). En este punto indicar, que hay que trabajar correctamente los formatos, sobre todo muy importante con las fechas.

  • Se puede pasar directamente valores fijos o parametrizarlo con variables del PLC (Que es la idea), para ello yo he tenido que crear una función que me hace todo esto:

Como se aprecia, las últimas líneas generan la cadena que pasaré cuando haga el INSERT correspondiente.

3- Habilitamos el bloque: se realiza la conexión con la base de datos. Si todo ha ido bien, os responderá con un Valid=TRUE y error=FALSE.

4- Habilitamos la marca de “Execute_Command” para que cíclicamente se envíen los datos en la cadena INSERT.

Y veremos que si todo va bien, la longitud del telegrama ira cambiando, y el dataReceived se pondrá a TRUE, confirmando la escritura.

5- Confirmamos la escritura en la BBDD con el Management: en mi caso está en otra máquina virtual, pero podría estar en el mismo host.

2- Analizando la trama

Vamos ahora a hacer lo mismo que en el artículo de Modbus, poniéndonos a la escucha de la tarjeta de red, buscando tramas que nos cuadren con la comunicación que sabemos que se está haciendo.

Intentaremos ver la query que se está pasando con nuestro INSERT de valores.

Vemos ciertas tramas con contenido relevante como “S7-1500, así que filtramos por la IP del PLC como “Source” y obtenemos lo siguiente:


Hay dos tipos de paquetes de nuestro PLC:

  • TCP: información relativa al protocolo y establecimiento de la conexión.
  • TDS: paquete con los datos de nuestra query. Si investigamos un poco los veremos abajo del todo, con los datos concretos de dicho paquete.

Se observa como la query coincide con lo que hemos programado en el Paso 1.

3- Usuario y contraseña de la base de datos

Ya hemos descubierto una de las tramas que mandamos, pero… aun podemos hacer algo más. Cuando establecíamos la conexión con el PLC y activábamos la marca de Enable, se establecía la conexión con SQL y por tanto en ese momento se tenían que pasar los credenciales de la misma. ¿Podremos verlos?

  • Apagamos la conexión y desconectamos la escritura y dejamos el Wireshark a la escucha. Vemos como al desconectar sale un paquete especial:
  • Activamos la conexión de nuevo y observamos los paquetes:

No deja lugar a dudas el paquete… TDS7 login. Vamos a ver que hay dentro….

Sorpresa. Tenemos el login datos de la base de datos donde escribimos, con el usuario y la contraseña en texto plano y sin encriptar.

Conclusion

  • Una comunicación SQL de un PLC, si no está protegido el autenticado ni cifradas las comunicaciones, es muy fácil ver los paquetes enviados y peor aún, es muy sencillo, si no se configura la encriptación, poder obtener el log-in de la BBDD.