Identifying industrial devices by port on a plant network

Short answer. Six TCP ports account for most of what answers on a control network, and each one narrows the vendor down considerably:

PortProtocolTypically means
102Siemens S7 (ISO-TSAP)S7-300 / 400 / 1200 / 1500, and third-party devices speaking S7comm
502Modbus TCPAlmost anything — PLCs, drives, meters, gateways, I/O blocks
44818EtherNet/IP (CIP)Rockwell / Allen-Bradley, and the wider ODVA ecosystem
9600Omron FINSOmron CJ / CS / NJ series
5007Mitsubishi MC protocolMELSEC Q / L / iQ-R, when an MC frame port is configured
48898Beckhoff ADSTwinCAT runtimes, often on an industrial PC rather than a PLC

Treat a hit as a candidate, not an identification. The reasons why are the rest of this post.

You have a list of addresses that answered on an unfamiliar subnet. Some are obviously office equipment. A few are not, and those are the ones you care about. The open port is the cheapest signal available, and it is a good one — but it is weaker evidence than it looks.

Why a port number is a candidate and not an answer

Three things break the clean mapping, and all three are common.

This is why it matters whether a tool tells you "PLC" or "PLC candidate — port 502 open". The second is honest about what was actually observed. The first invites you to act on an inference someone else made.

Turning a candidate into an identification

To confirm, you have to speak the protocol. Of the six, EtherNet/IP is the friendliest: the CIP List Identity request returns vendor, product type, revision and product name with no session, no authentication and no configuration on the device side.

The request is a 24-byte encapsulation header with command 0x0063 and every other field zeroed — length, session handle, status, sender context, options. It can be sent as a UDP broadcast to discover devices, or as a TCP connection to a single address when you already know where you are pointing:

request   TCP 44818
          63 00 00 00 00 00 00 00 00 00 00 00
          00 00 00 00 00 00 00 00 00 00 00 00
          ^^^^^ command 0x0063 (List Identity), little-endian

response  encapsulation header (24 bytes)
          item count (2 bytes)
          item type 0x000C  <-- CIP Identity item
            +18  vendor ID       (uint16, little-endian)
            +32  product name    (length-prefixed string)

Parse the identity item and you have the vendor and the product name straight from the device, rather than a guess derived from a port number. That is a genuine identification.

The other five are not this easy

It is worth being clear about the asymmetry, because tools rarely are.

So in practice: EtherNet/IP can be confirmed cheaply and safely, and the rest stay candidates unless you bring project-specific knowledge to the network. A tool that claims otherwise is guessing on your behalf.

Where a discovery tool should stop

Reading is not writing, and the distinction is the whole safety argument. A discovery request asks a device to describe itself. A write frame changes it. Between those two sits a grey zone that is worth ruling out explicitly:

Not detected is not the same as not there

A device can be present and entirely invisible to a scan: client isolation on the wireless, VLAN separation, a wired-only control segment, a firewall between you and it, or equipment that simply does not answer unsolicited traffic. An empty result is evidence about your vantage point as much as about the network. Read it that way and you will waste less time.

Dotori WiFi Scanner lists these ports as candidates with the port and protocol shown as the reason, and runs an identity query only on a row you approve — read-only, unicast, once. It sends no write or job frames. More about Dotori WiFi Scanner

Get it on Google Play

Related notes