Modbus TCP Packet


Modbus TCP는 산업용 프로토콜인 Modbus를 Ethernet(TCP 502 Port)으로 보내는 방식 이다.
구조가 단순해서 Wireshark로 보면 바로 읽히는데 그만큼 보안에는 약하다.

1. 프레임 구조

Function Code + Data 부분을 PDU(Protocol Data Unit)라고 하고 Serial(RTU)이든 TCP든 PDU는 똑같다.
여기에 앞뒤로 뭘 붙이냐 에 따라서 RTU , TCP가 나뉜다.
A. PDU : 최대 253 Byte
B. RTU ADU = Slave Address(1) + PDU + CRC(2) → 최대 256 Byte
C. TCP ADU = MBAP Header(7) + PDU → 최대 260 Byte

* MBAP Header (Modbus Application Protocol Header)
A. Transaction ID (2 Byte) : 요청 , 응답 짝을 맞추는 번호. 응답은 요청이랑 같은 값으로 돌아온다.
B. Protocol ID (2 Byte) : Modbus는 항상 0x0000
C. Length (2 Byte) : 뒤에 따라오는 Byte수 [Unit ID + PDU]
D. Unit ID (1 Byte) : Gateway 뒤에 있는 Serial Slave를 구분할때 쓴다. [PLC에 직접 붙을때는 보통 1 이나 0xFF]

2. 프레임 예제
EX1) Unit ID 1 장비의 Holding Register 40001 ~ 40002 (2개)를 FC 03(Read Holding Registers)으로 읽는다.
[40001은 실제 Packet에서 주소 0x0000 이다. 40001 = 온도 x 10 , 40002 = 습도(%) 라고 가정]

[Request]  Client -> Server
00 01   00 00   00 06   01    03   00 00   00 02
-----   -----   -----   --    --   -----   -----
TID     PID     Len     UID   FC   Addr    Qty

Len 0x0006 : Unit ID(1) + FC(1) + 시작주소(2) + 개수(2) = 6

[Response]  Server -> Client
00 01   00 00   00 07   01    03   04      00 E6   00 19
-----   -----   -----   --    --   --      -----   -----
TID     PID     Len     UID   FC   Bytes   Val1    Val2

A. Len 0x0007 : Unit ID(1) + FC(1) + Byte Count(1) + 데이터(4) = 7
B. 0x00E6 = 230 → 온도 23.0℃ , 0x0019 = 25 → 습도 25%

3. 보안 취약점
Modbus는 원래 폐쇄된 Serial망 에서 쓰려고 만든거라 보안을 거의 고려하지않았다.
A. 인증이 없다 : 502 Port에 접속만 되면 누구나 읽고 쓸수 있다
B. 암호화가 없다 : 평문이라 위 예제 값도 Wireshark로 그대로 다보인다.
C. Replay 공격 : 캡처한 쓰기 Packet을 그대로 다시 보내도 장비는 정상 명령 으로 처리한다.
[Shodan 같은 검색엔진 에서 port:502로 검색해보면 인터넷에 그대로 노출된 Modbus 장비가 생각보다 많이 나온다.]

4. 대응 방법
A. 망 분리 : Modbus 장비는 OT망 안에만 두고 인터넷 , 사무망에서 직접 접근이 안되게 한다.
B. DPI(산업용 Firewall) : Function Code 단위로 필터링 해서 읽기(01 ~ 04)만 허용하고 쓰기(05 , 06 , 15 , 16)는 Engineering Workstation에서만 허용한다.
C. Modbus/TCP Security : Modbus Organization이 발표한 TLS 적용 버전 이다. TCP 802 Port를 쓰고 X.509 인증서로 서로 인증한다 [아직 지원하는 장비가 많지는 않다]

+ Recent posts