{"id":4242,"date":"2019-07-10T15:37:03","date_gmt":"2019-07-10T14:37:03","guid":{"rendered":"http:\/\/bitacora.eniac2000.com\/?p=4242"},"modified":"2025-10-11T05:16:43","modified_gmt":"2025-10-11T03:16:43","slug":"hacking-lab-sobre-modbus-tcp-proceso-de-intrusion-en-el-sistema","status":"publish","type":"post","link":"https:\/\/bitacora.eniac2000.com\/?p=4242","title":{"rendered":"Hacking lab sobre Modbus TCP. Proceso de intrusi\u00f3n en el sistema"},"content":{"rendered":"<div class=\"seriesmeta\">Esta entrada es la parte 3 de 4 de la serie <a href=\"https:\/\/bitacora.eniac2000.com\/?series=hacking-lab-modbus-tcp\" class=\"series-1837\" title=\"Hacking Lab Modbus TCP\">Hacking Lab Modbus TCP<\/a><\/div><p>El tercer cap\u00edtulo de esta serie describe el proceso a seguir para lograr una intrusi\u00f3n en el sistema. Para realizar este proceso, se han seguido los pasos descritos en la metodolog\u00eda de hacking \u00e9tico desarrollados por el <a href=\"https:\/\/www.cci-es.org\/\" target=\"_blank\">Centro de Ciberseguridad Industrial<\/a>. En concreto, las fases realizadas son las siguientes:<\/p>\n<p><strong>Fase de Reconocimiento<\/strong><\/p>\n<p>La fase de reconocimiento consisti\u00f3 en determinar qu\u00e9 equipo de la red de sistema escuchaba tr\u00e1fico MODBUS. Para ello, se hizo uso de ZenMap, interfaz gr\u00e1fica para NMAP. Se realiz\u00f3 un escaneo a la red entre los puertos 1 y 2000, para el segmento 192.168.0.0\/24, determin\u00e1ndose que el equipo con IP 192.168.0.39 escuchaba en el puerto 1502\/TCP. Ninguno de los dem\u00e1s equipos descubiertos en la red escuchaba en dicho puerto.<\/p>\n<figure id=\"attachment_4243\" aria-describedby=\"caption-attachment-4243\" style=\"width: 400px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2019\/07\/trabajo2-imagen8.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2019\/07\/trabajo2-imagen8-400x246.png\" alt=\"Resultado del comando NMAP ejecutado en Zenmap\" title=\"Resultado del comando NMAP ejecutado en Zenmap\" width=\"400\" height=\"246\" class=\"size-medium wp-image-4243\" \/><\/a><figcaption id=\"caption-attachment-4243\" class=\"wp-caption-text\">Resultado del comando NMAP ejecutado en Zenmap<\/figcaption><\/figure>\n<p><em>Comando ejecutado:<\/em> <code>nmap -p 1-2000 -T4 -A -v 192.168.0.0\/24<\/code><\/p>\n<p>El resultado de nmap para dicho servidor fue el siguiente:<\/p>\n<p><code>Initiating SYN Stealth Scan at 23:24<br \/>\nScanning 192.168.0.39 [1 port]<br \/>\nDiscovered open port 1502\/tcp on 192.168.0.39<br \/>\nCompleted SYN Stealth Scan at 23:24, 0.30s elapsed (1 total ports)<br \/>\nInitiating Service scan at 23:24<br \/>\nScanning 1 service on 192.168.0.39<br \/>\nCompleted Service scan at 23:25, 68.99s elapsed (1 service on 1 host)<br \/>\nInitiating OS detection (try #1) against 192.168.0.39<br \/>\nWARNING: RST from 192.168.0.39 port 1502 -- is this port really open?<br \/>\nWARNING: RST from 192.168.0.39 port 1502 -- is this port really open?<br \/>\nWARNING: RST from 192.168.0.39 port 1502 -- is this port really open?<br \/>\nWARNING: RST from 192.168.0.39 port 1502 -- is this port really open?<br \/>\nWARNING: RST from 192.168.0.39 port 1502 -- is this port really open?<br \/>\nWARNING: RST from 192.168.0.39 port 1502 -- is this port really open?<br \/>\nNSE: Script scanning 192.168.0.39.<br \/>\nInitiating NSE at 23:25<br \/>\nCompleted NSE at 23:25, 0.04s elapsed<br \/>\nInitiating NSE at 23:25<br \/>\nCompleted NSE at 23:25, 0.04s elapsed<br \/>\nNmap scan report for 192.168.0.39<br \/>\nHost is up (0.00023s latency).<br \/>\nPORT     STATE SERVICE         VERSION<br \/>\n<strong>1502\/tcp open  shivadiscovery?<\/strong><br \/>\nWarning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port<br \/>\nDevice type: general purpose<br \/>\nRunning: Linux 2.4.X<br \/>\nOS CPE: cpe:\/o:linux:linux_kernel:2.4.21<br \/>\nOS details: Linux 2.4.21<br \/>\nNetwork Distance: 0 hops<\/code><\/p>\n<p>Se puede apreciar c\u00f3mo se ha encontrado abierto el puerto 1502\/tcp en el elemento de red 192.168.0.39, que seg\u00fan nuestro diagrama, corresponder al PLC simulado que recibe los comandos para encender y apagar las luces.<\/p>\n<p><strong>Fase de escaneo<\/strong><\/p>\n<p>Una vez determinado el equipo que act\u00faa como PLC recibiendo comunicaciones Modbus, se utiliz\u00f3 la herramienta <strong>modbus-cli<\/strong> disponible en Kali con el fin de intentar determinar las bobinas que controlaban el sistema de iluminaci\u00f3n. Se hizo una lectura de las 20 primeras direcciones de memoria del PLC identificado. Tras sucesivas pruebas, se pudo determinar que los valores que variaban eran las relativas a las direcciones de memoria 2 a 4:<\/p>\n<figure id=\"attachment_4244\" aria-describedby=\"caption-attachment-4244\" style=\"width: 400px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2019\/07\/trabajo2-imagen9.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2019\/07\/trabajo2-imagen9-400x389.png\" alt=\"Resultados de los escaneos con modbus-cli\" title=\"Resultados de los escaneos con modbus-cli\" width=\"400\" height=\"389\" class=\"size-medium wp-image-4244\" \/><\/a><figcaption id=\"caption-attachment-4244\" class=\"wp-caption-text\">Resultados de los escaneos con modbus-cli<\/figcaption><\/figure>\n<p>De acuerdo a la especificaci\u00f3n del protocolo Modbus, los primeros 9999 registros de memoria corresponden a bobinas con valores TRUE o FALSE (1 o 0):<\/p>\n<figure id=\"attachment_4245\" aria-describedby=\"caption-attachment-4245\" style=\"width: 400px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2019\/07\/trabajo2-imagen10.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2019\/07\/trabajo2-imagen10-400x113.png\" alt=\"Tipos de registros de memoria en funci\u00f3n de su direcci\u00f3n\" title=\"Tipos de registros de memoria en funci\u00f3n de su direcci\u00f3n\" width=\"400\" height=\"113\" class=\"size-medium wp-image-4245\" \/><\/a><figcaption id=\"caption-attachment-4245\" class=\"wp-caption-text\">Tipos de registros de memoria en funci\u00f3n de su direcci\u00f3n<\/figcaption><\/figure>\n<p>Una vez determinados estos valores, pudo pasarse a la siguiente fase del ataque.<\/p>\n<p><strong>Fase de ganado de acceso<\/strong><br \/>\nEn el caso de protocolo Modbus, al ser un protocolo que no tuvo en cuenta en su fase de desarrollo ninguna medida en especial de seguridad, es tremendamente sencillo acceder al sistema para realizar cambios. Se trata tan s\u00f3lo de inyectar los valores correspondientes mediante las oportunas se\u00f1ales de control, ya que no se hace verificaci\u00f3n alguna de origen, identidad, permisos, ni se realiza autenticaci\u00f3n alguna. En este caso, basta con ejecutar el mismo modbus-cli en modo escritura para alterar los valores registrados en el PLC:<\/p>\n<p><code># modbus write -p 1502 192.168.0.39 2 0 0 0<\/code><\/p>\n<figure id=\"attachment_4246\" aria-describedby=\"caption-attachment-4246\" style=\"width: 400px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2019\/07\/trabajo2-imagen11.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2019\/07\/trabajo2-imagen11-400x160.png\" alt=\"Sucesivos comandos de cambio de estado\" title=\"Sucesivos comandos de cambio de estado\" width=\"400\" height=\"160\" class=\"size-medium wp-image-4246\" \/><\/a><figcaption id=\"caption-attachment-4246\" class=\"wp-caption-text\">Sucesivos comandos de cambio de estado<\/figcaption><\/figure>\n<figure id=\"attachment_4247\" aria-describedby=\"caption-attachment-4247\" style=\"width: 400px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2019\/07\/trabajo2-imagen12.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2019\/07\/trabajo2-imagen12-400x300.png\" alt=\"Estado final del sistema de iluminaci\u00f3n\" title=\"Estado final del sistema de iluminaci\u00f3n\" width=\"400\" height=\"300\" class=\"size-medium wp-image-4247\" \/><\/a><figcaption id=\"caption-attachment-4247\" class=\"wp-caption-text\">Estado final del sistema de iluminaci\u00f3n<\/figcaption><\/figure>\n<p>El resultado de dichos comandos fue, en primer lugar, el apagado completo de la iluminaci\u00f3n, y posteriormente, el encendido de la iluminaci\u00f3n en verde, controlada por la bobina 3. Estos cambios se vieron reflejados en la interfaz HMI del sistema, por lo que un operador podr\u00eda haber determinado la existencia de un comportamiento an\u00f3malo del sistema.<\/p>\n<figure id=\"attachment_4248\" aria-describedby=\"caption-attachment-4248\" style=\"width: 400px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2019\/07\/trabajo2-imagen13.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2019\/07\/trabajo2-imagen13-400x170.png\" alt=\"Interfaz HMI reflejando el cambio de estado\" title=\"Interfaz HMI reflejando el cambio de estado\" width=\"400\" height=\"170\" class=\"size-medium wp-image-4248\" \/><\/a><figcaption id=\"caption-attachment-4248\" class=\"wp-caption-text\">Interfaz HMI reflejando el cambio de estado<\/figcaption><\/figure>\n<p>Sin embargo, no es tan sencillo introducir valores fuera de rango. Al intentar inyectar valores distintos de 0 o 1 en las bobinas, la herramienta devolvi\u00f3 un mensaje de error, y no se alter\u00f3 el funcionamiento del sistema:<\/p>\n<p><code>root@raspberrypi:\/home\/pi# modbus write -p 1502 192.168.0.39 2 10 10 10<br \/>\nERROR: parameter 'VALUES ...': Value should be in the range 0..1<\/p>\n<p>See: 'modbus write --help'<\/code><\/p>\n<p>En lo referente a las dos \u00faltimas fases (Mantener Accesso y Borrar Huellas) exced\u00eda el \u00e1mbito de lo buscado en este piloto, por lo que no se han desarrollado de manera expl\u00edcita.<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"seriesmeta\">Esta entrada es la parte 3 de 4 de la serie <a href=\"https:\/\/bitacora.eniac2000.com\/?series=hacking-lab-modbus-tcp\" class=\"series-1837\" title=\"Hacking Lab Modbus TCP\">Hacking Lab Modbus TCP<\/a><\/div><p>El tercer cap\u00edtulo de esta serie describe el proceso a<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[13],"tags":[235,397,434,900,1094,1095,1175,1814],"series":[1837],"class_list":["post-4242","post","type-post","status-publish","format-standard","hentry","category-informatica","tag-bobina","tag-centro-de-ciberseguridad-industrial","tag-coil","tag-kali","tag-modbus","tag-modbus-cli","tag-nmap","tag-zenmap","series-hacking-lab-modbus-tcp"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/4242","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4242"}],"version-history":[{"count":1,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/4242\/revisions"}],"predecessor-version":[{"id":11037,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/4242\/revisions\/11037"}],"wp:attachment":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4242"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4242"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4242"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fseries&post=4242"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}