Embedded/PLC2015.06.16 15:53






PROFINET

- 이더넷 기반

- 초기 설계시 보안을 고려하지 않고 설계

- 필드버스 스탠다드 프로토콜

- 산업 자동화기기와 표준 네트워크 프로토콜간의 유비쿼터스 인터커넥션 환경을 위한 프로토콜

- 다수의 PLC를 하나의 Management 시스템으로 관리하기 위한 목적

- 이더넷, Wi-Fi, HART, ISA 100을 지원

- 대부분의 PLC S7은 PROFINET을 사용

- WireShark 또한 PROFINET을 레코딩 할 수 있는 기능을 지원


ISO-TSAP

- Simatic TIA(Totally Integrated Automation Portal)/Step7은 ISO-TSAP에 의존적인 성향을 가짐

- 통신 표준 프로토콜이며 대부분의 S7 PLC에 사용

- 워크 스테이션과 PLC간의 패킷을 레코딩 할 수 있도록 허용



"Simatic Totally Integrated Automation Portal"(TIA) 엔지니어링 프레임 워크

- Step7 TIA Portal 제공 기능

1. 프로그래밍 2. 진단 3. 통신 4. 테스트


ISO-TSAP 오픈 프로토콜의 위험성

- ISO-TSAP 패킷은 암호화되어 있지 않으며 평문 그대로 노출

- 패킷을 중간에 캡쳐해서 재구성 가능

- Telnet, HTTP와 비교했을 때 공통점을 발견 (아이디, 패스워드, 명령어 노출 -> Man In The Middle 공격 가능)

- S7-300은 텔넷 서버나 웹 서버를 소유 (simaticHTTP)


재전송 공격(Replay Attack)

- MITM 공격과는 조금 상이함

- 악의적인 트래픽으로 검출되지 않음


보안 인증

- 사용자 패스워드나 해쉬값을 PLC 메모리 내의 저장된 프로젝트 파일에 포함된 정보와 비교

- 일치할 경우, PLC 메모리로의 read/write/execute 기능을 허용

- 해쉬 된 패킷?

1. 인증 패킷 생성이 가능

2. 인증 패킷의 라이브러리를 생성하고 크랙할 수 있음 (?)


** ISO-TSAP 패킷 캡쳐가 핵심 요소


재전송 공격 및 DUT

1. Wireshark를 실행

2. Step7을 실행하고 타겟 PLC에 연결 (네트워크 상에서)

3. CPU STOP 명령 실행을 보내고 기다림

4. PLC의 CPU가 정지되었을 때, 패킷 캡쳐를 중지하고 PLC와 엔지니어링 소프트웨어 사이의 ISO-TSAP의 TCP Stream을 추적


- 이러한 과정을 통해 PLC로 패킷을 생성하여 보냄으로써 의미있는 데이터들을 반환받을 수 있으며, 재전송 공격을 위해 STEP7에서 PLC로의 레더로직의 초기 트랜스미션 과정을 파악할 수 있음


- 타겟 PLC의 로직에 대한 추가적인 정보를 얻기 위해, Backup 과정이 진행되는 동안 패킷을 캡쳐하거나 PLC 메모리를 덤프할 수 있으며 이를 기반으로 재생 패킷 생성이 가능


- Simatic S7 프로젝트 파일의 EOF에 저장함으로써, PLC에 페이로드를 로드 가능 (? 13p)


- 새로운 버그를 찾을 때 사용하는 Simatic 프로젝트 파일로부터 유효한 정보를 덤프하기 위해 PEData.plf에 Metasploit strings 명령어 사용가능


- ISO-TSAP에서 다시 PLC로 특별하게 만들어진 프로젝트(파일들)를 전송함으로써 PLC에 백도어 생성 가능


S7 PLC 공격 리스트

1. TCP Replay over ISO-TSAP Attack

2. S7 Authentication Bypass

3. CPU Stop and Start Attack

4. Memory Read and Write Logic Attack

5. Decrypting Siemens Simatic firmware

6. Getting a Shell on the PLC


Simatic S7 PLC 재전송 공격 시나리오

1. Capture ISO-TSAP traffic from the engineering workstation

2. Export TCP stream into a character array

3. Dissect packets and discard the ones you don't need

4. Paste them into the MSF baseline module

5. Exploit!


- 공격자는 자신의 인증 패킷을 생성 가능

- STEP7 TIA는 메모리 보호기능을 제거할 수 있으며, 컨트롤러로 가는 패킷을 캡쳐할 수 있음

- 공격자는 컨트롤러의 메모리 보호 패스워드를 변경 가능

- 운영자가 Step7을 실행할 때, 소프트웨어에는 PLC의 패스워드 보호가 disable 되었다는 것을 표시해주는 기능이 없음

- 보호 기능은 엔지니어링 소프트웨어의 부분이며 PLC 환경설정 변경에 근거한 실시간 처리는 업데이트 되지 않기 때문임


- 클라이언트와 PLC간의 인증에 관해서 흥미로운 사실 하나는 서버 세션은 절대 만료되지 않음

- 이것은 공격자가 패킷을 캡쳐, 재사용 또는 생성할 수 있도록 함

- 서버 세션 ID의 패킷은 TCP 스트림이 시작되는 처음 부분에 위치 (TCP 스트림은 클라이언트(STEP7)에 의해 생성)


Simatic S7 Server Session ID

- 자신의 세션을 생성하여 다른 컨트롤러들에 대해 세션을 재사용 가능

- 실제 세션 검증을 확인하지 않으며 다른 디바이스(동일 모델)에 대해 기존의 세션이 정상작동함 (S7-1200, 300, 400)


Remote Memory Dumps, Read and Writes

- 특별한 프로브 요청을 사용하여 PLC로부터 정보를 얻어낼 수 있음

- 심지어 공개된 정보(public consumption)가 아니어도 획득 가능

- (Reconnaissance scan)스캔을 할 때, 공격자는 S7 패킷 라이브러리에 존재하는 패킷에 의존하는 디바이스를 추척할 수 있으며

  PLC의 로직 정보를 잡아낼 수 있음

- 이러한 기술을 사용하게 되면 Tag name, 데이터 블록 이름, 펌웨어 버젼, 서비스, PLC 이름 등과 같은 정보를 얻어낼 수 있음


- PLC 데이터 블록과 다른 메모리 영역에 있는 Read Memory나 Write Memory에 재전송 공격을 사용

- 이러한 공격은 IP주소, 시간, 패스워드, 로직, 테그명, 데이터 블록명 과 같은 H/W 설정을 변경할 뿐만 아니라 데이터,

  추가된 새로운 코드, PLC로부터 다운로드 받은 프로젝트 파일까지 삭제 가능함


- Simatic PLC는 x86 Linux를 사용

- 때문에 페이로드를 주입할 수 있다면, 디바이스에 연결하거나 (Popping a shell) 쉘이 튀는 문제를 고려하지 않을 수 있음

- 또한 PLC에서의 모든 것들은 root 권한으로 실행되고 있음을 확인


- PLC 시리얼 번호를 이용하면 특정 컨트롤러에만 리프로그램이 가능함

- 웜에 시리얼 번호를 넣고 아무 PLC를 공격해도 특정(시리얼 번호에 해당하는) 컨트롤러에 전파되기까지 실제 공격은

  이루어지지 않으며 해당 컨트롤러에서만 공격이 수행됨 (스턱스넷에서 사용된 기술)


Fun with Simatic Step7 and Meterpreter

- Step7의 다른 버젼에 영향을 미치는 Step 7 TIA에 취약점이 존재하지만 해당 논문에서는 패치되지 않았기 때문에 언급하지 않음

- 메타스플로잇(Metasploit)의 여러 퍼징 모듈중 하나를 사용하여 해당 취약점을 찾아냄

- 참고 논문은 익스플로잇을 만들어내고자 해당 실험에서 Step7 엔지니어링 소프트웨어에 페이로드를 주입하는

  특정 메타프리터 스크립트를 작성해서 네트워크나 이동식 장치를 통해 확산되도록 함

- 메타프리터의 Railgun extension을 사용하여 스턱스넷의 행동을 에뮬레이터함

- 해당 Extension은 윈도우 API(after post exploitation of a machine)를 사용할 수 있도록 허용

- 공격자는 타겟 네트워크로 직접적인 접근이 필요하지 않음

- 만약 웜 내부에 악의적인 패킷을 삽입할 땐, 웜이 퍼질 수 있는 어떠한 수단이 필요


참고 논문 : Exploiting Siemens Simatic S7 PLCs, by Dillon Beresford





Posted by boxbop@gmail.com boxbop